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:
parent
d91990a491
commit
2e8d2be063
4 changed files with 13 additions and 2 deletions
|
@ -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;
|
||||
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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...
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Add table
Reference in a new issue