From 3c0e38368c23a7c9b6d0436da9ec551f0d8bf211 Mon Sep 17 00:00:00 2001 From: HanzZ Date: Tue, 12 Jul 2011 22:02:02 +0200 Subject: [PATCH] Send unavailable presences for available buddies when disconnecting the user --- include/transport/rostermanager.h | 2 ++ src/rostermanager.cpp | 18 ++++++++++++++++++ 2 files changed, 20 insertions(+) diff --git a/include/transport/rostermanager.h b/include/transport/rostermanager.h index c657302f..10fe69b1 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 a2d76784..72758adf 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); + } + } +} + }