diff options
Diffstat (limited to 'Nim')
-rw-r--r-- | Nim/main.cpp | 122 |
1 files changed, 85 insertions, 37 deletions
diff --git a/Nim/main.cpp b/Nim/main.cpp index 127878c..2fd5b21 100644 --- a/Nim/main.cpp +++ b/Nim/main.cpp @@ -16,9 +16,9 @@ #include "Swiften/EventLoop/SimpleEventLoop.h" #include "Swiften/EventLoop/EventOwner.h" #include "Swiften/Elements/Element.h" +#include "Swiften/LinkLocal/LinkLocalConnector.h" #include "Swiften/LinkLocal/LinkLocalServiceInfo.h" #include "Swiften/LinkLocal/LinkLocalRoster.h" -#include "Swiften/LinkLocal/LinkLocalSession.h" #include "Swiften/LinkLocal/OutgoingLinkLocalSession.h" #include "Swiften/LinkLocal/IncomingLinkLocalSession.h" #include "Swiften/LinkLocal/DNSSDService.h" @@ -46,20 +46,35 @@ class DummyUserRegistry : public UserRegistry { class Server { public: - Server(int clientConnectionPort, int linkLocalConnectionPort) : boostConnectionFactory_(&boostIOServiceThread_.getIOService()), dnsSDServiceRegistered_(false), rosterRequested_(false), clientConnectionPort_(clientConnectionPort), linkLocalConnectionPort_(linkLocalConnectionPort) { - serverFromClientConnectionServer_ = boost::shared_ptr<BoostConnectionServer>(new BoostConnectionServer(clientConnectionPort, &boostIOServiceThread_.getIOService())); - serverFromClientConnectionServer_->onNewConnection.connect(boost::bind(&Server::handleNewClientConnection, this, _1)); + Server(int clientConnectionPort, int linkLocalConnectionPort) : + dnsSDServiceRegistered_(false), + rosterRequested_(false), + clientConnectionPort_(clientConnectionPort), + linkLocalConnectionPort_(linkLocalConnectionPort) { + serverFromClientConnectionServer_ = + boost::shared_ptr<BoostConnectionServer>(new BoostConnectionServer( + clientConnectionPort, &boostIOServiceThread_.getIOService())); + serverFromClientConnectionServer_->onNewConnection.connect( + boost::bind(&Server::handleNewClientConnection, this, _1)); serverFromClientConnectionServer_->start(); - serverFromNetworkConnectionServer_ = boost::shared_ptr<BoostConnectionServer>(new BoostConnectionServer(linkLocalConnectionPort, &boostIOServiceThread_.getIOService())); - serverFromNetworkConnectionServer_->onNewConnection.connect(boost::bind(&Server::handleNewLinkLocalConnection, this, _1)); + serverFromNetworkConnectionServer_ = + boost::shared_ptr<BoostConnectionServer>(new BoostConnectionServer( + linkLocalConnectionPort, &boostIOServiceThread_.getIOService())); + serverFromNetworkConnectionServer_->onNewConnection.connect( + boost::bind(&Server::handleNewLinkLocalConnection, this, _1)); serverFromNetworkConnectionServer_->start(); - dnsSDService_ = boost::shared_ptr<AppleDNSSDService>(new AppleDNSSDService()); - dnsSDService_->onServiceRegistered.connect(boost::bind(&Server::handleServiceRegistered, this, _1)); - linkLocalRoster_ = boost::shared_ptr<LinkLocalRoster>(new LinkLocalRoster(dnsSDService_)); - linkLocalRoster_->onRosterChanged.connect(boost::bind(&Server::handleRosterChanged, this, _1)); - linkLocalRoster_->onPresenceChanged.connect(boost::bind(&Server::handlePresenceChanged, this, _1)); + dnsSDService_ = boost::shared_ptr<AppleDNSSDService>( + new AppleDNSSDService()); + dnsSDService_->onServiceRegistered.connect + (boost::bind(&Server::handleServiceRegistered, this, _1)); + linkLocalRoster_ = boost::shared_ptr<LinkLocalRoster>( + new LinkLocalRoster(dnsSDService_)); + linkLocalRoster_->onRosterChanged.connect( + boost::bind(&Server::handleRosterChanged, this, _1)); + linkLocalRoster_->onPresenceChanged.connect( + boost::bind(&Server::handlePresenceChanged, this, _1)); dnsSDService_->start(); } @@ -94,12 +109,12 @@ class Server { rosterRequested_ = false; } - void handleLinkLocalSessionFinished(boost::shared_ptr<LinkLocalSession> session) { + void handleLinkLocalSessionFinished(boost::shared_ptr<Session> session) { std::cout << "Link local session from " << session->getRemoteJID() << " ended" << std::endl; linkLocalSessions_.erase(std::remove(linkLocalSessions_.begin(), linkLocalSessions_.end(), session), linkLocalSessions_.end()); } - void handleLinkLocalElementReceived(boost::shared_ptr<Element> element, boost::shared_ptr<LinkLocalSession> session) { + void handleLinkLocalElementReceived(boost::shared_ptr<Element> element, boost::shared_ptr<Session> session) { if (boost::shared_ptr<Stanza> stanza = boost::dynamic_pointer_cast<Stanza>(element)) { JID fromJID = session->getRemoteJID(); if (!linkLocalRoster_->hasItem(fromJID)) { @@ -123,16 +138,16 @@ class Server { return; } - stanza->setFrom(session->getJID()); + stanza->setFrom(session->getRemoteJID()); if (!stanza->getTo().isValid()) { - stanza->setTo(JID(session->getDomain())); + stanza->setTo(session->getLocalJID()); } if (boost::shared_ptr<Presence> presence = boost::dynamic_pointer_cast<Presence>(stanza)) { if (presence->getType() == Presence::Available) { if (!dnsSDServiceRegistered_) { dnsSDServiceRegistered_ = true; - dnsSDService_->registerService(session->getJID().toBare().toString(), linkLocalConnectionPort_, getLinkLocalServiceInfo(presence)); + dnsSDService_->registerService(session->getRemoteJID().toBare().toString(), linkLocalConnectionPort_, getLinkLocalServiceInfo(presence)); } else { dnsSDService_->updateService(getLinkLocalServiceInfo(presence)); @@ -142,7 +157,7 @@ class Server { unregisterService(); } } - else if (!stanza->getTo().isValid() || stanza->getTo() == session->getDomain() || stanza->getTo() == session->getJID().toBare()) { + else if (!stanza->getTo().isValid() || stanza->getTo() == session->getLocalJID() || stanza->getTo() == session->getRemoteJID().toBare()) { if (boost::shared_ptr<IQ> iq = boost::dynamic_pointer_cast<IQ>(stanza)) { if (iq->getPayload<RosterPayload>()) { if (iq->getType() == IQ::Get) { @@ -173,23 +188,28 @@ class Server { } else { JID toJID = stanza->getTo(); - boost::shared_ptr<LinkLocalSession> outgoingSession = + boost::shared_ptr<Session> outgoingSession = getLinkLocalSessionForJID(toJID); if (outgoingSession) { outgoingSession->sendElement(stanza); } else { if (linkLocalRoster_->hasItem(toJID)) { - boost::shared_ptr<OutgoingLinkLocalSession> outgoingSession( - new OutgoingLinkLocalSession( - selfJID_, toJID, - linkLocalRoster_->getHostname(toJID), - linkLocalRoster_->getPort(toJID), - dnsSDService_, - &payloadParserFactories_, &payloadSerializers_, - &boostConnectionFactory_)); - registerLinkLocalSession(outgoingSession); - outgoingSession->sendElement(stanza); + boost::shared_ptr<LinkLocalConnector> connector = + getLinkLocalConnectorForJID(toJID); + if (!connector) { + boost::shared_ptr<LinkLocalConnector> connector( + new LinkLocalConnector( + toJID, + linkLocalRoster_->getHostname(toJID), + linkLocalRoster_->getPort(toJID), + dnsSDService_, + boost::shared_ptr<BoostConnection>(new BoostConnection(&boostIOServiceThread_.getIOService())))); + connector->onConnectFinished.connect( + boost::bind(&Server::handleConnectFinished, this, connector, _1)); + connectors_.push_back(connector); + } + connector->queueElement(element); } else { session->sendElement(IQ::createError( @@ -200,26 +220,54 @@ class Server { } } - void registerLinkLocalSession(boost::shared_ptr<LinkLocalSession> session) { + void handleConnectFinished(boost::shared_ptr<LinkLocalConnector> connector, bool error) { + if (error) { + std::cerr << "Error connecting" << std::endl; + // TODO: Send back queued stanzas + } + else { + boost::shared_ptr<OutgoingLinkLocalSession> outgoingSession( + new OutgoingLinkLocalSession( + selfJID_, connector->getRemoteJID(), connector->getConnection(), + &payloadParserFactories_, &payloadSerializers_)); + registerLinkLocalSession(outgoingSession); + foreach(const boost::shared_ptr<Element> element, connector->getQueuedElements()) { + outgoingSession->queueElement(element); + } + } + connectors_.erase(std::remove(connectors_.begin(), connectors_.end(), connector), connectors_.end()); + } + + + void registerLinkLocalSession(boost::shared_ptr<Session> session) { session->onSessionFinished.connect(boost::bind(&Server::handleLinkLocalSessionFinished, this, session)); session->onElementReceived.connect(boost::bind(&Server::handleLinkLocalElementReceived, this, _1, session)); linkLocalSessions_.push_back(session); - session->start(); + session->startSession(); } - boost::shared_ptr<LinkLocalSession> getLinkLocalSessionForJID(const JID& jid) { - foreach(const boost::shared_ptr<LinkLocalSession> session, linkLocalSessions_) { + boost::shared_ptr<Session> getLinkLocalSessionForJID(const JID& jid) { + foreach(const boost::shared_ptr<Session> session, linkLocalSessions_) { if (session->getRemoteJID() == jid) { return session; } } - return boost::shared_ptr<LinkLocalSession>(); + return boost::shared_ptr<Session>(); + } + + boost::shared_ptr<LinkLocalConnector> getLinkLocalConnectorForJID(const JID& jid) { + foreach(const boost::shared_ptr<LinkLocalConnector> connector, connectors_) { + if (connector->getRemoteJID() == jid) { + return connector; + } + } + return boost::shared_ptr<LinkLocalConnector>(); } void handleRosterChanged(boost::shared_ptr<RosterPayload> roster) { if (rosterRequested_) { - boost::shared_ptr<IQ> iq = IQ::createRequest(IQ::Set, serverFromClientSession_->getJID(), idGenerator_.generateID(), roster); - iq->setFrom(serverFromClientSession_->getJID().toBare()); + boost::shared_ptr<IQ> iq = IQ::createRequest(IQ::Set, serverFromClientSession_->getRemoteJID(), idGenerator_.generateID(), roster); + iq->setFrom(serverFromClientSession_->getRemoteJID().toBare()); serverFromClientSession_->sendElement(iq); } } @@ -259,14 +307,14 @@ class Server { private: IDGenerator idGenerator_; BoostIOServiceThread boostIOServiceThread_; - BoostConnectionFactory boostConnectionFactory_; DummyUserRegistry userRegistry_; boost::shared_ptr<AppleDNSSDService> dnsSDService_; boost::shared_ptr<LinkLocalRoster> linkLocalRoster_; boost::shared_ptr<BoostConnectionServer> serverFromClientConnectionServer_; boost::shared_ptr<ServerFromClientSession> serverFromClientSession_; boost::shared_ptr<BoostConnectionServer> serverFromNetworkConnectionServer_; - std::vector< boost::shared_ptr<LinkLocalSession> > linkLocalSessions_; + std::vector< boost::shared_ptr<Session> > linkLocalSessions_; + std::vector< boost::shared_ptr<LinkLocalConnector> > connectors_; FullPayloadParserFactoryCollection payloadParserFactories_; FullPayloadSerializerCollection payloadSerializers_; bool dnsSDServiceRegistered_; |