diff options
| author | Felix Morgner <felix.morgner@gmail.com> | 2018-11-30 17:50:47 +0100 |
|---|---|---|
| committer | Felix Morgner <felix.morgner@gmail.com> | 2018-11-30 17:50:47 +0100 |
| commit | 9f266f1ed5f45d6c673eb7b3fe6276f73ac99252 (patch) | |
| tree | 6bd9bba8d8f9cf6c497cd07d4ebdef1cdaf6420f | |
| parent | 3abece6f0a7edca476ee0c493f30dda8f8bcefd5 (diff) | |
| download | wanda-9f266f1ed5f45d6c673eb7b3fe6276f73ac99252.tar.xz wanda-9f266f1ed5f45d6c673eb7b3fe6276f73ac99252.zip | |
core: move state to connection
| -rw-r--r-- | src/commander.cpp | 21 | ||||
| -rw-r--r-- | src/commander.hpp | 1 | ||||
| -rw-r--r-- | src/control_connection.cpp | 14 | ||||
| -rw-r--r-- | src/control_connection.hpp | 17 | ||||
| -rw-r--r-- | src/control_interface.cpp | 9 | ||||
| -rw-r--r-- | src/control_interface.hpp | 7 |
6 files changed, 39 insertions, 30 deletions
diff --git a/src/commander.cpp b/src/commander.cpp index 762cd83..98fc0d0 100644 --- a/src/commander.cpp +++ b/src/commander.cpp @@ -22,24 +22,14 @@ void commander::start() } else { - std::clog << "[commander::start] Control connection established\n"; m_connection = wanda::make_control_connection(std::move(m_socket)); m_connection->add(this); m_connection->start(); - send({"C", "HELLO", "1.0.0"}); + m_connection->send({"C", "HELLO", "1.0.0"}); } }); } -void commander::send(message message) -{ - if (m_connection) - { - std::clog << "[commander::send] sending message: " << message << '\n'; - m_connection->send(std::move(message)); - } -} - void commander::on_error(wanda::control_connection::pointer connection, boost::system::error_code error) { std::cerr << "[commander::on_error] error occured: " << error.message() << '\n'; @@ -47,7 +37,14 @@ void commander::on_error(wanda::control_connection::pointer connection, boost::s void commander::on_received(wanda::control_connection::pointer connection, message message) { - std::clog << "[commander::on_receive] Received message: " << message << '\n'; + if (auto state = connection->current_state(); message.command == "HELLO" && state == control_connection::state::fresh) + { + connection->update(control_connection::state::established); + } + else + { + std::cerr << "[commander::on_receive] unexpected message: " << message << '\n'; + } } } // namespace wanda
\ No newline at end of file diff --git a/src/commander.hpp b/src/commander.hpp index 70b231d..b88cd7f 100644 --- a/src/commander.hpp +++ b/src/commander.hpp @@ -18,7 +18,6 @@ struct commander : wanda::control_connection::listener commander(boost::asio::io_service &service, std::filesystem::path socket); void start(); - void send(message message); void on_error(wanda::control_connection::pointer connection, boost::system::error_code error) override; void on_received(wanda::control_connection::pointer connection, message message) override; diff --git a/src/control_connection.cpp b/src/control_connection.cpp index c06d489..b0d30d6 100644 --- a/src/control_connection.cpp +++ b/src/control_connection.cpp @@ -30,9 +30,9 @@ bool control_connection::remove(listener * listener) void control_connection::start() { - if (!m_running) + if (m_state == state::unknown) { - m_running = true; + m_state = state::fresh; perform_read(); } } @@ -77,6 +77,16 @@ void control_connection::close() m_listeners.clear(); } +void control_connection::update(state state) +{ + m_state = state; +} + +control_connection::state control_connection::current_state() const +{ + return m_state; +} + void control_connection::perform_read() { boost::asio::async_read_until(m_socket, m_in, '\n', [that = shared_from_this(), this](auto const &error, auto const length) { diff --git a/src/control_connection.hpp b/src/control_connection.hpp index 679a2ff..24d3276 100644 --- a/src/control_connection.hpp +++ b/src/control_connection.hpp @@ -27,6 +27,13 @@ struct control_connection : keyed<control_connection>, std::enable_shared_from_t virtual void on_error(pointer connection, boost::system::error_code) {} }; + enum struct state : std::underlying_type_t<std::byte> + { + unknown, + fresh, + established, + }; + /** * @internal * @brief Construct a new control connection object @@ -40,14 +47,14 @@ struct control_connection : keyed<control_connection>, std::enable_shared_from_t * * @returns <code>true</code> iff. the listener was not already in the listener set */ - bool add(listener * listener); + bool add(listener *listener); /** * @brief Remove the given listener from this control connection's listener set * * @return <code>true</code> iff. the listener was previously registered with this control connection */ - bool remove(listener * listener); + bool remove(listener *listener); /** * @brief Start I/O processing for this control connection @@ -61,6 +68,10 @@ struct control_connection : keyed<control_connection>, std::enable_shared_from_t void send(message message); + void update(state state); + + state current_state() const; + private: friend pointer make_control_connection(protocol::socket &&socket); @@ -72,7 +83,7 @@ struct control_connection : keyed<control_connection>, std::enable_shared_from_t std::istream m_input{&m_in}; std::ostream m_output{&m_out}; std::set<listener *> m_listeners{}; - bool m_running{}; + state m_state{}; }; control_connection::pointer make_control_connection(control_connection::protocol::socket &&socket); diff --git a/src/control_interface.cpp b/src/control_interface.cpp index 29f3f4f..92d5def 100644 --- a/src/control_interface.cpp +++ b/src/control_interface.cpp @@ -79,7 +79,6 @@ void control_interface::perform_accept() auto [connection, inserted] = m_connections.insert(make_control_connection(std::move(m_socket))); if (inserted) { - m_states[*connection] = state::fresh; (*connection)->add(this); (*connection)->start(); } @@ -95,19 +94,19 @@ void control_interface::on_close(control_connection::pointer connection) void control_interface::on_received(control_connection::pointer connection, message message) { - if (m_states.find(connection) == m_states.cend()) + if (m_connections.find(connection) == m_connections.cend()) { // TODO: Handle unknown connection return; } - switch (m_states[connection]) + switch (connection->current_state()) { - case state::fresh: + case control_connection::state::fresh: if (message.command == "HELLO") { - m_states[connection] = state::greeted; connection->send({"D", "HELLO", "1.0.0"}); + connection->update(control_connection::state::established); } } } diff --git a/src/control_interface.hpp b/src/control_interface.hpp index 51d8c62..adf7416 100644 --- a/src/control_interface.hpp +++ b/src/control_interface.hpp @@ -40,12 +40,6 @@ struct control_interface : control_connection::listener, keyed<control_interface void on_received(control_connection::pointer connection, message message) override; private: - enum struct state : std::underlying_type_t<std::byte> - { - fresh, - greeted, - }; - void perform_accept(); friend pointer make_interface(boost::asio::io_service &service, std::filesystem::path file); @@ -56,7 +50,6 @@ struct control_interface : control_connection::listener, keyed<control_interface protocol::acceptor m_acceptor; socket_deleter m_deleter{m_endpoint.path()}; std::set<control_connection::pointer> m_connections; - std::map<control_connection::pointer, state> m_states; }; control_interface::pointer make_interface(boost::asio::io_service &service, std::filesystem::path file); |
