diff options
| author | Dennis Brentjes <d.brentjes@gmail.com> | 2016-08-30 16:36:14 +0200 |
|---|---|---|
| committer | Dennis Brentjes <d.brentjes@gmail.com> | 2016-08-30 16:36:14 +0200 |
| commit | fff831ff736e90fa6175fcb6f3000408218957e7 (patch) | |
| tree | f48320f1e6ff04a11c38741e9f233634452941d5 | |
| parent | 5bac5321fa5ab128cee2f0b8c549945bd6a1ccfc (diff) | |
| download | cmix-fff831ff736e90fa6175fcb6f3000408218957e7.tar.gz cmix-fff831ff736e90fa6175fcb6f3000408218957e7.tar.bz2 cmix-fff831ff736e90fa6175fcb6f3000408218957e7.zip | |
Replaced Client based implementation to composition instead of inheritance.
| -rw-r--r-- | network-handler/client.cpp | 10 | ||||
| -rw-r--r-- | network-handler/client.hpp | 15 | ||||
| -rw-r--r-- | network-handler/nodeclient.cpp | 12 | ||||
| -rw-r--r-- | network-handler/nodeclient.hpp | 8 | ||||
| -rw-r--r-- | network-handler/userclient.cpp | 11 | ||||
| -rw-r--r-- | network-handler/userclient.hpp | 9 |
6 files changed, 42 insertions, 23 deletions
diff --git a/network-handler/client.cpp b/network-handler/client.cpp index 19b6f34..3098185 100644 --- a/network-handler/client.cpp +++ b/network-handler/client.cpp @@ -13,26 +13,26 @@ Client::Client(tcp::socket &&socket) , buffer() {} -void Client::handle_receive(const error_code &ec, size_t read_bytes) +void Client::handle_receive(MessageHandler message_handler, const error_code &ec, size_t read_bytes) { buffer.commit(read_bytes); std::istream is(&buffer); if(!ec) { std::vector<uint8_t> data(std::istream_iterator<uint8_t>(is), {}); - handle_message(data); - receive(); + message_handler(data); + receive(message_handler); } else { done(); } } -void Client::receive() { +void Client::receive(MessageHandler message_handler) { using namespace boost::asio::placeholders; socket.async_receive( buffer.prepare(512), - boost::bind(&Client::handle_receive, this, error(), bytes_transferred()) + boost::bind(&Client::handle_receive, this, message_handler, error(), bytes_transferred()) ); } diff --git a/network-handler/client.hpp b/network-handler/client.hpp index fa0c6d6..2b6a6df 100644 --- a/network-handler/client.hpp +++ b/network-handler/client.hpp @@ -8,26 +8,17 @@ class Client { public: typedef std::function<void(void)> OnDoneFT; + typedef std::function<void(std::vector<uint8_t>)> MessageHandler; private: boost::asio::ip::tcp::socket socket; boost::asio::streambuf buffer; OnDoneFT done; - Client() = delete; - Client(Client const&) = delete; - Client(Client&&) = delete; - - Client& operator=(Client const&) = delete; - Client& operator=(Client&&) = delete; - -protected: - virtual void handle_message(std::vector<uint8_t> message) = 0; - public: Client(boost::asio::ip::tcp::socket&& socket); - void handle_receive(boost::system::error_code const& ec, size_t read_bytes); - void receive(); + void handle_receive(MessageHandler message_handler, boost::system::error_code const& ec, size_t read_bytes); + void receive(MessageHandler message_handler); void on_done(OnDoneFT f); }; diff --git a/network-handler/nodeclient.cpp b/network-handler/nodeclient.cpp index 8486f4b..9b026ba 100644 --- a/network-handler/nodeclient.cpp +++ b/network-handler/nodeclient.cpp @@ -3,10 +3,20 @@ #include <iostream> NodeClient::NodeClient(boost::asio::ip::tcp::socket &&socket) -: Client(std::move(socket)) +: client(std::move(socket)) {} void NodeClient::handle_message(std::vector<uint8_t> message) { std::cout << std::string(message.begin(), message.end()) << std::endl; } + +void NodeClient::receive() +{ + client.receive(std::bind(&NodeClient::handle_message, this, std::placeholders::_1)); +} + +void NodeClient::on_done(Client::OnDoneFT done) { + client.on_done(done); +} + diff --git a/network-handler/nodeclient.hpp b/network-handler/nodeclient.hpp index 00d8450..9a3799a 100644 --- a/network-handler/nodeclient.hpp +++ b/network-handler/nodeclient.hpp @@ -6,11 +6,15 @@ #include <vector> -class NodeClient : public Client +class NodeClient { - virtual void handle_message(std::vector<uint8_t> message) override final; + Client client; + void handle_message(std::vector<uint8_t> message); public: NodeClient(boost::asio::ip::tcp::socket&& socket); virtual ~NodeClient() = default; + + void receive(); + void on_done(Client::OnDoneFT done); }; diff --git a/network-handler/userclient.cpp b/network-handler/userclient.cpp index b35a544..bf4eaa4 100644 --- a/network-handler/userclient.cpp +++ b/network-handler/userclient.cpp @@ -8,5 +8,14 @@ void UserClient::handle_message(std::vector<uint8_t> message) } UserClient::UserClient(boost::asio::ip::tcp::socket&& socket) -: Client(std::move(socket)) +: client(std::move(socket)) {} + +void UserClient::receive() +{ + client.receive(std::bind(&UserClient::handle_message, this, std::placeholders::_1)); +} + +void UserClient::on_done(Client::OnDoneFT done) { + client.on_done(done); +} diff --git a/network-handler/userclient.hpp b/network-handler/userclient.hpp index 94d5ec0..5734dd2 100644 --- a/network-handler/userclient.hpp +++ b/network-handler/userclient.hpp @@ -4,12 +4,17 @@ #include "client.hpp" -class UserClient : public Client +class UserClient { - virtual void handle_message(std::vector<uint8_t> message) override final; + Client client; + void handle_message(std::vector<uint8_t> message); public: UserClient(boost::asio::ip::tcp::socket&& socket); virtual ~UserClient() = default; + void receive(); + + void on_done(Client::OnDoneFT done); + }; |
