#pragma once #include "client.hpp" #include "cmix.pb.h" #include /*! * \file */ /*! * MESSAGE_SETTER is a boilerplate macro that generates a setter function for our CMix * protobuf messages, This because there are seperate functions for each to type to use. * And there seems no way to solve this using templates. */ #define MESSAGE_SETTER(TYPE, NAME) \ inline void message_setter(cmix_proto::CMixMessage& m, cmix_proto::TYPE const& v) { \ *m.mutable_##NAME() = v; \ } \ MESSAGE_SETTER(ImAClient, imaclient) MESSAGE_SETTER(Bye, bye) #undef MESSAGE_SETTER /*! * \brief The Node class represents a node in the network. */ class Node { Client client; public: /*! * \brief Node * \param socket an rvalue reference to the socket it takes ownership and uses to communicate with the next node in the network. */ Node(boost::asio::ip::tcp::socket&& socket); /*! * \brief send * \param v The CMixMessage type we try to send and first have to wrap in a CMixMessage. */ template void send(T v) { cmix_proto::CMixMessage m; message_setter(m, v); client.send(m.SerializeAsString()); } /*! * \brief async_connect * \param next_host The host of the next node. * \param next_port The port of the next node. * \param on_connect The callback to call when the connect was succesfull. */ void async_connect(std::string next_host, std::string next_port, std::function on_connect); /*! * \brief close This function closes the underlying socket connection. */ void close(); };