Changeset - 2e8d2be063af
[Not reviewed]
0 4 0
Jan Kaluza - 13 years ago 2012-09-05 09:45:49
hanzz.k@gmail.com
Clear presences in PresenceOracle when user disconnects. This fixes situation when transport disconnects user but PresenceOracle still caches his last presence and therefore the user is not able to login
4 files changed with 13 insertions and 2 deletions:
0 comments (0 inline, 0 general)
include/transport/presenceoracle.h
Show inline comments
 
@@ -39,6 +39,8 @@ class PresenceOracle {
 
		Swift::Presence::ref getHighestPriorityPresence(const Swift::JID& bareJID) const;
 
		std::vector<Swift::Presence::ref> getAllPresence(const Swift::JID& bareJID) const;
 

	
 
		void clearPresences(const Swift::JID& bareJID);
 

	
 
	public:
 
		boost::signal<void (Swift::Presence::ref)> onPresenceChange;
 

	
src/presenceoracle.cpp
Show inline comments
 
@@ -44,6 +44,11 @@ void PresenceOracle::handleStanzaChannelAvailableChanged(bool available) {
 
	}
 
}
 

	
 
void PresenceOracle::clearPresences(const Swift::JID& bareJID) {
 
	std::map<JID, boost::shared_ptr<Presence> > jidMap = entries_[bareJID];
 
	jidMap.clear();
 
	entries_[bareJID] = jidMap;
 
}
 

	
 
void PresenceOracle::handleIncomingPresence(Presence::ref presence) {
 
	// ignore presences for some contact, we're checking only presences for the transport itself here.
src/tests/filetransfermanager.cpp
Show inline comments
 
@@ -143,8 +143,6 @@ class FileTransferManagerTest : public CPPUNIT_NS :: TestFixture, public BasicTe
 
		injectIQ(Swift::IQ::createResult(getStanza(received[0])->getFrom(), getStanza(received[0])->getTo(), getStanza(received[0])->getID()));
 
		loop->processEvents();
 
		received.erase(received.begin());
 
// 		dumpReceived();
 
		// TODO: Check that we receive Swift::IBB:Close stanza. This is not done right now because of Swiften bug...
 
	}
 

	
 

	
src/usermanager.cpp
Show inline comments
 
@@ -110,6 +110,12 @@ void UserManager::removeUser(User *user, bool onUserBehalf) {
 
	if (m_component->inServerMode()) {
 
		disconnectUser(user->getJID());
 
	}
 
	else {
 
		// User could be disconnected by User::handleDisconnect() method, but
 
		// Transport::PresenceOracle could still contain his last presence.
 
		// We have to clear all received presences for this user in PresenceOracle.
 
		m_component->getPresenceOracle()->clearPresences(user->getJID().toBare());
 
	}
 

	
 
	if (m_storageBackend && onUserBehalf) {
 
		m_storageBackend->setUserOnline(user->getUserInfo().id, false);
0 comments (0 inline, 0 general)