diff --git a/src/rostermanager.cpp b/src/rostermanager.cpp index dc024b7ae8cf8e5ac0f98affe8d57e06b2e9a56c..377ddffd5472fb7806204bedef7d700be28236f8 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");