diff options
| author | Remko Tronçon <git@el-tramo.be> | 2009-07-29 20:18:02 (GMT) | 
|---|---|---|
| committer | Remko Tronçon <git@el-tramo.be> | 2009-07-30 18:31:58 (GMT) | 
| commit | b145bde2b103b0e688eef6300d34668431c5ad04 (patch) | |
| tree | 4789bd165ed919e20f80bbfb658263302c8a71c7 /Slimber/LinkLocalPresenceManager.cpp | |
| parent | 4b809245dd6a1236dda99ab780485599434a419a (diff) | |
| download | swift-b145bde2b103b0e688eef6300d34668431c5ad04.zip swift-b145bde2b103b0e688eef6300d34668431c5ad04.tar.bz2 | |
Created LinkLocalPresenceManager.
Diffstat (limited to 'Slimber/LinkLocalPresenceManager.cpp')
| -rw-r--r-- | Slimber/LinkLocalPresenceManager.cpp | 98 | 
1 files changed, 98 insertions, 0 deletions
| diff --git a/Slimber/LinkLocalPresenceManager.cpp b/Slimber/LinkLocalPresenceManager.cpp new file mode 100644 index 0000000..b964786 --- /dev/null +++ b/Slimber/LinkLocalPresenceManager.cpp @@ -0,0 +1,98 @@ +#include "Slimber/LinkLocalPresenceManager.h" + +#include <boost/bind.hpp> + +#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)); +} + +void LinkLocalPresenceManager::handleServiceAdded(const LinkLocalService& service) { +	boost::shared_ptr<RosterPayload> 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<RosterPayload> roster(new RosterPayload()); +	roster->addItem(RosterItemPayload(getJIDForService(service), "", RosterItemPayload::Remove)); +	onRosterChanged(roster); +} + +boost::shared_ptr<RosterPayload> LinkLocalPresenceManager::getRoster() const { +	boost::shared_ptr<RosterPayload> roster(new RosterPayload()); +	foreach(const LinkLocalService& service, browser->getServices()) { +		roster->addItem(getRosterItem(service)); +	} +	return roster; +} + +std::vector<boost::shared_ptr<Presence> > LinkLocalPresenceManager::getAllPresence() const { +	std::vector<boost::shared_ptr<Presence> > result; +	foreach(const LinkLocalService& service, browser->getServices()) { +		result.push_back(getPresence(service)); +	} +	return result; +} + +RosterItemPayload LinkLocalPresenceManager::getRosterItem(const LinkLocalService& service) const { + return RosterItemPayload(getJIDForService(service), 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 ""; +} + +JID LinkLocalPresenceManager::getJIDForService(const LinkLocalService& service) const { +	return JID(service.getName()); +} + +boost::shared_ptr<Presence> LinkLocalPresenceManager::getPresence(const LinkLocalService& service) const { +	boost::shared_ptr<Presence> presence(new Presence()); +	presence->setFrom(getJIDForService(service)); +	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; +} + +} | 
 Swift
 Swift