From 3c0e38368c23a7c9b6d0436da9ec551f0d8bf211 2011-07-12 22:02:02 From: HanzZ Date: 2011-07-12 22:02:02 Subject: [PATCH] Send unavailable presences for available buddies when disconnecting the user --- diff --git a/include/transport/rostermanager.h b/include/transport/rostermanager.h index c657302fa43c22c2e45001674e781c055c535582..10fe69b1a387ac89b5feef4ec79e3423386ab521 100644 --- a/include/transport/rostermanager.h +++ b/include/transport/rostermanager.h @@ -86,6 +86,8 @@ class RosterManager { void sendCurrentPresences(const Swift::JID &to); + void sendUnavailablePresences(const Swift::JID &to); + private: void setBuddyCallback(Buddy *buddy); diff --git a/src/rostermanager.cpp b/src/rostermanager.cpp index a2d76784159150976670c70d9f9a94ac00712399..72758adf9ee141914057423bc6dbf507889b8d89 100644 --- a/src/rostermanager.cpp +++ b/src/rostermanager.cpp @@ -57,6 +57,8 @@ RosterManager::~RosterManager() { m_rosterStorage->storeBuddies(); } + sendUnavailablePresences(m_user->getJID().toBare()); + for (std::map::const_iterator it = m_buddies.begin(); it != m_buddies.end(); it++) { Buddy *buddy = (*it).second; if (!buddy) { @@ -64,6 +66,7 @@ RosterManager::~RosterManager() { } delete buddy; } + if (m_rosterStorage) delete m_rosterStorage; } @@ -347,4 +350,19 @@ void RosterManager::sendCurrentPresences(const Swift::JID &to) { } } +void RosterManager::sendUnavailablePresences(const Swift::JID &to) { + for (std::map::const_iterator it = m_buddies.begin(); it != m_buddies.end(); it++) { + Buddy *buddy = (*it).second; + if (!buddy) { + continue; + } + Swift::Presence::ref presence = buddy->generatePresenceStanza(255); + if (presence) { + presence->setTo(to); + presence->setType(Swift::Presence::Unavailable); + m_component->getStanzaChannel()->sendPresence(presence); + } + } +} + }