Better unregistering in gateway mode + other gateway mode fixes

This commit is contained in:
HanzZ 2011-09-18 16:59:05 +02:00
parent 4095ec6904
commit ab6a0ecf30
3 changed files with 24 additions and 16 deletions

View file

@ -58,7 +58,7 @@ BuddyFlag Buddy::getFlags() {
}
const Swift::JID &Buddy::getJID() {
if (!m_jid.isValid()) {
if (!m_jid.isValid() || m_jid.getNode().empty()) {
generateJID();
}
return m_jid;
@ -81,6 +81,10 @@ Swift::Presence::ref Buddy::generatePresenceStanza(int features, bool only_new)
if (!getStatus(s, statusMessage))
return Swift::Presence::ref();
if (m_jid.getNode().empty()) {
generateJID();
}
Swift::Presence::ref presence = Swift::Presence::create();
presence->setFrom(m_jid);
presence->setTo(m_rosterManager->getUser()->getJID().toBare());
@ -163,9 +167,9 @@ std::string Buddy::JIDToLegacyName(const Swift::JID &jid) {
else {
name = jid.getUnescapedNode();
// Psi sucks...
if (name.find_last_of("\\40") != std::string::npos) {
name.replace(name.find_last_of("\\40"), 1, "@"); // OK
}
// if (name.find_last_of("\\40") != std::string::npos) {
// name.replace(name.find_last_of("\\40"), 1, "@"); // OK
// }
}
return name;
}

View file

@ -199,12 +199,14 @@ void RosterManager::handleRemoteRosterResponse(boost::shared_ptr<Swift::RosterPa
LOG4CXX_INFO(logger, m_user->getJID().toString() << ": This server supports remote roster protoXEP");
m_supportRemoteRoster = true;
return;
BOOST_FOREACH(const Swift::RosterItemPayload &item, payload->getItems()) {
std::string legacyName = Buddy::JIDToLegacyName(item.getJID());
if (m_buddies.find(legacyName) != m_buddies.end()) {
continue;
}
std::cout << "LEGACYNAME " << legacyName << "\n";
BuddyInfo buddyInfo;
buddyInfo.id = -1;

View file

@ -88,34 +88,36 @@ void UserRegistration::handleUnregisterRemoteRosterResponse(boost::shared_ptr<Sw
if (!registered)
return;
std::list <BuddyInfo> roster;
m_storageBackend->getBuddies(userInfo.id, roster);
for(std::list<BuddyInfo>::iterator u = roster.begin(); u != roster.end() ; u++){
std::string name = (*u).legacyName;
if (remoteRosterNotSupported) {
std::list <BuddyInfo> roster;
m_storageBackend->getBuddies(userInfo.id, roster);
for(std::list<BuddyInfo>::iterator u = roster.begin(); u != roster.end() ; u++){
std::string name = Swift::JID::getEscapedNode((*u).legacyName);
if (remoteRosterNotSupported) {
Swift::Presence::ref response;
response = Swift::Presence::create();
response->setTo(Swift::JID(barejid));
response->setFrom(Swift::JID(name + "@" + m_component->getJID().toString()));
response->setFrom(Swift::JID(name, m_component->getJID().toString()));
response->setType(Swift::Presence::Unsubscribe);
m_component->getStanzaChannel()->sendPresence(response);
response = Swift::Presence::create();
response->setTo(Swift::JID(barejid));
response->setFrom(Swift::JID(name + "@" + m_component->getJID().toString()));
response->setFrom(Swift::JID(name, m_component->getJID().toString()));
response->setType(Swift::Presence::Unsubscribed);
m_component->getStanzaChannel()->sendPresence(response);
}
else {
Swift::RosterPayload::ref payload = Swift::RosterPayload::ref(new Swift::RosterPayload());
}
else {
BOOST_FOREACH(Swift::RosterItemPayload it, payload->getItems()) {
Swift::RosterPayload::ref p = Swift::RosterPayload::ref(new Swift::RosterPayload());
Swift::RosterItemPayload item;
item.setJID(Swift::JID(name + "@" + m_component->getJID().toString()));
item.setJID(it.getJID());
item.setSubscription(Swift::RosterItemPayload::Remove);
payload->addItem(item);
p->addItem(item);
Swift::SetRosterRequest::ref request = Swift::SetRosterRequest::create(payload, barejid, m_component->getIQRouter());
Swift::SetRosterRequest::ref request = Swift::SetRosterRequest::create(p, barejid, m_component->getIQRouter());
request->send();
}
}