diff --git a/include/transport/rostermanager.h b/include/transport/rostermanager.h index 1d37a74f..de50c15a 100644 --- a/include/transport/rostermanager.h +++ b/include/transport/rostermanager.h @@ -88,6 +88,8 @@ class RosterManager { void sendCurrentPresences(const Swift::JID &to); + void sendCurrentPresence(const Swift::JID &from, const Swift::JID &to); + void sendUnavailablePresences(const Swift::JID &to); private: diff --git a/spectrum/src/sample.cfg b/spectrum/src/sample.cfg index f5113b16..39d761b4 100644 --- a/spectrum/src/sample.cfg +++ b/spectrum/src/sample.cfg @@ -8,7 +8,7 @@ backend_host=localhost # < this option doesn't work yet backend_port=10001 admin_username=admin admin_password=test -idle_reconnect_time=10 +#idle_reconnect_time=10 #cert= #patch to PKCS#12 certificate #cert_password= #password to that certificate if any users_per_backend=10 diff --git a/src/rostermanager.cpp b/src/rostermanager.cpp index b5a88f5d..c8d955a8 100644 --- a/src/rostermanager.cpp +++ b/src/rostermanager.cpp @@ -377,6 +377,24 @@ void RosterManager::sendCurrentPresences(const Swift::JID &to) { } } +void RosterManager::sendCurrentPresence(const Swift::JID &from, const Swift::JID &to) { + Buddy *buddy = getBuddy(Buddy::JIDToLegacyName(from)); + if (buddy) { + Swift::Presence::ref presence = buddy->generatePresenceStanza(255); + if (presence) { + presence->setTo(to); + m_component->getStanzaChannel()->sendPresence(presence); + } + } + else { + Swift::Presence::ref response = Swift::Presence::create(); + response->setTo(to); + response->setFrom(from); + response->setType(Swift::Presence::Unavailable); + m_component->getStanzaChannel()->sendPresence(response); + } +} + void RosterManager::sendUnavailablePresences(const Swift::JID &to) { for (std::map::const_iterator it = m_buddies.begin(); it != m_buddies.end(); it++) { Buddy *buddy = (*it).second; diff --git a/src/user.cpp b/src/user.cpp index ac519980..e6d6e832 100644 --- a/src/user.cpp +++ b/src/user.cpp @@ -90,12 +90,12 @@ Swift::JID User::getJIDWithFeature(const std::string &feature) { continue; if (discoInfo->hasFeature(feature)) { - LOG4CXX_INFO(logger, m_jid.toString() << ": Found JID with " << feature << "feature: " << presence->getFrom().toString()); + LOG4CXX_INFO(logger, m_jid.toString() << ": Found JID with " << feature << " feature: " << presence->getFrom().toString()); return presence->getFrom(); } } - LOG4CXX_INFO(logger, m_jid.toString() << ": No JID with " << feature << "feature"); + LOG4CXX_INFO(logger, m_jid.toString() << ": No JID with " << feature << " feature"); return jid; } diff --git a/src/usermanager.cpp b/src/usermanager.cpp index 2eae166f..a645d5a1 100644 --- a/src/usermanager.cpp +++ b/src/usermanager.cpp @@ -236,7 +236,18 @@ void UserManager::handleGeneralPresenceReceived(Swift::Presence::ref presence) { } void UserManager::handleProbePresence(Swift::Presence::ref presence) { - + User *user = getUser(presence->getFrom().toBare().toString()); + + if (user) { + user->getRosterManager()->sendCurrentPresence(presence->getTo(), presence->getFrom()); + } + else { + Swift::Presence::ref response = Swift::Presence::create(); + response->setFrom(presence->getTo()); + response->setTo(presence->getFrom()); + response->setType(Swift::Presence::Unavailable); + m_component->getStanzaChannel()->sendPresence(response); + } } void UserManager::handleSubscription(Swift::Presence::ref presence) {