Answer to initial jabber:iq:roster get
This commit is contained in:
parent
525a07a4d1
commit
8ab47cce70
5 changed files with 40 additions and 2 deletions
|
@ -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; }
|
||||
|
|
|
@ -84,6 +84,7 @@ class UserManager {
|
|||
StorageBackend *m_storageBackend;
|
||||
StorageResponder *m_storageResponder;
|
||||
RosterResponder *m_rosterResponder;
|
||||
friend class RosterResponder;
|
||||
};
|
||||
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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();
|
||||
|
|
Loading…
Add table
Reference in a new issue