Answer to initial jabber:iq:roster get

This commit is contained in:
HanzZ 2011-05-31 16:01:17 +02:00
parent 525a07a4d1
commit 8ab47cce70
5 changed files with 40 additions and 2 deletions

View file

@ -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; }

View file

@ -84,6 +84,7 @@ class UserManager {
StorageBackend *m_storageBackend;
StorageResponder *m_storageResponder;
RosterResponder *m_rosterResponder;
friend class RosterResponder;
};
}

View file

@ -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<std::string, Buddy *>::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;
}
}

View file

@ -24,6 +24,9 @@
#include <boost/bind.hpp>
#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<Swift::RosterPayload> 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<RosterPayload>(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<RosterPayload>(new RosterPayload()));
return true;
}
}
sendResponse(from, id, user->getRosterManager()->generateRosterPayload());
return true;
}

View file

@ -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();