diff options
83 files changed, 301 insertions, 322 deletions
diff --git a/Documentation/SwiftenDevelopersGuide/Examples/EchoBot/EchoBot1.cpp b/Documentation/SwiftenDevelopersGuide/Examples/EchoBot/EchoBot1.cpp index df1da12..ec9c583 100644 --- a/Documentation/SwiftenDevelopersGuide/Examples/EchoBot/EchoBot1.cpp +++ b/Documentation/SwiftenDevelopersGuide/Examples/EchoBot/EchoBot1.cpp @@ -11,7 +11,7 @@ using namespace Swift; int main(int, char**) { SimpleEventLoop eventLoop; - Client client(JID("echobot@wonderland.lit"), "mypass"); + Client client(&eventLoop, JID("echobot@wonderland.lit"), "mypass"); client.connect(); eventLoop.run(); diff --git a/Documentation/SwiftenDevelopersGuide/Examples/EchoBot/EchoBot2.cpp b/Documentation/SwiftenDevelopersGuide/Examples/EchoBot/EchoBot2.cpp index dcecbcb..fb24e46 100644 --- a/Documentation/SwiftenDevelopersGuide/Examples/EchoBot/EchoBot2.cpp +++ b/Documentation/SwiftenDevelopersGuide/Examples/EchoBot/EchoBot2.cpp @@ -20,7 +20,7 @@ void handleMessageReceived(Message::ref message); int main(int, char**) { SimpleEventLoop eventLoop; - client = new Client(JID("echobot@wonderland.lit"), "mypass"); + client = new Client(&eventLoop, JID("echobot@wonderland.lit"), "mypass"); client->onConnected.connect(&handleConnected); client->onMessageReceived.connect(bind(&handleMessageReceived, _1)); client->connect(); diff --git a/Documentation/SwiftenDevelopersGuide/Examples/EchoBot/EchoBot3.cpp b/Documentation/SwiftenDevelopersGuide/Examples/EchoBot/EchoBot3.cpp index b5e6972..d3e3d97 100644 --- a/Documentation/SwiftenDevelopersGuide/Examples/EchoBot/EchoBot3.cpp +++ b/Documentation/SwiftenDevelopersGuide/Examples/EchoBot/EchoBot3.cpp @@ -14,8 +14,8 @@ using namespace boost; class EchoBot { public: - EchoBot() { - client = new Client(JID("echobot@wonderland.lit"), "mypass"); + EchoBot(EventLoop* eventLoop) { + client = new Client(eventLoop, JID("echobot@wonderland.lit"), "mypass"); client->onConnected.connect(bind(&EchoBot::handleConnected, this)); client->onMessageReceived.connect( bind(&EchoBot::handleMessageReceived, this, _1)); @@ -47,7 +47,7 @@ class EchoBot { int main(int, char**) { SimpleEventLoop eventLoop; - EchoBot bot; + EchoBot bot(&eventLoop); eventLoop.run(); return 0; } diff --git a/Documentation/SwiftenDevelopersGuide/Examples/EchoBot/EchoBot4.cpp b/Documentation/SwiftenDevelopersGuide/Examples/EchoBot/EchoBot4.cpp index 9cedc43..e54346d 100644 --- a/Documentation/SwiftenDevelopersGuide/Examples/EchoBot/EchoBot4.cpp +++ b/Documentation/SwiftenDevelopersGuide/Examples/EchoBot/EchoBot4.cpp @@ -15,9 +15,9 @@ using namespace boost; //... class EchoBot { public: - EchoBot() { + EchoBot(EventLoop* eventLoop) { //... - client = new Client(JID("echobot@wonderland.lit"), "mypass"); + client = new Client(eventLoop, JID("echobot@wonderland.lit"), "mypass"); client->onConnected.connect(bind(&EchoBot::handleConnected, this)); client->onMessageReceived.connect( bind(&EchoBot::handleMessageReceived, this, _1)); @@ -82,7 +82,7 @@ class EchoBot { int main(int, char**) { SimpleEventLoop eventLoop; - EchoBot bot; + EchoBot bot(&eventLoop); eventLoop.run(); return 0; } diff --git a/Documentation/SwiftenDevelopersGuide/Examples/EchoBot/EchoBot5.cpp b/Documentation/SwiftenDevelopersGuide/Examples/EchoBot/EchoBot5.cpp index d675062..000b2ce 100644 --- a/Documentation/SwiftenDevelopersGuide/Examples/EchoBot/EchoBot5.cpp +++ b/Documentation/SwiftenDevelopersGuide/Examples/EchoBot/EchoBot5.cpp @@ -15,9 +15,9 @@ using namespace boost; //... class EchoBot { public: - EchoBot() { + EchoBot(EventLoop* eventLoop) { //... - client = new Client(JID("echobot@wonderland.lit"), "mypass"); + client = new Client(eventLoop, JID("echobot@wonderland.lit"), "mypass"); client->onConnected.connect(bind(&EchoBot::handleConnected, this)); client->onMessageReceived.connect( bind(&EchoBot::handleMessageReceived, this, _1)); @@ -90,7 +90,7 @@ class EchoBot { int main(int, char**) { SimpleEventLoop eventLoop; - EchoBot bot; + EchoBot bot(&eventLoop); eventLoop.run(); return 0; } diff --git a/Documentation/SwiftenDevelopersGuide/Examples/EchoBot/EchoComponent.cpp b/Documentation/SwiftenDevelopersGuide/Examples/EchoBot/EchoComponent.cpp index 67f469d..b99aec5 100644 --- a/Documentation/SwiftenDevelopersGuide/Examples/EchoBot/EchoComponent.cpp +++ b/Documentation/SwiftenDevelopersGuide/Examples/EchoBot/EchoComponent.cpp @@ -14,8 +14,8 @@ using namespace boost; class EchoComponent { public: - EchoComponent() { - component = new Component(JID("echo.wonderland.lit"), "EchoSecret"); + EchoComponent(EventLoop* eventLoop) { + component = new Component(eventLoop, JID("echo.wonderland.lit"), "EchoSecret"); component->onConnected.connect(bind(&EchoComponent::handleConnected, this)); component->onMessageReceived.connect( bind(&EchoComponent::handleMessageReceived, this, _1)); @@ -58,7 +58,7 @@ class EchoComponent { int main(int, char**) { SimpleEventLoop eventLoop; - EchoComponent bot; + EchoComponent bot(&eventLoop); eventLoop.run(); return 0; } diff --git a/Limber/main.cpp b/Limber/main.cpp index 45c6931..0ab4710 100644 --- a/Limber/main.cpp +++ b/Limber/main.cpp @@ -13,7 +13,7 @@ #include "Swiften/Elements/VCard.h" #include "Swiften/Server/SimpleUserRegistry.h" #include "Swiften/Base/IDGenerator.h" -#include "Swiften/EventLoop/MainEventLoop.h" +#include "Swiften/EventLoop/EventLoop.h" #include "Swiften/EventLoop/SimpleEventLoop.h" #include "Swiften/EventLoop/EventOwner.h" #include "Swiften/Elements/Stanza.h" @@ -29,8 +29,8 @@ using namespace Swift; class Server { public: - Server(UserRegistry* userRegistry) : userRegistry_(userRegistry) { - serverFromClientConnectionServer_ = BoostConnectionServer::create(5222, &boostIOServiceThread_.getIOService()); + Server(UserRegistry* userRegistry, EventLoop* eventLoop) : userRegistry_(userRegistry) { + serverFromClientConnectionServer_ = BoostConnectionServer::create(5222, &boostIOServiceThread_.getIOService(), eventLoop); serverFromClientConnectionServer_->onNewConnection.connect(boost::bind(&Server::handleNewConnection, this, _1)); serverFromClientConnectionServer_->start(); } @@ -96,7 +96,7 @@ int main() { userRegistry.addUser(JID("kevin@localhost"), "kevin"); userRegistry.addUser(JID("remko@limber.swift.im"), "remko"); userRegistry.addUser(JID("kevin@limber.swift.im"), "kevin"); - Server server(&userRegistry); + Server server(&userRegistry, &eventLoop); eventLoop.run(); return 0; } diff --git a/Slimber/CLI/main.cpp b/Slimber/CLI/main.cpp index d254cb1..5252373 100644 --- a/Slimber/CLI/main.cpp +++ b/Slimber/CLI/main.cpp @@ -14,7 +14,7 @@ int main() { SimpleEventLoop eventLoop; DummyMenulet menulet; - MainController controller(&menulet); + MainController controller(&menulet, &eventLoop); eventLoop.run(); return 0; diff --git a/Slimber/Cocoa/CocoaController.mm b/Slimber/Cocoa/CocoaController.mm index 437d85a..a0c4ef4 100644 --- a/Slimber/Cocoa/CocoaController.mm +++ b/Slimber/Cocoa/CocoaController.mm @@ -2,6 +2,7 @@ #include "Slimber/MainController.h" #include "Slimber/Cocoa/CocoaMenulet.h" +#include "Slimber/Cocoa/main.h" @implementation CocoaController @@ -13,7 +14,7 @@ - (void) awakeFromNib { menulet = new CocoaMenulet(); - main = new MainController(menulet); + main = new MainController(menulet, eventLoop); } @end diff --git a/Slimber/Cocoa/main.h b/Slimber/Cocoa/main.h new file mode 100644 index 0000000..681139d --- /dev/null +++ b/Slimber/Cocoa/main.h @@ -0,0 +1,11 @@ +/* + * Copyright (c) 2010 Remko Tronçon + * Licensed under the GNU General Public License v3. + * See Documentation/Licenses/GPLv3.txt for more information. + */ + +#pragma once + +#include "Swiften/EventLoop/Cocoa/CocoaEventLoop.h" + +extern Swift::CocoaEventLoop* eventLoop; diff --git a/Slimber/Cocoa/main.mm b/Slimber/Cocoa/main.mm index e267477..fc051e0 100644 --- a/Slimber/Cocoa/main.mm +++ b/Slimber/Cocoa/main.mm @@ -1,8 +1,13 @@ #include <Cocoa/Cocoa.h> +#include "Slimber/Cocoa/main.h" #include "Swiften/EventLoop/Cocoa/CocoaEventLoop.h" +Swift::CocoaEventLoop* eventLoop; + int main(int argc, char *argv[]) { - Swift::CocoaEventLoop eventLoop; - return NSApplicationMain(argc, const_cast<const char **>(argv)); + eventLoop = new Swift::CocoaEventLoop(); + int result = NSApplicationMain(argc, const_cast<const char **>(argv)); + delete eventLoop; + return result; } diff --git a/Slimber/MainController.cpp b/Slimber/MainController.cpp index 38c1a7c..e6c2ab5 100644 --- a/Slimber/MainController.cpp +++ b/Slimber/MainController.cpp @@ -22,8 +22,8 @@ using namespace Swift; -MainController::MainController(Menulet* menulet) : menulet(menulet) { - dnsSDQuerier = PlatformDNSSDQuerierFactory().createQuerier(); +MainController::MainController(Menulet* menulet, EventLoop* eventLoop) : menulet(menulet) { + dnsSDQuerier = PlatformDNSSDQuerierFactory(eventLoop).createQuerier(); assert(dnsSDQuerier); linkLocalServiceBrowser = new LinkLocalServiceBrowser(dnsSDQuerier); @@ -37,7 +37,7 @@ MainController::MainController(Menulet* menulet) : menulet(menulet) { vCardCollection = new FileVCardCollection( PlatformApplicationPathProvider("Slimber").getDataDir()); - server = new Server(5222, 5562, linkLocalServiceBrowser, vCardCollection); + server = new Server(5222, 5562, linkLocalServiceBrowser, vCardCollection, eventLoop); server->onStopped.connect( boost::bind(&MainController::handleServerStopped, this, _1)); server->onSelfConnected.connect( diff --git a/Slimber/MainController.h b/Slimber/MainController.h index de90932..4b341d9 100644 --- a/Slimber/MainController.h +++ b/Slimber/MainController.h @@ -16,6 +16,7 @@ namespace Swift { class LinkLocalServiceBrowser; class VCardCollection; class Server; + class EventLoop; } class MenuletController; @@ -23,7 +24,7 @@ class Menulet; class MainController { public: - MainController(Menulet* menulet); + MainController(Menulet* menulet, Swift::EventLoop* eventLoop); virtual ~MainController(); private: diff --git a/Slimber/Server.cpp b/Slimber/Server.cpp index 734f3b8..c6e700e 100644 --- a/Slimber/Server.cpp +++ b/Slimber/Server.cpp @@ -37,13 +37,15 @@ Server::Server( int clientConnectionPort, int linkLocalConnectionPort, LinkLocalServiceBrowser* linkLocalServiceBrowser, - VCardCollection* vCardCollection) : + VCardCollection* vCardCollection, + EventLoop* eventLoop) : linkLocalServiceRegistered(false), rosterRequested(false), clientConnectionPort(clientConnectionPort), linkLocalConnectionPort(linkLocalConnectionPort), linkLocalServiceBrowser(linkLocalServiceBrowser), vCardCollection(vCardCollection), + eventLoop(eventLoop), presenceManager(NULL), stopping(false) { linkLocalServiceBrowser->onServiceRegistered.connect( @@ -57,7 +59,7 @@ Server::~Server() { void Server::start() { assert(!serverFromClientConnectionServer); serverFromClientConnectionServer = BoostConnectionServer::create( - clientConnectionPort, &boostIOServiceThread.getIOService()); + clientConnectionPort, &boostIOServiceThread.getIOService(), eventLoop); serverFromClientConnectionServerSignalConnections.push_back( serverFromClientConnectionServer->onNewConnection.connect( boost::bind(&Server::handleNewClientConnection, this, _1))); @@ -67,7 +69,7 @@ void Server::start() { assert(!serverFromNetworkConnectionServer); serverFromNetworkConnectionServer = BoostConnectionServer::create( - linkLocalConnectionPort, &boostIOServiceThread.getIOService()); + linkLocalConnectionPort, &boostIOServiceThread.getIOService(), eventLoop); serverFromNetworkConnectionServerSignalConnections.push_back( serverFromNetworkConnectionServer->onNewConnection.connect( boost::bind(&Server::handleNewLinkLocalConnection, this, _1))); @@ -254,7 +256,7 @@ void Server::handleElementReceived(boost::shared_ptr<Element> element, boost::sh new LinkLocalConnector( *service, linkLocalServiceBrowser->getQuerier(), - BoostConnection::create(&boostIOServiceThread.getIOService()))); + BoostConnection::create(&boostIOServiceThread.getIOService(), eventLoop))); connector->onConnectFinished.connect( boost::bind(&Server::handleConnectFinished, this, connector, _1)); connectors.push_back(connector); diff --git a/Slimber/Server.h b/Slimber/Server.h index 864f705..039f351 100644 --- a/Slimber/Server.h +++ b/Slimber/Server.h @@ -32,6 +32,7 @@ namespace Swift { class SessionTracer; class RosterPayload; class Presence; + class EventLoop; class Server { public: @@ -39,7 +40,8 @@ namespace Swift { int clientConnectionPort, int linkLocalConnectionPort, LinkLocalServiceBrowser* browser, - VCardCollection* vCardCollection); + VCardCollection* vCardCollection, + EventLoop* eventLoop); ~Server(); void start(); @@ -102,6 +104,7 @@ namespace Swift { int linkLocalConnectionPort; LinkLocalServiceBrowser* linkLocalServiceBrowser; VCardCollection* vCardCollection; + EventLoop* eventLoop; LinkLocalPresenceManager* presenceManager; bool stopping; boost::shared_ptr<BoostConnectionServer> serverFromClientConnectionServer; diff --git a/Slimber/UnitTest/LinkLocalPresenceManagerTest.cpp b/Slimber/UnitTest/LinkLocalPresenceManagerTest.cpp index f8ee755..8c6710a 100644 --- a/Slimber/UnitTest/LinkLocalPresenceManagerTest.cpp +++ b/Slimber/UnitTest/LinkLocalPresenceManagerTest.cpp @@ -42,7 +42,7 @@ class LinkLocalPresenceManagerTest : public CppUnit::TestFixture { public: void setUp() { eventLoop = new DummyEventLoop(); - querier = boost::shared_ptr<FakeDNSSDQuerier>(new FakeDNSSDQuerier("wonderland.lit")); + querier = boost::shared_ptr<FakeDNSSDQuerier>(new FakeDNSSDQuerier("wonderland.lit", eventLoop)); browser = new LinkLocalServiceBrowser(querier); browser->start(); } diff --git a/Swift/Controllers/MainController.cpp b/Swift/Controllers/MainController.cpp index b02c78b..c9e6230 100644 --- a/Swift/Controllers/MainController.cpp +++ b/Swift/Controllers/MainController.cpp @@ -65,6 +65,7 @@ static const String CLIENT_NODE = "http://swift.im"; static const String SHOW_NOTIFICATIONS = "showNotifications"; MainController::MainController( + EventLoop* eventLoop, ChatWindowFactory* chatWindowFactory, MainWindowFactory *mainWindowFactory, LoginWindowFactory *loginWindowFactory, @@ -79,7 +80,8 @@ MainController::MainController( Dock* dock, Notifier* notifier, bool useDelayForLatency) : - timerFactory_(&boostIOServiceThread_.getIOService()), + eventLoop_(eventLoop), + timerFactory_(&boostIOServiceThread_.getIOService(), eventLoop), idleDetector_(&idleQuerier_, &timerFactory_, 100), storagesFactory_(storagesFactory), chatWindowFactory_(chatWindowFactory), @@ -361,7 +363,7 @@ void MainController::performLoginFromCachedCredentials() { } if (!client_) { storages_ = storagesFactory_->createStorages(jid_); - client_ = new Swift::Client(jid_, password_, storages_); + client_ = new Swift::Client(eventLoop_, jid_, password_, storages_); client_->onDataRead.connect(boost::bind(&XMLConsoleController::handleDataRead, xmlConsoleController_, _1)); client_->onDataWritten.connect(boost::bind(&XMLConsoleController::handleDataWritten, xmlConsoleController_, _1)); client_->onError.connect(boost::bind(&MainController::handleError, this, _1)); diff --git a/Swift/Controllers/MainController.h b/Swift/Controllers/MainController.h index 22d2559..709bacf 100644 --- a/Swift/Controllers/MainController.h +++ b/Swift/Controllers/MainController.h @@ -28,6 +28,7 @@ #include "Swift/Controllers/UIEvents/UIEvent.h" namespace Swift { + class EventLoop; class Client; class ChatWindowFactory; class ChatController; @@ -65,6 +66,7 @@ namespace Swift { class MainController { public: MainController( + EventLoop* eventLoop, ChatWindowFactory* chatWindowFactory, MainWindowFactory *mainWindowFactory, LoginWindowFactory *loginWindowFactory, @@ -107,6 +109,7 @@ namespace Swift { void handleNotificationClicked(const JID& jid); private: + EventLoop* eventLoop_; BoostIOServiceThread boostIOServiceThread_; BoostTimerFactory timerFactory_; PlatformIdleQuerier idleQuerier_; diff --git a/Swift/QtUI/QtSwift.cpp b/Swift/QtUI/QtSwift.cpp index d61f94c..77860d5 100644 --- a/Swift/QtUI/QtSwift.cpp +++ b/Swift/QtUI/QtSwift.cpp @@ -135,6 +135,7 @@ QtSwift::QtSwift(po::variables_map options) : autoUpdater_(NULL) { QtMUCSearchWindowFactory* mucSearchWindowFactory = new QtMUCSearchWindowFactory(); mucSearchWindowFactories_.push_back(mucSearchWindowFactory); MainController* mainController = new MainController( + &clientMainThreadCaller_, chatWindowFactory_, rosterWindowFactory, loginWindowFactory, diff --git a/Swift/QtUI/QtSwift.h b/Swift/QtUI/QtSwift.h index 59fa746..6817734 100644 --- a/Swift/QtUI/QtSwift.h +++ b/Swift/QtUI/QtSwift.h @@ -45,6 +45,7 @@ namespace Swift { class QtEventWindowFactory; class QtChatListWindowFactory; class QtMUCSearchWindowFactory; + class EventLoop; class QtSwift : public QObject { Q_OBJECT diff --git a/Swiften/Client/Client.cpp b/Swiften/Client/Client.cpp index 67e2051..45eeeff 100644 --- a/Swiften/Client/Client.cpp +++ b/Swiften/Client/Client.cpp @@ -22,7 +22,7 @@ namespace Swift { -Client::Client(const JID& jid, const String& password, Storages* storages) : CoreClient(jid, password), storages(storages) { +Client::Client(EventLoop* eventLoop, const JID& jid, const String& password, Storages* storages) : CoreClient(eventLoop, jid, password), storages(storages) { memoryStorages = new MemoryStorages(); softwareVersionResponder = new SoftwareVersionResponder(getIQRouter()); diff --git a/Swiften/Client/Client.h b/Swiften/Client/Client.h index 47a276a..7e11df9 100644 --- a/Swiften/Client/Client.h +++ b/Swiften/Client/Client.h @@ -39,7 +39,7 @@ namespace Swift { * this is NULL, * all data will be stored in memory (and be lost on shutdown) */ - Client(const JID& jid, const String& password, Storages* storages = NULL); + Client(EventLoop* eventLoop, const JID& jid, const String& password, Storages* storages = NULL); ~Client(); diff --git a/Swiften/Client/CoreClient.cpp b/Swiften/Client/CoreClient.cpp index 272a2a7..fa9dca0 100644 --- a/Swiften/Client/CoreClient.cpp +++ b/Swiften/Client/CoreClient.cpp @@ -23,7 +23,7 @@ namespace Swift { -CoreClient::CoreClient(const JID& jid, const String& password) : jid_(jid), password_(password), disconnectRequested_(false) { +CoreClient::CoreClient(EventLoop* eventLoop, const JID& jid, const String& password) : resolver_(eventLoop), jid_(jid), password_(password), eventLoop(eventLoop), disconnectRequested_(false) { stanzaChannel_ = new ClientSessionStanzaChannel(); stanzaChannel_->onMessageReceived.connect(boost::ref(onMessageReceived)); stanzaChannel_->onPresenceReceived.connect(boost::ref(onPresenceReceived)); @@ -31,8 +31,8 @@ CoreClient::CoreClient(const JID& jid, const String& password) : jid_(jid), pass stanzaChannel_->onAvailableChanged.connect(boost::bind(&CoreClient::handleStanzaChannelAvailableChanged, this, _1)); iqRouter_ = new IQRouter(stanzaChannel_); - connectionFactory_ = new BoostConnectionFactory(&MainBoostIOServiceThread::getInstance().getIOService()); - timerFactory_ = new BoostTimerFactory(&MainBoostIOServiceThread::getInstance().getIOService()); + connectionFactory_ = new BoostConnectionFactory(&MainBoostIOServiceThread::getInstance().getIOService(), eventLoop); + timerFactory_ = new BoostTimerFactory(&MainBoostIOServiceThread::getInstance().getIOService(), eventLoop); tlsLayerFactory_ = new PlatformTLSLayerFactory(); } diff --git a/Swiften/Client/CoreClient.h b/Swiften/Client/CoreClient.h index f440dfe..f6e0b6d 100644 --- a/Swiften/Client/CoreClient.h +++ b/Swiften/Client/CoreClient.h @@ -31,6 +31,7 @@ namespace Swift { class TimerFactory; class ClientSession; class BasicSessionStream; + class EventLoop; /** * The central class for communicating with an XMPP server. @@ -46,8 +47,9 @@ namespace Swift { public: /** * Constructs a client for the given JID with the given password. + * The given eventLoop will be used to post events to. */ - CoreClient(const JID& jid, const String& password); + CoreClient(EventLoop* eventLoop, const JID& jid, const String& password); ~CoreClient(); void setCertificate(const String& certificate); @@ -180,6 +182,7 @@ namespace Swift { PlatformDomainNameResolver resolver_; JID jid_; String password_; + EventLoop* eventLoop; ClientSessionStanzaChannel* stanzaChannel_; IQRouter* iqRouter_; Connector::ref connector_; diff --git a/Swiften/Component/Component.cpp b/Swiften/Component/Component.cpp index af3802d..579bca9 100644 --- a/Swiften/Component/Component.cpp +++ b/Swiften/Component/Component.cpp @@ -10,7 +10,7 @@ namespace Swift { -Component::Component(const JID& jid, const String& secret) : CoreComponent(jid, secret) { +Component::Component(EventLoop* eventLoop, const JID& jid, const String& secret) : CoreComponent(eventLoop, jid, secret) { softwareVersionResponder = new SoftwareVersionResponder(getIQRouter()); softwareVersionResponder->start(); } diff --git a/Swiften/Component/Component.h b/Swiften/Component/Component.h index a89deb3..b880725 100644 --- a/Swiften/Component/Component.h +++ b/Swiften/Component/Component.h @@ -19,7 +19,7 @@ namespace Swift { */ class Component : public CoreComponent { public: - Component(const JID& jid, const String& secret); + Component(EventLoop* eventLoop, const JID& jid, const String& secret); ~Component(); /** diff --git a/Swiften/Component/CoreComponent.cpp b/Swiften/Component/CoreComponent.cpp index c9d9051..af6ebe5 100644 --- a/Swiften/Component/CoreComponent.cpp +++ b/Swiften/Component/CoreComponent.cpp @@ -23,7 +23,7 @@ namespace Swift { -CoreComponent::CoreComponent(const JID& jid, const String& secret) : jid_(jid), secret_(secret), disconnectRequested_(false) { +CoreComponent::CoreComponent(EventLoop* eventLoop, const JID& jid, const String& secret) : eventLoop(eventLoop), resolver_(eventLoop), jid_(jid), secret_(secret), disconnectRequested_(false) { stanzaChannel_ = new ComponentSessionStanzaChannel(); stanzaChannel_->onMessageReceived.connect(boost::ref(onMessageReceived)); stanzaChannel_->onPresenceReceived.connect(boost::ref(onPresenceReceived)); @@ -31,8 +31,8 @@ CoreComponent::CoreComponent(const JID& jid, const String& secret) : jid_(jid), iqRouter_ = new IQRouter(stanzaChannel_); iqRouter_->setFrom(jid); - connectionFactory_ = new BoostConnectionFactory(&MainBoostIOServiceThread::getInstance().getIOService()); - timerFactory_ = new BoostTimerFactory(&MainBoostIOServiceThread::getInstance().getIOService()); + connectionFactory_ = new BoostConnectionFactory(&MainBoostIOServiceThread::getInstance().getIOService(), eventLoop); + timerFactory_ = new BoostTimerFactory(&MainBoostIOServiceThread::getInstance().getIOService(), eventLoop); tlsLayerFactory_ = new NullTLSLayerFactory(); } diff --git a/Swiften/Component/CoreComponent.h b/Swiften/Component/CoreComponent.h index 67f87ee..75e6bda 100644 --- a/Swiften/Component/CoreComponent.h +++ b/Swiften/Component/CoreComponent.h @@ -43,7 +43,7 @@ namespace Swift { */ class CoreComponent { public: - CoreComponent(const JID& jid, const String& secret); + CoreComponent(EventLoop* eventLoop, const JID& jid, const String& secret); ~CoreComponent(); void connect(const String& host, int port); @@ -88,6 +88,7 @@ namespace Swift { void handleDataWritten(const String&); private: + EventLoop* eventLoop; PlatformDomainNameResolver resolver_; JID jid_; String secret_; diff --git a/Swiften/Component/UnitTest/ComponentConnectorTest.cpp b/Swiften/Component/UnitTest/ComponentConnectorTest.cpp index 4648365..7d00b09 100644 --- a/Swiften/Component/UnitTest/ComponentConnectorTest.cpp +++ b/Swiften/Component/UnitTest/ComponentConnectorTest.cpp @@ -16,7 +16,6 @@ #include "Swiften/Network/HostAddressPort.h" #include "Swiften/Network/StaticDomainNameResolver.h" #include "Swiften/Network/DummyTimerFactory.h" -#include "Swiften/EventLoop/MainEventLoop.h" #include "Swiften/EventLoop/DummyEventLoop.h" using namespace Swift; @@ -38,8 +37,8 @@ class ComponentConnectorTest : public CppUnit::TestFixture { void setUp() { eventLoop = new DummyEventLoop(); - resolver = new StaticDomainNameResolver(); - connectionFactory = new MockConnectionFactory(); + resolver = new StaticDomainNameResolver(eventLoop); + connectionFactory = new MockConnectionFactory(eventLoop); timerFactory = new DummyTimerFactory(); } @@ -164,14 +163,14 @@ class ComponentConnectorTest : public CppUnit::TestFixture { struct MockConnection : public Connection { public: - MockConnection(const std::vector<HostAddressPort>& failingPorts, bool isResponsive) : failingPorts(failingPorts), isResponsive(isResponsive) {} + MockConnection(const std::vector<HostAddressPort>& failingPorts, bool isResponsive, EventLoop* eventLoop) : eventLoop(eventLoop), failingPorts(failingPorts), isResponsive(isResponsive) {} void listen() { assert(false); } void connect(const HostAddressPort& address) { hostAddressPort = address; if (isResponsive) { bool fail = std::find(failingPorts.begin(), failingPorts.end(), address) != failingPorts.end(); - MainEventLoop::postEvent(boost::bind(boost::ref(onConnectFinished), fail)); + eventLoop->postEvent(boost::bind(boost::ref(onConnectFinished), fail)); } } @@ -179,19 +178,21 @@ class ComponentConnectorTest : public CppUnit::TestFixture { void write(const ByteArray&) { assert(false); } HostAddressPort getLocalAddress() const { return HostAddressPort(); } + EventLoop* eventLoop; boost::optional<HostAddressPort> hostAddressPort; std::vector<HostAddressPort> failingPorts; bool isResponsive; }; struct MockConnectionFactory : public ConnectionFactory { - MockConnectionFactory() : isResponsive(true) { + MockConnectionFactory(EventLoop* eventLoop) : eventLoop(eventLoop), isResponsive(true) { } boost::shared_ptr<Connection> createConnection() { - return boost::shared_ptr<Connection>(new MockConnection(failingPorts, isResponsive)); + return boost::shared_ptr<Connection>(new MockConnection(failingPorts, isResponsive, eventLoop)); } + EventLoop* eventLoop; bool isResponsive; std::vector<HostAddressPort> failingPorts; }; diff --git a/Swiften/EventLoop/EventLoop.cpp b/Swiften/EventLoop/EventLoop.cpp index 2e9e021..f787e73 100644 --- a/Swiften/EventLoop/EventLoop.cpp +++ b/Swiften/EventLoop/EventLoop.cpp @@ -10,16 +10,12 @@ #include <boost/bind.hpp> #include <iostream> -#include "Swiften/EventLoop/MainEventLoop.h" - namespace Swift { EventLoop::EventLoop() : nextEventID_(0), handlingEvents_(false) { - MainEventLoop::setInstance(this); } EventLoop::~EventLoop() { - MainEventLoop::resetInstance(); } void EventLoop::handleEvent(const Event& event) { diff --git a/Swiften/EventLoop/MainEventLoop.cpp b/Swiften/EventLoop/MainEventLoop.cpp deleted file mode 100644 index dae3261..0000000 --- a/Swiften/EventLoop/MainEventLoop.cpp +++ /dev/null @@ -1,42 +0,0 @@ -/* - * Copyright (c) 2010 Remko Tronçon - * Licensed under the GNU General Public License v3. - * See Documentation/Licenses/GPLv3.txt for more information. - */ - -#include "Swiften/EventLoop/MainEventLoop.h" - -#include <iostream> -#include <typeinfo> - -namespace Swift { - -EventLoop* MainEventLoop::getInstance() { - if (!instance_) { - std::cerr << "No main event loop instantiated. Please instantiate the appropriate subclass of EventLoop (e.g. SimpleEventLoop, QtEventLoop) at the start of your application." << std::endl; - exit(-1); - } - return instance_; -} - -void MainEventLoop::setInstance(EventLoop* loop) { - assert(!instance_); - instance_ = loop; -} - -void MainEventLoop::resetInstance() { - assert(instance_); - instance_ = 0; -} - -void MainEventLoop::postEvent(boost::function<void ()> event, boost::shared_ptr<EventOwner> owner) { - getInstance()->postEvent(event, owner); -} - -void MainEventLoop::removeEventsFromOwner(boost::shared_ptr<EventOwner> owner) { - getInstance()->removeEventsFromOwner(owner); -} - -EventLoop* MainEventLoop::instance_ = 0; - -} diff --git a/Swiften/EventLoop/MainEventLoop.h b/Swiften/EventLoop/MainEventLoop.h deleted file mode 100644 index 5789db2..0000000 --- a/Swiften/EventLoop/MainEventLoop.h +++ /dev/null @@ -1,47 +0,0 @@ -/* - * Copyright (c) 2010 Remko Tronçon - * Licensed under the GNU General Public License v3. - * See Documentation/Licenses/GPLv3.txt for more information. - */ - -#ifndef SWIFTEN_MainEventLoop_H -#define SWIFTEN_MainEventLoop_H - -#include <boost/function.hpp> - -#include "Swiften/EventLoop/Deleter.h" -#include "Swiften/EventLoop/EventLoop.h" - -namespace Swift { - class EventLoop; - class EventOwner; - - class MainEventLoop { - friend class EventLoop; - - public: - /** - * Post an event from the given owner to the event loop. - * If the owner is destroyed, all events should be removed from the - * loop using removeEventsFromOwner(). - */ - static void postEvent(boost::function<void ()> event, boost::shared_ptr<EventOwner> owner = boost::shared_ptr<EventOwner>()); - - static void removeEventsFromOwner(boost::shared_ptr<EventOwner> owner); - - template<typename T> - static void deleteLater(T* t) { - getInstance()->postEvent(Deleter<T>(t), 0); - } - - private: - static void setInstance(EventLoop*); - static void resetInstance(); - static EventLoop* getInstance(); - - private: - static EventLoop* instance_; - }; -} - -#endif diff --git a/Swiften/EventLoop/SConscript b/Swiften/EventLoop/SConscript index 248d451..a98971f 100644 --- a/Swiften/EventLoop/SConscript +++ b/Swiften/EventLoop/SConscript @@ -3,7 +3,6 @@ Import("swiften_env") sources = [ "EventLoop.cpp", "EventOwner.cpp", - "MainEventLoop.cpp", "SimpleEventLoop.cpp", ] diff --git a/Swiften/Examples/ConnectivityTest/ConnectivityTest.cpp b/Swiften/Examples/ConnectivityTest/ConnectivityTest.cpp index e796e66..e870d83 100644 --- a/Swiften/Examples/ConnectivityTest/ConnectivityTest.cpp +++ b/Swiften/Examples/ConnectivityTest/ConnectivityTest.cpp @@ -9,7 +9,7 @@ #include "Swiften/Client/Client.h" #include "Swiften/Network/BoostTimer.h" -#include "Swiften/EventLoop/MainEventLoop.h" +#include "Swiften/EventLoop/EventLoop.h" #include "Swiften/Client/ClientXMLTracer.h" #include "Swiften/EventLoop/SimpleEventLoop.h" #include "Swiften/Network/BoostIOServiceThread.h" @@ -67,7 +67,7 @@ int main(int argc, char* argv[]) { connectHost = argv[argi++]; } - client = new Swift::Client(JID(jid), String(argv[argi++])); + client = new Swift::Client(&eventLoop, JID(jid), String(argv[argi++])); char* timeoutChar = argv[argi++]; int timeout = atoi(timeoutChar); timeout = (timeout ? timeout : 30) * 1000; @@ -84,7 +84,7 @@ int main(int argc, char* argv[]) { } { - BoostTimer::ref timer(BoostTimer::create(timeout, &MainBoostIOServiceThread::getInstance().getIOService())); + BoostTimer::ref timer(BoostTimer::create(timeout, &MainBoostIOServiceThread::getInstance().getIOService(), &eventLoop)); timer->onTick.connect(boost::bind(&SimpleEventLoop::stop, &eventLoop)); timer->start(); diff --git a/Swiften/Examples/LinkLocalTool/main.cpp b/Swiften/Examples/LinkLocalTool/main.cpp index ccecd1a..65fc9bc 100644 --- a/Swiften/Examples/LinkLocalTool/main.cpp +++ b/Swiften/Examples/LinkLocalTool/main.cpp @@ -23,7 +23,7 @@ int main(int argc, char* argv[]) { } SimpleEventLoop eventLoop; - PlatformDNSSDQuerierFactory factory; + PlatformDNSSDQuerierFactory factory(&eventLoop); boost::shared_ptr<DNSSDQuerier> querier = factory.createQuerier(); querier->start(); diff --git a/Swiften/Examples/SendFile/SendFile.cpp b/Swiften/Examples/SendFile/SendFile.cpp index da0b2fe..6f72480 100644 --- a/Swiften/Examples/SendFile/SendFile.cpp +++ b/Swiften/Examples/SendFile/SendFile.cpp @@ -9,7 +9,7 @@ #include "Swiften/Client/Client.h" #include "Swiften/Network/BoostTimer.h" -#include "Swiften/EventLoop/MainEventLoop.h" +#include "Swiften/EventLoop/EventLoop.h" #include "Swiften/Client/ClientXMLTracer.h" #include "Swiften/EventLoop/SimpleEventLoop.h" #include "Swiften/Network/MainBoostIOServiceThread.h" @@ -27,10 +27,10 @@ int exitCode = 2; class FileSender { public: FileSender(const JID& jid, const String& password, const JID& recipient, const boost::filesystem::path& file, int port) : jid(jid), password(password), recipient(recipient), file(file), transfer(NULL) { - connectionServer = BoostConnectionServer::create(port, &MainBoostIOServiceThread::getInstance().getIOService()); + connectionServer = BoostConnectionServer::create(port, &MainBoostIOServiceThread::getInstance().getIOService(), &eventLoop); socksBytestreamServer = new SOCKS5BytestreamServer(connectionServer); - client = new Swift::Client(jid, password); + client = new Swift::Client(&eventLoop, jid, password); client->onConnected.connect(boost::bind(&FileSender::handleConnected, this)); client->onError.connect(boost::bind(&FileSender::handleError, this, _1)); //tracer = new ClientXMLTracer(client); diff --git a/Swiften/Examples/SendMessage/SendMessage.cpp b/Swiften/Examples/SendMessage/SendMessage.cpp index 2ba5f3b..d9ed923 100644 --- a/Swiften/Examples/SendMessage/SendMessage.cpp +++ b/Swiften/Examples/SendMessage/SendMessage.cpp @@ -9,7 +9,7 @@ #include "Swiften/Client/Client.h" #include "Swiften/Network/BoostTimer.h" -#include "Swiften/EventLoop/MainEventLoop.h" +#include "Swiften/EventLoop/EventLoop.h" #include "Swiften/Client/ClientXMLTracer.h" #include "Swiften/EventLoop/SimpleEventLoop.h" #include "Swiften/Network/BoostIOServiceThread.h" @@ -57,7 +57,7 @@ int main(int argc, char* argv[]) { connectHost = argv[argi++]; } - client = new Swift::Client(JID(jid), String(argv[argi++])); + client = new Swift::Client(&eventLoop, JID(jid), String(argv[argi++])); recipient = JID(argv[argi++]); messageBody = std::string(argv[argi++]); @@ -72,7 +72,7 @@ int main(int argc, char* argv[]) { } { - BoostTimer::ref timer(BoostTimer::create(30000, &MainBoostIOServiceThread::getInstance().getIOService())); + BoostTimer::ref timer(BoostTimer::create(30000, &MainBoostIOServiceThread::getInstance().getIOService(), &eventLoop)); timer->onTick.connect(boost::bind(&SimpleEventLoop::stop, &eventLoop)); timer->start(); diff --git a/Swiften/FileTransfer/UnitTest/SOCKS5BytestreamServerSessionTest.cpp b/Swiften/FileTransfer/UnitTest/SOCKS5BytestreamServerSessionTest.cpp index 574b35b..b3b93ac 100644 --- a/Swiften/FileTransfer/UnitTest/SOCKS5BytestreamServerSessionTest.cpp +++ b/Swiften/FileTransfer/UnitTest/SOCKS5BytestreamServerSessionTest.cpp @@ -33,7 +33,7 @@ class SOCKS5BytestreamServerSessionTest : public CppUnit::TestFixture { void setUp() { receivedDataChunks = 0; eventLoop = new DummyEventLoop(); - connection = boost::shared_ptr<DummyConnection>(new DummyConnection()); + connection = boost::shared_ptr<DummyConnection>(new DummyConnection(eventLoop)); connection->onDataSent.connect(boost::bind(&SOCKS5BytestreamServerSessionTest::handleDataWritten, this, _1)); stream1 = boost::shared_ptr<ByteArrayReadBytestream>(new ByteArrayReadBytestream(ByteArray("abcdefg"))); } diff --git a/Swiften/LinkLocal/DNSSD/Avahi/AvahiBrowseQuery.h b/Swiften/LinkLocal/DNSSD/Avahi/AvahiBrowseQuery.h index f8ec795..3bee907 100644 --- a/Swiften/LinkLocal/DNSSD/Avahi/AvahiBrowseQuery.h +++ b/Swiften/LinkLocal/DNSSD/Avahi/AvahiBrowseQuery.h @@ -10,7 +10,7 @@ #include "Swiften/LinkLocal/DNSSD/Avahi/AvahiQuery.h" #include "Swiften/LinkLocal/DNSSD/DNSSDBrowseQuery.h" -#include "Swiften/EventLoop/MainEventLoop.h" +#include "Swiften/EventLoop/EventLoop.h" namespace Swift { class AvahiQuerier; @@ -27,7 +27,7 @@ namespace Swift { browser = avahi_service_browser_new(querier->getClient(), AVAHI_IF_UNSPEC, AVAHI_PROTO_UNSPEC, "_presence._tcp", NULL, static_cast<AvahiLookupFlags>(0), &handleServiceDiscoveredStatic, this); if (!browser) { std::cout << "Error" << std::endl; - MainEventLoop::postEvent(boost::bind(boost::ref(onError)), shared_from_this()); + eventLoop->postEvent(boost::bind(boost::ref(onError)), shared_from_this()); } avahi_threaded_poll_unlock(querier->getThreadedPoll()); } @@ -49,18 +49,18 @@ namespace Swift { switch (event) { case AVAHI_BROWSER_FAILURE: std::cout << "Service browse error" << std::endl; - MainEventLoop::postEvent(boost::bind(boost::ref(onError)), shared_from_this()); + eventLoop->postEvent(boost::bind(boost::ref(onError)), shared_from_this()); break; case AVAHI_BROWSER_NEW: { DNSSDServiceID service(name, domain, type, interfaceIndex); std::cout << "Service discovered " << name << " " << domain << " " << type << " " << interfaceIndex << std::endl; - MainEventLoop::postEvent(boost::bind(boost::ref(onServiceAdded), service), shared_from_this()); + eventLoop->postEvent(boost::bind(boost::ref(onServiceAdded), service), shared_from_this()); break; } case AVAHI_BROWSER_REMOVE: { std::cout << "Service went away " << name << " " << domain << " " << type << " " << interfaceIndex << std::endl; DNSSDServiceID service(name, domain, type, interfaceIndex); - MainEventLoop::postEvent(boost::bind(boost::ref(onServiceRemoved), service), shared_from_this()); + eventLoop->postEvent(boost::bind(boost::ref(onServiceRemoved), service), shared_from_this()); break; } case AVAHI_BROWSER_ALL_FOR_NOW: diff --git a/Swiften/LinkLocal/DNSSD/Avahi/AvahiRegisterQuery.h b/Swiften/LinkLocal/DNSSD/Avahi/AvahiRegisterQuery.h index 2045328..3e5a758 100644 --- a/Swiften/LinkLocal/DNSSD/Avahi/AvahiRegisterQuery.h +++ b/Swiften/LinkLocal/DNSSD/Avahi/AvahiRegisterQuery.h @@ -11,7 +11,7 @@ #include "Swiften/LinkLocal/DNSSD/Avahi/AvahiQuery.h" #include "Swiften/LinkLocal/DNSSD/DNSSDRegisterQuery.h" #include "Swiften/Base/ByteArray.h" -#include "Swiften/EventLoop/MainEventLoop.h" +#include "Swiften/EventLoop/EventLoop.h" namespace Swift { class AvahiQuerier; @@ -29,7 +29,7 @@ namespace Swift { group = avahi_entry_group_new(querier->getClient(), handleEntryGroupChange, this); if (!group) { std::cout << "Error ceating entry group" << std::endl; - MainEventLoop::postEvent(boost::bind(boost::ref(onRegisterFinished), boost::optional<DNSSDServiceID>()), shared_from_this()); + eventLoop->postEvent(boost::bind(boost::ref(onRegisterFinished), boost::optional<DNSSDServiceID>()), shared_from_this()); } } @@ -61,7 +61,7 @@ namespace Swift { int result = avahi_entry_group_add_service_strlst(group, AVAHI_IF_UNSPEC, AVAHI_PROTO_UNSPEC, static_cast<AvahiPublishFlags>(0), name.getUTF8Data(), "_presence._tcp", NULL, NULL, port, txtList); if (result < 0) { std::cout << "Error registering service: " << avahi_strerror(result) << std::endl; - MainEventLoop::postEvent(boost::bind(boost::ref(onRegisterFinished), boost::optional<DNSSDServiceID>()), shared_from_this()); + eventLoop->postEvent(boost::bind(boost::ref(onRegisterFinished), boost::optional<DNSSDServiceID>()), shared_from_this()); } result = avahi_entry_group_commit(group); if (result < 0) { @@ -78,7 +78,7 @@ namespace Swift { switch (state) { case AVAHI_ENTRY_GROUP_ESTABLISHED : // Domain is a hack! - MainEventLoop::postEvent(boost::bind(boost::ref(onRegisterFinished), boost::optional<DNSSDServiceID>(DNSSDServiceID(name, "local", "_presence._tcp", 0))), shared_from_this()); + eventLoop->postEvent(boost::bind(boost::ref(onRegisterFinished), boost::optional<DNSSDServiceID>(DNSSDServiceID(name, "local", "_presence._tcp", 0))), shared_from_this()); std::cout << "Entry group established" << std::endl; break; case AVAHI_ENTRY_GROUP_COLLISION : { @@ -106,7 +106,7 @@ namespace Swift { if (result != kDNSServiceErr_NoError) { sdRef = NULL; }*/ - //MainEventLoop::postEvent(boost::bind(boost::ref(onRegisterFinished), boost::optional<DNSSDServiceID>()), shared_from_this()); + //eventLoop->postEvent(boost::bind(boost::ref(onRegisterFinished), boost::optional<DNSSDServiceID>()), shared_from_this()); } } @@ -117,7 +117,7 @@ namespace Swift { void handleServiceRegistered(DNSServiceErrorType errorCode, const char *name, const char *regtype, const char *domain) { if (errorCode != kDNSServiceErr_NoError) { - MainEventLoop::postEvent(boost::bind(boost::ref(onRegisterFinished), boost::optional<DNSSDServiceID>()), shared_from_this()); + eventLoop->postEvent(boost::bind(boost::ref(onRegisterFinished), boost::optional<DNSSDServiceID>()), shared_from_this()); } else { } diff --git a/Swiften/LinkLocal/DNSSD/Avahi/AvahiResolveHostnameQuery.h b/Swiften/LinkLocal/DNSSD/Avahi/AvahiResolveHostnameQuery.h index e069629..6803fd0 100644 --- a/Swiften/LinkLocal/DNSSD/Avahi/AvahiResolveHostnameQuery.h +++ b/Swiften/LinkLocal/DNSSD/Avahi/AvahiResolveHostnameQuery.h @@ -9,7 +9,7 @@ #include "Swiften/Base/String.h" #include "Swiften/LinkLocal/DNSSD/Avahi/AvahiQuery.h" #include "Swiften/LinkLocal/DNSSD/DNSSDResolveHostnameQuery.h" -#include "Swiften/EventLoop/MainEventLoop.h" +#include "Swiften/EventLoop/EventLoop.h" #include "Swiften/Network/HostAddress.h" #include <netinet/in.h> @@ -24,7 +24,7 @@ namespace Swift { } void run() { - MainEventLoop::postEvent(boost::bind(boost::ref(onHostnameResolved), boost::optional<HostAddress>(HostAddress(hostname))), shared_from_this()); + eventLoop->postEvent(boost::bind(boost::ref(onHostnameResolved), boost::optional<HostAddress>(HostAddress(hostname))), shared_from_this()); } void finish() { diff --git a/Swiften/LinkLocal/DNSSD/Avahi/AvahiResolveServiceQuery.h b/Swiften/LinkLocal/DNSSD/Avahi/AvahiResolveServiceQuery.h index 4709677..402f84f 100644 --- a/Swiften/LinkLocal/DNSSD/Avahi/AvahiResolveServiceQuery.h +++ b/Swiften/LinkLocal/DNSSD/Avahi/AvahiResolveServiceQuery.h @@ -10,7 +10,7 @@ #include "Swiften/LinkLocal/DNSSD/DNSSDResolveServiceQuery.h" #include "Swiften/LinkLocal/LinkLocalServiceInfo.h" #include "Swiften/Base/ByteArray.h" -#include "Swiften/EventLoop/MainEventLoop.h" +#include "Swiften/EventLoop/EventLoop.h" namespace Swift { class AvahiQuerier; @@ -27,7 +27,7 @@ namespace Swift { resolver = avahi_service_resolver_new(querier->getClient(), service.getNetworkInterfaceID(), AVAHI_PROTO_UNSPEC, service.getName().getUTF8Data(), service.getType().getUTF8Data(), service.getDomain().getUTF8Data(), AVAHI_PROTO_UNSPEC, static_cast<AvahiLookupFlags>(0), handleServiceResolvedStatic, this); if (!resolver) { std::cout << "Error starting resolver" << std::endl; - MainEventLoop::postEvent(boost::bind(boost::ref(onServiceResolved), boost::optional<Result>()), shared_from_this()); + eventLoop->postEvent(boost::bind(boost::ref(onServiceResolved), boost::optional<Result>()), shared_from_this()); } avahi_threaded_poll_unlock(querier->getThreadedPoll()); } @@ -50,7 +50,7 @@ namespace Swift { switch(event) { case AVAHI_RESOLVER_FAILURE: std::cout << "Resolve error " << avahi_strerror(avahi_client_errno(avahi_service_resolver_get_client(resolver))) << std::endl; - MainEventLoop::postEvent(boost::bind(boost::ref(onServiceResolved), boost::optional<Result>()), shared_from_this()); + eventLoop->postEvent(boost::bind(boost::ref(onServiceResolved), boost::optional<Result>()), shared_from_this()); break; case AVAHI_RESOLVER_FOUND: { std::cout << "Success" << std::endl; @@ -64,7 +64,7 @@ namespace Swift { // FIXME: Probably not accurate String fullname = String(name) + "." + String(type) + "." + String(domain) + "."; std::cout << "Result: " << fullname << "->" << String(a) << ":" << port << std::endl; - MainEventLoop::postEvent( + eventLoop->postEvent( boost::bind( boost::ref(onServiceResolved), Result(fullname, String(a), port, txtRecord)), diff --git a/Swiften/LinkLocal/DNSSD/Bonjour/BonjourBrowseQuery.h b/Swiften/LinkLocal/DNSSD/Bonjour/BonjourBrowseQuery.h index bfecea9..52c47d7 100644 --- a/Swiften/LinkLocal/DNSSD/Bonjour/BonjourBrowseQuery.h +++ b/Swiften/LinkLocal/DNSSD/Bonjour/BonjourBrowseQuery.h @@ -8,14 +8,14 @@ #include "Swiften/LinkLocal/DNSSD/Bonjour/BonjourQuery.h" #include "Swiften/LinkLocal/DNSSD/DNSSDBrowseQuery.h" -#include "Swiften/EventLoop/MainEventLoop.h" +#include "Swiften/EventLoop/EventLoop.h" namespace Swift { class BonjourQuerier; class BonjourBrowseQuery : public DNSSDBrowseQuery, public BonjourQuery { public: - BonjourBrowseQuery(boost::shared_ptr<BonjourQuerier> q) : BonjourQuery(q) { + BonjourBrowseQuery(boost::shared_ptr<BonjourQuerier> q, EventLoop* eventLoop) : BonjourQuery(q, eventLoop) { DNSServiceErrorType result = DNSServiceBrowse( &sdRef, 0, 0, "_presence._tcp", 0, &BonjourBrowseQuery::handleServiceDiscoveredStatic, this); @@ -26,7 +26,7 @@ namespace Swift { void startBrowsing() { if (!sdRef) { - MainEventLoop::postEvent(boost::bind(boost::ref(onError)), shared_from_this()); + eventLoop->postEvent(boost::bind(boost::ref(onError)), shared_from_this()); } else { run(); @@ -44,16 +44,16 @@ namespace Swift { void handleServiceDiscovered(DNSServiceFlags flags, uint32_t interfaceIndex, DNSServiceErrorType errorCode, const char *name, const char *type, const char *domain) { if (errorCode != kDNSServiceErr_NoError) { - MainEventLoop::postEvent(boost::bind(boost::ref(onError)), shared_from_this()); + eventLoop->postEvent(boost::bind(boost::ref(onError)), shared_from_this()); } else { //std::cout << "Discovered service: name:" << name << " domain:" << domain << " type: " << type << std::endl; DNSSDServiceID service(name, domain, type, interfaceIndex); if (flags & kDNSServiceFlagsAdd) { - MainEventLoop::postEvent(boost::bind(boost::ref(onServiceAdded), service), shared_from_this()); + eventLoop->postEvent(boost::bind(boost::ref(onServiceAdded), service), shared_from_this()); } else { - MainEventLoop::postEvent(boost::bind(boost::ref(onServiceRemoved), service), shared_from_this()); + eventLoop->postEvent(boost::bind(boost::ref(onServiceRemoved), service), shared_from_this()); } } } diff --git a/Swiften/LinkLocal/DNSSD/Bonjour/BonjourQuerier.cpp b/Swiften/LinkLocal/DNSSD/Bonjour/BonjourQuerier.cpp index 55c64c4..03271d6 100644 --- a/Swiften/LinkLocal/DNSSD/Bonjour/BonjourQuerier.cpp +++ b/Swiften/LinkLocal/DNSSD/Bonjour/BonjourQuerier.cpp @@ -18,7 +18,7 @@ namespace Swift { -BonjourQuerier::BonjourQuerier() : stopRequested(false), thread(0) { +BonjourQuerier::BonjourQuerier(EventLoop* eventLoop) : eventLoop(eventLoop), stopRequested(false), thread(0) { int fds[2]; int result = pipe(fds); assert(result == 0); @@ -32,19 +32,19 @@ BonjourQuerier::~BonjourQuerier() { } boost::shared_ptr<DNSSDBrowseQuery> BonjourQuerier::createBrowseQuery() { - return boost::shared_ptr<DNSSDBrowseQuery>(new BonjourBrowseQuery(shared_from_this())); + return boost::shared_ptr<DNSSDBrowseQuery>(new BonjourBrowseQuery(shared_from_this(), eventLoop)); } boost::shared_ptr<DNSSDRegisterQuery> BonjourQuerier::createRegisterQuery(const String& name, int port, const ByteArray& info) { - return boost::shared_ptr<DNSSDRegisterQuery>(new BonjourRegisterQuery(name, port, info, shared_from_this())); + return boost::shared_ptr<DNSSDRegisterQuery>(new BonjourRegisterQuery(name, port, info, shared_from_this(), eventLoop)); } boost::shared_ptr<DNSSDResolveServiceQuery> BonjourQuerier::createResolveServiceQuery(const DNSSDServiceID& service) { - return boost::shared_ptr<DNSSDResolveServiceQuery>(new BonjourResolveServiceQuery(service, shared_from_this())); + return boost::shared_ptr<DNSSDResolveServiceQuery>(new BonjourResolveServiceQuery(service, shared_from_this(), eventLoop)); } boost::shared_ptr<DNSSDResolveHostnameQuery> BonjourQuerier::createResolveHostnameQuery(const String& hostname, int interfaceIndex) { - return boost::shared_ptr<DNSSDResolveHostnameQuery>(new BonjourResolveHostnameQuery(hostname, interfaceIndex, shared_from_this())); + return boost::shared_ptr<DNSSDResolveHostnameQuery>(new BonjourResolveHostnameQuery(hostname, interfaceIndex, shared_from_this(), eventLoop)); } void BonjourQuerier::addRunningQuery(boost::shared_ptr<BonjourQuery> query) { diff --git a/Swiften/LinkLocal/DNSSD/Bonjour/BonjourQuerier.h b/Swiften/LinkLocal/DNSSD/Bonjour/BonjourQuerier.h index a6c7d4d..916acc3 100644 --- a/Swiften/LinkLocal/DNSSD/Bonjour/BonjourQuerier.h +++ b/Swiften/LinkLocal/DNSSD/Bonjour/BonjourQuerier.h @@ -22,7 +22,7 @@ namespace Swift { public DNSSDQuerier, public boost::enable_shared_from_this<BonjourQuerier> { public: - BonjourQuerier(); + BonjourQuerier(EventLoop* eventLoop); ~BonjourQuerier(); boost::shared_ptr<DNSSDBrowseQuery> createBrowseQuery(); @@ -45,6 +45,7 @@ namespace Swift { void run(); private: + EventLoop* eventLoop; bool stopRequested; boost::thread* thread; boost::mutex runningQueriesMutex; diff --git a/Swiften/LinkLocal/DNSSD/Bonjour/BonjourQuery.cpp b/Swiften/LinkLocal/DNSSD/Bonjour/BonjourQuery.cpp index c496072..d7ff5d5 100644 --- a/Swiften/LinkLocal/DNSSD/Bonjour/BonjourQuery.cpp +++ b/Swiften/LinkLocal/DNSSD/Bonjour/BonjourQuery.cpp @@ -9,7 +9,7 @@ namespace Swift { -BonjourQuery::BonjourQuery(boost::shared_ptr<BonjourQuerier> q) : querier(q), sdRef(0) { +BonjourQuery::BonjourQuery(boost::shared_ptr<BonjourQuerier> q, EventLoop* eventLoop) : eventLoop(eventLoop), querier(q), sdRef(0) { } BonjourQuery::~BonjourQuery() { diff --git a/Swiften/LinkLocal/DNSSD/Bonjour/BonjourQuery.h b/Swiften/LinkLocal/DNSSD/Bonjour/BonjourQuery.h index e13883e..e3cd9a5 100644 --- a/Swiften/LinkLocal/DNSSD/Bonjour/BonjourQuery.h +++ b/Swiften/LinkLocal/DNSSD/Bonjour/BonjourQuery.h @@ -15,12 +15,13 @@ namespace Swift { class BonjourQuerier; + class EventLoop; class BonjourQuery : public EventOwner, public boost::enable_shared_from_this<BonjourQuery> { public: - BonjourQuery(boost::shared_ptr<BonjourQuerier>); + BonjourQuery(boost::shared_ptr<BonjourQuerier>, EventLoop* eventLoop); virtual ~BonjourQuery(); void processResult(); @@ -31,6 +32,7 @@ namespace Swift { void finish(); protected: + EventLoop* eventLoop; boost::shared_ptr<BonjourQuerier> querier; mutable boost::mutex sdRefMutex; DNSServiceRef sdRef; diff --git a/Swiften/LinkLocal/DNSSD/Bonjour/BonjourRegisterQuery.h b/Swiften/LinkLocal/DNSSD/Bonjour/BonjourRegisterQuery.h index 8155a33..9d8516b 100644 --- a/Swiften/LinkLocal/DNSSD/Bonjour/BonjourRegisterQuery.h +++ b/Swiften/LinkLocal/DNSSD/Bonjour/BonjourRegisterQuery.h @@ -9,14 +9,14 @@ #include "Swiften/LinkLocal/DNSSD/Bonjour/BonjourQuery.h" #include "Swiften/LinkLocal/DNSSD/DNSSDRegisterQuery.h" #include "Swiften/Base/ByteArray.h" -#include "Swiften/EventLoop/MainEventLoop.h" +#include "Swiften/EventLoop/EventLoop.h" namespace Swift { class BonjourQuerier; class BonjourRegisterQuery : public DNSSDRegisterQuery, public BonjourQuery { public: - BonjourRegisterQuery(const String& name, int port, const ByteArray& txtRecord, boost::shared_ptr<BonjourQuerier> querier) : BonjourQuery(querier) { + BonjourRegisterQuery(const String& name, int port, const ByteArray& txtRecord, boost::shared_ptr<BonjourQuerier> querier, EventLoop* eventLoop) : BonjourQuery(querier, eventLoop) { DNSServiceErrorType result = DNSServiceRegister( &sdRef, 0, 0, name.getUTF8Data(), "_presence._tcp", NULL, NULL, port, txtRecord.getSize(), txtRecord.getData(), @@ -31,7 +31,7 @@ namespace Swift { run(); } else { - MainEventLoop::postEvent(boost::bind(boost::ref(onRegisterFinished), boost::optional<DNSSDServiceID>()), shared_from_this()); + eventLoop->postEvent(boost::bind(boost::ref(onRegisterFinished), boost::optional<DNSSDServiceID>()), shared_from_this()); } } @@ -51,10 +51,10 @@ namespace Swift { void handleServiceRegistered(DNSServiceErrorType errorCode, const char *name, const char *regtype, const char *domain) { if (errorCode != kDNSServiceErr_NoError) { - MainEventLoop::postEvent(boost::bind(boost::ref(onRegisterFinished), boost::optional<DNSSDServiceID>()), shared_from_this()); + eventLoop->postEvent(boost::bind(boost::ref(onRegisterFinished), boost::optional<DNSSDServiceID>()), shared_from_this()); } else { - MainEventLoop::postEvent(boost::bind(boost::ref(onRegisterFinished), boost::optional<DNSSDServiceID>(DNSSDServiceID(name, domain, regtype, 0))), shared_from_this()); + eventLoop->postEvent(boost::bind(boost::ref(onRegisterFinished), boost::optional<DNSSDServiceID>(DNSSDServiceID(name, domain, regtype, 0))), shared_from_this()); } } }; diff --git a/Swiften/LinkLocal/DNSSD/Bonjour/BonjourResolveHostnameQuery.h b/Swiften/LinkLocal/DNSSD/Bonjour/BonjourResolveHostnameQuery.h index de52321..16e9be6 100644 --- a/Swiften/LinkLocal/DNSSD/Bonjour/BonjourResolveHostnameQuery.h +++ b/Swiften/LinkLocal/DNSSD/Bonjour/BonjourResolveHostnameQuery.h @@ -11,7 +11,7 @@ #include "Swiften/Base/String.h" #include "Swiften/LinkLocal/DNSSD/Bonjour/BonjourQuery.h" #include "Swiften/LinkLocal/DNSSD/DNSSDResolveHostnameQuery.h" -#include "Swiften/EventLoop/MainEventLoop.h" +#include "Swiften/EventLoop/EventLoop.h" #include "Swiften/Network/HostAddress.h" #include <netinet/in.h> @@ -21,7 +21,7 @@ namespace Swift { class BonjourResolveHostnameQuery : public DNSSDResolveHostnameQuery, public BonjourQuery { public: - BonjourResolveHostnameQuery(const String& hostname, int interfaceIndex, boost::shared_ptr<BonjourQuerier> querier) : BonjourQuery(querier) { + BonjourResolveHostnameQuery(const String& hostname, int interfaceIndex, boost::shared_ptr<BonjourQuerier> querier, EventLoop* eventLoop) : BonjourQuery(querier, eventLoop) { DNSServiceErrorType result = DNSServiceGetAddrInfo( &sdRef, 0, interfaceIndex, kDNSServiceProtocol_IPv4, hostname.getUTF8Data(), @@ -37,7 +37,7 @@ namespace Swift { BonjourQuery::run(); } else { - MainEventLoop::postEvent(boost::bind(boost::ref(onHostnameResolved), boost::optional<HostAddress>()), shared_from_this()); + eventLoop->postEvent(boost::bind(boost::ref(onHostnameResolved), boost::optional<HostAddress>()), shared_from_this()); } } @@ -52,7 +52,7 @@ namespace Swift { void handleHostnameResolved(DNSServiceErrorType errorCode, const struct sockaddr *rawAddress) { if (errorCode) { - MainEventLoop::postEvent( + eventLoop->postEvent( boost::bind(boost::ref(onHostnameResolved), boost::optional<HostAddress>()), shared_from_this()); @@ -61,7 +61,7 @@ namespace Swift { assert(rawAddress->sa_family == AF_INET); const sockaddr_in* sa = reinterpret_cast<const sockaddr_in*>(rawAddress); uint32_t address = ntohl(sa->sin_addr.s_addr); - MainEventLoop::postEvent(boost::bind( + eventLoop->postEvent(boost::bind( boost::ref(onHostnameResolved), HostAddress(reinterpret_cast<unsigned char*>(&address), 4)), shared_from_this()); diff --git a/Swiften/LinkLocal/DNSSD/Bonjour/BonjourResolveServiceQuery.h b/Swiften/LinkLocal/DNSSD/Bonjour/BonjourResolveServiceQuery.h index 38121ca..136b366 100644 --- a/Swiften/LinkLocal/DNSSD/Bonjour/BonjourResolveServiceQuery.h +++ b/Swiften/LinkLocal/DNSSD/Bonjour/BonjourResolveServiceQuery.h @@ -10,14 +10,14 @@ #include "Swiften/LinkLocal/DNSSD/DNSSDResolveServiceQuery.h" #include "Swiften/LinkLocal/LinkLocalServiceInfo.h" #include "Swiften/Base/ByteArray.h" -#include "Swiften/EventLoop/MainEventLoop.h" +#include "Swiften/EventLoop/EventLoop.h" namespace Swift { class BonjourQuerier; class BonjourResolveServiceQuery : public DNSSDResolveServiceQuery, public BonjourQuery { public: - BonjourResolveServiceQuery(const DNSSDServiceID& service, boost::shared_ptr<BonjourQuerier> querier) : BonjourQuery(querier) { + BonjourResolveServiceQuery(const DNSSDServiceID& service, boost::shared_ptr<BonjourQuerier> querier, EventLoop* eventLoop) : BonjourQuery(querier, eventLoop) { DNSServiceErrorType result = DNSServiceResolve( &sdRef, 0, service.getNetworkInterfaceID(), service.getName().getUTF8Data(), service.getType().getUTF8Data(), @@ -33,7 +33,7 @@ namespace Swift { run(); } else { - MainEventLoop::postEvent(boost::bind(boost::ref(onServiceResolved), boost::optional<Result>()), shared_from_this()); + eventLoop->postEvent(boost::bind(boost::ref(onServiceResolved), boost::optional<Result>()), shared_from_this()); } } @@ -48,11 +48,11 @@ namespace Swift { void handleServiceResolved(DNSServiceErrorType errorCode, const char* fullName, const char* host, uint16_t port, uint16_t txtLen, const unsigned char *txtRecord) { if (errorCode != kDNSServiceErr_NoError) { - MainEventLoop::postEvent(boost::bind(boost::ref(onServiceResolved), boost::optional<Result>()), shared_from_this()); + eventLoop->postEvent(boost::bind(boost::ref(onServiceResolved), boost::optional<Result>()), shared_from_this()); } else { //std::cout << "Service resolved: name:" << fullName << " host:" << host << " port:" << port << std::endl; - MainEventLoop::postEvent( + eventLoop->postEvent( boost::bind( boost::ref(onServiceResolved), Result(String(fullName), String(host), port, diff --git a/Swiften/LinkLocal/DNSSD/Fake/FakeDNSSDQuerier.cpp b/Swiften/LinkLocal/DNSSD/Fake/FakeDNSSDQuerier.cpp index d8e7acf..0bcdba1 100644 --- a/Swiften/LinkLocal/DNSSD/Fake/FakeDNSSDQuerier.cpp +++ b/Swiften/LinkLocal/DNSSD/Fake/FakeDNSSDQuerier.cpp @@ -12,11 +12,11 @@ #include "Swiften/LinkLocal/DNSSD/Fake/FakeDNSSDRegisterQuery.h" #include "Swiften/LinkLocal/DNSSD/Fake/FakeDNSSDResolveServiceQuery.h" #include "Swiften/LinkLocal/DNSSD/Fake/FakeDNSSDResolveHostnameQuery.h" -#include "Swiften/EventLoop/MainEventLoop.h" +#include "Swiften/EventLoop/EventLoop.h" namespace Swift { -FakeDNSSDQuerier::FakeDNSSDQuerier(const String& domain) : domain(domain) { +FakeDNSSDQuerier::FakeDNSSDQuerier(const String& domain, EventLoop* eventLoop) : domain(domain), eventLoop(eventLoop) { } FakeDNSSDQuerier::~FakeDNSSDQuerier() { @@ -46,24 +46,24 @@ void FakeDNSSDQuerier::addRunningQuery(boost::shared_ptr<FakeDNSSDQuery> query) allQueriesEverRun.push_back(query); if (boost::shared_ptr<FakeDNSSDBrowseQuery> browseQuery = boost::dynamic_pointer_cast<FakeDNSSDBrowseQuery>(query)) { foreach(const DNSSDServiceID& service, services) { - MainEventLoop::postEvent(boost::bind(boost::ref(browseQuery->onServiceAdded), service), shared_from_this()); + eventLoop->postEvent(boost::bind(boost::ref(browseQuery->onServiceAdded), service), shared_from_this()); } } else if (boost::shared_ptr<FakeDNSSDResolveServiceQuery> resolveQuery = boost::dynamic_pointer_cast<FakeDNSSDResolveServiceQuery>(query)) { for(ServiceInfoMap::const_iterator i = serviceInfo.begin(); i != serviceInfo.end(); ++i) { if (i->first == resolveQuery->service) { - MainEventLoop::postEvent(boost::bind(boost::ref(resolveQuery->onServiceResolved), i->second), shared_from_this()); + eventLoop->postEvent(boost::bind(boost::ref(resolveQuery->onServiceResolved), i->second), shared_from_this()); } } } else if (boost::shared_ptr<FakeDNSSDRegisterQuery> registerQuery = boost::dynamic_pointer_cast<FakeDNSSDRegisterQuery>(query)) { DNSSDServiceID service(registerQuery->name, domain); - MainEventLoop::postEvent(boost::bind(boost::ref(registerQuery->onRegisterFinished), service), shared_from_this()); + eventLoop->postEvent(boost::bind(boost::ref(registerQuery->onRegisterFinished), service), shared_from_this()); } else if (boost::shared_ptr<FakeDNSSDResolveHostnameQuery> resolveHostnameQuery = boost::dynamic_pointer_cast<FakeDNSSDResolveHostnameQuery>(query)) { std::map<String,boost::optional<HostAddress> >::const_iterator i = addresses.find(resolveHostnameQuery->hostname); if (i != addresses.end()) { - MainEventLoop::postEvent( + eventLoop->postEvent( boost::bind( boost::ref(resolveHostnameQuery->onHostnameResolved), i->second), shared_from_this()); @@ -79,7 +79,7 @@ void FakeDNSSDQuerier::removeRunningQuery(boost::shared_ptr<FakeDNSSDQuery> quer void FakeDNSSDQuerier::addService(const DNSSDServiceID& id) { services.insert(id); foreach(const boost::shared_ptr<FakeDNSSDBrowseQuery>& query, getQueries<FakeDNSSDBrowseQuery>()) { - MainEventLoop::postEvent(boost::bind(boost::ref(query->onServiceAdded), id), shared_from_this()); + eventLoop->postEvent(boost::bind(boost::ref(query->onServiceAdded), id), shared_from_this()); } } @@ -87,7 +87,7 @@ void FakeDNSSDQuerier::removeService(const DNSSDServiceID& id) { services.erase(id); serviceInfo.erase(id); foreach(const boost::shared_ptr<FakeDNSSDBrowseQuery>& query, getQueries<FakeDNSSDBrowseQuery>()) { - MainEventLoop::postEvent(boost::bind(boost::ref(query->onServiceRemoved), id), shared_from_this()); + eventLoop->postEvent(boost::bind(boost::ref(query->onServiceRemoved), id), shared_from_this()); } } @@ -98,7 +98,7 @@ void FakeDNSSDQuerier::setServiceInfo(const DNSSDServiceID& id, const DNSSDResol } foreach(const boost::shared_ptr<FakeDNSSDResolveServiceQuery>& query, getQueries<FakeDNSSDResolveServiceQuery>()) { if (query->service == id) { - MainEventLoop::postEvent(boost::bind(boost::ref(query->onServiceResolved), info), shared_from_this()); + eventLoop->postEvent(boost::bind(boost::ref(query->onServiceResolved), info), shared_from_this()); } } } @@ -114,13 +114,13 @@ bool FakeDNSSDQuerier::isServiceRegistered(const String& name, int port, const B void FakeDNSSDQuerier::setBrowseError() { foreach(const boost::shared_ptr<FakeDNSSDBrowseQuery>& query, getQueries<FakeDNSSDBrowseQuery>()) { - MainEventLoop::postEvent(boost::ref(query->onError), shared_from_this()); + eventLoop->postEvent(boost::ref(query->onError), shared_from_this()); } } void FakeDNSSDQuerier::setRegisterError() { foreach(const boost::shared_ptr<FakeDNSSDRegisterQuery>& query, getQueries<FakeDNSSDRegisterQuery>()) { - MainEventLoop::postEvent(boost::bind(boost::ref(query->onRegisterFinished), boost::optional<DNSSDServiceID>()), shared_from_this()); + eventLoop->postEvent(boost::bind(boost::ref(query->onRegisterFinished), boost::optional<DNSSDServiceID>()), shared_from_this()); } } @@ -128,7 +128,7 @@ void FakeDNSSDQuerier::setAddress(const String& hostname, boost::optional<HostAd addresses[hostname] = address; foreach(const boost::shared_ptr<FakeDNSSDResolveHostnameQuery>& query, getQueries<FakeDNSSDResolveHostnameQuery>()) { if (query->hostname == hostname) { - MainEventLoop::postEvent(boost::bind( + eventLoop->postEvent(boost::bind( boost::ref(query->onHostnameResolved), address), shared_from_this()); } } diff --git a/Swiften/LinkLocal/DNSSD/Fake/FakeDNSSDQuerier.h b/Swiften/LinkLocal/DNSSD/Fake/FakeDNSSDQuerier.h index f08ab68..9338dd4 100644 --- a/Swiften/LinkLocal/DNSSD/Fake/FakeDNSSDQuerier.h +++ b/Swiften/LinkLocal/DNSSD/Fake/FakeDNSSDQuerier.h @@ -22,13 +22,14 @@ namespace Swift { class ByteArray; class FakeDNSSDQuery; class FakeDNSSDBrowseQuery; + class EventLoop; class FakeDNSSDQuerier : public DNSSDQuerier, public EventOwner, public boost::enable_shared_from_this<FakeDNSSDQuerier> { public: - FakeDNSSDQuerier(const String& domain); + FakeDNSSDQuerier(const String& domain, EventLoop* eventLoop); ~FakeDNSSDQuerier(); void start() {} @@ -84,6 +85,7 @@ namespace Swift { private: String domain; + EventLoop* eventLoop; std::list< boost::shared_ptr<FakeDNSSDQuery> > runningQueries; std::list< boost::shared_ptr<FakeDNSSDQuery> > allQueriesEverRun; std::set<DNSSDServiceID> services; diff --git a/Swiften/LinkLocal/DNSSD/PlatformDNSSDQuerierFactory.cpp b/Swiften/LinkLocal/DNSSD/PlatformDNSSDQuerierFactory.cpp index 56128f0..7a42129 100644 --- a/Swiften/LinkLocal/DNSSD/PlatformDNSSDQuerierFactory.cpp +++ b/Swiften/LinkLocal/DNSSD/PlatformDNSSDQuerierFactory.cpp @@ -15,11 +15,14 @@ namespace Swift { +PlatformDNSSDQuerierFactory::PlatformDNSSDQuerierFactory(EventLoop* eventLoop) : eventLoop(eventLoop) { +} + boost::shared_ptr<DNSSDQuerier> PlatformDNSSDQuerierFactory::createQuerier() { #if defined(HAVE_BONJOUR) - return boost::shared_ptr<DNSSDQuerier>(new BonjourQuerier()); + return boost::shared_ptr<DNSSDQuerier>(new BonjourQuerier(eventLoop)); #elif defined(HAVE_AVAHI) - return boost::shared_ptr<DNSSDQuerier>(new AvahiQuerier()); + return boost::shared_ptr<DNSSDQuerier>(new AvahiQuerier(eventLoop)); #else return boost::shared_ptr<DNSSDQuerier>(); #endif diff --git a/Swiften/LinkLocal/DNSSD/PlatformDNSSDQuerierFactory.h b/Swiften/LinkLocal/DNSSD/PlatformDNSSDQuerierFactory.h index 674c13a..ca5570f 100644 --- a/Swiften/LinkLocal/DNSSD/PlatformDNSSDQuerierFactory.h +++ b/Swiften/LinkLocal/DNSSD/PlatformDNSSDQuerierFactory.h @@ -10,11 +10,17 @@ namespace Swift { class DNSSDQuerier; + class EventLoop; class PlatformDNSSDQuerierFactory { public: - boost::shared_ptr<DNSSDQuerier> createQuerier(); + PlatformDNSSDQuerierFactory(EventLoop* eventLoop); - bool canCreate(); + boost::shared_ptr<DNSSDQuerier> createQuerier(); + + bool canCreate(); + + private: + EventLoop* eventLoop; }; } diff --git a/Swiften/LinkLocal/UnitTest/LinkLocalConnectorTest.cpp b/Swiften/LinkLocal/UnitTest/LinkLocalConnectorTest.cpp index f6fc131..65b8a67 100644 --- a/Swiften/LinkLocal/UnitTest/LinkLocalConnectorTest.cpp +++ b/Swiften/LinkLocal/UnitTest/LinkLocalConnectorTest.cpp @@ -30,8 +30,8 @@ class LinkLocalConnectorTest : public CppUnit::TestFixture { void setUp() { eventLoop = new DummyEventLoop(); querier = boost::shared_ptr<FakeDNSSDQuerier>( - new FakeDNSSDQuerier("rabbithole.local")); - connection = boost::shared_ptr<FakeConnection>(new FakeConnection()); + new FakeDNSSDQuerier("rabbithole.local", eventLoop)); + connection = boost::shared_ptr<FakeConnection>(new FakeConnection(eventLoop)); connectFinished = false; } diff --git a/Swiften/LinkLocal/UnitTest/LinkLocalServiceBrowserTest.cpp b/Swiften/LinkLocal/UnitTest/LinkLocalServiceBrowserTest.cpp index f4b0034..d55603c 100644 --- a/Swiften/LinkLocal/UnitTest/LinkLocalServiceBrowserTest.cpp +++ b/Swiften/LinkLocal/UnitTest/LinkLocalServiceBrowserTest.cpp @@ -44,7 +44,7 @@ class LinkLocalServiceBrowserTest : public CppUnit::TestFixture { void setUp() { eventLoop = new DummyEventLoop(); - querier = boost::shared_ptr<FakeDNSSDQuerier>(new FakeDNSSDQuerier("wonderland.lit")); + querier = boost::shared_ptr<FakeDNSSDQuerier>(new FakeDNSSDQuerier("wonderland.lit", eventLoop)); aliceServiceID = new DNSSDServiceID("alice", "wonderland.lit"); aliceServiceInfo = new DNSSDResolveServiceQuery::Result("_presence._tcp.wonderland.lit", "xmpp.wonderland.lit", 1234, LinkLocalServiceInfo().toTXTRecord()); testServiceID = new DNSSDServiceID("foo", "bar.local"); diff --git a/Swiften/Network/BoostConnection.cpp b/Swiften/Network/BoostConnection.cpp index 8cd19f2..6ec8460 100644 --- a/Swiften/Network/BoostConnection.cpp +++ b/Swiften/Network/BoostConnection.cpp @@ -10,7 +10,7 @@ #include <boost/bind.hpp> #include <boost/thread.hpp> -#include "Swiften/EventLoop/MainEventLoop.h" +#include "Swiften/EventLoop/EventLoop.h" #include "Swiften/Base/String.h" #include "Swiften/Base/ByteArray.h" #include "Swiften/Network/HostAddressPort.h" @@ -42,8 +42,8 @@ class SharedBuffer { // ----------------------------------------------------------------------------- -BoostConnection::BoostConnection(boost::asio::io_service* ioService) : - socket_(*ioService), readBuffer_(BUFFER_SIZE) { +BoostConnection::BoostConnection(boost::asio::io_service* ioService, EventLoop* eventLoop) : + eventLoop(eventLoop), socket_(*ioService), readBuffer_(BUFFER_SIZE) { } BoostConnection::~BoostConnection() { @@ -73,11 +73,11 @@ void BoostConnection::write(const ByteArray& data) { void BoostConnection::handleConnectFinished(const boost::system::error_code& error) { if (!error) { - MainEventLoop::postEvent(boost::bind(boost::ref(onConnectFinished), false), shared_from_this()); + eventLoop->postEvent(boost::bind(boost::ref(onConnectFinished), false), shared_from_this()); doRead(); } else if (error != boost::asio::error::operation_aborted) { - MainEventLoop::postEvent(boost::bind(boost::ref(onConnectFinished), true), shared_from_this()); + eventLoop->postEvent(boost::bind(boost::ref(onConnectFinished), true), shared_from_this()); } } @@ -89,26 +89,26 @@ void BoostConnection::doRead() { void BoostConnection::handleSocketRead(const boost::system::error_code& error, size_t bytesTransferred) { if (!error) { - MainEventLoop::postEvent(boost::bind(boost::ref(onDataRead), ByteArray(&readBuffer_[0], bytesTransferred)), shared_from_this()); + eventLoop->postEvent(boost::bind(boost::ref(onDataRead), ByteArray(&readBuffer_[0], bytesTransferred)), shared_from_this()); doRead(); } else if (error == boost::asio::error::eof) { - MainEventLoop::postEvent(boost::bind(boost::ref(onDisconnected), boost::optional<Error>()), shared_from_this()); + eventLoop->postEvent(boost::bind(boost::ref(onDisconnected), boost::optional<Error>()), shared_from_this()); } else if (error != boost::asio::error::operation_aborted) { - MainEventLoop::postEvent(boost::bind(boost::ref(onDisconnected), ReadError), shared_from_this()); + eventLoop->postEvent(boost::bind(boost::ref(onDisconnected), ReadError), shared_from_this()); } } void BoostConnection::handleDataWritten(const boost::system::error_code& error) { if (!error) { - MainEventLoop::postEvent(boost::ref(onDataWritten), shared_from_this()); + eventLoop->postEvent(boost::ref(onDataWritten), shared_from_this()); } if (error == boost::asio::error::eof) { - MainEventLoop::postEvent(boost::bind(boost::ref(onDisconnected), boost::optional<Error>()), shared_from_this()); + eventLoop->postEvent(boost::bind(boost::ref(onDisconnected), boost::optional<Error>()), shared_from_this()); } else if (error && error != boost::asio::error::operation_aborted) { - MainEventLoop::postEvent(boost::bind(boost::ref(onDisconnected), WriteError), shared_from_this()); + eventLoop->postEvent(boost::bind(boost::ref(onDisconnected), WriteError), shared_from_this()); } } diff --git a/Swiften/Network/BoostConnection.h b/Swiften/Network/BoostConnection.h index 4f5352f..da4f7b8 100644 --- a/Swiften/Network/BoostConnection.h +++ b/Swiften/Network/BoostConnection.h @@ -20,14 +20,16 @@ namespace boost { } namespace Swift { + class EventLoop; + class BoostConnection : public Connection, public EventOwner, public boost::enable_shared_from_this<BoostConnection> { public: typedef boost::shared_ptr<BoostConnection> ref; ~BoostConnection(); - static ref create(boost::asio::io_service* ioService) { - return ref(new BoostConnection(ioService)); + static ref create(boost::asio::io_service* ioService, EventLoop* eventLoop) { + return ref(new BoostConnection(ioService, eventLoop)); } virtual void listen(); @@ -42,7 +44,7 @@ namespace Swift { HostAddressPort getLocalAddress() const; private: - BoostConnection(boost::asio::io_service* ioService); + BoostConnection(boost::asio::io_service* ioService, EventLoop* eventLoop); void handleConnectFinished(const boost::system::error_code& error); void handleSocketRead(const boost::system::error_code& error, size_t bytesTransferred); @@ -50,6 +52,7 @@ namespace Swift { void doRead(); private: + EventLoop* eventLoop; boost::asio::ip::tcp::socket socket_; std::vector<char> readBuffer_; bool disconnecting_; diff --git a/Swiften/Network/BoostConnectionFactory.cpp b/Swiften/Network/BoostConnectionFactory.cpp index 7ba9f48..00b36c6 100644 --- a/Swiften/Network/BoostConnectionFactory.cpp +++ b/Swiften/Network/BoostConnectionFactory.cpp @@ -9,11 +9,11 @@ namespace Swift { -BoostConnectionFactory::BoostConnectionFactory(boost::asio::io_service* ioService) : ioService(ioService) { +BoostConnectionFactory::BoostConnectionFactory(boost::asio::io_service* ioService, EventLoop* eventLoop) : ioService(ioService), eventLoop(eventLoop) { } boost::shared_ptr<Connection> BoostConnectionFactory::createConnection() { - return BoostConnection::create(ioService); + return BoostConnection::create(ioService, eventLoop); } } diff --git a/Swiften/Network/BoostConnectionFactory.h b/Swiften/Network/BoostConnectionFactory.h index 6588498..551defe 100644 --- a/Swiften/Network/BoostConnectionFactory.h +++ b/Swiften/Network/BoostConnectionFactory.h @@ -16,11 +16,12 @@ namespace Swift { class BoostConnectionFactory : public ConnectionFactory { public: - BoostConnectionFactory(boost::asio::io_service*); + BoostConnectionFactory(boost::asio::io_service*, EventLoop* eventLoop); virtual boost::shared_ptr<Connection> createConnection(); private: boost::asio::io_service* ioService; + EventLoop* eventLoop; }; } diff --git a/Swiften/Network/BoostConnectionServer.cpp b/Swiften/Network/BoostConnectionServer.cpp index 03ae19c..839c990 100644 --- a/Swiften/Network/BoostConnectionServer.cpp +++ b/Swiften/Network/BoostConnectionServer.cpp @@ -9,11 +9,11 @@ #include <boost/bind.hpp> #include <boost/system/system_error.hpp> -#include "Swiften/EventLoop/MainEventLoop.h" +#include "Swiften/EventLoop/EventLoop.h" namespace Swift { -BoostConnectionServer::BoostConnectionServer(int port, boost::asio::io_service* ioService) : port_(port), ioService_(ioService), acceptor_(NULL) { +BoostConnectionServer::BoostConnectionServer(int port, boost::asio::io_service* ioService, EventLoop* eventLoop) : port_(port), ioService_(ioService), eventLoop(eventLoop), acceptor_(NULL) { } @@ -27,10 +27,10 @@ void BoostConnectionServer::start() { } catch (const boost::system::system_error& e) { if (e.code() == boost::asio::error::address_in_use) { - MainEventLoop::postEvent(boost::bind(boost::ref(onStopped), Conflict), shared_from_this()); + eventLoop->postEvent(boost::bind(boost::ref(onStopped), Conflict), shared_from_this()); } else { - MainEventLoop::postEvent(boost::bind(boost::ref(onStopped), UnknownError), shared_from_this()); + eventLoop->postEvent(boost::bind(boost::ref(onStopped), UnknownError), shared_from_this()); } } } @@ -46,24 +46,24 @@ void BoostConnectionServer::stop(boost::optional<Error> e) { delete acceptor_; acceptor_ = NULL; } - MainEventLoop::postEvent(boost::bind(boost::ref(onStopped), e), shared_from_this()); + eventLoop->postEvent(boost::bind(boost::ref(onStopped), e), shared_from_this()); } void BoostConnectionServer::acceptNextConnection() { - BoostConnection::ref newConnection(BoostConnection::create(&acceptor_->io_service())); + BoostConnection::ref newConnection(BoostConnection::create(&acceptor_->io_service(), eventLoop)); acceptor_->async_accept(newConnection->getSocket(), boost::bind(&BoostConnectionServer::handleAccept, shared_from_this(), newConnection, boost::asio::placeholders::error)); } void BoostConnectionServer::handleAccept(boost::shared_ptr<BoostConnection> newConnection, const boost::system::error_code& error) { if (error) { - MainEventLoop::postEvent( + eventLoop->postEvent( boost::bind( &BoostConnectionServer::stop, shared_from_this(), UnknownError), shared_from_this()); } else { - MainEventLoop::postEvent( + eventLoop->postEvent( boost::bind(boost::ref(onNewConnection), newConnection), shared_from_this()); newConnection->listen(); diff --git a/Swiften/Network/BoostConnectionServer.h b/Swiften/Network/BoostConnectionServer.h index abcb3af..223f264 100644 --- a/Swiften/Network/BoostConnectionServer.h +++ b/Swiften/Network/BoostConnectionServer.h @@ -25,8 +25,8 @@ namespace Swift { UnknownError }; - static ref create(int port, boost::asio::io_service* ioService) { - return ref(new BoostConnectionServer(port, ioService)); + static ref create(int port, boost::asio::io_service* ioService, EventLoop* eventLoop) { + return ref(new BoostConnectionServer(port, ioService, eventLoop)); } void start(); @@ -37,7 +37,7 @@ namespace Swift { boost::signal<void (boost::optional<Error>)> onStopped; private: - BoostConnectionServer(int port, boost::asio::io_service* ioService); + BoostConnectionServer(int port, boost::asio::io_service* ioService, EventLoop* eventLoop); void stop(boost::optional<Error> e); void acceptNextConnection(); @@ -46,6 +46,7 @@ namespace Swift { private: int port_; boost::asio::io_service* ioService_; + EventLoop* eventLoop; boost::asio::ip::tcp::acceptor* acceptor_; }; } diff --git a/Swiften/Network/BoostTimer.cpp b/Swiften/Network/BoostTimer.cpp index c655860..65e7712 100644 --- a/Swiften/Network/BoostTimer.cpp +++ b/Swiften/Network/BoostTimer.cpp @@ -9,12 +9,12 @@ #include <boost/date_time/posix_time/posix_time.hpp> #include <boost/asio.hpp> -#include "Swiften/EventLoop/MainEventLoop.h" +#include "Swiften/EventLoop/EventLoop.h" namespace Swift { -BoostTimer::BoostTimer(int milliseconds, boost::asio::io_service* service) : - timeout(milliseconds), timer(*service) { +BoostTimer::BoostTimer(int milliseconds, boost::asio::io_service* service, EventLoop* eventLoop) : + timeout(milliseconds), timer(*service), eventLoop(eventLoop) { } void BoostTimer::start() { @@ -31,7 +31,7 @@ void BoostTimer::handleTimerTick(const boost::system::error_code& error) { assert(error == boost::asio::error::operation_aborted); } else { - MainEventLoop::postEvent(boost::bind(boost::ref(onTick)), shared_from_this()); + eventLoop->postEvent(boost::bind(boost::ref(onTick)), shared_from_this()); timer.expires_from_now(boost::posix_time::milliseconds(timeout)); timer.async_wait(boost::bind(&BoostTimer::handleTimerTick, shared_from_this(), boost::asio::placeholders::error)); } diff --git a/Swiften/Network/BoostTimer.h b/Swiften/Network/BoostTimer.h index f48cb36..548133f 100644 --- a/Swiften/Network/BoostTimer.h +++ b/Swiften/Network/BoostTimer.h @@ -14,24 +14,27 @@ #include "Swiften/Network/Timer.h" namespace Swift { + class EventLoop; + class BoostTimer : public Timer, public EventOwner, public boost::enable_shared_from_this<BoostTimer> { public: typedef boost::shared_ptr<BoostTimer> ref; - static ref create(int milliseconds, boost::asio::io_service* service) { - return ref(new BoostTimer(milliseconds, service)); + static ref create(int milliseconds, boost::asio::io_service* service, EventLoop* eventLoop) { + return ref(new BoostTimer(milliseconds, service, eventLoop)); } virtual void start(); virtual void stop(); private: - BoostTimer(int milliseconds, boost::asio::io_service* service); + BoostTimer(int milliseconds, boost::asio::io_service* service, EventLoop* eventLoop); void handleTimerTick(const boost::system::error_code& error); private: int timeout; boost::asio::deadline_timer timer; + EventLoop* eventLoop; }; } diff --git a/Swiften/Network/BoostTimerFactory.cpp b/Swiften/Network/BoostTimerFactory.cpp index b22525c..38842f9 100644 --- a/Swiften/Network/BoostTimerFactory.cpp +++ b/Swiften/Network/BoostTimerFactory.cpp @@ -9,11 +9,11 @@ namespace Swift { -BoostTimerFactory::BoostTimerFactory(boost::asio::io_service* ioService) : ioService(ioService) { +BoostTimerFactory::BoostTimerFactory(boost::asio::io_service* ioService, EventLoop* eventLoop) : ioService(ioService), eventLoop(eventLoop) { } boost::shared_ptr<Timer> BoostTimerFactory::createTimer(int milliseconds) { - return BoostTimer::create(milliseconds, ioService); + return BoostTimer::create(milliseconds, ioService, eventLoop); } } diff --git a/Swiften/Network/BoostTimerFactory.h b/Swiften/Network/BoostTimerFactory.h index a22592c..a987763 100644 --- a/Swiften/Network/BoostTimerFactory.h +++ b/Swiften/Network/BoostTimerFactory.h @@ -13,14 +13,16 @@ namespace Swift { class BoostTimer; + class EventLoop; class BoostTimerFactory : public TimerFactory { public: - BoostTimerFactory(boost::asio::io_service*); + BoostTimerFactory(boost::asio::io_service*, EventLoop* eventLoop); virtual boost::shared_ptr<Timer> createTimer(int milliseconds); private: boost::asio::io_service* ioService; + EventLoop* eventLoop; }; } diff --git a/Swiften/Network/CAresDomainNameResolver.cpp b/Swiften/Network/CAresDomainNameResolver.cpp index ba41d03..8462e4f 100644 --- a/Swiften/Network/CAresDomainNameResolver.cpp +++ b/Swiften/Network/CAresDomainNameResolver.cpp @@ -19,7 +19,7 @@ #include "Swiften/Network/DomainNameServiceQuery.h" #include "Swiften/Network/DomainNameAddressQuery.h" #include "Swiften/Base/ByteArray.h" -#include "Swiften/EventLoop/MainEventLoop.h" +#include "Swiften/EventLoop/EventLoop.h" #include "Swiften/Base/foreach.h" namespace Swift { @@ -77,10 +77,10 @@ class CAresDomainNameServiceQuery : public DomainNameServiceQuery, public CAresQ } } std::sort(records.begin(), records.end(), ResultPriorityComparator()); - MainEventLoop::postEvent(boost::bind(boost::ref(onResult), records)); + eventLoop->postEvent(boost::bind(boost::ref(onResult), records)); } else if (status != ARES_EDESTRUCTION) { - MainEventLoop::postEvent(boost::bind(boost::ref(onResult), std::vector<DomainNameServiceQuery::Result>()), shared_from_this()); + eventLoop->postEvent(boost::bind(boost::ref(onResult), std::vector<DomainNameServiceQuery::Result>()), shared_from_this()); } } }; @@ -105,15 +105,15 @@ class CAresDomainNameAddressQuery : public DomainNameAddressQuery, public CAresQ std::vector<HostAddress> results; results.push_back(HostAddress(inet_ntoa(addr))); - MainEventLoop::postEvent(boost::bind(boost::ref(onResult), results, boost::optional<DomainNameResolveError>()), boost::dynamic_pointer_cast<CAresDomainNameAddressQuery>(shared_from_this())); + eventLoop->postEvent(boost::bind(boost::ref(onResult), results, boost::optional<DomainNameResolveError>()), boost::dynamic_pointer_cast<CAresDomainNameAddressQuery>(shared_from_this())); ares_free_hostent(hosts); } else { - MainEventLoop::postEvent(boost::bind(boost::ref(onResult), std::vector<HostAddress>(), boost::optional<DomainNameResolveError>(DomainNameResolveError())), shared_from_this()); + eventLoop->postEvent(boost::bind(boost::ref(onResult), std::vector<HostAddress>(), boost::optional<DomainNameResolveError>(DomainNameResolveError())), shared_from_this()); } } else if (status != ARES_EDESTRUCTION) { - MainEventLoop::postEvent(boost::bind(boost::ref(onResult), std::vector<HostAddress>(), boost::optional<DomainNameResolveError>(DomainNameResolveError())), shared_from_this()); + eventLoop->postEvent(boost::bind(boost::ref(onResult), std::vector<HostAddress>(), boost::optional<DomainNameResolveError>(DomainNameResolveError())), shared_from_this()); } } }; diff --git a/Swiften/Network/DummyConnection.h b/Swiften/Network/DummyConnection.h index 576965f..6b426b1 100644 --- a/Swiften/Network/DummyConnection.h +++ b/Swiften/Network/DummyConnection.h @@ -11,12 +11,14 @@ #include <boost/enable_shared_from_this.hpp> #include "Swiften/Network/Connection.h" -#include "Swiften/EventLoop/MainEventLoop.h" +#include "Swiften/EventLoop/EventLoop.h" #include "Swiften/EventLoop/EventOwner.h" namespace Swift { class DummyConnection : public Connection, public EventOwner, public boost::enable_shared_from_this<DummyConnection> { public: + DummyConnection(EventLoop* eventLoop) : eventLoop(eventLoop) {} + void listen() { assert(false); } @@ -30,12 +32,12 @@ namespace Swift { } void write(const ByteArray& data) { - MainEventLoop::postEvent(boost::ref(onDataWritten), shared_from_this()); + eventLoop->postEvent(boost::ref(onDataWritten), shared_from_this()); onDataSent(data); } void receive(const ByteArray& data) { - MainEventLoop::postEvent(boost::bind(boost::ref(onDataRead), ByteArray(data)), shared_from_this()); + eventLoop->postEvent(boost::bind(boost::ref(onDataRead), ByteArray(data)), shared_from_this()); } HostAddressPort getLocalAddress() const { @@ -44,6 +46,7 @@ namespace Swift { boost::signal<void (const ByteArray&)> onDataSent; + EventLoop* eventLoop; HostAddressPort localAddress; }; } diff --git a/Swiften/Network/FakeConnection.h b/Swiften/Network/FakeConnection.h index a89466f..4e2e960 100644 --- a/Swiften/Network/FakeConnection.h +++ b/Swiften/Network/FakeConnection.h @@ -14,7 +14,7 @@ #include "Swiften/Network/Connection.h" #include "Swiften/Network/HostAddressPort.h" #include "Swiften/EventLoop/EventOwner.h" -#include "Swiften/EventLoop/MainEventLoop.h" +#include "Swiften/EventLoop/EventLoop.h" namespace Swift { class FakeConnection : @@ -30,7 +30,7 @@ namespace Swift { DisconnectedWithError }; - FakeConnection() : state(Initial), delayConnect(false) {} + FakeConnection(EventLoop* eventLoop) : eventLoop(eventLoop), state(Initial), delayConnect(false) {} virtual void listen() { assert(false); @@ -44,7 +44,7 @@ namespace Swift { error = boost::optional<Error>(e); state = DisconnectedWithError; if (connectedTo) { - MainEventLoop::postEvent( + eventLoop->postEvent( boost::bind(boost::ref(onDisconnected), error), shared_from_this()); } @@ -62,7 +62,7 @@ namespace Swift { else { state = DisconnectedWithError; } - MainEventLoop::postEvent( + eventLoop->postEvent( boost::bind(boost::ref(onConnectFinished), error), shared_from_this()); } @@ -76,7 +76,7 @@ namespace Swift { state = DisconnectedWithError; } connectedTo.reset(); - MainEventLoop::postEvent( + eventLoop->postEvent( boost::bind(boost::ref(onDisconnected), error), shared_from_this()); } @@ -89,6 +89,7 @@ namespace Swift { delayConnect = true; } + EventLoop* eventLoop; boost::optional<HostAddressPort> connectedTo; std::vector<ByteArray> dataWritten; boost::optional<Error> error; diff --git a/Swiften/Network/PlatformDomainNameResolver.cpp b/Swiften/Network/PlatformDomainNameResolver.cpp index 452783a..44c87e0 100644 --- a/Swiften/Network/PlatformDomainNameResolver.cpp +++ b/Swiften/Network/PlatformDomainNameResolver.cpp @@ -19,7 +19,7 @@ #include "Swiften/Base/String.h" #include "Swiften/Network/HostAddress.h" -#include "Swiften/EventLoop/MainEventLoop.h" +#include "Swiften/EventLoop/EventLoop.h" #include "Swiften/Network/HostAddressPort.h" #include "Swiften/Network/DomainNameAddressQuery.h" @@ -27,7 +27,7 @@ using namespace Swift; namespace { struct AddressQuery : public DomainNameAddressQuery, public boost::enable_shared_from_this<AddressQuery>, public EventOwner { - AddressQuery(const String& host) : hostname(host), thread(NULL), safeToJoin(false) {} + AddressQuery(const String& host, EventLoop* eventLoop) : hostname(host), eventLoop(eventLoop), thread(NULL), safeToJoin(false) {} ~AddressQuery() { if (safeToJoin) { @@ -64,7 +64,7 @@ namespace { } //std::cout << "PlatformDomainNameResolver::doRun(): Success" << std::endl; - MainEventLoop::postEvent( + eventLoop->postEvent( boost::bind(boost::ref(onResult), results, boost::optional<DomainNameResolveError>()), shared_from_this()); } @@ -77,11 +77,12 @@ namespace { } void emitError() { - MainEventLoop::postEvent(boost::bind(boost::ref(onResult), std::vector<HostAddress>(), boost::optional<DomainNameResolveError>(DomainNameResolveError())), shared_from_this()); + eventLoop->postEvent(boost::bind(boost::ref(onResult), std::vector<HostAddress>(), boost::optional<DomainNameResolveError>(DomainNameResolveError())), shared_from_this()); } boost::asio::io_service ioService; String hostname; + EventLoop* eventLoop; boost::thread* thread; bool safeToJoin; }; @@ -90,15 +91,15 @@ namespace { namespace Swift { -PlatformDomainNameResolver::PlatformDomainNameResolver() { +PlatformDomainNameResolver::PlatformDomainNameResolver(EventLoop* eventLoop) : eventLoop(eventLoop) { } boost::shared_ptr<DomainNameServiceQuery> PlatformDomainNameResolver::createServiceQuery(const String& name) { - return boost::shared_ptr<DomainNameServiceQuery>(new PlatformDomainNameServiceQuery(getNormalized(name))); + return boost::shared_ptr<DomainNameServiceQuery>(new PlatformDomainNameServiceQuery(getNormalized(name), eventLoop)); } boost::shared_ptr<DomainNameAddressQuery> PlatformDomainNameResolver::createAddressQuery(const String& name) { - return boost::shared_ptr<DomainNameAddressQuery>(new AddressQuery(getNormalized(name))); + return boost::shared_ptr<DomainNameAddressQuery>(new AddressQuery(getNormalized(name), eventLoop)); } } diff --git a/Swiften/Network/PlatformDomainNameResolver.h b/Swiften/Network/PlatformDomainNameResolver.h index a385122..46c209b 100644 --- a/Swiften/Network/PlatformDomainNameResolver.h +++ b/Swiften/Network/PlatformDomainNameResolver.h @@ -10,12 +10,16 @@ namespace Swift { class String; + class EventLoop; class PlatformDomainNameResolver : public DomainNameResolver { public: - PlatformDomainNameResolver(); + PlatformDomainNameResolver(EventLoop* eventLoop); virtual boost::shared_ptr<DomainNameServiceQuery> createServiceQuery(const String& name); virtual boost::shared_ptr<DomainNameAddressQuery> createAddressQuery(const String& name); + + private: + EventLoop* eventLoop; }; } diff --git a/Swiften/Network/PlatformDomainNameServiceQuery.cpp b/Swiften/Network/PlatformDomainNameServiceQuery.cpp index aa0be4e..ed73b64 100644 --- a/Swiften/Network/PlatformDomainNameServiceQuery.cpp +++ b/Swiften/Network/PlatformDomainNameServiceQuery.cpp @@ -25,14 +25,14 @@ #include <boost/bind.hpp> #include "Swiften/Base/ByteArray.h" -#include "Swiften/EventLoop/MainEventLoop.h" +#include "Swiften/EventLoop/EventLoop.h" #include "Swiften/Base/foreach.h" using namespace Swift; namespace Swift { -PlatformDomainNameServiceQuery::PlatformDomainNameServiceQuery(const String& service) : thread(NULL), service(service), safeToJoin(true) { +PlatformDomainNameServiceQuery::PlatformDomainNameServiceQuery(const String& service, EventLoop* eventLoop) : eventLoop(eventLoop), thread(NULL), service(service), safeToJoin(true) { } PlatformDomainNameServiceQuery::~PlatformDomainNameServiceQuery() { @@ -166,12 +166,12 @@ void PlatformDomainNameServiceQuery::doRun() { safeToJoin = true; std::sort(records.begin(), records.end(), ResultPriorityComparator()); //std::cout << "Sending out " << records.size() << " SRV results " << std::endl; - MainEventLoop::postEvent(boost::bind(boost::ref(onResult), records)); + eventLoop->postEvent(boost::bind(boost::ref(onResult), records)); } void PlatformDomainNameServiceQuery::emitError() { safeToJoin = true; - MainEventLoop::postEvent(boost::bind(boost::ref(onResult), std::vector<DomainNameServiceQuery::Result>()), shared_from_this()); + eventLoop->postEvent(boost::bind(boost::ref(onResult), std::vector<DomainNameServiceQuery::Result>()), shared_from_this()); } } diff --git a/Swiften/Network/PlatformDomainNameServiceQuery.h b/Swiften/Network/PlatformDomainNameServiceQuery.h index ff50b31..9808196 100644 --- a/Swiften/Network/PlatformDomainNameServiceQuery.h +++ b/Swiften/Network/PlatformDomainNameServiceQuery.h @@ -14,9 +14,11 @@ #include "Swiften/Base/String.h" namespace Swift { + class EventLoop; + class PlatformDomainNameServiceQuery : public DomainNameServiceQuery, public boost::enable_shared_from_this<PlatformDomainNameServiceQuery>, public EventOwner { public: - PlatformDomainNameServiceQuery(const String& service); + PlatformDomainNameServiceQuery(const String& service, EventLoop* eventLoop); ~PlatformDomainNameServiceQuery(); virtual void run(); @@ -26,6 +28,7 @@ namespace Swift { void emitError(); private: + EventLoop* eventLoop; boost::thread* thread; String service; bool safeToJoin; diff --git a/Swiften/Network/StaticDomainNameResolver.cpp b/Swiften/Network/StaticDomainNameResolver.cpp index 636f310..ccea2b7 100644 --- a/Swiften/Network/StaticDomainNameResolver.cpp +++ b/Swiften/Network/StaticDomainNameResolver.cpp @@ -16,7 +16,7 @@ using namespace Swift; namespace { struct ServiceQuery : public DomainNameServiceQuery, public boost::enable_shared_from_this<ServiceQuery> { - ServiceQuery(const String& service, Swift::StaticDomainNameResolver* resolver) : service(service), resolver(resolver) {} + ServiceQuery(const String& service, Swift::StaticDomainNameResolver* resolver, EventLoop* eventLoop) : eventLoop(eventLoop), service(service), resolver(resolver) {} virtual void run() { if (!resolver->getIsResponsive()) { @@ -28,19 +28,20 @@ namespace { results.push_back(i->second); } } - MainEventLoop::postEvent(boost::bind(&ServiceQuery::emitOnResult, shared_from_this(), results)); + eventLoop->postEvent(boost::bind(&ServiceQuery::emitOnResult, shared_from_this(), results)); } void emitOnResult(std::vector<DomainNameServiceQuery::Result> results) { onResult(results); } + EventLoop* eventLoop; String service; StaticDomainNameResolver* resolver; }; struct AddressQuery : public DomainNameAddressQuery, public boost::enable_shared_from_this<AddressQuery> { - AddressQuery(const String& host, StaticDomainNameResolver* resolver) : host(host), resolver(resolver) {} + AddressQuery(const String& host, StaticDomainNameResolver* resolver, EventLoop* eventLoop) : eventLoop(eventLoop), host(host), resolver(resolver) {} virtual void run() { if (!resolver->getIsResponsive()) { @@ -48,11 +49,11 @@ namespace { } StaticDomainNameResolver::AddressesMap::const_iterator i = resolver->getAddresses().find(host); if (i != resolver->getAddresses().end()) { - MainEventLoop::postEvent( + eventLoop->postEvent( boost::bind(&AddressQuery::emitOnResult, shared_from_this(), i->second, boost::optional<DomainNameResolveError>())); } else { - MainEventLoop::postEvent(boost::bind(&AddressQuery::emitOnResult, shared_from_this(), std::vector<HostAddress>(), boost::optional<DomainNameResolveError>(DomainNameResolveError()))); + eventLoop->postEvent(boost::bind(&AddressQuery::emitOnResult, shared_from_this(), std::vector<HostAddress>(), boost::optional<DomainNameResolveError>(DomainNameResolveError()))); } } @@ -60,6 +61,7 @@ namespace { onResult(results, error); } + EventLoop* eventLoop; String host; StaticDomainNameResolver* resolver; }; @@ -67,7 +69,7 @@ namespace { namespace Swift { -StaticDomainNameResolver::StaticDomainNameResolver() : isResponsive(true) { +StaticDomainNameResolver::StaticDomainNameResolver(EventLoop* eventLoop) : eventLoop(eventLoop), isResponsive(true) { } void StaticDomainNameResolver::addAddress(const String& domain, const HostAddress& address) { @@ -92,11 +94,11 @@ void StaticDomainNameResolver::addXMPPClientService(const String& domain, const } boost::shared_ptr<DomainNameServiceQuery> StaticDomainNameResolver::createServiceQuery(const String& name) { - return boost::shared_ptr<DomainNameServiceQuery>(new ServiceQuery(name, this)); + return boost::shared_ptr<DomainNameServiceQuery>(new ServiceQuery(name, this, eventLoop)); } boost::shared_ptr<DomainNameAddressQuery> StaticDomainNameResolver::createAddressQuery(const String& name) { - return boost::shared_ptr<DomainNameAddressQuery>(new AddressQuery(name, this)); + return boost::shared_ptr<DomainNameAddressQuery>(new AddressQuery(name, this, eventLoop)); } } diff --git a/Swiften/Network/StaticDomainNameResolver.h b/Swiften/Network/StaticDomainNameResolver.h index 69b0d9d..39b2782 100644 --- a/Swiften/Network/StaticDomainNameResolver.h +++ b/Swiften/Network/StaticDomainNameResolver.h @@ -14,7 +14,7 @@ #include "Swiften/Network/DomainNameResolver.h" #include "Swiften/Network/DomainNameServiceQuery.h" #include "Swiften/Network/DomainNameAddressQuery.h" -#include "Swiften/EventLoop/MainEventLoop.h" +#include "Swiften/EventLoop/EventLoop.h" namespace Swift { class String; @@ -25,7 +25,7 @@ namespace Swift { typedef std::vector< std::pair<String, DomainNameServiceQuery::Result> > ServicesCollection; public: - StaticDomainNameResolver(); + StaticDomainNameResolver(EventLoop* eventLoop); void addAddress(const String& domain, const HostAddress& address); void addService(const String& service, const DomainNameServiceQuery::Result& result); @@ -52,6 +52,7 @@ namespace Swift { virtual boost::shared_ptr<DomainNameAddressQuery> createAddressQuery(const String& name); private: + EventLoop* eventLoop; bool isResponsive; AddressesMap addresses; ServicesCollection services; diff --git a/Swiften/Network/UnitTest/ConnectorTest.cpp b/Swiften/Network/UnitTest/ConnectorTest.cpp index 07e520c..a71d4b7 100644 --- a/Swiften/Network/UnitTest/ConnectorTest.cpp +++ b/Swiften/Network/UnitTest/ConnectorTest.cpp @@ -16,7 +16,6 @@ #include "Swiften/Network/HostAddressPort.h" #include "Swiften/Network/StaticDomainNameResolver.h" #include "Swiften/Network/DummyTimerFactory.h" -#include "Swiften/EventLoop/MainEventLoop.h" #include "Swiften/EventLoop/DummyEventLoop.h" using namespace Swift; @@ -44,8 +43,8 @@ class ConnectorTest : public CppUnit::TestFixture { void setUp() { eventLoop = new DummyEventLoop(); - resolver = new StaticDomainNameResolver(); - connectionFactory = new MockConnectionFactory(); + resolver = new StaticDomainNameResolver(eventLoop); + connectionFactory = new MockConnectionFactory(eventLoop); timerFactory = new DummyTimerFactory(); } @@ -257,14 +256,14 @@ class ConnectorTest : public CppUnit::TestFixture { struct MockConnection : public Connection { public: - MockConnection(const std::vector<HostAddressPort>& failingPorts, bool isResponsive) : failingPorts(failingPorts), isResponsive(isResponsive) {} + MockConnection(const std::vector<HostAddressPort>& failingPorts, bool isResponsive, EventLoop* eventLoop) : eventLoop(eventLoop), failingPorts(failingPorts), isResponsive(isResponsive) {} void listen() { assert(false); } void connect(const HostAddressPort& address) { hostAddressPort = address; if (isResponsive) { bool fail = std::find(failingPorts.begin(), failingPorts.end(), address) != failingPorts.end(); - MainEventLoop::postEvent(boost::bind(boost::ref(onConnectFinished), fail)); + eventLoop->postEvent(boost::bind(boost::ref(onConnectFinished), fail)); } } @@ -272,19 +271,21 @@ class ConnectorTest : public CppUnit::TestFixture { void disconnect() { assert(false); } void write(const ByteArray&) { assert(false); } + EventLoop* eventLoop; boost::optional<HostAddressPort> hostAddressPort; std::vector<HostAddressPort> failingPorts; bool isResponsive; }; struct MockConnectionFactory : public ConnectionFactory { - MockConnectionFactory() : isResponsive(true) { + MockConnectionFactory(EventLoop* eventLoop) : eventLoop(eventLoop), isResponsive(true) { } boost::shared_ptr<Connection> createConnection() { - return boost::shared_ptr<Connection>(new MockConnection(failingPorts, isResponsive)); + return boost::shared_ptr<Connection>(new MockConnection(failingPorts, isResponsive, eventLoop)); } + EventLoop* eventLoop; bool isResponsive; std::vector<HostAddressPort> failingPorts; }; diff --git a/Swiften/QA/ClientTest/ClientTest.cpp b/Swiften/QA/ClientTest/ClientTest.cpp index f504d2c..4e48339 100644 --- a/Swiften/QA/ClientTest/ClientTest.cpp +++ b/Swiften/QA/ClientTest/ClientTest.cpp @@ -9,7 +9,7 @@ #include "Swiften/Client/Client.h" #include "Swiften/Network/BoostTimer.h" -#include "Swiften/EventLoop/MainEventLoop.h" +#include "Swiften/EventLoop/EventLoop.h" #include "Swiften/EventLoop/SimpleEventLoop.h" #include "Swiften/Roster/GetRosterRequest.h" #include "Swiften/Client/ClientXMLTracer.h" @@ -55,13 +55,13 @@ int main(int, char**) { return -1; } - client = new Swift::Client(JID(jid), String(pass)); + client = new Swift::Client(&eventLoop, JID(jid), String(pass)); ClientXMLTracer* tracer = new ClientXMLTracer(client); client->onConnected.connect(&handleConnected); client->connect(); { - boost::shared_ptr<BoostTimer> timer(BoostTimer::create(30000, &MainBoostIOServiceThread::getInstance().getIOService())); + boost::shared_ptr<BoostTimer> timer(BoostTimer::create(30000, &MainBoostIOServiceThread::getInstance().getIOService(), &eventLoop)); timer->onTick.connect(boost::bind(&SimpleEventLoop::stop, &eventLoop)); timer->start(); diff --git a/Swiften/QA/NetworkTest/BoostConnectionServerTest.cpp b/Swiften/QA/NetworkTest/BoostConnectionServerTest.cpp index 543e085..4c38576 100644 --- a/Swiften/QA/NetworkTest/BoostConnectionServerTest.cpp +++ b/Swiften/QA/NetworkTest/BoostConnectionServerTest.cpp @@ -39,15 +39,15 @@ class BoostConnectionServerTest : public CppUnit::TestFixture { } void testConstructor_TwoServersOnSamePort() { - BoostConnectionServer::ref testling(BoostConnectionServer::create(9999, &boostIOServiceThread_->getIOService())); - BoostConnectionServer::ref testling2(BoostConnectionServer::create(9999, &boostIOServiceThread_->getIOService())); + BoostConnectionServer::ref testling(BoostConnectionServer::create(9999, &boostIOServiceThread_->getIOService(), eventLoop_)); + BoostConnectionServer::ref testling2(BoostConnectionServer::create(9999, &boostIOServiceThread_->getIOService(), eventLoop_)); } void testStart_Conflict() { - BoostConnectionServer::ref testling(BoostConnectionServer::create(9999, &boostIOServiceThread_->getIOService())); + BoostConnectionServer::ref testling(BoostConnectionServer::create(9999, &boostIOServiceThread_->getIOService(), eventLoop_)); testling->start(); - BoostConnectionServer::ref testling2(BoostConnectionServer::create(9999, &boostIOServiceThread_->getIOService())); + BoostConnectionServer::ref testling2(BoostConnectionServer::create(9999, &boostIOServiceThread_->getIOService(), eventLoop_)); testling2->onStopped.connect( boost::bind(&BoostConnectionServerTest::handleStopped, this, _1)); @@ -55,12 +55,12 @@ class BoostConnectionServerTest : public CppUnit::TestFixture { } void testStop() { - BoostConnectionServer::ref testling(BoostConnectionServer::create(9999, &boostIOServiceThread_->getIOService())); + BoostConnectionServer::ref testling(BoostConnectionServer::create(9999, &boostIOServiceThread_->getIOService(), eventLoop_)); testling->start(); testling->stop(); - BoostConnectionServer::ref testling2(BoostConnectionServer::create(9999, &boostIOServiceThread_->getIOService())); + BoostConnectionServer::ref testling2(BoostConnectionServer::create(9999, &boostIOServiceThread_->getIOService(), eventLoop_)); testling2->start(); testling2->stop(); diff --git a/Swiften/QA/NetworkTest/BoostConnectionTest.cpp b/Swiften/QA/NetworkTest/BoostConnectionTest.cpp index 913f7c0..6d6fddf 100644 --- a/Swiften/QA/NetworkTest/BoostConnectionTest.cpp +++ b/Swiften/QA/NetworkTest/BoostConnectionTest.cpp @@ -43,14 +43,14 @@ class BoostConnectionTest : public CppUnit::TestFixture { void testDestructor() { { - BoostConnection::ref testling(BoostConnection::create(&boostIOServiceThread_->getIOService())); + BoostConnection::ref testling(BoostConnection::create(&boostIOServiceThread_->getIOService(), eventLoop_)); testling->connect(HostAddressPort(HostAddress(address, 4), 5222)); } } void testDestructor_PendingEvents() { { - BoostConnection::ref testling(BoostConnection::create(&boostIOServiceThread_->getIOService())); + BoostConnection::ref testling(BoostConnection::create(&boostIOServiceThread_->getIOService(), eventLoop_)); testling->connect(HostAddressPort(HostAddress(address, 4), 5222)); while (!eventLoop_->hasEvents()) { Swift::sleep(10); @@ -60,7 +60,7 @@ class BoostConnectionTest : public CppUnit::TestFixture { } void testWrite() { - BoostConnection::ref testling(BoostConnection::create(&boostIOServiceThread_->getIOService())); + BoostConnection::ref testling(BoostConnection::create(&boostIOServiceThread_->getIOService(), eventLoop_)); testling->onConnectFinished.connect(boost::bind(&BoostConnectionTest::doWrite, this, testling.get())); testling->onDataRead.connect(boost::bind(&BoostConnectionTest::handleDataRead, this, _1)); testling->onDisconnected.connect(boost::bind(&BoostConnectionTest::handleDisconnected, this)); diff --git a/Swiften/QA/NetworkTest/DomainNameResolverTest.cpp b/Swiften/QA/NetworkTest/DomainNameResolverTest.cpp index 309e617..c853d68 100644 --- a/Swiften/QA/NetworkTest/DomainNameResolverTest.cpp +++ b/Swiften/QA/NetworkTest/DomainNameResolverTest.cpp @@ -43,7 +43,7 @@ class DomainNameResolverTest : public CppUnit::TestFixture { void setUp() { eventLoop = new DummyEventLoop(); - resolver = new PlatformDomainNameResolver(); + resolver = new PlatformDomainNameResolver(eventLoop); resultsAvailable = false; } diff --git a/Swiften/QA/ReconnectTest/ReconnectTest.cpp b/Swiften/QA/ReconnectTest/ReconnectTest.cpp index c4e34ac..e74ae27 100644 --- a/Swiften/QA/ReconnectTest/ReconnectTest.cpp +++ b/Swiften/QA/ReconnectTest/ReconnectTest.cpp @@ -9,7 +9,7 @@ #include "Swiften/Client/Client.h" #include "Swiften/Network/BoostTimer.h" -#include "Swiften/EventLoop/MainEventLoop.h" +#include "Swiften/EventLoop/EventLoop.h" #include "Swiften/EventLoop/SimpleEventLoop.h" #include "Swiften/Roster/GetRosterRequest.h" #include "Swiften/Client/ClientXMLTracer.h" diff --git a/Swiften/Queries/Request.cpp b/Swiften/Queries/Request.cpp index db7b1f4..45ece8a 100644 --- a/Swiften/Queries/Request.cpp +++ b/Swiften/Queries/Request.cpp @@ -6,7 +6,6 @@ #include "Swiften/Queries/Request.h" #include "Swiften/Queries/IQRouter.h" -#include "Swiften/EventLoop/MainEventLoop.h" namespace Swift { diff --git a/Swiften/Roster/XMPPRosterController.cpp b/Swiften/Roster/XMPPRosterController.cpp index 75ab494..62bebc3 100644 --- a/Swiften/Roster/XMPPRosterController.cpp +++ b/Swiften/Roster/XMPPRosterController.cpp @@ -12,7 +12,6 @@ #include "Swiften/Elements/RosterItemPayload.h" #include "Swiften/Queries/IQRouter.h" #include "Swiften/Roster/GetRosterRequest.h" -#include "Swiften/EventLoop/MainEventLoop.h" #include "Swiften/Roster/Roster.h" #include "Swiften/Roster/SetPresence.h" #include "Swiften/Roster/OfflineRosterFilter.h" |