From a87a0484add4d04ad24b1f9cd65426ff8c25a638 Mon Sep 17 00:00:00 2001 From: Jan Kaluza Date: Mon, 22 Aug 2011 15:44:47 +0200 Subject: [PATCH] VCard timeout --- include/transport/vcardresponder.h | 6 +++++- spectrum/src/sample.cfg | 2 +- src/networkpluginserver.cpp | 2 +- src/usermanager.cpp | 4 ++-- src/vcardresponder.cpp | 26 +++++++++++++++++++++++++- 5 files changed, 34 insertions(+), 6 deletions(-) diff --git a/include/transport/vcardresponder.h b/include/transport/vcardresponder.h index fc4fb4c7..2618a897 100644 --- a/include/transport/vcardresponder.h +++ b/include/transport/vcardresponder.h @@ -33,7 +33,7 @@ class User; class VCardResponder : public Swift::Responder { public: - VCardResponder(Swift::IQRouter *router, UserManager *userManager); + VCardResponder(Swift::IQRouter *router, Swift::NetworkFactories *factories, UserManager *userManager); ~VCardResponder(); void sendVCard(unsigned int id, boost::shared_ptr vcard); @@ -41,11 +41,14 @@ class VCardResponder : public Swift::Responder { boost::signal onVCardRequired; boost::signal vcard)> onVCardUpdated; + void collectTimeouted(); + private: struct VCardData { Swift::JID from; Swift::JID to; std::string id; + time_t received; }; virtual bool handleGetRequest(const Swift::JID& from, const Swift::JID& to, const std::string& id, boost::shared_ptr payload); @@ -53,6 +56,7 @@ class VCardResponder : public Swift::Responder { UserManager *m_userManager; std::map m_queries; unsigned int m_id; + Swift::Timer::ref m_collectTimer; }; } \ No newline at end of file diff --git a/spectrum/src/sample.cfg b/spectrum/src/sample.cfg index d971d8a1..eda95692 100644 --- a/spectrum/src/sample.cfg +++ b/spectrum/src/sample.cfg @@ -20,7 +20,7 @@ protocol=any [backend] #default_avatar=catmelonhead.jpg -no_vcard_fetch=true +#no_vcard_fetch=true [logging] #config=logging.cfg # log4cxx/log4j logging configuration file diff --git a/src/networkpluginserver.cpp b/src/networkpluginserver.cpp index 7d09db73..989a942a 100644 --- a/src/networkpluginserver.cpp +++ b/src/networkpluginserver.cpp @@ -186,7 +186,7 @@ NetworkPluginServer::NetworkPluginServer(Component *component, Config *config, U m_collectTimer->onTick.connect(boost::bind(&NetworkPluginServer::collectBackend, this)); m_collectTimer->start(); - m_vcardResponder = new VCardResponder(component->getIQRouter(), userManager); + m_vcardResponder = new VCardResponder(component->getIQRouter(), component->getNetworkFactories(), userManager); m_vcardResponder->onVCardRequired.connect(boost::bind(&NetworkPluginServer::handleVCardRequired, this, _1, _2, _3)); m_vcardResponder->onVCardUpdated.connect(boost::bind(&NetworkPluginServer::handleVCardUpdated, this, _1, _2)); m_vcardResponder->start(); diff --git a/src/usermanager.cpp b/src/usermanager.cpp index 3146d8cb..19957558 100644 --- a/src/usermanager.cpp +++ b/src/usermanager.cpp @@ -31,7 +31,7 @@ #include "Swiften/Server/ServerStanzaChannel.h" #include "Swiften/Elements/StreamError.h" #include "malloc.h" -// #include "valgrind/memcheck.h" +#include "valgrind/memcheck.h" using namespace log4cxx; @@ -100,7 +100,7 @@ void UserManager::removeUser(User *user) { onUserDestroyed(user); delete user; malloc_trim(0); -// VALGRIND_DO_LEAK_CHECK; + VALGRIND_DO_LEAK_CHECK; } int UserManager::getUserCount() { diff --git a/src/vcardresponder.cpp b/src/vcardresponder.cpp index e5bf4c60..7528c658 100644 --- a/src/vcardresponder.cpp +++ b/src/vcardresponder.cpp @@ -39,9 +39,12 @@ namespace Transport { static LoggerPtr logger = Logger::getLogger("VCardResponder"); -VCardResponder::VCardResponder(Swift::IQRouter *router, UserManager *userManager) : Swift::Responder(router) { +VCardResponder::VCardResponder(Swift::IQRouter *router, Swift::NetworkFactories *factories, UserManager *userManager) : Swift::Responder(router) { m_id = 0; m_userManager = userManager; + m_collectTimer = factories->getTimerFactory()->createTimer(20); + m_collectTimer->onTick.connect(boost::bind(&VCardResponder::collectTimeouted, this)); + m_collectTimer->start(); } VCardResponder::~VCardResponder() { @@ -59,6 +62,26 @@ void VCardResponder::sendVCard(unsigned int id, boost::shared_ptr m_queries.erase(id); } +void VCardResponder::collectTimeouted() { + time_t now = time(NULL); + + std::vector candidates; + for(std::map::iterator it = m_queries.begin(); it != m_queries.end(); it++) { + if (now - (*it).second.received > 40) { + candidates.push_back((*it).first); + } + } + + if (candidates.size() != 0) { + LOG4CXX_INFO(logger, "Removing " << candidates.size() << " timeouted VCard requests"); + } + + BOOST_FOREACH(unsigned int id, candidates) { + sendVCard(id, boost::shared_ptr(new Swift::VCard())); + } + m_collectTimer->start(); +} + bool VCardResponder::handleGetRequest(const Swift::JID& from, const Swift::JID& to, const std::string& id, boost::shared_ptr payload) { // Get means we're in server mode and user wants to fetch his roster. // For now we send empty reponse, but TODO: Get buddies from database and send proper stored roster. @@ -85,6 +108,7 @@ bool VCardResponder::handleGetRequest(const Swift::JID& from, const Swift::JID& m_queries[m_id].from = from; m_queries[m_id].to = to_; m_queries[m_id].id = id; + m_queries[m_id].received = time(NULL); onVCardRequired(user, name, m_id++); return true; }