From 8ab47cce701241e2d1ca6c22717ec8d7f7aa8740 2011-05-31 16:01:17 From: HanzZ Date: 2011-05-31 16:01:17 Subject: [PATCH] Answer to initial jabber:iq:roster get --- diff --git a/include/transport/rostermanager.h b/include/transport/rostermanager.h index ce5bcb6c7f9226d9433d9764444c08c196bce9fa..8ff033b5e4fda473a54153642be9da6f1b7e2752 100644 --- a/include/transport/rostermanager.h +++ b/include/transport/rostermanager.h @@ -60,6 +60,8 @@ class RosterManager { void setStorageBackend(StorageBackend *storageBackend); + Swift::RosterPayload::ref generateRosterPayload(); + /// Returns user associated with this roster. /// \return User User *getUser() { return m_user; } diff --git a/include/transport/usermanager.h b/include/transport/usermanager.h index e3731378dd0ef976d8709a929799d492f872878f..cff900272eae2d7021ec4fe4c4211d78efbaa877 100644 --- a/include/transport/usermanager.h +++ b/include/transport/usermanager.h @@ -84,6 +84,7 @@ class UserManager { StorageBackend *m_storageBackend; StorageResponder *m_storageResponder; RosterResponder *m_rosterResponder; + friend class RosterResponder; }; } diff --git a/src/rostermanager.cpp b/src/rostermanager.cpp index 6e715e7be969da60f3e722af9ae3a04ab732dabb..ac212948bc0f34c0ff8443743f626773927d8713 100644 --- a/src/rostermanager.cpp +++ b/src/rostermanager.cpp @@ -159,4 +159,18 @@ void RosterManager::setStorageBackend(StorageBackend *storageBackend) { } } +Swift::RosterPayload::ref RosterManager::generateRosterPayload() { + Swift::RosterPayload::ref payload = Swift::RosterPayload::ref(new Swift::RosterPayload()); + + for (std::map::const_iterator it = m_buddies.begin(); it != m_buddies.end(); it++) { + Buddy *buddy = (*it).second; + Swift::RosterItemPayload item; + item.setJID(buddy->getJID().toBare()); + item.setName(buddy->getAlias()); + item.setGroups(buddy->getGroups()); + payload->addItem(item); + } + return payload; +} + } diff --git a/src/rosterresponder.cpp b/src/rosterresponder.cpp index f93312ca8968d1e58696acf7ffdbea969df1e747..68f566a6992a3fb2510a28f92e386adedbf76dc9 100644 --- a/src/rosterresponder.cpp +++ b/src/rosterresponder.cpp @@ -24,6 +24,9 @@ #include #include "Swiften/Queries/IQRouter.h" #include "Swiften/Swiften.h" +#include "transport/user.h" +#include "transport/usermanager.h" +#include "transport/rostermanager.h" using namespace Swift; using namespace boost; @@ -41,7 +44,25 @@ RosterResponder::~RosterResponder() { bool RosterResponder::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. - sendResponse(from, id, boost::shared_ptr(new RosterPayload())); + User *user = m_userManager->getUser(from.toBare().toString()); + if (!user) { + // Client can send jabber:iq:roster IQ before presence, so we do little hack here to + // trigger logging in. + // UserManager should create user now, if everything is OK. + Swift::Presence::ref response = Swift::Presence::create(); + response->setTo(to); + response->setFrom(from); + response->setType(Swift::Presence::Available); + m_userManager->handlePresence(response); + + // if it's not created, lets finish this get + user = m_userManager->getUser(from.toBare().toString()); + if (!user) { + sendResponse(from, id, boost::shared_ptr(new RosterPayload())); + return true; + } + } + sendResponse(from, id, user->getRosterManager()->generateRosterPayload()); return true; } diff --git a/src/usermanager.cpp b/src/usermanager.cpp index 4dd66e8fb0efbb8de31179558cf49e01080ee46a..23f7246974c0046bd2ff90251f6ff4abbdc1b513 100644 --- a/src/usermanager.cpp +++ b/src/usermanager.cpp @@ -88,7 +88,7 @@ void UserManager::handlePresence(Swift::Presence::ref presence) { std::string userkey = presence->getFrom().toBare().toString(); User *user = getUser(userkey); - if (!user ) { + if (!user) { // No user and unavailable presence -> answer with unavailable if (presence->getType() == Swift::Presence::Unavailable) { Swift::Presence::ref response = Swift::Presence::create();