diff --git a/src/rostermanager.cpp b/src/rostermanager.cpp index 4426458830b3a67bac124320c1b3af1d8a5241e5..cdb13dbc6f73cd0d43c78a7a662ed73c069886e8 100644 --- a/src/rostermanager.cpp +++ b/src/rostermanager.cpp @@ -25,21 +25,19 @@ #include "transport/usermanager.h" #include "transport/buddy.h" #include "transport/user.h" +#include "transport/logging.h" #include "Swiften/Roster/SetRosterRequest.h" #include "Swiften/Elements/RosterPayload.h" #include "Swiften/Elements/RosterItemPayload.h" #include "Swiften/Elements/RosterItemExchangePayload.h" -#include "log4cxx/logger.h" #include #include #include -using namespace log4cxx; - namespace Transport { -static LoggerPtr logger = Logger::getLogger("RosterManager"); +DEFINE_LOGGER(logger, "RosterManager"); RosterManager::RosterManager(User *user, Component *component){ m_rosterStorage = NULL; @@ -110,7 +108,12 @@ void RosterManager::sendBuddyRosterPush(Buddy *buddy) { Swift::RosterPayload::ref payload = Swift::RosterPayload::ref(new Swift::RosterPayload()); Swift::RosterItemPayload item; item.setJID(buddy->getJID().toBare()); - item.setName(buddy->getAlias()); + if (buddy->getAlias().empty()) { + item.setName(buddy->getJID().toBare().toString()); + } + else { + item.setName(buddy->getAlias()); + } item.setGroups(buddy->getGroups()); item.setSubscription(Swift::RosterItemPayload::Both); @@ -132,6 +135,11 @@ void RosterManager::sendBuddyRosterPush(Buddy *buddy) { request->send(); m_requests.push_back(request); } + + if (buddy->getSubscription() != Buddy::Both) { + buddy->setSubscription(Buddy::Both); + handleBuddyChanged(buddy); + } } void RosterManager::sendBuddySubscribePresence(Buddy *buddy) { @@ -144,9 +152,6 @@ void RosterManager::sendBuddySubscribePresence(Buddy *buddy) { } void RosterManager::handleBuddyChanged(Buddy *buddy) { - if (m_rosterStorage) { - m_rosterStorage->storeBuddy(buddy); - } } void RosterManager::setBuddyCallback(Buddy *buddy) { @@ -160,6 +165,11 @@ void RosterManager::setBuddyCallback(Buddy *buddy) { sendBuddyRosterPush(buddy); } else { + if (buddy->getSubscription() == Buddy::Both) { + LOG4CXX_INFO(logger, m_user->getJID().toString() << ": Not forwarding this buddy, because subscription=both"); + return; + } + if (m_supportRemoteRoster) { sendBuddyRosterPush(buddy); } @@ -222,7 +232,10 @@ void RosterManager::handleRemoteRosterResponse(boost::shared_ptrgetFactory()->createBuddy(this, buddyInfo); setBuddy(buddy); @@ -281,6 +295,10 @@ void RosterManager::sendRIE() { void RosterManager::handleSubscription(Swift::Presence::ref presence) { std::string legacyName = Buddy::JIDToLegacyName(presence->getTo()); + if (legacyName.empty()) { + return; + } + // For server mode the subscription changes are handler in rosterresponder.cpp // using roster pushes. if (m_component->inServerMode()) { @@ -326,8 +344,8 @@ void RosterManager::handleSubscription(Swift::Presence::ref presence) { response->setType(Swift::Presence::Subscribed); break; case Swift::Presence::Subscribed: - onBuddyAdded(buddy); - break; +// onBuddyAdded(buddy); + return; // buddy is already there, so nothing to do, just answer case Swift::Presence::Unsubscribe: response->setType(Swift::Presence::Unsubscribed); @@ -356,6 +374,10 @@ void RosterManager::handleSubscription(Swift::Presence::ref presence) { currentPresence->setTo(presence->getFrom()); m_component->getStanzaChannel()->sendPresence(currentPresence); } + if (buddy->getSubscription() != Buddy::Both) { + buddy->setSubscription(Buddy::Both); + handleBuddyChanged(buddy); + } break; // remove buddy case Swift::Presence::Unsubscribe: @@ -365,7 +387,20 @@ void RosterManager::handleSubscription(Swift::Presence::ref presence) { // just send response case Swift::Presence::Unsubscribed: response->setType(Swift::Presence::Unsubscribe); + // We set both here, because this Unsubscribed can be response to + // subscribe presence and we don't want that unsubscribe presence + // to be send later again + if (buddy->getSubscription() != Buddy::Both) { + buddy->setSubscription(Buddy::Both); + handleBuddyChanged(buddy); + } break; + case Swift::Presence::Subscribed: + if (buddy->getSubscription() != Buddy::Both) { + buddy->setSubscription(Buddy::Both); + handleBuddyChanged(buddy); + } + return; default: return; } @@ -389,7 +424,7 @@ void RosterManager::handleSubscription(Swift::Presence::ref presence) { // buddy is already there, so nothing to do, just answer case Swift::Presence::Unsubscribe: response->setType(Swift::Presence::Unsubscribed); - onBuddyRemoved(buddy); +// onBuddyRemoved(buddy); break; // just send response case Swift::Presence::Unsubscribed: