summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRemko Tronçon <git@el-tramo.be>2009-07-12 14:30:10 (GMT)
committerRemko Tronçon <git@el-tramo.be>2009-07-12 14:30:58 (GMT)
commit2a64272ce320b4f542f2c381fe061a58bc1835fc (patch)
tree43ff1a0e235e7fe83a5f96704093a155f39e1511
parent9d47ed3d783da724c653a17619df904fa7986be7 (diff)
downloadswift-contrib-2a64272ce320b4f542f2c381fe061a58bc1835fc.zip
swift-contrib-2a64272ce320b4f542f2c381fe061a58bc1835fc.tar.bz2
Created BoostIOServiceThread.
-rw-r--r--Limber/main.cpp80
-rw-r--r--Swiften/Network/BoostIOServiceThread.cpp18
-rw-r--r--Swiften/Network/BoostIOServiceThread.h23
-rw-r--r--Swiften/Network/Makefile.inc1
4 files changed, 89 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;
}
diff --git a/Swiften/Network/BoostIOServiceThread.cpp b/Swiften/Network/BoostIOServiceThread.cpp
new file mode 100644
index 0000000..01c3bf3
--- /dev/null
+++ b/Swiften/Network/BoostIOServiceThread.cpp
@@ -0,0 +1,18 @@
+#include "Swiften/Network/BoostIOServiceThread.h"
+
+namespace Swift {
+
+BoostIOServiceThread::BoostIOServiceThread() : thread_(boost::bind(&BoostIOServiceThread::doRun, this)) {
+}
+
+BoostIOServiceThread::~BoostIOServiceThread() {
+ ioService_.stop();
+ thread_.join();
+}
+
+void BoostIOServiceThread::doRun() {
+ boost::asio::io_service::work work(ioService_);
+ ioService_.run();
+}
+
+}
diff --git a/Swiften/Network/BoostIOServiceThread.h b/Swiften/Network/BoostIOServiceThread.h
new file mode 100644
index 0000000..ddc90bf
--- /dev/null
+++ b/Swiften/Network/BoostIOServiceThread.h
@@ -0,0 +1,23 @@
+#pragma once
+
+#include <boost/asio.hpp>
+#include <boost/thread.hpp>
+
+namespace Swift {
+ class BoostIOServiceThread {
+ public:
+ BoostIOServiceThread();
+ ~BoostIOServiceThread();
+
+ boost::asio::io_service& getIOService() {
+ return ioService_;
+ }
+
+ private:
+ void doRun();
+
+ private:
+ boost::asio::io_service ioService_;
+ boost::thread thread_;
+ };
+}
diff --git a/Swiften/Network/Makefile.inc b/Swiften/Network/Makefile.inc
index b0f0fd1..3e4ece6 100644
--- a/Swiften/Network/Makefile.inc
+++ b/Swiften/Network/Makefile.inc
@@ -6,6 +6,7 @@ SWIFTEN_SOURCES += \
Swiften/Network/BoostConnectionFactory.cpp \
Swiften/Network/ConnectionServer.cpp \
Swiften/Network/IncomingConnection.cpp \
+ Swiften/Network/BoostIOServiceThread.cpp \
Swiften/Network/Timer.cpp
include Swiften/Network/UnitTest/Makefile.inc