diff --git a/include/transport/rostermanager.h b/include/transport/rostermanager.h index 92ecfca8..a856c899 100644 --- a/include/transport/rostermanager.h +++ b/include/transport/rostermanager.h @@ -72,12 +72,15 @@ class RosterManager { void setBuddyCallback(Buddy *buddy); void sendBuddyRosterPush(Buddy *buddy); + void sendRIE(); void handleBuddyRosterPushResponse(Swift::ErrorPayload::ref error, const std::string &key); + std::map m_buddies; Component *m_component; User *m_user; Swift::Timer::ref m_setBuddyTimer; + Swift::Timer::ref m_RIETimer; }; } diff --git a/spectrum/src/sample.cfg b/spectrum/src/sample.cfg index 5daa303e..5a7e5cd6 100644 --- a/spectrum/src/sample.cfg +++ b/spectrum/src/sample.cfg @@ -2,7 +2,7 @@ jid = icq.localhost password = secret server = 127.0.0.1 -port = 5222 +port = 8888 protocol=prpl-jabber server_mode=1 diff --git a/src/rostermanager.cpp b/src/rostermanager.cpp index 8a54ff7a..16a73247 100644 --- a/src/rostermanager.cpp +++ b/src/rostermanager.cpp @@ -26,6 +26,7 @@ #include "Swiften/Roster/SetRosterRequest.h" #include "Swiften/Elements/RosterPayload.h" #include "Swiften/Elements/RosterItemPayload.h" +#include "Swiften/Elements/RosterItemExchangePayload.h" namespace Transport { @@ -33,9 +34,13 @@ RosterManager::RosterManager(User *user, Component *component){ m_user = user; m_component = component; m_setBuddyTimer = m_component->getFactories()->getTimerFactory()->createTimer(1000); + m_RIETimer = m_component->getFactories()->getTimerFactory()->createTimer(3000); + m_RIETimer->onTick.connect(boost::bind(&RosterManager::sendRIE, this)); } RosterManager::~RosterManager() { + m_setBuddyTimer->stop(); + m_RIETimer->stop(); } void RosterManager::setBuddy(Buddy *buddy) { @@ -63,12 +68,20 @@ void RosterManager::setBuddyCallback(Buddy *buddy) { m_buddies[buddy->getName()] = buddy; onBuddySet(buddy); + // In server mode the only way is to send jabber:iq:roster push. + // In component mode we send RIE or Subscribe presences, based on features. if (m_component->inServerMode()) { sendBuddyRosterPush(buddy); } + else { + + } if (m_setBuddyTimer->onTick.empty()) { m_setBuddyTimer->stop(); + if (true /*&& rie_is_supported*/) { + m_RIETimer->start(); + } } } @@ -87,4 +100,23 @@ Buddy *RosterManager::getBuddy(const std::string &name) { return m_buddies[name]; } +void RosterManager::sendRIE() { + m_RIETimer->stop(); + + 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; + Swift::RosterItemExchangePayload::Item item; + item.jid = buddy->getJID().toBare(); + item.name = buddy->getAlias(); + item.action = Swift::RosterItemExchangePayload::Add; + item.groups = buddy->getGroups(); + + payload->addItem(item); + } + + boost::shared_ptr > request(new Swift::GenericRequest(Swift::IQ::Set, m_user->getJID(), payload, m_component->getIQRouter())); + request->send(); +} + } \ No newline at end of file