summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRemko Tronçon <git@el-tramo.be>2009-07-30 19:15:34 (GMT)
committerRemko Tronçon <git@el-tramo.be>2009-07-30 22:08:39 (GMT)
commitc8634883470be42eaa674aab05db61c46b005608 (patch)
treef0c05e8488c6f7845481d9ef27a56336a8912c55 /Slimber
parentf1938c7096f2ab77fb438d285f1eadb094010b0a (diff)
downloadswift-c8634883470be42eaa674aab05db61c46b005608.zip
swift-c8634883470be42eaa674aab05db61c46b005608.tar.bz2
Make Slimber use the new LinkLocal framework.
XMPP Server is temporarily out of order.
Diffstat (limited to 'Slimber')
-rw-r--r--Slimber/CLI/main.cpp18
-rw-r--r--Slimber/Cocoa/Makefile.inc7
-rw-r--r--Slimber/Cocoa/Menulet.m4
-rw-r--r--Slimber/Cocoa/Slimber.h13
-rw-r--r--Slimber/Cocoa/Slimber.mm42
-rw-r--r--Slimber/Server.cpp228
-rw-r--r--Slimber/Server.h77
-rw-r--r--Slimber/UnitTest/LinkLocalPresenceManagerTest.cpp12
8 files changed, 222 insertions, 179 deletions
diff --git a/Slimber/CLI/main.cpp b/Slimber/CLI/main.cpp
index 7ebdb0f..b82ffcd 100644
--- a/Slimber/CLI/main.cpp
+++ b/Slimber/CLI/main.cpp
@@ -2,14 +2,8 @@
#include <boost/bind.hpp>
#include "Swiften/Base/Platform.h"
-#if defined(SWIFTEN_PLATFORM_MACOSX) || defined(SWIFTEN_PLATFORM_WINDOWS)
-#include "Swiften/LinkLocal/AppleDNSSDService.h"
-#else
-#include "Swiften/LinkLocal/AvahiDNSSDService.h"
-#endif
#include "Slimber/Server.h"
#include "Slimber/FileVCardCollection.h"
-#include "Swiften/LinkLocal/LinkLocalRoster.h"
#include "Swiften/LinkLocal/LinkLocalServiceBrowser.h"
#include "Swiften/LinkLocal/DNSSD/DNSSDBrowseQuery.h"
#include "Swiften/LinkLocal/DNSSD/DNSSDRegisterQuery.h"
@@ -27,19 +21,7 @@ int main() {
browser.start();
/*
- boost::shared_ptr<DNSSDService> dnsSDService;
-#if defined(SWIFTEN_PLATFORM_MACOSX) || defined(SWIFTEN_PLATFORM_WINDOWS)
- dnsSDService = boost::shared_ptr<AppleDNSSDService>(
- new AppleDNSSDService());
-#else
- dnsSDService = boost::shared_ptr<AvahiDNSSDService>(
- new AvahiDNSSDService());
-#endif
-
- boost::shared_ptr<LinkLocalRoster> linkLocalRoster = boost::shared_ptr<LinkLocalRoster>(new LinkLocalRoster(dnsSDService));
-
FileVCardCollection vCardCollection(PlatformApplication("Slimber").getSettingsDir());
-
Server server(5222, 5562, linkLocalRoster, dnsSDService, &vCardCollection);
*/
diff --git a/Slimber/Cocoa/Makefile.inc b/Slimber/Cocoa/Makefile.inc
index 8068350..8cd72cd 100644
--- a/Slimber/Cocoa/Makefile.inc
+++ b/Slimber/Cocoa/Makefile.inc
@@ -2,9 +2,6 @@ SLIMBER_COCOA_TARGET = Slimber/Cocoa/Slimber.app
SLIMBER_COCOA_BINARY = \
Slimber/Cocoa/Slimber
SLIMBER_COCOA_SOURCES = \
- Slimber/Server.cpp \
- Slimber/VCardCollection.cpp \
- Slimber/FileVCardCollection.cpp \
Slimber/Cocoa/MainController.mm \
Slimber/Cocoa/Slimber.mm \
Slimber/Cocoa/main.mm \
@@ -45,5 +42,5 @@ $(SLIMBER_COCOA_TARGET): $(SLIMBER_COCOA_BINARY) $(SLIMBER_COCOA_NIBS) Slimber/C
cp $(SLIMBER_COCOA_NIBS) $(SLIMBER_COCOA_TARGET)/Contents/Resources
cp $(SLIMBER_COCOA_RESOURCES) $(SLIMBER_COCOA_TARGET)/Contents/Resources
-$(SLIMBER_COCOA_BINARY): $(SLIMBER_COCOA_OBJECTS) $(SWIFTEN_TARGET)
- $(QUIET_LINK)$(CXX) -o $@ $(SLIMBER_COCOA_OBJECTS) $(LDFLAGS) $(SWIFTEN_TARGET) $(LIBS) -framework Cocoa
+$(SLIMBER_COCOA_BINARY): $(SLIMBER_COCOA_OBJECTS) $(SWIFTEN_TARGET) $(SLIMBER_TRGET)
+ $(QUIET_LINK)$(CXX) -o $@ $(SLIMBER_COCOA_OBJECTS) $(LDFLAGS) $(SLIMBER_TARGET) $(SWIFTEN_TARGET) $(LIBS) -framework Cocoa
diff --git a/Slimber/Cocoa/Menulet.m b/Slimber/Cocoa/Menulet.m
index 4fa7fed..1cc1f1f 100644
--- a/Slimber/Cocoa/Menulet.m
+++ b/Slimber/Cocoa/Menulet.m
@@ -49,8 +49,10 @@
[statusMenu addItem: [[NSMenuItem alloc] initWithTitle: @"Online users:" action: NULL keyEquivalent: @""]];
int i;
for (i = 0; i < [userNames count]; ++i) {
- NSMenuItem* userItem = [[NSMenuItem alloc] initWithTitle: [@" " stringByAppendingString: [userNames objectAtIndex: i]] action: NULL keyEquivalent: @""];
+ NSString* text = [NSString stringWithFormat: @" %@", [userNames objectAtIndex: i]];
+ NSMenuItem* userItem = [[NSMenuItem alloc] initWithTitle: text action: NULL keyEquivalent: @""];
[statusMenu addItem: userItem];
+ [userItem release];
}
}
else {
diff --git a/Slimber/Cocoa/Slimber.h b/Slimber/Cocoa/Slimber.h
index c2c0e2d..b62f9e5 100644
--- a/Slimber/Cocoa/Slimber.h
+++ b/Slimber/Cocoa/Slimber.h
@@ -1,16 +1,13 @@
#pragma once
-#include <string>
-#include <boost/bind.hpp>
#include <boost/shared_ptr.hpp>
-#include "Swiften/LinkLocal/DNSSDService.h"
-#include "Swiften/LinkLocal/LinkLocalRoster.h"
-
@class Menulet;
namespace Swift {
class Server;
class VCardCollection;
+ class LinkLocalServiceBrowser;
+ class BonjourQuerier;
}
class Slimber {
@@ -20,11 +17,11 @@ class Slimber {
private:
void handleSelfConnected(bool b);
- void handleRosterChanged();
+ void handleServicesChanged();
private:
- boost::shared_ptr<Swift::DNSSDService> dnsSDService;
- boost::shared_ptr<Swift::LinkLocalRoster>linkLocalRoster;
+ boost::shared_ptr<Swift::BonjourQuerier> dnsSDQuerier;
+ Swift::LinkLocalServiceBrowser* linkLocalServiceBrowser;
Swift::VCardCollection* vCardCollection;
Swift::Server* server;
Menulet* menulet;
diff --git a/Slimber/Cocoa/Slimber.mm b/Slimber/Cocoa/Slimber.mm
index ae1d9fd..d4851c8 100644
--- a/Slimber/Cocoa/Slimber.mm
+++ b/Slimber/Cocoa/Slimber.mm
@@ -1,9 +1,12 @@
#include "Slimber/Cocoa/Slimber.h"
+#include <boost/bind.hpp>
+
#include "Swiften/Base/foreach.h"
-#include "Swiften/Elements/RosterPayload.h"
-#include "Swiften/LinkLocal/AppleDNSSDService.h"
#include "Swiften/Application/Platform/PlatformApplication.h"
+#include "Swiften/LinkLocal/LinkLocalService.h"
+#include "Swiften/LinkLocal/LinkLocalServiceBrowser.h"
+#include "Swiften/LinkLocal/DNSSD/Bonjour/BonjourQuerier.h"
#include "Slimber/Cocoa/Menulet.h"
#include "Slimber/Server.h"
#include "Slimber/FileVCardCollection.h"
@@ -11,37 +14,46 @@
using namespace Swift;
Slimber::Slimber() {
- dnsSDService = boost::shared_ptr<AppleDNSSDService>(new AppleDNSSDService());
+ dnsSDQuerier = boost::shared_ptr<BonjourQuerier>(new BonjourQuerier());
+ dnsSDQuerier->start();
- linkLocalRoster = boost::shared_ptr<LinkLocalRoster>(new LinkLocalRoster(dnsSDService));
- linkLocalRoster->onRosterChanged.connect(boost::bind(&Slimber::handleRosterChanged, this));
+ linkLocalServiceBrowser = new LinkLocalServiceBrowser(dnsSDQuerier);
+ linkLocalServiceBrowser->onServiceAdded.connect(
+ boost::bind(&Slimber::handleServicesChanged, this));
+ linkLocalServiceBrowser->onServiceRemoved.connect(
+ boost::bind(&Slimber::handleServicesChanged, this));
+ linkLocalServiceBrowser->onServiceChanged.connect(
+ boost::bind(&Slimber::handleServicesChanged, this));
+ linkLocalServiceBrowser->start();
- vCardCollection = new FileVCardCollection(PlatformApplication("Slimber").getSettingsDir());
+ vCardCollection = new FileVCardCollection(
+ PlatformApplication("Slimber").getSettingsDir());
- server = new Server(5222, 5562, linkLocalRoster, dnsSDService, vCardCollection);
- server->onSelfConnected.connect(boost::bind(&Slimber::handleSelfConnected, this, _1));
+ server = new Server(5222, 5562, linkLocalServiceBrowser, vCardCollection);
+ server->onSelfConnected.connect(
+ boost::bind(&Slimber::handleSelfConnected, this, _1));
menulet = [[Menulet alloc] init];
- handleRosterChanged();
+ handleServicesChanged();
}
Slimber::~Slimber() {
[menulet release];
delete server;
delete vCardCollection;
+ linkLocalServiceBrowser->stop();
+ delete linkLocalServiceBrowser;
+ dnsSDQuerier->stop();
}
void Slimber::handleSelfConnected(bool b) {
[menulet setSelfConnected: b];
}
-void Slimber::handleRosterChanged() {
+void Slimber::handleServicesChanged() {
NSMutableArray* names = [[NSMutableArray alloc] init];
- boost::shared_ptr<RosterPayload> roster = linkLocalRoster->getRoster();
- foreach(const RosterItemPayload& item, roster->getItems()) {
- NSString* name = [NSString stringWithUTF8String: item.getName().getUTF8Data()];
- [names addObject: name];
- [name release];
+ foreach(const LinkLocalService& service, linkLocalServiceBrowser->getServices()) {
+ [names addObject: [NSString stringWithUTF8String: service.getDescription().getUTF8Data()]];
}
[menulet setUserNames: names];
diff --git a/Slimber/Server.cpp b/Slimber/Server.cpp
index 39f4233..a63201b 100644
--- a/Slimber/Server.cpp
+++ b/Slimber/Server.cpp
@@ -3,75 +3,89 @@
#include <string>
#include <boost/bind.hpp>
+#include "Swiften/LinkLocal/LinkLocalConnector.h"
+#include "Swiften/Network/Connection.h"
+#include "Swiften/Session/SessionTracer.h"
+#include "Swiften/Elements/Element.h"
+#include "Swiften/Elements/Presence.h"
+#include "Swiften/Elements/RosterPayload.h"
+#include "Swiften/Network/BoostConnection.h"
+#include "Swiften/Network/BoostConnectionServer.h"
#include "Swiften/Session/SessionTracer.h"
#include "Swiften/Elements/IQ.h"
#include "Swiften/Elements/VCard.h"
#include "Swiften/Server/UserRegistry.h"
#include "Swiften/Base/String.h"
#include "Swiften/LinkLocal/LinkLocalServiceInfo.h"
-#include "Swiften/LinkLocal/LinkLocalRoster.h"
#include "Swiften/LinkLocal/OutgoingLinkLocalSession.h"
#include "Swiften/LinkLocal/IncomingLinkLocalSession.h"
+#include "Swiften/LinkLocal/LinkLocalServiceBrowser.h"
#include "Swiften/Network/ConnectionServer.h"
#include "Slimber/VCardCollection.h"
+#include "Slimber/LinkLocalPresenceManager.h"
#include "Swiften/Server/ServerFromClientSession.h"
namespace Swift {
-Server::Server(int clientConnectionPort, int linkLocalConnectionPort, boost::shared_ptr<LinkLocalRoster> linkLocalRoster, boost::shared_ptr<DNSSDService> dnsSDService, VCardCollection* vCardCollection) :
- dnsSDServiceRegistered_(false),
- rosterRequested_(false),
- clientConnectionPort_(clientConnectionPort),
- linkLocalConnectionPort_(linkLocalConnectionPort),
- linkLocalRoster_(linkLocalRoster),
- dnsSDService_(dnsSDService),
- vCardCollection_(vCardCollection) {
- serverFromClientConnectionServer_ =
+Server::Server(
+ int clientConnectionPort,
+ int linkLocalConnectionPort,
+ LinkLocalServiceBrowser* linkLocalServiceBrowser,
+ VCardCollection* vCardCollection) :
+ linkLocalServiceRegistered(false),
+ rosterRequested(false),
+ clientConnectionPort(clientConnectionPort),
+ linkLocalConnectionPort(linkLocalConnectionPort),
+ linkLocalServiceBrowser(linkLocalServiceBrowser),
+ vCardCollection(vCardCollection) {
+ serverFromClientConnectionServer =
boost::shared_ptr<BoostConnectionServer>(new BoostConnectionServer(
- clientConnectionPort, &boostIOServiceThread_.getIOService()));
- serverFromClientConnectionServer_->onNewConnection.connect(
+ 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_->start();
+ serverFromClientConnectionServer->start();
- dnsSDService_->onServiceRegistered.connect
- (boost::bind(&Server::handleServiceRegistered, this, _1));
- linkLocalRoster_->onRosterChanged.connect(
+ presenceManager = new LinkLocalPresenceManager(linkLocalServiceBrowser);
+ presenceManager->onRosterChanged.connect(
boost::bind(&Server::handleRosterChanged, this, _1));
- linkLocalRoster_->onPresenceChanged.connect(
+ presenceManager->onPresenceChanged.connect(
boost::bind(&Server::handlePresenceChanged, this, _1));
- dnsSDService_->start();
-}
-void Server::handleNewClientConnection(boost::shared_ptr<Connection> c) {
- if (serverFromClientSession_) {
- c->disconnect();
- }
- serverFromClientSession_ = boost::shared_ptr<ServerFromClientSession>(new ServerFromClientSession(idGenerator_.generateID(), c, &payloadParserFactories_, &payloadSerializers_, &userRegistry_));
- serverFromClientSession_->onSessionStarted.connect(boost::bind(&Server::handleSessionStarted, this));
- serverFromClientSession_->onElementReceived.connect(boost::bind(&Server::handleElementReceived, this, _1, serverFromClientSession_));
- serverFromClientSession_->onSessionFinished.connect(boost::bind(&Server::handleSessionFinished, this, serverFromClientSession_));
- //tracers_.push_back(boost::shared_ptr<SessionTracer>(new SessionTracer(serverFromClientSession_)));
- serverFromClientSession_->startSession();
+ linkLocalServiceBrowser->onServiceRegistered.connect(
+ boost::bind(&Server::handleServiceRegistered, this, _1));
+
+ /*
+ serverFromNetworkConnectionServer =
+ boost::shared_ptr<BoostConnectionServer>(new BoostConnectionServer(
+ linkLocalConnectionPort, &boostIOServiceThread.getIOService()));
+ serverFromNetworkConnectionServer->onNewConnection.connect(
+ boost::bind(&Server::handleNewLinkLocalConnection, this, _1));
+ serverFromNetworkConnectionServer->start();
+ */
}
-void Server::handleNewLinkLocalConnection(boost::shared_ptr<Connection> connection) {
- boost::shared_ptr<IncomingLinkLocalSession> session(
- new IncomingLinkLocalSession(
- selfJID_, connection,
- &payloadParserFactories_, &payloadSerializers_));
- registerLinkLocalSession(session);
+Server::~Server() {
+ delete presenceManager;
}
-void Server::handleServiceRegistered(const DNSSDServiceID& service) {
- std::cout << "Service registered " << service.getName() << " " << service.getType() << " " << service.getDomain() << std::endl;
- selfJID_ = JID(service.getName());
+void Server::handleNewClientConnection(boost::shared_ptr<Connection> connection) {
+ if (serverFromClientSession) {
+ connection->disconnect();
+ }
+ serverFromClientSession = boost::shared_ptr<ServerFromClientSession>(
+ new ServerFromClientSession(idGenerator.generateID(), connection,
+ &payloadParserFactories, &payloadSerializers, &userRegistry));
+ serverFromClientSession->onSessionStarted.connect(
+ boost::bind(&Server::handleSessionStarted, this));
+ serverFromClientSession->onElementReceived.connect(
+ boost::bind(&Server::handleElementReceived, this, _1,
+ serverFromClientSession));
+ serverFromClientSession->onSessionFinished.connect(
+ boost::bind(&Server::handleSessionFinished, this,
+ serverFromClientSession));
+ tracers.push_back(boost::shared_ptr<SessionTracer>(
+ new SessionTracer(serverFromClientSession)));
+ serverFromClientSession->startSession();
}
void Server::handleSessionStarted() {
@@ -79,34 +93,18 @@ void Server::handleSessionStarted() {
}
void Server::handleSessionFinished(boost::shared_ptr<ServerFromClientSession>) {
- serverFromClientSession_.reset();
+ serverFromClientSession.reset();
unregisterService();
- selfJID_ = JID();
- rosterRequested_ = false;
+ selfJID = JID();
+ rosterRequested = false;
onSelfConnected(false);
- lastPresence_.reset();
-}
-
-void Server::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 Server::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)) {
- return; // TODO: Queue
- }
- stanza->setFrom(fromJID);
- serverFromClientSession_->sendElement(stanza);
- }
+ lastPresence.reset();
}
void Server::unregisterService() {
- if (dnsSDServiceRegistered_) {
- dnsSDServiceRegistered_ = false;
- dnsSDService_->unregisterService();
+ if (linkLocalServiceRegistered) {
+ linkLocalServiceRegistered = false;
+ linkLocalServiceBrowser->unregisterService();
}
}
@@ -123,14 +121,17 @@ void Server::handleElementReceived(boost::shared_ptr<Element> element, boost::sh
if (boost::shared_ptr<Presence> presence = boost::dynamic_pointer_cast<Presence>(stanza)) {
if (presence->getType() == Presence::Available) {
- if (!dnsSDServiceRegistered_) {
- dnsSDServiceRegistered_ = true;
- dnsSDService_->registerService(session->getRemoteJID().toBare().toString(), linkLocalConnectionPort_, getLinkLocalServiceInfo(presence));
+ if (!linkLocalServiceRegistered) {
+ linkLocalServiceRegistered = true;
+ linkLocalServiceBrowser->registerService(
+ session->getRemoteJID().toBare().toString(),
+ linkLocalConnectionPort, getLinkLocalServiceInfo(presence));
}
else {
- dnsSDService_->updateService(getLinkLocalServiceInfo(presence));
+ linkLocalServiceBrowser->updateService(
+ getLinkLocalServiceInfo(presence));
}
- lastPresence_ = presence;
+ lastPresence = presence;
}
else {
unregisterService();
@@ -140,9 +141,9 @@ void Server::handleElementReceived(boost::shared_ptr<Element> element, boost::sh
if (boost::shared_ptr<IQ> iq = boost::dynamic_pointer_cast<IQ>(stanza)) {
if (iq->getPayload<RosterPayload>()) {
if (iq->getType() == IQ::Get) {
- session->sendElement(IQ::createResult(iq->getFrom(), iq->getID(), linkLocalRoster_->getRoster()));
- rosterRequested_ = true;
- foreach(const boost::shared_ptr<Presence> presence, linkLocalRoster_->getAllPresence()) {
+ session->sendElement(IQ::createResult(iq->getFrom(), iq->getID(), presenceManager->getRoster()));
+ rosterRequested = true;
+ foreach(const boost::shared_ptr<Presence> presence, presenceManager->getAllPresence()) {
session->sendElement(presence);
}
}
@@ -152,13 +153,13 @@ void Server::handleElementReceived(boost::shared_ptr<Element> element, boost::sh
}
if (boost::shared_ptr<VCard> vcard = iq->getPayload<VCard>()) {
if (iq->getType() == IQ::Get) {
- session->sendElement(IQ::createResult(iq->getFrom(), iq->getID(), vCardCollection_->getOwnVCard()));
+ session->sendElement(IQ::createResult(iq->getFrom(), iq->getID(), vCardCollection->getOwnVCard()));
}
else {
- vCardCollection_->setOwnVCard(vcard);
+ vCardCollection->setOwnVCard(vcard);
session->sendElement(IQ::createResult(iq->getFrom(), iq->getID()));
- if (lastPresence_) {
- dnsSDService_->updateService(getLinkLocalServiceInfo(lastPresence_));
+ if (lastPresence) {
+ linkLocalServiceBrowser->updateService(getLinkLocalServiceInfo(lastPresence));
}
}
}
@@ -167,6 +168,7 @@ void Server::handleElementReceived(boost::shared_ptr<Element> element, boost::sh
}
}
}
+ /*
else {
JID toJID = stanza->getTo();
boost::shared_ptr<Session> outgoingSession =
@@ -175,17 +177,17 @@ void Server::handleElementReceived(boost::shared_ptr<Element> element, boost::sh
outgoingSession->sendElement(stanza);
}
else {
- if (linkLocalRoster_->hasItem(toJID)) {
+ if (linkLocalServiceBrowser->hasItem(toJID)) {
boost::shared_ptr<LinkLocalConnector> connector =
getLinkLocalConnectorForJID(toJID);
if (!connector) {
connector = boost::shared_ptr<LinkLocalConnector>(
new LinkLocalConnector(
toJID,
- linkLocalRoster_->getHostname(toJID),
- linkLocalRoster_->getPort(toJID),
- dnsSDService_,
- boost::shared_ptr<BoostConnection>(new BoostConnection(&boostIOServiceThread_.getIOService()))));
+ linkLocalServiceBrowser->getHostname(toJID),
+ linkLocalServiceBrowser->getPort(toJID),
+ linkLocalServiceBrowser,
+ boost::shared_ptr<BoostConnection>(new BoostConnection(&boostIOServiceThread.getIOService()))));
connector->onConnectFinished.connect(
boost::bind(&Server::handleConnectFinished, this, connector, _1));
connectors_.push_back(connector);
@@ -200,6 +202,32 @@ void Server::handleElementReceived(boost::shared_ptr<Element> element, boost::sh
}
}
}
+ */
+}
+
+/*
+void Server::handleNewLinkLocalConnection(boost::shared_ptr<Connection> connection) {
+ boost::shared_ptr<IncomingLinkLocalSession> session(
+ new IncomingLinkLocalSession(
+ selfJID, connection,
+ &payloadParserFactories, &payloadSerializers));
+ registerLinkLocalSession(session);
+}
+
+void Server::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 Server::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 (!linkLocalServiceBrowser->hasItem(fromJID)) {
+ return; // TODO: Queue
+ }
+ stanza->setFrom(fromJID);
+ serverFromClientSession->sendElement(stanza);
+ }
}
void Server::handleConnectFinished(boost::shared_ptr<LinkLocalConnector> connector, bool error) {
@@ -210,8 +238,8 @@ void Server::handleConnectFinished(boost::shared_ptr<LinkLocalConnector> connect
else {
boost::shared_ptr<OutgoingLinkLocalSession> outgoingSession(
new OutgoingLinkLocalSession(
- selfJID_, connector->getRemoteJID(), connector->getConnection(),
- &payloadParserFactories_, &payloadSerializers_));
+ selfJID, connector->getRemoteJID(), connector->getConnection(),
+ &payloadParserFactories, &payloadSerializers));
foreach(const boost::shared_ptr<Element> element, connector->getQueuedElements()) {
outgoingSession->queueElement(element);
}
@@ -225,7 +253,7 @@ void Server::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);
- //tracers_.push_back(boost::shared_ptr<SessionTracer>(new SessionTracer(session)));
+ //tracers.push_back(boost::shared_ptr<SessionTracer>(new SessionTracer(session)));
session->startSession();
}
@@ -246,24 +274,32 @@ boost::shared_ptr<LinkLocalConnector> Server::getLinkLocalConnectorForJID(const
}
return boost::shared_ptr<LinkLocalConnector>();
}
+*/
+
+void Server::handleServiceRegistered(const DNSSDServiceID& service) {
+ selfJID = JID(service.getName());
+}
void Server::handleRosterChanged(boost::shared_ptr<RosterPayload> roster) {
- if (rosterRequested_) {
- boost::shared_ptr<IQ> iq = IQ::createRequest(IQ::Set, serverFromClientSession_->getRemoteJID(), idGenerator_.generateID(), roster);
- iq->setFrom(serverFromClientSession_->getRemoteJID().toBare());
- serverFromClientSession_->sendElement(iq);
+ if (rosterRequested) {
+ assert(serverFromClientSession);
+ boost::shared_ptr<IQ> iq = IQ::createRequest(
+ IQ::Set, serverFromClientSession->getRemoteJID(),
+ idGenerator.generateID(), roster);
+ iq->setFrom(serverFromClientSession->getRemoteJID().toBare());
+ serverFromClientSession->sendElement(iq);
}
}
void Server::handlePresenceChanged(boost::shared_ptr<Presence> presence) {
- if (rosterRequested_) {
- serverFromClientSession_->sendElement(presence);
+ if (rosterRequested) {
+ serverFromClientSession->sendElement(presence);
}
}
LinkLocalServiceInfo Server::getLinkLocalServiceInfo(boost::shared_ptr<Presence> presence) {
LinkLocalServiceInfo info;
- boost::shared_ptr<VCard> vcard = vCardCollection_->getOwnVCard();
+ boost::shared_ptr<VCard> vcard = vCardCollection->getOwnVCard();
if (!vcard->getFamilyName().isEmpty() || !vcard->getGivenName().isEmpty()) {
info.setFirstName(vcard->getGivenName());
info.setLastName(vcard->getFamilyName());
@@ -294,7 +330,7 @@ LinkLocalServiceInfo Server::getLinkLocalServiceInfo(boost::shared_ptr<Presence>
info.setStatus(LinkLocalServiceInfo::DND);
break;
}
- info.setPort(linkLocalConnectionPort_);
+ info.setPort(linkLocalConnectionPort);
return info;
}
diff --git a/Slimber/Server.h b/Slimber/Server.h
index 9167106..3ed0a58 100644
--- a/Slimber/Server.h
+++ b/Slimber/Server.h
@@ -3,49 +3,56 @@
#include <boost/shared_ptr.hpp>
#include <vector>
-#include "Swiften/Network/BoostConnection.h"
#include "Swiften/Network/BoostIOServiceThread.h"
-#include "Swiften/Network/BoostConnectionServer.h"
#include "Swiften/Server/UserRegistry.h"
#include "Swiften/Base/IDGenerator.h"
-#include "Swiften/Network/Connection.h"
-#include "Swiften/LinkLocal/DNSSDService.h"
-#include "Swiften/LinkLocal/LinkLocalRoster.h"
-#include "Swiften/Session/SessionTracer.h"
#include "Swiften/Server/ServerFromClientSession.h"
-#include "Swiften/Elements/Element.h"
-#include "Swiften/LinkLocal/LinkLocalConnector.h"
#include "Swiften/JID/JID.h"
-#include "Swiften/Elements/Presence.h"
-#include "Swiften/Elements/RosterPayload.h"
#include "Swiften/Parser/PayloadParsers/FullPayloadParserFactoryCollection.h"
#include "Swiften/Serializer/PayloadSerializers/FullPayloadSerializerCollection.h"
+#include "Swiften/LinkLocal/LinkLocalServiceInfo.h"
namespace Swift {
+ class DNSSDServiceID;
+ class String;
class VCardCollection;
+ class LinkLocalServiceBrowser;
+ class LinkLocalPresenceManager;
+ class BoostConnectionServer;
+ class SessionTracer;
+ class RosterPayload;
+ class Presence;
class Server {
public:
- Server(int clientConnectionPort, int linkLocalConnectionPort, boost::shared_ptr<LinkLocalRoster>, boost::shared_ptr<DNSSDService> dnsSDService, VCardCollection* vCardCollection);
+ Server(
+ int clientConnectionPort,
+ int linkLocalConnectionPort,
+ LinkLocalServiceBrowser* browser,
+ VCardCollection* vCardCollection);
+ ~Server();
boost::signal<void (bool)> onSelfConnected;
private:
void handleNewClientConnection(boost::shared_ptr<Connection> c);
- void handleNewLinkLocalConnection(boost::shared_ptr<Connection> connection);
- void handleServiceRegistered(const DNSSDServiceID& service);
void handleSessionStarted();
void handleSessionFinished(boost::shared_ptr<ServerFromClientSession>);
+ void handleElementReceived(boost::shared_ptr<Element> element, boost::shared_ptr<ServerFromClientSession> session);
+ void handleRosterChanged(boost::shared_ptr<RosterPayload> roster);
+ void handlePresenceChanged(boost::shared_ptr<Presence> presence);
+ void handleServiceRegistered(const DNSSDServiceID& service);
+/*
+ void handleNewLinkLocalConnection(boost::shared_ptr<Connection> connection);
void handleLinkLocalSessionFinished(boost::shared_ptr<Session> session);
void handleLinkLocalElementReceived(boost::shared_ptr<Element> element, boost::shared_ptr<Session> session);
- void unregisterService();
- void handleElementReceived(boost::shared_ptr<Element> element, boost::shared_ptr<ServerFromClientSession> session);
void handleConnectFinished(boost::shared_ptr<LinkLocalConnector> connector, bool error);
void registerLinkLocalSession(boost::shared_ptr<Session> session);
boost::shared_ptr<Session> getLinkLocalSessionForJID(const JID& jid);
boost::shared_ptr<LinkLocalConnector> getLinkLocalConnectorForJID(const JID& jid);
- void handleRosterChanged(boost::shared_ptr<RosterPayload> roster);
- void handlePresenceChanged(boost::shared_ptr<Presence> presence);
+ */
+
+ void unregisterService();
LinkLocalServiceInfo getLinkLocalServiceInfo(boost::shared_ptr<Presence> presence);
private:
@@ -59,25 +66,27 @@ namespace Swift {
};
private:
- IDGenerator idGenerator_;
- BoostIOServiceThread boostIOServiceThread_;
- DummyUserRegistry userRegistry_;
- bool dnsSDServiceRegistered_;
- bool rosterRequested_;
- int clientConnectionPort_;
- int linkLocalConnectionPort_;
- boost::shared_ptr<LinkLocalRoster> linkLocalRoster_;
- boost::shared_ptr<DNSSDService> dnsSDService_;
- VCardCollection* vCardCollection_;
- boost::shared_ptr<Presence> lastPresence_;
- boost::shared_ptr<BoostConnectionServer> serverFromClientConnectionServer_;
- boost::shared_ptr<ServerFromClientSession> serverFromClientSession_;
+ IDGenerator idGenerator;
+ FullPayloadParserFactoryCollection payloadParserFactories;
+ FullPayloadSerializerCollection payloadSerializers;
+ BoostIOServiceThread boostIOServiceThread;
+ DummyUserRegistry userRegistry;
+ bool linkLocalServiceRegistered;
+ bool rosterRequested;
+ int clientConnectionPort;
+ int linkLocalConnectionPort;
+ LinkLocalServiceBrowser* linkLocalServiceBrowser;
+ VCardCollection* vCardCollection;
+ LinkLocalPresenceManager* presenceManager;
+ boost::shared_ptr<BoostConnectionServer> serverFromClientConnectionServer;
+ boost::shared_ptr<ServerFromClientSession> serverFromClientSession;
+ boost::shared_ptr<Presence> lastPresence;
+ JID selfJID;
+ /*
boost::shared_ptr<BoostConnectionServer> serverFromNetworkConnectionServer_;
- std::vector< boost::shared_ptr<SessionTracer> > tracers_;
std::vector< boost::shared_ptr<Session> > linkLocalSessions_;
std::vector< boost::shared_ptr<LinkLocalConnector> > connectors_;
- FullPayloadParserFactoryCollection payloadParserFactories_;
- FullPayloadSerializerCollection payloadSerializers_;
- JID selfJID_;
+*/
+ std::vector< boost::shared_ptr<SessionTracer> > tracers;
};
}
diff --git a/Slimber/UnitTest/LinkLocalPresenceManagerTest.cpp b/Slimber/UnitTest/LinkLocalPresenceManagerTest.cpp
index a1ecdf8..f15daf4 100644
--- a/Slimber/UnitTest/LinkLocalPresenceManagerTest.cpp
+++ b/Slimber/UnitTest/LinkLocalPresenceManagerTest.cpp
@@ -18,6 +18,7 @@ using namespace Swift;
class LinkLocalPresenceManagerTest : public CppUnit::TestFixture {
CPPUNIT_TEST_SUITE(LinkLocalPresenceManagerTest);
+ CPPUNIT_TEST(testConstructor);
CPPUNIT_TEST(testServiceAdded);
CPPUNIT_TEST(testServiceRemoved);
CPPUNIT_TEST(testServiceChanged);
@@ -31,8 +32,6 @@ class LinkLocalPresenceManagerTest : public CppUnit::TestFixture {
CPPUNIT_TEST_SUITE_END();
public:
- LinkLocalPresenceManagerTest() {}
-
void setUp() {
eventLoop = new DummyEventLoop();
querier = boost::shared_ptr<FakeDNSSDQuerier>(new FakeDNSSDQuerier("wonderland.lit"));
@@ -46,6 +45,15 @@ class LinkLocalPresenceManagerTest : public CppUnit::TestFixture {
delete eventLoop;
}
+ void testConstructor() {
+ addService("alice@wonderland");
+ addService("rabbit@teaparty");
+ std::auto_ptr<LinkLocalPresenceManager> testling(createTestling());
+
+ CPPUNIT_ASSERT_EQUAL(2, static_cast<int>(testling->getRoster()->getItems().size()));
+ CPPUNIT_ASSERT_EQUAL(2, static_cast<int>(testling->getAllPresence().size()));
+ }
+
void testServiceAdded() {
std::auto_ptr<LinkLocalPresenceManager> testling(createTestling());