diff --git a/src/rostermanager.cpp b/src/rostermanager.cpp index db888909..23b19a7f 100644 --- a/src/rostermanager.cpp +++ b/src/rostermanager.cpp @@ -116,9 +116,18 @@ void RosterManager::sendBuddyRosterPush(Buddy *buddy) { payload->addItem(item); - std::vector presences = m_component->getPresenceOracle()->getAllPresence(m_user->getJID().toBare()); - BOOST_FOREACH(Swift::Presence::ref presence, presences) { - Swift::SetRosterRequest::ref request = Swift::SetRosterRequest::create(payload, presence->getFrom(), m_component->getIQRouter()); + // In server mode we have to send pushes to all resources, but in gateway-mode we send it only to bare JID + if (m_component->inServerMode()) { + std::vector presences = m_component->getPresenceOracle()->getAllPresence(m_user->getJID().toBare()); + BOOST_FOREACH(Swift::Presence::ref presence, presences) { + Swift::SetRosterRequest::ref request = Swift::SetRosterRequest::create(payload, presence->getFrom(), m_component->getIQRouter()); + request->onResponse.connect(boost::bind(&RosterManager::handleBuddyRosterPushResponse, this, _1, request, buddy->getName())); + request->send(); + m_requests.push_back(request); + } + } + else { + Swift::SetRosterRequest::ref request = Swift::SetRosterRequest::create(payload, m_user->getJID().toBare(), m_component->getIQRouter()); request->onResponse.connect(boost::bind(&RosterManager::handleBuddyRosterPushResponse, this, _1, request, buddy->getName())); request->send(); m_requests.push_back(request); @@ -332,8 +341,8 @@ void RosterManager::handleSubscription(Swift::Presence::ref presence) { else { Swift::Presence::ref response = Swift::Presence::create(); Swift::Presence::ref currentPresence; - response->setTo(presence->getFrom()); - response->setFrom(presence->getTo()); + response->setTo(presence->getFrom().toBare()); + response->setFrom(presence->getTo().toBare().toString() + "/bot"); Buddy *buddy = getBuddy(Buddy::JIDToLegacyName(presence->getTo())); if (buddy) { @@ -355,7 +364,7 @@ void RosterManager::handleSubscription(Swift::Presence::ref presence) { break; // just send response case Swift::Presence::Unsubscribed: -// response->setType(Swift::Presence::Unsubscribe); + response->setType(Swift::Presence::Unsubscribe); break; default: return;