Basic gateway mode with RIE

This commit is contained in:
HanzZ 2011-07-10 15:32:01 +02:00
parent 3fe27413f5
commit de4e6f57c5
6 changed files with 39 additions and 22 deletions

View file

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

View file

@ -59,6 +59,9 @@ RosterManager::~RosterManager() {
for (std::map<std::string, Buddy *>::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<std::string, Buddy *>::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<Swift::GenericRequest<Swift::RosterItemExchangePayload> > request(new Swift::GenericRequest<Swift::RosterItemExchangePayload>(Swift::IQ::Set, m_user->getJID(), payload, m_component->getIQRouter()));
boost::shared_ptr<Swift::GenericRequest<Swift::RosterItemExchangePayload> > request(new Swift::GenericRequest<Swift::RosterItemExchangePayload>(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<std::string, Buddy *>::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<std::string, Buddy *>::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);

View file

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

View file

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

View file

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

View file

@ -25,11 +25,15 @@
#include "transport/user.h"
#include "Swiften/Elements/ErrorPayload.h"
#include <boost/shared_ptr.hpp>
#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<Swift::InBandRegistrationPayload>(component->m_iqRouter) {
m_component = component;
m_config = m_component->m_config;