From 3ab65bbe0dad7e47a5edb878823cd7a84c36c39a Mon Sep 17 00:00:00 2001 From: orignal Date: Tue, 2 Dec 2014 11:42:35 -0500 Subject: [PATCH] command channel acceptor --- BOB.cpp | 67 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++- BOB.h | 35 ++++++++++++++++++++++++++++++ 2 files changed, 101 insertions(+), 1 deletion(-) diff --git a/BOB.cpp b/BOB.cpp index 5cb8cda3..00957a0b 100644 --- a/BOB.cpp +++ b/BOB.cpp @@ -1,15 +1,80 @@ +#include "Log.h" #include "BOB.h" namespace i2p { namespace client { - BOBCommandChannel::BOBCommandChannel (int port) + BOBDataStream::BOBDataStream (std::shared_ptr socket, + std::shared_ptr stream): m_Socket (socket), m_Stream (stream) + { + } + + BOBCommandChannel::BOBCommandChannel (int port): + m_IsRunning (false), m_Thread (nullptr), + m_Acceptor (m_Service, boost::asio::ip::tcp::endpoint(boost::asio::ip::tcp::v4(), port)) { } BOBCommandChannel::~BOBCommandChannel () { + Stop (); + } + + void BOBCommandChannel::Start () + { + Accept (); + m_IsRunning = true; + m_Thread = new std::thread (std::bind (&BOBCommandChannel::Run, this)); + } + + void BOBCommandChannel::Stop () + { + m_DataStreams.clear (); + m_IsRunning = false; + m_Service.stop (); + if (m_Thread) + { + m_Thread->join (); + delete m_Thread; + m_Thread = nullptr; + } + } + + void BOBCommandChannel::Run () + { + while (m_IsRunning) + { + try + { + m_Service.run (); + } + catch (std::exception& ex) + { + LogPrint (eLogError, "BOB: ", ex.what ()); + } + } + } + + void BOBCommandChannel::Accept () + { + auto newSocket = std::make_shared (m_Service); + m_Acceptor.async_accept (*newSocket, std::bind (&BOBCommandChannel::HandleAccept, this, + std::placeholders::_1, newSocket)); + } + + void BOBCommandChannel::HandleAccept(const boost::system::error_code& ecode, std::shared_ptr socket) + { + if (ecode != boost::asio::error::operation_aborted) + Accept (); + + if (!ecode) + { + LogPrint (eLogInfo, "New BOB command connection from ", socket->remote_endpoint ()); + // TODO: + } + else + LogPrint (eLogError, "BOB accept error: ", ecode.message ()); } } } diff --git a/BOB.h b/BOB.h index 4f7359c9..d05df7cc 100644 --- a/BOB.h +++ b/BOB.h @@ -1,10 +1,28 @@ #ifndef BOB_H__ #define BOB_H__ +#include +#include +#include +#include +#include "Streaming.h" + namespace i2p { namespace client { + class BOBDataStream: public std::enable_shared_from_this + { + public: + + BOBDataStream (std::shared_ptr socket, + std::shared_ptr stream); + + private: + + std::shared_ptr m_Socket; + std::shared_ptr m_Stream; + }; class BOBCommandChannel { @@ -12,6 +30,23 @@ namespace client BOBCommandChannel (int port); ~BOBCommandChannel (); + + void Start (); + void Stop (); + + private: + + void Run (); + void Accept (); + void HandleAccept(const boost::system::error_code& ecode, std::shared_ptr socket); + + private: + + bool m_IsRunning; + std::thread * m_Thread; + boost::asio::io_service m_Service; + boost::asio::ip::tcp::acceptor m_Acceptor; + std::list > m_DataStreams; }; } }