From de4e6f57c5d9305a7ae85516c4829ea963f2b896 Mon Sep 17 00:00:00 2001 From: HanzZ Date: Sun, 10 Jul 2011 15:32:01 +0200 Subject: [PATCH] Basic gateway mode with RIE --- spectrum/src/main.cpp | 3 ++- src/rostermanager.cpp | 31 +++++++++++++++++++++---------- src/sqlite3backend.cpp | 2 +- src/user.cpp | 11 ++++++----- src/usermanager.cpp | 10 +++++----- src/userregistration.cpp | 4 ++++ 6 files changed, 39 insertions(+), 22 deletions(-) diff --git a/spectrum/src/main.cpp b/spectrum/src/main.cpp index 6ba06e6d..eb786e10 100644 --- a/spectrum/src/main.cpp +++ b/spectrum/src/main.cpp @@ -70,7 +70,8 @@ int main(int argc, char **argv) UserManager userManager(&transport, &userRegistry, storageBackend); if (storageBackend) { - UserRegistration userRegistration(&transport, &userManager, storageBackend); + UserRegistration *userRegistration = new UserRegistration(&transport, &userManager, storageBackend); + userRegistration->start(); // logger.setUserRegistration(&userRegistration); } // logger.setUserManager(&userManager); diff --git a/src/rostermanager.cpp b/src/rostermanager.cpp index 50550383..369a4a00 100644 --- a/src/rostermanager.cpp +++ b/src/rostermanager.cpp @@ -59,6 +59,9 @@ RosterManager::~RosterManager() { for (std::map::const_iterator it = m_buddies.begin(); it != m_buddies.end(); it++) { Buddy *buddy = (*it).second; + if (!buddy) { + continue; + } delete buddy; } if (m_rosterStorage) @@ -141,7 +144,10 @@ Buddy *RosterManager::getBuddy(const std::string &name) { void RosterManager::sendRIE() { m_RIETimer->stop(); - LOG4CXX_INFO(logger, "Sending RIE stanza to " << m_user->getJID().toString()); + Swift::Presence::ref highest = m_component->getPresenceOracle()->getHighestPriorityPresence(m_user->getJID().toBare()); + + LOG4CXX_INFO(logger, "Sending RIE stanza to " << highest->getFrom().toString()); + Swift::RosterItemExchangePayload::ref payload = Swift::RosterItemExchangePayload::ref(new Swift::RosterItemExchangePayload()); for (std::map::const_iterator it = m_buddies.begin(); it != m_buddies.end(); it++) { Buddy *buddy = (*it).second; @@ -154,7 +160,7 @@ void RosterManager::sendRIE() { payload->addItem(item); } - boost::shared_ptr > request(new Swift::GenericRequest(Swift::IQ::Set, m_user->getJID(), payload, m_component->getIQRouter())); + boost::shared_ptr > request(new Swift::GenericRequest(Swift::IQ::Set, highest->getFrom(), payload, m_component->getIQRouter())); request->send(); } @@ -211,6 +217,7 @@ void RosterManager::handleSubscription(Swift::Presence::ref presence) { } else { Swift::Presence::ref response = Swift::Presence::create(); + Swift::Presence::ref presence; response->setTo(presence->getFrom()); response->setFrom(presence->getTo()); @@ -220,6 +227,11 @@ void RosterManager::handleSubscription(Swift::Presence::ref presence) { // buddy is already there, so nothing to do, just answer case Swift::Presence::Subscribe: response->setType(Swift::Presence::Subscribed); + presence = buddy->generatePresenceStanza(255); + if (presence) { + presence->setTo(presence->getFrom()); + m_component->getStanzaChannel()->sendPresence(presence); + } break; // remove buddy case Swift::Presence::Unsubscribe: @@ -228,11 +240,7 @@ void RosterManager::handleSubscription(Swift::Presence::ref presence) { break; // just send response case Swift::Presence::Unsubscribed: - response->setType(Swift::Presence::Unsubscribe); - break; - // just send response - case Swift::Presence::Subscribed: - response->setType(Swift::Presence::Subscribe); +// response->setType(Swift::Presence::Unsubscribe); break; default: return; @@ -263,9 +271,6 @@ void RosterManager::handleSubscription(Swift::Presence::ref presence) { response->setType(Swift::Presence::Unsubscribe); break; // just send response - case Swift::Presence::Subscribed: - response->setType(Swift::Presence::Subscribe); - break; default: return; } @@ -312,6 +317,9 @@ Swift::RosterPayload::ref RosterManager::generateRosterPayload() { for (std::map::const_iterator it = m_buddies.begin(); it != m_buddies.end(); it++) { Buddy *buddy = (*it).second; + if (!buddy) { + continue; + } Swift::RosterItemPayload item; item.setJID(buddy->getJID().toBare()); item.setName(buddy->getAlias()); @@ -325,6 +333,9 @@ Swift::RosterPayload::ref RosterManager::generateRosterPayload() { void RosterManager::sendCurrentPresences(const Swift::JID &to) { for (std::map::const_iterator it = m_buddies.begin(); it != m_buddies.end(); it++) { Buddy *buddy = (*it).second; + if (!buddy) { + continue; + } Swift::Presence::ref presence = buddy->generatePresenceStanza(255); if (presence) { presence->setTo(to); diff --git a/src/sqlite3backend.cpp b/src/sqlite3backend.cpp index d75b52d6..3ec5694c 100644 --- a/src/sqlite3backend.cpp +++ b/src/sqlite3backend.cpp @@ -272,7 +272,7 @@ long SQLite3Backend::addBuddy(long userId, const BuddyInfo &buddyInfo) { void SQLite3Backend::updateBuddy(long userId, const BuddyInfo &buddyInfo) { // UPDATE " + m_prefix + "buddies SET groups=?, nickname=?, flags=?, subscription=? WHERE user_id=? AND uin=? BEGIN(m_updateBuddy); - BIND_STR(m_updateBuddy, buddyInfo.groups[0]); // TODO: serialize groups + BIND_STR(m_updateBuddy, buddyInfo.groups.size() == 0 ? "" : buddyInfo.groups[0]); // TODO: serialize groups BIND_STR(m_updateBuddy, buddyInfo.alias); BIND_INT(m_updateBuddy, buddyInfo.flags); BIND_STR(m_updateBuddy, buddyInfo.subscription); diff --git a/src/user.cpp b/src/user.cpp index de4823a0..5452ddc4 100644 --- a/src/user.cpp +++ b/src/user.cpp @@ -115,11 +115,12 @@ void User::handlePresence(Swift::Presence::ref presence) { Swift::Presence::ref highest = m_presenceOracle->getHighestPriorityPresence(m_jid.toBare()); if (highest) { - highest->setTo(presence->getFrom().toBare()); - highest->setFrom(m_component->getJID()); - m_component->getStanzaChannel()->sendPresence(highest); - LOG4CXX_INFO(logger, m_jid.toString() << ": Changing legacy network presence to " << highest->getType()); - onPresenceChanged(highest); + Swift::Presence::ref response = Swift::Presence::create(highest); + response->setTo(presence->getFrom().toBare()); + response->setFrom(m_component->getJID()); + m_component->getStanzaChannel()->sendPresence(response); + LOG4CXX_INFO(logger, m_jid.toString() << ": Changing legacy network presence to " << response->getType()); + onPresenceChanged(response); } else { Swift::Presence::ref response = Swift::Presence::create(); diff --git a/src/usermanager.cpp b/src/usermanager.cpp index 42bb2685..8e16c029 100644 --- a/src/usermanager.cpp +++ b/src/usermanager.cpp @@ -229,11 +229,11 @@ void UserManager::handleSubscription(Swift::Presence::ref presence) { response->setType(Swift::Presence::Subscribed); m_component->getStanzaChannel()->sendPresence(response); - response = Swift::Presence::create(); - response->setFrom(presence->getTo()); - response->setTo(presence->getFrom()); - response->setType(Swift::Presence::Subscribe); - m_component->getStanzaChannel()->sendPresence(response); +// response = Swift::Presence::create(); +// response->setFrom(presence->getTo()); +// response->setTo(presence->getFrom()); +// response->setType(Swift::Presence::Subscribe); +// m_component->getStanzaChannel()->sendPresence(response); return; } diff --git a/src/userregistration.cpp b/src/userregistration.cpp index 8dd6a9c7..b03b3e4e 100644 --- a/src/userregistration.cpp +++ b/src/userregistration.cpp @@ -25,11 +25,15 @@ #include "transport/user.h" #include "Swiften/Elements/ErrorPayload.h" #include +#include "log4cxx/logger.h" using namespace Swift; +using namespace log4cxx; namespace Transport { +static LoggerPtr logger = Logger::getLogger("UserRegistration"); + UserRegistration::UserRegistration(Component *component, UserManager *userManager, StorageBackend *storageBackend) : Swift::Responder(component->m_iqRouter) { m_component = component; m_config = m_component->m_config;