diff --git a/include/transport/rostermanager.h b/include/transport/rostermanager.h index 90ed926c..0fb5eac2 100644 --- a/include/transport/rostermanager.h +++ b/include/transport/rostermanager.h @@ -100,7 +100,7 @@ class RosterManager { void setBuddyCallback(Buddy *buddy); void sendRIE(); - void handleBuddyRosterPushResponse(Swift::ErrorPayload::ref error, const std::string &key); + void handleBuddyRosterPushResponse(Swift::ErrorPayload::ref error, Swift::SetRosterRequest::ref request, const std::string &key); std::map, boost::pool_allocator< std::pair > > m_buddies; Component *m_component; @@ -108,6 +108,7 @@ class RosterManager { User *m_user; Swift::Timer::ref m_setBuddyTimer; Swift::Timer::ref m_RIETimer; + std::list m_requests; }; } diff --git a/src/rostermanager.cpp b/src/rostermanager.cpp index e7d24247..63ce201c 100644 --- a/src/rostermanager.cpp +++ b/src/rostermanager.cpp @@ -30,6 +30,7 @@ #include "Swiften/Elements/RosterItemPayload.h" #include "Swiften/Elements/RosterItemExchangePayload.h" #include "log4cxx/logger.h" +#include using namespace log4cxx; @@ -63,6 +64,11 @@ RosterManager::~RosterManager() { delete buddy; } + BOOST_FOREACH(Swift::SetRosterRequest::ref request, m_requests) { + request->onResponse.disconnect_all_slots(); + } + m_requests.clear(); + boost::singleton_pool::release_memory(); if (m_rosterStorage) @@ -89,8 +95,9 @@ void RosterManager::sendBuddyRosterPush(Buddy *buddy) { payload->addItem(item); Swift::SetRosterRequest::ref request = Swift::SetRosterRequest::create(payload, m_user->getJID().toBare(), m_component->getIQRouter()); - request->onResponse.connect(boost::bind(&RosterManager::handleBuddyRosterPushResponse, this, _1, buddy->getName())); + request->onResponse.connect(boost::bind(&RosterManager::handleBuddyRosterPushResponse, this, _1, request, buddy->getName())); request->send(); + m_requests.push_back(request); } void RosterManager::sendBuddySubscribePresence(Buddy *buddy) { @@ -152,10 +159,13 @@ void RosterManager::storeBuddy(Buddy *buddy) { } } -void RosterManager::handleBuddyRosterPushResponse(Swift::ErrorPayload::ref error, const std::string &key) { +void RosterManager::handleBuddyRosterPushResponse(Swift::ErrorPayload::ref error, Swift::SetRosterRequest::ref request, const std::string &key) { if (m_buddies[key] != NULL) { m_buddies[key]->handleBuddyChanged(); } + + m_requests.remove(request); + request->onResponse.disconnect_all_slots(); } Buddy *RosterManager::getBuddy(const std::string &name) {