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

This commit is contained in:
Jan Kaluza 2012-09-05 09:45:49 +02:00
parent d91990a491
commit 2e8d2be063
4 changed files with 13 additions and 2 deletions

View file

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

View file

@ -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.

View file

@ -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...
}

View file

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