diff --git a/include/transport/networkpluginserver.h b/include/transport/networkpluginserver.h index 082bbc42..d8a3e843 100644 --- a/include/transport/networkpluginserver.h +++ b/include/transport/networkpluginserver.h @@ -37,6 +37,7 @@ class Buddy; class LocalBuddy; class Config; class NetworkConversation; +class VCardResponder; class NetworkPluginServer { public: @@ -71,6 +72,8 @@ class NetworkPluginServer { void handleUserReadyToConnect(User *user); void handleUserDestroyed(User *user); + void handleVCardRequired(User *user, const std::string &name, unsigned int id); + void send(boost::shared_ptr &, const std::string &data); void pingTimeout(); @@ -78,6 +81,7 @@ class NetworkPluginServer { Client *getFreeClient(); UserManager *m_userManager; + VCardResponder *m_vcardResponder; Config *m_config; boost::shared_ptr m_server; std::list m_clients; diff --git a/include/transport/usermanager.h b/include/transport/usermanager.h index af0f1282..cff90027 100644 --- a/include/transport/usermanager.h +++ b/include/transport/usermanager.h @@ -31,7 +31,6 @@ class Component; class StorageBackend; class StorageResponder; class RosterResponder; -class VCardResponder; /// Manages online XMPP Users. @@ -85,7 +84,6 @@ class UserManager { StorageBackend *m_storageBackend; StorageResponder *m_storageResponder; RosterResponder *m_rosterResponder; - VCardResponder *m_vcardResponder; friend class RosterResponder; }; diff --git a/src/vcardresponder.h b/include/transport/vcardresponder.h similarity index 78% rename from src/vcardresponder.h rename to include/transport/vcardresponder.h index f4ba1fa5..db6ea319 100644 --- a/src/vcardresponder.h +++ b/include/transport/vcardresponder.h @@ -29,18 +29,29 @@ namespace Transport { class StorageBackend; class UserManager; +class User; class VCardResponder : public Swift::Responder { public: - VCardResponder(Swift::IQRouter *router, StorageBackend *storageBackend, UserManager *userManager); + VCardResponder(Swift::IQRouter *router, UserManager *userManager); ~VCardResponder(); - boost::signal onVCardRequired; + + void sendVCard(unsigned int id, boost::shared_ptr vcard); + + boost::signal onVCardRequired; private: + struct VCardData { + Swift::JID from; + Swift::JID to; + std::string id; + }; + virtual bool handleGetRequest(const Swift::JID& from, const Swift::JID& to, const std::string& id, boost::shared_ptr payload); virtual bool handleSetRequest(const Swift::JID& from, const Swift::JID& to, const std::string& id, boost::shared_ptr payload); - StorageBackend *m_storageBackend; UserManager *m_userManager; + std::map m_queries; + unsigned int m_id; }; } \ No newline at end of file diff --git a/src/networkpluginserver.cpp b/src/networkpluginserver.cpp index 26cc0b13..26c20cc0 100644 --- a/src/networkpluginserver.cpp +++ b/src/networkpluginserver.cpp @@ -28,6 +28,7 @@ #include "transport/localbuddy.h" #include "transport/config.h" #include "transport/conversation.h" +#include "transport/vcardresponder.h" #include "Swiften/Swiften.h" #include "Swiften/Server/ServerStanzaChannel.h" #include "Swiften/Elements/StreamError.h" @@ -118,6 +119,10 @@ NetworkPluginServer::NetworkPluginServer(Component *component, Config *config, U m_pingTimer = component->getFactories()->getTimerFactory()->createTimer(10000); m_pingTimer->onTick.connect(boost::bind(&NetworkPluginServer::pingTimeout, this)); + m_vcardResponder = new VCardResponder(component->getIQRouter(), userManager); + m_vcardResponder->onVCardRequired.connect(boost::bind(&NetworkPluginServer::handleVCardRequired, this, _1, _2, _3)); + m_vcardResponder->start(); + m_server = component->getFactories()->getConnectionFactory()->createConnectionServer(10000); m_server->onNewConnection.connect(boost::bind(&NetworkPluginServer::handleNewClientConnection, this, _1)); m_server->start(); @@ -129,6 +134,7 @@ NetworkPluginServer::NetworkPluginServer(Component *component, Config *config, U NetworkPluginServer::~NetworkPluginServer() { m_pingTimer->stop(); + delete m_vcardResponder; } void NetworkPluginServer::handleNewClientConnection(boost::shared_ptr c) { @@ -480,6 +486,10 @@ void NetworkPluginServer::handleMessageReceived(NetworkConversation *conv, boost send(c->connection, message); } +void NetworkPluginServer::handleVCardRequired(User *user, const std::string &name, unsigned int id) { + +} + void NetworkPluginServer::sendPing(Client *c) { std::string message; diff --git a/src/usermanager.cpp b/src/usermanager.cpp index d0589e7a..23f72469 100644 --- a/src/usermanager.cpp +++ b/src/usermanager.cpp @@ -26,7 +26,6 @@ #include "transport/rostermanager.h" #include "storageresponder.h" #include "rosterresponder.h" -#include "vcardresponder.h" namespace Transport { @@ -42,9 +41,6 @@ UserManager::UserManager(Component *component, StorageBackend *storageBackend) { m_rosterResponder = new RosterResponder(component->getIQRouter(), m_storageBackend, this); m_rosterResponder->start(); - m_vcardResponder = new VCardResponder(component->getIQRouter(), m_storageBackend, this); - m_vcardResponder->start(); - component->onUserPresenceReceived.connect(bind(&UserManager::handlePresence, this, _1)); m_component->getStanzaChannel()->onMessageReceived.connect(bind(&UserManager::handleMessageReceived, this, _1)); m_component->getStanzaChannel()->onPresenceReceived.connect(bind(&UserManager::handleGeneralPresenceReceived, this, _1)); @@ -55,7 +51,6 @@ UserManager::~UserManager(){ m_storageResponder->stop(); delete m_storageResponder; delete m_rosterResponder; - delete m_vcardResponder; } void UserManager::addUser(User *user) { diff --git a/src/vcardresponder.cpp b/src/vcardresponder.cpp index cb0c5ecd..c65603fa 100644 --- a/src/vcardresponder.cpp +++ b/src/vcardresponder.cpp @@ -18,7 +18,7 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA */ -#include "vcardresponder.h" +#include "transport/vcardresponder.h" #include #include @@ -33,18 +33,39 @@ using namespace boost; namespace Transport { -VCardResponder::VCardResponder(Swift::IQRouter *router, StorageBackend *storageBackend, UserManager *userManager) : Swift::Responder(router) { - m_storageBackend = storageBackend; +VCardResponder::VCardResponder(Swift::IQRouter *router, UserManager *userManager) : Swift::Responder(router) { + m_id = 0; m_userManager = userManager; } VCardResponder::~VCardResponder() { } +void VCardResponder::sendVCard(unsigned int id, boost::shared_ptr vcard) { + if (m_queries.find(id) == m_queries.end()) + return; + + sendResponse(m_queries[id].to, m_queries[id].from, m_queries[id].id, vcard); + m_queries.erase(id); +} + 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. - onVCardRequired(from, to, id); + User *user = m_userManager->getUser(from.toBare().toString()); + if (!user) { + return false; + } + + std::string name = to.getUnescapedNode(); + if (name.find_last_of("%") != std::string::npos) { + name.replace(name.find_last_of("%"), 1, "@"); + } + + m_queries[m_id].from = from; + m_queries[m_id].to = to; + m_queries[m_id].id = id; + onVCardRequired(user, name, m_id++); return true; }