From 9f266f1ed5f45d6c673eb7b3fe6276f73ac99252 Mon Sep 17 00:00:00 2001 From: Felix Morgner Date: Fri, 30 Nov 2018 17:50:47 +0100 Subject: core: move state to connection --- src/commander.cpp | 21 +++++++++------------ src/commander.hpp | 1 - src/control_connection.cpp | 14 ++++++++++++-- src/control_connection.hpp | 17 ++++++++++++++--- src/control_interface.cpp | 9 ++++----- 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, std::enable_shared_from_t virtual void on_error(pointer connection, boost::system::error_code) {} }; + enum struct state : std::underlying_type_t + { + unknown, + fresh, + established, + }; + /** * @internal * @brief Construct a new control connection object @@ -40,14 +47,14 @@ struct control_connection : keyed, std::enable_shared_from_t * * @returns true 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 true 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, 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, std::enable_shared_from_t std::istream m_input{&m_in}; std::ostream m_output{&m_out}; std::set 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 - { - 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 m_connections; - std::map m_states; }; control_interface::pointer make_interface(boost::asio::io_service &service, std::filesystem::path file); -- cgit v1.2.3