summaryrefslogtreecommitdiffstats
path: root/src/Net/Connection.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/Net/Connection.h')
-rw-r--r--src/Net/Connection.h50
1 files changed, 33 insertions, 17 deletions
diff --git a/src/Net/Connection.h b/src/Net/Connection.h
index 3070282..19ee826 100644
--- a/src/Net/Connection.h
+++ b/src/Net/Connection.h
@@ -20,10 +20,15 @@
#ifndef MAD_NET_CONNECTION_H_
#define MAD_NET_CONNECTION_H_
+#include "export.h"
+
#include "Packet.h"
#include <Core/Signals.h>
#include <Core/ThreadManager.h>
+#include <boost/array.hpp>
+#include <boost/shared_array.hpp>
+
#include <boost/asio.hpp>
#include <boost/asio/ssl.hpp>
@@ -35,7 +40,7 @@ namespace Net {
class Listener;
class ThreadManager;
-class Connection : boost::noncopyable {
+class MAD_NET_EXPORT Connection : boost::noncopyable {
protected:
friend class Listener;
friend class ThreadManager;
@@ -45,9 +50,9 @@ class Connection : boost::noncopyable {
};
private:
- class Buffer {
+ class MAD_NET_EXPORT Buffer {
public:
- Buffer(const uint8_t *data0, std::size_t length) : data(new std::vector<uint8_t>(data0, data0+length)), buffer(boost::asio::buffer(*data)) {}
+ Buffer(const boost::uint8_t *data0, std::size_t length) : data(new std::vector<boost::uint8_t>(data0, data0+length)), buffer(boost::asio::buffer(*data)) {}
typedef boost::asio::const_buffer value_type;
typedef const boost::asio::const_buffer* const_iterator;
@@ -56,7 +61,7 @@ class Connection : boost::noncopyable {
const boost::asio::const_buffer* end() const { return &buffer + 1; }
private:
- boost::shared_ptr<std::vector<uint8_t> > data;
+ boost::shared_ptr<std::vector<boost::uint8_t> > data;
boost::asio::const_buffer buffer;
};
@@ -66,10 +71,10 @@ class Connection : boost::noncopyable {
State state;
- std::vector<boost::uint8_t> receiveBuffer;
+ boost::scoped_ptr<boost::array<boost::uint8_t, 1024*1024> > receiveBuffer;
std::size_t received;
- Packet::Data header;
+ Packet::Header header;
Core::Signals::Signal1<boost::shared_ptr<Packet> > receiveSignal;
Core::Signals::Signal0 connectedSignal;
@@ -77,24 +82,29 @@ class Connection : boost::noncopyable {
bool receiving;
unsigned long sending;
-
+
+ void _initSocket() {
+ socket.reset(new boost::asio::ssl::stream<boost::asio::ip::tcp::socket>(application->getIOService(), context));
+ }
+
void enterReceiveLoop();
- void handleHeaderReceive(const std::vector<boost::uint8_t> &data);
- void handleDataReceive(const std::vector<boost::uint8_t> &data);
+ void handleHeaderReceive(const boost::shared_array<boost::uint8_t> &data);
+ void handleDataReceive(const boost::shared_array<boost::uint8_t> &data);
- void handleRead(const boost::system::error_code& error, std::size_t bytes_transferred, std::size_t length, const boost::function1<void, const std::vector<boost::uint8_t>& > &notify);
+ void handleRead(const boost::system::error_code& error, std::size_t bytes_transferred, std::size_t length, const boost::function1<void, const boost::shared_array<boost::uint8_t>& > &notify);
void handleWrite(const boost::system::error_code& error, std::size_t);
void handleShutdown(const boost::system::error_code& error);
- void rawReceive(std::size_t length, const boost::function1<void, const std::vector<boost::uint8_t>& > &notify);
- void rawSend(const uint8_t *data, std::size_t length);
+ void rawReceive(std::size_t length, const boost::function1<void, const boost::shared_array<boost::uint8_t>& > &notify);
+ void rawSend(const boost::uint8_t *data, std::size_t length);
protected:
boost::shared_mutex connectionLock;
-
- boost::asio::ssl::stream<boost::asio::ip::tcp::socket> socket;
+
+ boost::asio::ssl::context context;
+ boost::scoped_ptr<boost::asio::ssl::stream<boost::asio::ip::tcp::socket> > socket;
boost::asio::ip::tcp::endpoint peer;
void handleHandshake(const boost::system::error_code& error);
@@ -110,14 +120,20 @@ class Connection : boost::noncopyable {
void _setState(State newState) {
state = newState;
+
+ if(_isConnected() && !socket.get())
+ _initSocket();
+ else if(!_isConnected() && socket.get())
+ socket.reset();
+
stateChanged.notify_all();
}
void doDisconnect();
- Connection(Core::Application *application0, boost::asio::ssl::context &sslContext) :
- application(application0), state(DISCONNECTED), receiveBuffer(1024*1024), receiveSignal(application), connectedSignal(application),
- disconnectedSignal(application), socket(application->getIOService(), sslContext) {}
+ Connection(Core::Application *application0) :
+ application(application0), state(DISCONNECTED), receiveBuffer(new boost::array<boost::uint8_t, 1024*1024>), receiveSignal(application), connectedSignal(application),
+ disconnectedSignal(application), context(application->getIOService(), boost::asio::ssl::context::sslv23) {}
public:
virtual ~Connection();