From 629e93e34b422e53c0c486bc8046fa9fb24d592b Mon Sep 17 00:00:00 2001 From: HanzZ Date: Wed, 20 Jul 2011 03:02:50 +0200 Subject: [PATCH] Fixed crash in removig XMPPLayer --- include/transport/usermanager.h | 2 ++ src/networkpluginserver.cpp | 3 +++ src/usermanager.cpp | 9 ++++++++- 3 files changed, 13 insertions(+), 1 deletion(-) diff --git a/include/transport/usermanager.h b/include/transport/usermanager.h index 85e06032..507af267 100644 --- a/include/transport/usermanager.h +++ b/include/transport/usermanager.h @@ -89,6 +89,7 @@ class UserManager { void handleGeneralPresenceReceived(Swift::Presence::ref presence); void handleProbePresence(Swift::Presence::ref presence); void handleSubscription(Swift::Presence::ref presence); + void handleRemoveTimeout(User *user); // void handleDiscoInfoResponse(boost::shared_ptr info, Swift::ErrorPayload::ref error, const Swift::JID& jid); void addUser(User *user); @@ -99,6 +100,7 @@ class UserManager { StorageBackend *m_storageBackend; StorageResponder *m_storageResponder; UserRegistry *m_userRegistry; + Swift::Timer::ref m_removeTimer; friend class RosterResponder; }; diff --git a/src/networkpluginserver.cpp b/src/networkpluginserver.cpp index 6d2a9da1..39db7ec0 100644 --- a/src/networkpluginserver.cpp +++ b/src/networkpluginserver.cpp @@ -227,6 +227,9 @@ void NetworkPluginServer::handleSessionFinished(Backend *c) { (*it)->handleDisconnected("Internal Server Error, please reconnect."); } +// c->connection->onDisconnected.connect(boost::bind(&NetworkPluginServer::handleSessionFinished, this, c)); +// c->connection->onDataRead.connect(boost::bind(&NetworkPluginServer::handleDataRead, this, c, _1)); + m_clients.remove(c); delete c; diff --git a/src/usermanager.cpp b/src/usermanager.cpp index 5076a205..345e32e4 100644 --- a/src/usermanager.cpp +++ b/src/usermanager.cpp @@ -53,6 +53,8 @@ UserManager::UserManager(Component *component, UserRegistry *userRegistry, Stora m_userRegistry->onConnectUser.connect(bind(&UserManager::connectUser, this, _1)); // component->onDiscoInfoResponse.connect(bind(&UserManager::handleDiscoInfoResponse, this, _1, _2, _3)); + + m_removeTimer = m_component->getNetworkFactories()->getTimerFactory()->createTimer(1); } UserManager::~UserManager(){ @@ -186,7 +188,8 @@ void UserManager::handlePresence(Swift::Presence::ref presence) { Swift::Presence::ref highest = m_component->getPresenceOracle()->getHighestPriorityPresence(presence->getFrom().toBare()); // There's no presence for this user, so disconnect if (!highest || (highest && highest->getType() == Swift::Presence::Unavailable)) { - removeUser(user); + m_removeTimer->onTick.connect(boost::bind(&UserManager::handleRemoveTimeout, this, user)); + m_removeTimer->start(); } } // TODO: HANDLE MUC SOMEHOW @@ -196,6 +199,10 @@ void UserManager::handlePresence(Swift::Presence::ref presence) { } } +void UserManager::handleRemoveTimeout(User *user) { + removeUser(user); +} + void UserManager::handleMessageReceived(Swift::Message::ref message) { User *user = getUser(message->getFrom().toBare().toString()); if (!user ){