From 366bae00016bfbfdd354ab010555c2927505b2b2 Mon Sep 17 00:00:00 2001 From: Dennis Brentjes Date: Thu, 13 Oct 2016 14:35:32 +0200 Subject: Second big network rewrite. This time without the ugly SFINAE hack to restrict sending and receiving on Senders and Receivers respectively. Replaced this hack with private inheritance and using declerations. Also renamed receive to async_receive to better reflect the behaviour. --- node/CMakeLists.txt | 1 + node/node.cpp | 24 ++++++++++++------------ node/node.hpp | 6 ++++-- 3 files changed, 17 insertions(+), 14 deletions(-) (limited to 'node') diff --git a/node/CMakeLists.txt b/node/CMakeLists.txt index c5ec53f..05468bd 100644 --- a/node/CMakeLists.txt +++ b/node/CMakeLists.txt @@ -25,4 +25,5 @@ target_link_libraries(node PRIVATE cmix-bignum PRIVATE cmix-network PRIVATE cmix-protobuf + PRIVATE cmix-common ) diff --git a/node/node.cpp b/node/node.cpp index f06e389..5487299 100644 --- a/node/node.cpp +++ b/node/node.cpp @@ -13,8 +13,8 @@ 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(ProtobufClient(tcp::socket(io_service))) -, next_node(ProtobufClient(tcp::socket(io_service))) +, prev_node(Receiver(tcp::socket(io_service))) +, next_node(Sender(tcp::socket(io_service))) , api(get_implementation()) , keypair(api.create_key_pair()) , network_pub_key() @@ -42,14 +42,14 @@ void Node::run() { void Node::accept_handler(boost::asio::ip::tcp::socket&& socket) { - std::list>::iterator it = purgatory.emplace(purgatory.end(), std::move(socket)); + std::list::iterator it = purgatory.emplace(purgatory.end(), std::move(socket)); purgatory.back().on_done( [this, it]() { purgatory.erase(it); } ); - it->receive([this, it](cmix_proto::CMixMessage message) { + it->async_receive([this, it](cmix_proto::CMixMessage message) { handle_message(it, message); }); } @@ -109,7 +109,7 @@ void Node::handle_node_message(cmix_proto::CMixMessage message) prev_node.close(); if (!shutting_down) { send_bye(); - prev_node.receive([this](cmix_proto::CMixMessage message){ + prev_node.async_receive([this](cmix_proto::CMixMessage message){ handle_node_message(message); }); } @@ -119,7 +119,7 @@ void Node::handle_node_message(cmix_proto::CMixMessage message) BOOST_LOG_TRIVIAL(error) << "handle_node_message: CMixMessage contains unknown contents."; } } - prev_node.receive([this](cmix_proto::CMixMessage message) { + prev_node.async_receive([this](cmix_proto::CMixMessage message) { handle_node_message(message); }); } @@ -131,7 +131,7 @@ void Node::handle_client_message(ClientMap::key_type handle, cmix_proto::CMixMes BOOST_LOG_TRIVIAL(trace) << "Deriving shared key"; api.derive_shared_key(keypair, reinterpret_cast(message.keyexchange().public_key().c_str()), true); - clients.at(handle).receive([this, handle](cmix_proto::CMixMessage message){ + clients.at(handle).async_receive([this, handle](cmix_proto::CMixMessage message){ handle_client_message(handle, message); }); return; @@ -154,9 +154,9 @@ void Node::handle_client_message(ClientMap::key_type handle, cmix_proto::CMixMes void Node::handle_imanode(std::list::iterator handle) { handle->on_done([]{}); - prev_node = make_receiver(std::move(*handle)); + prev_node = Receiver(std::move(*handle)); purgatory.erase(handle); - prev_node.receive([this](cmix_proto::CMixMessage message){ + prev_node.async_receive([this](cmix_proto::CMixMessage message){ handle_node_message(message); }); } @@ -164,17 +164,17 @@ void Node::handle_imanode(std::list::iterator handle) { void Node::handle_imaclient(std::list::iterator handle, cmix_proto::ImAClient c) { BOOST_LOG_TRIVIAL(trace) << "Handling imaclient"; std::string client_id = c.id(); - clients.emplace(c.id(), make_sender_receiver(std::move(*handle))); + clients.emplace(c.id(), SenderReceiver(std::move(*handle))); clients.at(c.id()).on_done([this, client_id]{ clients.erase(client_id); }); purgatory.erase(handle); - clients.at(c.id()).receive([this, client_id](cmix_proto::CMixMessage message) { + clients.at(c.id()).async_receive([this, client_id](cmix_proto::CMixMessage message) { handle_client_message(client_id, message); }); } -void Node::handle_message(std::list>::iterator handle, cmix_proto::CMixMessage message) +void Node::handle_message(std::list::iterator handle, cmix_proto::CMixMessage message) { switch(message.contents_case()) { case cmix_proto::CMixMessage::ContentsCase::kImanode: { diff --git a/node/node.hpp b/node/node.hpp index 868c4b8..9423860 100644 --- a/node/node.hpp +++ b/node/node.hpp @@ -1,7 +1,9 @@ #pragma once #include "server.hpp" -#include "protobufclient.hpp" +#include "receiver.hpp" +#include "senderreceiver.hpp" +#include "sender.hpp" #include "api.h" @@ -61,7 +63,7 @@ class Node void handle_imanode(std::list::iterator handle); void handle_imaclient(std::list::iterator handle, cmix_proto::ImAClient c); - void handle_message(std::list>::iterator handle, cmix_proto::CMixMessage message); + void handle_message(std::list::iterator handle, cmix_proto::CMixMessage message); public: /*! -- cgit v1.2.3-70-g09d2