/* * Copyright (c) 2010 Remko Tronçon * Licensed under the GNU General Public License v3. * See Documentation/Licenses/GPLv3.txt for more information. */ #include "Slimber/LinkLocalPresenceManager.h" #include #include "Swiften/Base/foreach.h" #include "Swiften/LinkLocal/LinkLocalServiceBrowser.h" #include "Swiften/Elements/RosterPayload.h" #include "Swiften/Elements/Presence.h" namespace Swift { LinkLocalPresenceManager::LinkLocalPresenceManager(LinkLocalServiceBrowser* browser) : browser(browser) { browser->onServiceAdded.connect( boost::bind(&LinkLocalPresenceManager::handleServiceAdded, this, _1)); browser->onServiceChanged.connect( boost::bind(&LinkLocalPresenceManager::handleServiceChanged, this, _1)); browser->onServiceRemoved.connect( boost::bind(&LinkLocalPresenceManager::handleServiceRemoved, this, _1)); } boost::optional LinkLocalPresenceManager::getServiceForJID(const JID& j) const { foreach(const LinkLocalService& service, browser->getServices()) { if (service.getJID() == j) { return service; } } return boost::optional(); } void LinkLocalPresenceManager::handleServiceAdded(const LinkLocalService& service) { boost::shared_ptr roster(new RosterPayload()); roster->addItem(getRosterItem(service)); onRosterChanged(roster); onPresenceChanged(getPresence(service)); } void LinkLocalPresenceManager::handleServiceChanged(const LinkLocalService& service) { onPresenceChanged(getPresence(service)); } void LinkLocalPresenceManager::handleServiceRemoved(const LinkLocalService& service) { boost::shared_ptr roster(new RosterPayload()); roster->addItem(RosterItemPayload(service.getJID(), "", RosterItemPayload::Remove)); onRosterChanged(roster); } boost::shared_ptr LinkLocalPresenceManager::getRoster() const { boost::shared_ptr roster(new RosterPayload()); foreach(const LinkLocalService& service, browser->getServices()) { roster->addItem(getRosterItem(service)); } return roster; } std::vector > LinkLocalPresenceManager::getAllPresence() const { std::vector > result; foreach(const LinkLocalService& service, browser->getServices()) { result.push_back(getPresence(service)); } return result; } RosterItemPayload LinkLocalPresenceManager::getRosterItem(const LinkLocalService& service) const { return RosterItemPayload(service.getJID(), getRosterName(service), RosterItemPayload::Both); } String LinkLocalPresenceManager::getRosterName(const LinkLocalService& service) const { LinkLocalServiceInfo info = service.getInfo(); if (!info.getNick().isEmpty()) { return info.getNick(); } else if (!info.getFirstName().isEmpty()) { String result = info.getFirstName(); if (!info.getLastName().isEmpty()) { result += " " + info.getLastName(); } return result; } else if (!info.getLastName().isEmpty()) { return info.getLastName(); } return ""; } boost::shared_ptr LinkLocalPresenceManager::getPresence(const LinkLocalService& service) const { boost::shared_ptr presence(new Presence()); presence->setFrom(service.getJID()); switch (service.getInfo().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(service.getInfo().getMessage()); return presence; } }