diff options
Diffstat (limited to 'Limber/main.cpp')
-rw-r--r-- | Limber/main.cpp | 80 |
1 files changed, 47 insertions, 33 deletions
diff --git a/Limber/main.cpp b/Limber/main.cpp index 0893fc8..e68e03f 100644 --- a/Limber/main.cpp +++ b/Limber/main.cpp @@ -13,9 +13,26 @@ #include "Swiften/EventLoop/SimpleEventLoop.h" #include "Swiften/Network/IncomingConnection.h" #include "Swiften/Network/ConnectionServer.h" +#include "Swiften/Network/BoostIOServiceThread.h" using namespace Swift; +class ServerFromClientSession { + public: + ServerFromClientSession(boost::shared_ptr<IncomingConnection> connection) : connection_(connection) { + } + + void start() { + connection_->write("Hello\n"); + onSessionFinished(); + } + + boost::signal<void()> onSessionFinished; + + private: + boost::shared_ptr<IncomingConnection> connection_; +}; + // A reference-counted non-modifiable buffer class. class SharedBuffer { public: @@ -68,31 +85,6 @@ class IncomingBoostConnection : public IncomingConnection, public boost::enable_ boost::asio::ip::tcp::socket socket_; }; -class BoostIOServiceThread { - public: - BoostIOServiceThread() : thread_(boost::bind(&BoostIOServiceThread::doRun, this)) { - } - - ~BoostIOServiceThread() { - ioService_.stop(); - thread_.join(); - } - - boost::asio::io_service& getIOService() { - return ioService_; - } - - private: - void doRun() { - boost::asio::io_service::work work(ioService_); - ioService_.run(); - } - - private: - boost::asio::io_service ioService_; - boost::thread thread_; -}; - class BoostConnectionServer : public ConnectionServer { public: BoostConnectionServer(int port, boost::asio::io_service& ioService) : acceptor_(ioService, boost::asio::ip::tcp::endpoint(boost::asio::ip::tcp::v4(), port)) { @@ -100,14 +92,12 @@ class BoostConnectionServer : public ConnectionServer { } private: - // Called from Asio thread void acceptNextConnection() { IncomingBoostConnection::pointer newConnection = IncomingBoostConnection::create(acceptor_.io_service()); acceptor_.async_accept(newConnection->getSocket(), boost::bind(&BoostConnectionServer::handleAccept, this, newConnection, boost::asio::placeholders::error)); } - // Called from Asio thread void handleAccept(IncomingBoostConnection::pointer newConnection, const boost::system::error_code& error) { if (!error) { MainEventLoop::postEvent(boost::bind(boost::ref(onNewConnection), newConnection), this); @@ -118,15 +108,39 @@ class BoostConnectionServer : public ConnectionServer { boost::asio::ip::tcp::acceptor acceptor_; }; -void doSomething(boost::shared_ptr<IncomingConnection> c) { - c->write("Hello\n"); -} +class Server { + public: + Server() { + serverFromClientConnectionServer_ = new BoostConnectionServer(5222, boostIOServiceThread_.getIOService()); + serverFromClientConnectionServer_->onNewConnection.connect(boost::bind(&Server::handleNewConnection, this, _1)); + } + + ~Server() { + delete serverFromClientConnectionServer_; + } + + private: + void handleNewConnection(boost::shared_ptr<IncomingConnection> c) { + ServerFromClientSession* session = new ServerFromClientSession(c); + serverFromClientSessions_.push_back(session); + session->onSessionFinished.connect(boost::bind(&Server::handleSessionFinished, this, session)); + session->start(); + } + + void handleSessionFinished(ServerFromClientSession* session) { + serverFromClientSessions_.erase(std::remove(serverFromClientSessions_.begin(), serverFromClientSessions_.end(), session), serverFromClientSessions_.end()); + delete session; + } + + private: + BoostIOServiceThread boostIOServiceThread_; + BoostConnectionServer* serverFromClientConnectionServer_; + std::vector<ServerFromClientSession*> serverFromClientSessions_; +}; int main() { SimpleEventLoop eventLoop; - BoostIOServiceThread boostIOServiceThread; - BoostConnectionServer server(5222, boostIOServiceThread.getIOService()); - server.onNewConnection.connect(boost::bind(doSomething, _1)); + Server server; eventLoop.run(); return 0; } |