summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--common/connectionbase.cpp12
-rw-r--r--common/connectionbase.h9
-rw-r--r--server/connection.cpp10
-rw-r--r--server/connection.h9
4 files changed, 23 insertions, 17 deletions
diff --git a/common/connectionbase.cpp b/common/connectionbase.cpp
index 5dadf7d..c269349 100644
--- a/common/connectionbase.cpp
+++ b/common/connectionbase.cpp
@@ -4,15 +4,7 @@
#include <iostream>
-void ConnectionBase::prepare_next_message() {
- //next_message = make_shared<Message::Hello>();
-
- //request_data(next_message->deserialize(0, 0));
-}
-
-void ConnectionBase::connected() {
- std::cout << "Connection established." << std::endl;
-
+void ConnectionBase::start_recv() {
request_data(4);
}
@@ -67,8 +59,6 @@ void ConnectionBase::got_data(uint8_t* data, std::size_t bytes) {
}
got_message(m);
-
- request_data(4);
}
void ConnectionBase::send(const Message::p& msg) {
diff --git a/common/connectionbase.h b/common/connectionbase.h
index 3e64551..ef09f83 100644
--- a/common/connectionbase.h
+++ b/common/connectionbase.h
@@ -11,13 +11,10 @@ class ConnectionBase {
private:
Message::Type pending_type;
std::size_t pending_size;
-
- //! Create a new message and initiate reception.
- void prepare_next_message();
-
+
protected:
- //! Signal that connection is established and ready to transfer data.
- void connected();
+ //! Initiate reception of a message.
+ void start_recv();
//! Deliver received data.
//! \param data Pointer to received data. Ownership is retained by caller.
diff --git a/server/connection.cpp b/server/connection.cpp
index 32b24da..f7315b2 100644
--- a/server/connection.cpp
+++ b/server/connection.cpp
@@ -29,6 +29,10 @@ void Connection::request_data(std::size_t bytes) {
// boost::asio::placeholders::error
}
+void Connection::got_message(const Message::p& msg) {
+ recv_callback(msg);
+}
+
void Connection::write_data(uint8_t* data, std::size_t bytes) {
boost::asio::async_write(socket, boost::asio::buffer(data, bytes),
boost::bind(&Connection::handle_write, shared_from_this()));
@@ -37,3 +41,9 @@ void Connection::write_data(uint8_t* data, std::size_t bytes) {
Connection::p Connection::create(boost::asio::io_service& io_service) {
return Connection::p(new Connection(io_service));
}
+
+void Connection::recv(boost::function<void (Message::p)> f) {
+ recv_callback = f;
+
+ start_recv();
+} \ No newline at end of file
diff --git a/server/connection.h b/server/connection.h
index b6a3cd3..3428b88 100644
--- a/server/connection.h
+++ b/server/connection.h
@@ -3,6 +3,7 @@
#include <boost/asio.hpp>
#include <boost/enable_shared_from_this.hpp>
+#include <boost/function.hpp>
#include "../common/connectionbase.h"
@@ -12,6 +13,8 @@ class Connection : public ConnectionBase, public boost::enable_shared_from_this<
boost::asio::ip::tcp::socket socket;
+ boost::function<void (Message::p)> recv_callback;
+
Connection(boost::asio::io_service& io_service);
//! Callback for when data is read.
@@ -26,12 +29,18 @@ class Connection : public ConnectionBase, public boost::enable_shared_from_this<
//! Implements write_data().
virtual void write_data(uint8_t* data, std::size_t bytes);
+
+ //! Implements got_message().
+ virtual void got_message(const Message::p& msg);
public:
typedef boost::shared_ptr<Connection> p;
//! Constructs a new instance and returns a shared pointer.
static p create(boost::asio::io_service& io_service);
+
+ //! Initiates an asynchronous message receive.
+ void recv(boost::function<void (Message::p)> f);
};
#endif