From ac7bbb6cccf337902176d25bb345fc3f5f9c5343 2011-06-09 12:46:49 From: Jan Kaluza Date: 2011-06-09 12:46:49 Subject: [PATCH] Handle jabber:iq:roster sets --- diff --git a/src/localbuddy.cpp b/src/localbuddy.cpp index d79e0b72f7fa36c82d10c5e96a0c70528f78ceef..55deeec9183da17ff664015c533858003d35b1c0 100644 --- a/src/localbuddy.cpp +++ b/src/localbuddy.cpp @@ -24,6 +24,7 @@ namespace Transport { LocalBuddy::LocalBuddy(RosterManager *rosterManager, long id) : Buddy(rosterManager, id) { + m_status = Swift::StatusShow::None; } LocalBuddy::~LocalBuddy() { diff --git a/src/rosterresponder.cpp b/src/rosterresponder.cpp index 3c8554f3d6c72f5cbd1bbaf55115ec68b59ee90f..d99e84fdc1a7e75388471068b5926574fb0fbc00 100644 --- a/src/rosterresponder.cpp +++ b/src/rosterresponder.cpp @@ -27,6 +27,7 @@ #include "transport/user.h" #include "transport/usermanager.h" #include "transport/rostermanager.h" +#include "transport/buddy.h" using namespace Swift; using namespace boost; @@ -67,6 +68,41 @@ bool RosterResponder::handleGetRequest(const Swift::JID& from, const Swift::JID& bool RosterResponder::handleSetRequest(const Swift::JID& from, const Swift::JID& to, const std::string& id, boost::shared_ptr payload) { sendResponse(from, id, boost::shared_ptr(new RosterPayload())); + + User *user = m_userManager->getUser(from.toBare().toString()); + if (!user) { + return true; + } + + if (payload->getItems().size() == 0) { + return true; + } + + Swift::RosterItemPayload item = payload->getItems()[0]; + + Buddy *buddy = user->getRosterManager()->getBuddy(Buddy::JIDToLegacyName(item.getJID())); + if (buddy) { + if (item.getSubscription() == Swift::RosterItemPayload::Remove) { + std::cout << "BUDDY REMOVED\n"; + } + else { + std::cout << "BUDDY UPDATED\n"; + } + } + else if (item.getSubscription() != Swift::RosterItemPayload::Remove) { + // Roster push for this new buddy is sent by RosterManager + BuddyInfo buddyInfo; + buddyInfo.id = -1; + buddyInfo.alias = item.getName(); + buddyInfo.legacyName = Buddy::JIDToLegacyName(item.getJID()); + buddyInfo.subscription = "both"; + buddyInfo.flags = 0; + + buddy = user->getComponent()->getFactory()->createBuddy(user->getRosterManager(), buddyInfo); + user->getRosterManager()->setBuddy(buddy); + std::cout << "BUDDY ADDED\n"; + } + return true; } diff --git a/src/sqlite3backend.cpp b/src/sqlite3backend.cpp index 128921a72277c7f147b814525b76d97b30f427c5..565a5f843e4a660af9280b44691e03b59921567c 100644 --- a/src/sqlite3backend.cpp +++ b/src/sqlite3backend.cpp @@ -240,7 +240,7 @@ long SQLite3Backend::addBuddy(long userId, const BuddyInfo &buddyInfo) { BIND_INT(m_addBuddy, userId); BIND_STR(m_addBuddy, buddyInfo.legacyName); BIND_STR(m_addBuddy, buddyInfo.subscription); - BIND_STR(m_addBuddy, buddyInfo.groups[0]); // TODO: serialize groups + BIND_STR(m_addBuddy, buddyInfo.groups.size() == 0 ? "" : buddyInfo.groups[0]); // TODO: serialize groups BIND_STR(m_addBuddy, buddyInfo.alias); BIND_INT(m_addBuddy, buddyInfo.flags);