aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorFelix Morgner <felix.morgner@gmail.com>2018-11-30 17:50:47 +0100
committerFelix Morgner <felix.morgner@gmail.com>2018-11-30 17:50:47 +0100
commit9f266f1ed5f45d6c673eb7b3fe6276f73ac99252 (patch)
tree6bd9bba8d8f9cf6c497cd07d4ebdef1cdaf6420f /src
parent3abece6f0a7edca476ee0c493f30dda8f8bcefd5 (diff)
downloadwanda-9f266f1ed5f45d6c673eb7b3fe6276f73ac99252.tar.xz
wanda-9f266f1ed5f45d6c673eb7b3fe6276f73ac99252.zip
core: move state to connection
Diffstat (limited to 'src')
-rw-r--r--src/commander.cpp21
-rw-r--r--src/commander.hpp1
-rw-r--r--src/control_connection.cpp14
-rw-r--r--src/control_connection.hpp17
-rw-r--r--src/control_interface.cpp9
-rw-r--r--src/control_interface.hpp7
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);