/* * Copyright (c) 2010 Remko Tronçon * Licensed under the GNU General Public License v3. * See Documentation/Licenses/GPLv3.txt for more information. */ #include "PresenceOracle.h" #include #include "Swiften/Client/StanzaChannel.h" namespace Swift { typedef std::pair > > JIDMapPair; typedef std::pair > JIDPresencePair; PresenceOracle::PresenceOracle(StanzaChannel* stanzaChannel) { stanzaChannel_ = stanzaChannel; stanzaChannel_->onPresenceReceived.connect(boost::bind(&PresenceOracle::handleIncomingPresence, this, _1)); } void PresenceOracle::cancelSubscription(const JID& jid) { boost::shared_ptr stanza(new Presence()); stanza->setType(Presence::Unsubscribed); stanza->setTo(jid); stanzaChannel_->sendPresence(stanza); } void PresenceOracle::confirmSubscription(const JID& jid) { boost::shared_ptr stanza(new Presence()); stanza->setType(Presence::Subscribed); stanza->setTo(jid); stanzaChannel_->sendPresence(stanza); } void PresenceOracle::requestSubscription(const JID& jid) { boost::shared_ptr stanza(new Presence()); stanza->setType(Presence::Subscribe); stanza->setTo(jid); stanzaChannel_->sendPresence(stanza); } void PresenceOracle::handleIncomingPresence(boost::shared_ptr presence) { JID bareJID = JID(presence->getFrom().toBare()); if (presence->getType() == Presence::Subscribe) { onPresenceSubscriptionRequest(bareJID, presence->getStatus()); } else { std::map > jidMap = entries_[bareJID]; boost::shared_ptr last; foreach(JIDPresencePair pair, jidMap) { if (pair.first == presence->getFrom()) { last = pair.second; break; } } jidMap[presence->getFrom()] = presence; entries_[bareJID] = jidMap; onPresenceChange(presence, last); } } }