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);