aboutsummaryrefslogtreecommitdiff
path: root/src/control_interface.cpp
diff options
context:
space:
mode:
authorFelix Morgner <felix.morgner@gmail.com>2018-11-30 16:52:54 +0100
committerFelix Morgner <felix.morgner@gmail.com>2018-11-30 16:52:54 +0100
commit3abece6f0a7edca476ee0c493f30dda8f8bcefd5 (patch)
treee794f512a262cca92db6d0a5f9d41b6be64d9db0 /src/control_interface.cpp
parent9c2231c8fb45f32c7b1d23e14125bc58ea405e60 (diff)
downloadwanda-3abece6f0a7edca476ee0c493f30dda8f8bcefd5.tar.xz
wanda-3abece6f0a7edca476ee0c493f30dda8f8bcefd5.zip
core: stop ownership circles in connection
Diffstat (limited to 'src/control_interface.cpp')
-rw-r--r--src/control_interface.cpp26
1 files changed, 23 insertions, 3 deletions
diff --git a/src/control_interface.cpp b/src/control_interface.cpp
index 2b368dd..29f3f4f 100644
--- a/src/control_interface.cpp
+++ b/src/control_interface.cpp
@@ -58,7 +58,7 @@ boost::system::error_code control_interface::start()
boost::system::error_code control_interface::shutdown()
{
- for(auto & connection : m_connections)
+ for (auto &connection : m_connections)
{
connection->close();
}
@@ -77,9 +77,10 @@ void control_interface::perform_accept()
else
{
auto [connection, inserted] = m_connections.insert(make_control_connection(std::move(m_socket)));
- if(inserted)
+ if (inserted)
{
- (*connection)->add(shared_from_this());
+ m_states[*connection] = state::fresh;
+ (*connection)->add(this);
(*connection)->start();
}
perform_accept();
@@ -92,6 +93,25 @@ void control_interface::on_close(control_connection::pointer connection)
m_connections.erase(connection);
}
+void control_interface::on_received(control_connection::pointer connection, message message)
+{
+ if (m_states.find(connection) == m_states.cend())
+ {
+ // TODO: Handle unknown connection
+ return;
+ }
+
+ switch (m_states[connection])
+ {
+ case state::fresh:
+ if (message.command == "HELLO")
+ {
+ m_states[connection] = state::greeted;
+ connection->send({"D", "HELLO", "1.0.0"});
+ }
+ }
+}
+
control_interface::pointer make_interface(boost::asio::io_service &service, std::filesystem::path file)
{
if (std::filesystem::exists(file))