diff options
Diffstat (limited to 'src/Net/Connection.h')
-rw-r--r-- | src/Net/Connection.h | 50 |
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>& > ¬ify); + 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>& > ¬ify); 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>& > ¬ify); - 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>& > ¬ify); + 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(); |