From 2e8d2be063af3bcd1d12fae16d32f5774de67c89 Mon Sep 17 00:00:00 2001 From: Jan Kaluza Date: Wed, 5 Sep 2012 09:45:49 +0200 Subject: [PATCH] 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 --- include/transport/presenceoracle.h | 2 ++ src/presenceoracle.cpp | 5 +++++ src/tests/filetransfermanager.cpp | 2 -- src/usermanager.cpp | 6 ++++++ 4 files changed, 13 insertions(+), 2 deletions(-) diff --git a/include/transport/presenceoracle.h b/include/transport/presenceoracle.h index 763cf83d..f631d8e9 100644 --- a/include/transport/presenceoracle.h +++ b/include/transport/presenceoracle.h @@ -39,6 +39,8 @@ class PresenceOracle { Swift::Presence::ref getHighestPriorityPresence(const Swift::JID& bareJID) const; std::vector getAllPresence(const Swift::JID& bareJID) const; + void clearPresences(const Swift::JID& bareJID); + public: boost::signal onPresenceChange; diff --git a/src/presenceoracle.cpp b/src/presenceoracle.cpp index a3245502..28838b1d 100644 --- a/src/presenceoracle.cpp +++ b/src/presenceoracle.cpp @@ -44,6 +44,11 @@ void PresenceOracle::handleStanzaChannelAvailableChanged(bool available) { } } +void PresenceOracle::clearPresences(const Swift::JID& bareJID) { + std::map > 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. diff --git a/src/tests/filetransfermanager.cpp b/src/tests/filetransfermanager.cpp index 02e4b90b..5ca822b3 100644 --- a/src/tests/filetransfermanager.cpp +++ b/src/tests/filetransfermanager.cpp @@ -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... } diff --git a/src/usermanager.cpp b/src/usermanager.cpp index 50d969eb..c381fe1d 100644 --- a/src/usermanager.cpp +++ b/src/usermanager.cpp @@ -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);