diff options
Diffstat (limited to 'node/node.cpp')
| -rw-r--r-- | node/node.cpp | 99 |
1 files changed, 73 insertions, 26 deletions
diff --git a/node/node.cpp b/node/node.cpp index fb5b875..c02e5e6 100644 --- a/node/node.cpp +++ b/node/node.cpp @@ -13,6 +13,7 @@ Node::Node(ListenSettings const& listen_settings, NodeNetworkSettings network_se , server(io_service, listen_settings, [this](boost::asio::ip::tcp::socket&& socket){accept_handler(std::move(socket));}) , clients() , network_settings(network_settings) +, prev_node(Client(tcp::socket(io_service))) , next_node(tcp::socket(io_service)) , api(get_curve25519_implementation()) , keypair(api.create_key_pair()) @@ -21,6 +22,7 @@ Node::Node(ListenSettings const& listen_settings, NodeNetworkSettings network_se GOOGLE_PROTOBUF_VERIFY_VERSION; auto on_connect = [this, network_settings](){ + next_node.send(cmix_proto::ImANode()); if(network_settings.is_first) { start_initialisation(); } @@ -39,16 +41,18 @@ void Node::run() { void Node::accept_handler(boost::asio::ip::tcp::socket&& socket) { - clients.emplace_back(std::move(socket)); + purgatory.emplace_back(std::move(socket)); - auto it = --clients.end(); - clients.back().on_done( + std::list<Client>::iterator it = --purgatory.end(); + purgatory.back().on_done( [this, it]() { - clients.erase(it); + purgatory.erase(it); } ); - it->receive(std::bind(&Node::handle_message, this, std::placeholders::_1)); + it->receive([this, it](std::vector<uint8_t> const& message_buffer) { + handle_message(decltype(it)(it), message_buffer); + }); } void Node::start_initialisation() { @@ -58,27 +62,6 @@ void Node::start_initialisation() { next_node.send(init); } -void Node::handle_message(const std::vector<uint8_t>& message_buffer) -{ - cmix_proto::CMixMessage message; - if(!message.ParseFromArray(message_buffer.data(), message_buffer.size())) { - BOOST_LOG_TRIVIAL(error) << "Received something which was not a CMixMessage"; - clients.clear(); - io_service.stop(); - return; - } - - switch(message.contents_case()) { - case cmix_proto::CMixMessage::ContentsCase::kInitialization: { - handle_initialization(message.initialization()); - break; - } - default: { - BOOST_LOG_TRIVIAL(error) << "CMixMessage contains unknown contents."; - } - } -} - void Node::handle_initialization(const cmix_proto::Initialization& init) { if(network_settings.is_first) { @@ -114,6 +97,70 @@ void Node::handle_initialization(const cmix_proto::Initialization& init) } } +void Node::handle_message(const std::vector<uint8_t>& message_buffer) +{ + cmix_proto::CMixMessage message; + if(!message.ParseFromArray(message_buffer.data(), message_buffer.size())) { + BOOST_LOG_TRIVIAL(error) << "Received something which was not a CMixMessage"; + clients.clear(); + io_service.stop(); + return; + } + + switch(message.contents_case()) { + case cmix_proto::CMixMessage::ContentsCase::kInitialization: { + handle_initialization(message.initialization()); + break; + } + default: { + BOOST_LOG_TRIVIAL(error) << "CMixMessage contains unknown contents."; + } + } +} + +void Node::handle_imanode(std::list<Client>::iterator handle) { + handle->on_done([]{}); + prev_node = PrevNode(std::move(*handle)); + purgatory.erase(handle); + prev_node.receive([this](std::vector<uint8_t> const& message_buffer){ + handle_message(message_buffer); + }); +} + +void Node::handle_imaclient(std::list<Client>::iterator handle) { + clients.emplace_back(std::move(*handle)); + std::list<Client>::iterator it = clients.end()--; + it->on_done([this, it]{ + clients.erase(it); + }); + purgatory.erase(handle); +} + +void Node::handle_message(std::list<Client>::iterator handle, const std::vector<uint8_t>& message_buffer) +{ + cmix_proto::CMixMessage message; + if(!message.ParseFromArray(message_buffer.data(), message_buffer.size())) { + BOOST_LOG_TRIVIAL(error) << "Received something which was not a CMixMessage"; + clients.clear(); + io_service.stop(); + return; + } + + switch(message.contents_case()) { + case cmix_proto::CMixMessage::ContentsCase::kImanode: { + handle_imanode(handle); + break; + } + case cmix_proto::CMixMessage::ContentsCase::kImaclient: { + handle_imaclient(handle); + break; + } + default: { + BOOST_LOG_TRIVIAL(error) << "CMixMessage contains unknown contents."; + } + } +} + void Node::start_precomputation() { clients.clear(); io_service.stop(); |
