diff --git a/include/transport/presenceoracle.h b/include/transport/presenceoracle.h index 763cf83ddd1699768e86ee2305ca19fb9dfd7006..f631d8e90297a6696e792fabebf1da72b07cfc1b 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 a32455023b565932b47b7f15bf850ef2d6b3b67f..28838b1d3ce8e4f1dcb9f385714a5b1536a1c0d5 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 02e4b90ba7e6591a8788ea826de9a781d1fdd919..5ca822b341a24f76b5f334291e571f1b40e37f96 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 50d969eb7e355dfc1ce25a5ca7d7ab0080b77996..c381fe1d28e79566504b9db58a4fc83f176b6164 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);