From 8ab47cce701241e2d1ca6c22717ec8d7f7aa8740 Mon Sep 17 00:00:00 2001 From: HanzZ Date: Tue, 31 May 2011 16:01:17 +0200 Subject: [PATCH] Answer to initial jabber:iq:roster get --- include/transport/rostermanager.h | 2 ++ include/transport/usermanager.h | 1 + src/rostermanager.cpp | 14 ++++++++++++++ src/rosterresponder.cpp | 23 ++++++++++++++++++++++- src/usermanager.cpp | 2 +- 5 files changed, 40 insertions(+), 2 deletions(-) diff --git a/include/transport/rostermanager.h b/include/transport/rostermanager.h index ce5bcb6c..8ff033b5 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 e3731378..cff90027 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 6e715e7b..ac212948 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 f93312ca..68f566a6 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 4dd66e8f..23f72469 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();