summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to 'Swiften/LinkLocal/LinkLocalRoster.cpp')
-rw-r--r--Swiften/LinkLocal/LinkLocalRoster.cpp81
1 files changed, 68 insertions, 13 deletions
diff --git a/Swiften/LinkLocal/LinkLocalRoster.cpp b/Swiften/LinkLocal/LinkLocalRoster.cpp
index feec7b7..aedea77 100644
--- a/Swiften/LinkLocal/LinkLocalRoster.cpp
+++ b/Swiften/LinkLocal/LinkLocalRoster.cpp
@@ -12,37 +12,92 @@ LinkLocalRoster::LinkLocalRoster(boost::shared_ptr<DNSSDService> service) : dnsS
dnsSDService->onServiceAdded.connect(boost::bind(&LinkLocalRoster::handleServiceAdded, this, _1));
dnsSDService->onServiceRemoved.connect(boost::bind(&LinkLocalRoster::handleServiceRemoved, this, _1));
dnsSDService->onServiceResolved.connect(boost::bind(&LinkLocalRoster::handleServiceResolved, this, _1, _2));
- dnsSDService->onHostnameResolved.connect(boost::bind(&LinkLocalRoster::handleHostnameResolved, this, _1, _2));
+}
+
+boost::shared_ptr<RosterPayload> LinkLocalRoster::getRoster() const {
+ boost::shared_ptr<RosterPayload> roster(new RosterPayload());
+ for(ServiceMap::const_iterator i = services.begin(); i != services.end(); ++i) {
+ roster->addItem(getRosterItem(i->first, i->second));
+ }
+ return roster;
+}
+
+std::vector<boost::shared_ptr<Presence> > LinkLocalRoster::getAllPresence() const {
+ std::vector<boost::shared_ptr<Presence> > result;
+ for(ServiceMap::const_iterator i = services.begin(); i != services.end(); ++i) {
+ result.push_back(getPresence(i->first, i->second));
+ }
+ return result;
+}
+
+RosterItemPayload LinkLocalRoster::getRosterItem(const DNSSDService::Service& service, const DNSSDService::ResolveResult& resolveResult) const {
+ return RosterItemPayload(getJIDForService(service), getRosterName(service, resolveResult), RosterItemPayload::Both);
+}
+
+String LinkLocalRoster::getRosterName(const DNSSDService::Service& service, const DNSSDService::ResolveResult& resolveResult) const {
+ if (!resolveResult.info.getNick().isEmpty()) {
+ return resolveResult.info.getNick();
+ }
+ else if (!resolveResult.info.getFirstName().isEmpty()) {
+ String result = resolveResult.info.getFirstName();
+ if (!resolveResult.info.getLastName().isEmpty()) {
+ result += " " + resolveResult.info.getLastName();
+ }
+ return result;
+ }
+ else if (!resolveResult.info.getLastName().isEmpty()) {
+ return resolveResult.info.getLastName();
+ }
+ return service.name;
+}
+
+JID LinkLocalRoster::getJIDForService(const DNSSDService::Service& service) const {
+ return JID(service.name);
+}
+
+boost::shared_ptr<Presence> LinkLocalRoster::getPresence(const DNSSDService::Service& service, const DNSSDService::ResolveResult& resolveResult) const {
+ boost::shared_ptr<Presence> presence(new Presence());
+ presence->setFrom(getJIDForService(service));
+ switch (resolveResult.info.getStatus()) {
+ case LinkLocalServiceInfo::Available:
+ presence->setShow(StatusShow::Online);
+ break;
+ case LinkLocalServiceInfo::Away:
+ presence->setShow(StatusShow::Away);
+ break;
+ case LinkLocalServiceInfo::DND:
+ presence->setShow(StatusShow::DND);
+ break;
+ }
+ presence->setStatus(resolveResult.info.getMessage());
+ return presence;
}
void LinkLocalRoster::handleServiceAdded(const DNSSDService::Service& service) {
if (selfService && *selfService == service) {
return;
}
- std::cout << "Service added " << service.name << " " << service.type << " " << service.domain << std::endl;
dnsSDService->startResolvingService(service);
}
void LinkLocalRoster::handleServiceRemoved(const DNSSDService::Service& service) {
- std::cout << "Service removed " << service.name << " " << service.type << " " << service.domain << std::endl;
dnsSDService->stopResolvingService(service);
+ services.erase(service);
+ boost::shared_ptr<RosterPayload> roster(new RosterPayload());
+ roster->addItem(RosterItemPayload(getJIDForService(service), "", RosterItemPayload::Remove));
+ onRosterChanged(roster);
}
void LinkLocalRoster::handleServiceResolved(const DNSSDService::Service& service, const DNSSDService::ResolveResult& result) {
- std::cout << "Service resolved: " << service.name << "->" << result.host << " " << result.port << " " << result.info.getLastName() << std::endl;
+ services.insert(std::make_pair(service, result));
dnsSDService->resolveHostname(result.host);
-}
-void LinkLocalRoster::handleHostnameResolved(const String& hostname, const boost::optional<HostAddress>& address) {
- if (address) {
- std::cout << "Address resolved: " << hostname << " " << address->toString() << std::endl;
- }
- else {
- std::cout << "Unable to resolve address for " << hostname << std::endl;
- }
+ boost::shared_ptr<RosterPayload> roster(new RosterPayload());
+ roster->addItem(getRosterItem(service, result));
+ onRosterChanged(roster);
+ onPresenceChanged(getPresence(service, result));
}
-
void LinkLocalRoster::handleServiceRegistered(const DNSSDService::Service& service) {
selfService = service;
}