From bfe84737ee183b8328e4d3f876857e3e020aab91 Mon Sep 17 00:00:00 2001 From: HanzZ Date: Mon, 7 Nov 2011 20:11:49 +0100 Subject: [PATCH] Remove remoteRosterRequest in RosterManager destructor --- include/transport/rostermanager.h | 1 + src/rostermanager.cpp | 12 +++++++++--- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/include/transport/rostermanager.h b/include/transport/rostermanager.h index 2e67532a..81934f78 100644 --- a/include/transport/rostermanager.h +++ b/include/transport/rostermanager.h @@ -125,6 +125,7 @@ class RosterManager { Swift::Timer::ref m_RIETimer; std::list m_requests; bool m_supportRemoteRoster; + AddressedRosterRequest::ref m_remoteRosterRequest; }; } diff --git a/src/rostermanager.cpp b/src/rostermanager.cpp index dc024b7a..377ddffd 100644 --- a/src/rostermanager.cpp +++ b/src/rostermanager.cpp @@ -52,9 +52,9 @@ RosterManager::RosterManager(User *user, Component *component){ m_supportRemoteRoster = false; if (!m_component->inServerMode()) { - AddressedRosterRequest::ref request = AddressedRosterRequest::ref(new AddressedRosterRequest(m_component->getIQRouter(), m_user->getJID().toBare())); - request->onResponse.connect(boost::bind(&RosterManager::handleRemoteRosterResponse, this, _1, _2)); - request->send(); + m_remoteRosterRequest = AddressedRosterRequest::ref(new AddressedRosterRequest(m_component->getIQRouter(), m_user->getJID().toBare())); + m_remoteRosterRequest->onResponse.connect(boost::bind(&RosterManager::handleRemoteRosterResponse, this, _1, _2)); + m_remoteRosterRequest->send(); } } @@ -67,6 +67,11 @@ RosterManager::~RosterManager() { sendUnavailablePresences(m_user->getJID().toBare()); + if (m_remoteRosterRequest) { + m_remoteRosterRequest->onResponse.disconnect_all_slots(); + m_component->getIQRouter()->removeHandler(m_remoteRosterRequest); + } + for (std::map, boost::pool_allocator< std::pair > >::iterator it = m_buddies.begin(); it != m_buddies.end(); it++) { Buddy *buddy = (*it).second; if (!buddy) { @@ -198,6 +203,7 @@ void RosterManager::handleBuddyRosterPushResponse(Swift::ErrorPayload::ref error } void RosterManager::handleRemoteRosterResponse(boost::shared_ptr payload, Swift::ErrorPayload::ref error) { + m_remoteRosterRequest.reset(); if (error) { m_supportRemoteRoster = false; LOG4CXX_INFO(logger, m_user->getJID().toString() << ": This server does not support remote roster protoXEP");