From 2b836edd79856f640ec1bdcdf9a4fdfdde145e15 Mon Sep 17 00:00:00 2001 From: HanzZ Date: Fri, 11 Nov 2011 10:00:11 +0100 Subject: [PATCH] Send current presences to newly connected resource --- include/transport/user.h | 1 + src/user.cpp | 50 ++++++++++++++++++++++++++-------------- 2 files changed, 34 insertions(+), 17 deletions(-) diff --git a/include/transport/user.h b/include/transport/user.h index fe06277a..9d7f1118 100644 --- a/include/transport/user.h +++ b/include/transport/user.h @@ -135,6 +135,7 @@ class User : public Swift::EntityCapsProvider { time_t m_lastActivity; std::map m_legacyCaps; std::vector > m_filetransfers; + int m_resources; }; } diff --git a/src/user.cpp b/src/user.cpp index 60054733..aca25bae 100644 --- a/src/user.cpp +++ b/src/user.cpp @@ -43,7 +43,7 @@ namespace Transport { static LoggerPtr logger = Logger::getLogger("User"); User::User(const Swift::JID &jid, UserInfo &userInfo, Component *component, UserManager *userManager) { - m_jid = jid; + m_jid = jid.toBare(); m_data = NULL; m_component = component; @@ -54,6 +54,7 @@ User::User(const Swift::JID &jid, UserInfo &userInfo, Component *component, User m_connected = false; m_readyForConnect = false; m_ignoreDisconnect = false; + m_resources = 0; m_reconnectTimer = m_component->getNetworkFactories()->getTimerFactory()->createTimer(10000); m_reconnectTimer->onTick.connect(boost::bind(&User::onConnectingTimeout, this)); @@ -129,30 +130,37 @@ void User::sendCurrentPresence() { return; } - if (m_connected) { - Swift::Presence::ref highest = m_presenceOracle->getHighestPriorityPresence(m_jid.toBare()); - if (highest) { - Swift::Presence::ref response = Swift::Presence::create(highest); - response->setTo(m_jid); - response->setFrom(m_component->getJID()); - m_component->getStanzaChannel()->sendPresence(response); + std::vector presences = m_presenceOracle->getAllPresence(m_jid); + foreach(Swift::Presence::ref presence, presences) { + if (presence->getType() == Swift::Presence::Unavailable) { + continue; + } + + if (m_connected) { + Swift::Presence::ref highest = m_presenceOracle->getHighestPriorityPresence(m_jid.toBare()); + if (highest) { + Swift::Presence::ref response = Swift::Presence::create(highest); + response->setTo(presence->getFrom()); + response->setFrom(m_component->getJID()); + m_component->getStanzaChannel()->sendPresence(response); + } + else { + Swift::Presence::ref response = Swift::Presence::create(); + response->setTo(presence->getFrom()); + response->setFrom(m_component->getJID()); + response->setType(Swift::Presence::Unavailable); + m_component->getStanzaChannel()->sendPresence(response); + } } else { Swift::Presence::ref response = Swift::Presence::create(); - response->setTo(m_jid.toBare()); + response->setTo(presence->getFrom()); response->setFrom(m_component->getJID()); response->setType(Swift::Presence::Unavailable); + response->setStatus("Connecting"); m_component->getStanzaChannel()->sendPresence(response); } } - else { - Swift::Presence::ref response = Swift::Presence::create(); - response->setTo(m_jid.toBare()); - response->setFrom(m_component->getJID()); - response->setType(Swift::Presence::Unavailable); - response->setStatus("Connecting"); - m_component->getStanzaChannel()->sendPresence(response); - } } void User::setConnected(bool connected) { @@ -164,6 +172,8 @@ void User::setConnected(bool connected) { } void User::handlePresence(Swift::Presence::ref presence) { + int currentResourcesCount = m_presenceOracle->getAllPresence(m_jid).size(); + if (!m_connected) { // we are not connected to legacy network, so we should do it when disco#info arrive :) if (m_readyForConnect == false) { @@ -231,9 +241,15 @@ void User::handlePresence(Swift::Presence::ref presence) { } else { sendCurrentPresence(); + // This resource is new, so we have to send buddies presences + if (currentResourcesCount != m_resources) { + m_rosterManager->sendCurrentPresences(presence->getFrom()); + } } } + m_resources = currentResourcesCount; + // Change legacy network presence if (m_readyForConnect) {