bool ServerStanzaRouter::routeStanza(boost::shared_ptr<Stanza> stanza) { JID to = stanza->getTo(); assert(to.isValid()); // For a full JID, first try to route to a session with the full JID if (!to.isBare()) { std::vector<ServerSession*>::const_iterator i = std::find_if(clientSessions_.begin(), clientSessions_.end(), HasJID(to)); if (i != clientSessions_.end()) { (*i)->sendStanza(stanza); return true; } } // Look for candidate sessions to = to.toBare(); std::vector<ServerSession*> candidateSessions; for (std::vector<ServerSession*>::const_iterator i = clientSessions_.begin(); i != clientSessions_.end(); ++i) { if ((*i)->getJID().equals(to, JID::WithoutResource) && (*i)->getPriority() >= 0) { candidateSessions.push_back(*i); } } if (candidateSessions.empty()) { return false; } // Find the session with the highest priority std::vector<ServerSession*>::const_iterator i = std::max_element(clientSessions_.begin(), clientSessions_.end(), PriorityLessThan()); (*i)->sendStanza(stanza); return true; }
void ServerStanzaChannel::send(SWIFTEN_SHRPTR_NAMESPACE::shared_ptr<Stanza> stanza) { JID to = stanza->getTo(); assert(to.isValid()); if (!stanza->getFrom().isValid()) { stanza->setFrom(m_jid); } // For a full JID, first try to route to a session with the full JID if (!to.isBare()) { std::list<SWIFTEN_SHRPTR_NAMESPACE::shared_ptr<ServerFromClientSession> >::const_iterator i = std::find_if(sessions[stanza->getTo().toBare().toString()].begin(), sessions[stanza->getTo().toBare().toString()].end(), HasJID(to)); if (i != sessions[stanza->getTo().toBare().toString()].end()) { (*i)->sendElement(stanza); return; } } // Look for candidate sessions to = to.toBare(); std::vector<SWIFTEN_SHRPTR_NAMESPACE::shared_ptr<ServerFromClientSession> > candidateSessions; for (std::list<SWIFTEN_SHRPTR_NAMESPACE::shared_ptr<ServerFromClientSession> >::const_iterator i = sessions[stanza->getTo().toBare().toString()].begin(); i != sessions[stanza->getTo().toBare().toString()].end(); ++i) { if ((*i)->getRemoteJID().equals(to, JID::WithoutResource)) { candidateSessions.push_back(*i); (*i)->sendElement(stanza); } } if (candidateSessions.empty()) { return; } // Find the session with the highest priority // std::vector<ServerSession*>::const_iterator i = std::max_element(sessions.begin(), sessions.end(), PriorityLessThan()); // (*i)->sendStanza(stanza); return; }