Changeset - a15bd775539d
[Not reviewed]
0 1 0
HanzZ - 13 years ago 2012-12-04 16:00:08
hanzz.k@gmail.com
Do not store MUC presence in PresenceOracle
1 file changed with 22 insertions and 20 deletions:
0 comments (0 inline, 0 general)
src/presenceoracle.cpp
Show inline comments
 
@@ -59,33 +59,35 @@ void PresenceOracle::handleIncomingPresence(Presence::ref presence) {
 

	
 
	JID bareJID(presence->getFrom().toBare());
 
	if (presence->getType() == Presence::Subscribe || presence->getType() == Presence::Subscribed) {
 
	}
 
	else {
 
		Presence::ref passedPresence = presence;
 
		if (presence->getType() == Presence::Unsubscribe || presence->getType() == Presence::Unsubscribed) {
 
			/* 3921bis says that we don't follow up with an unavailable, so simulate this ourselves */
 
			passedPresence = Presence::ref(new Presence());
 
			passedPresence->setType(Presence::Unavailable);
 
			passedPresence->setFrom(bareJID);
 
			passedPresence->setStatus(presence->getStatus());
 
		if (!isMUC) {
 
			if (presence->getType() == Presence::Unsubscribe || presence->getType() == Presence::Unsubscribed) {
 
				/* 3921bis says that we don't follow up with an unavailable, so simulate this ourselves */
 
				passedPresence = Presence::ref(new Presence());
 
				passedPresence->setType(Presence::Unavailable);
 
				passedPresence->setFrom(bareJID);
 
				passedPresence->setStatus(presence->getStatus());
 
			}
 
			std::map<JID, boost::shared_ptr<Presence> > jidMap = entries_[bareJID];
 
			if (passedPresence->getFrom().isBare() && presence->getType() == Presence::Unavailable) {
 
				/* Have a bare-JID only presence of offline */
 
				jidMap.clear();
 
			} else if (passedPresence->getType() == Presence::Available) {
 
				/* Don't have a bare-JID only offline presence once there are available presences */
 
				jidMap.erase(bareJID);
 
			}
 
			if (passedPresence->getType() == Presence::Unavailable && jidMap.size() > 1) {
 
				jidMap.erase(passedPresence->getFrom());
 
			} else {
 
				jidMap[passedPresence->getFrom()] = passedPresence;
 
			}
 
			entries_[bareJID] = jidMap;
 
		}
 
		std::map<JID, boost::shared_ptr<Presence> > jidMap = entries_[bareJID];
 
		if (passedPresence->getFrom().isBare() && presence->getType() == Presence::Unavailable) {
 
			/* Have a bare-JID only presence of offline */
 
			jidMap.clear();
 
		} else if (passedPresence->getType() == Presence::Available) {
 
			/* Don't have a bare-JID only offline presence once there are available presences */
 
			jidMap.erase(bareJID);
 
		}
 
		if (passedPresence->getType() == Presence::Unavailable && jidMap.size() > 1) {
 
			jidMap.erase(passedPresence->getFrom());
 
		} else {
 
			jidMap[passedPresence->getFrom()] = passedPresence;
 
		}
 
		entries_[bareJID] = jidMap;
 
		onPresenceChange(passedPresence);
 
	}
 
}
 

	
 
Presence::ref PresenceOracle::getLastPresence(const JID& jid) const {
 
	PresencesMap::const_iterator i = entries_.find(jid.toBare());
0 comments (0 inline, 0 general)