aboutsummaryrefslogtreecommitdiff
path: root/node/node.cpp
diff options
context:
space:
mode:
authorDennis Brentjes <d.brentjes@gmail.com>2016-10-05 12:56:52 +0200
committerDennis Brentjes <d.brentjes@gmail.com>2016-10-05 14:12:28 +0200
commit88c5130eccd06e63ffca732626c0fb59426743a7 (patch)
treef9c7c4536bfa50057269c3636baedea3cb859ac1 /node/node.cpp
parentedc3690d62890449df3ae4c14636019bce4833f1 (diff)
downloadcmix-88c5130eccd06e63ffca732626c0fb59426743a7.tar.gz
cmix-88c5130eccd06e63ffca732626c0fb59426743a7.tar.bz2
cmix-88c5130eccd06e63ffca732626c0fb59426743a7.zip
Seperates Nodes and Clients for incoming connections.
Created a PrevNode class to reflect the seperation. Made Client movable. Added 2 empty protobuf message that declare what each connecting client is, sent when connected to a node.
Diffstat (limited to 'node/node.cpp')
-rw-r--r--node/node.cpp99
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();