diff options
author | Remko Tronçon <git@el-tramo.be> | 2011-06-18 10:21:21 (GMT) |
---|---|---|
committer | Remko Tronçon <git@el-tramo.be> | 2011-06-18 10:21:21 (GMT) |
commit | 7af8a078c57d94ff63eb81f26de2f55eca6b5c00 (patch) | |
tree | 6da747b7909de1069ad38f7706eae27afc7b3e70 /Limber/Server/ServerStanzaRouter.cpp | |
parent | 774c195afa103a577421541b821be05defa26a84 (diff) | |
download | swift-contrib-7af8a078c57d94ff63eb81f26de2f55eca6b5c00.zip swift-contrib-7af8a078c57d94ff63eb81f26de2f55eca6b5c00.tar.bz2 |
Moving unused server code out of Swiften into Limber.
Diffstat (limited to 'Limber/Server/ServerStanzaRouter.cpp')
-rw-r--r-- | Limber/Server/ServerStanzaRouter.cpp | 73 |
1 files changed, 73 insertions, 0 deletions
diff --git a/Limber/Server/ServerStanzaRouter.cpp b/Limber/Server/ServerStanzaRouter.cpp new file mode 100644 index 0000000..fec529f --- /dev/null +++ b/Limber/Server/ServerStanzaRouter.cpp @@ -0,0 +1,73 @@ +/* + * Copyright (c) 2010 Remko Tronçon + * Licensed under the GNU General Public License v3. + * See Documentation/Licenses/GPLv3.txt for more information. + */ + +#include "Limber/Server/ServerStanzaRouter.h" +#include "Limber/Server/ServerSession.h" + +#include <cassert> +#include <algorithm> + +namespace Swift { + +namespace { + struct PriorityLessThan { + bool operator()(const ServerSession* s1, const ServerSession* s2) const { + return s1->getPriority() < s2->getPriority(); + } + }; + + struct HasJID { + HasJID(const JID& jid) : jid(jid) {} + bool operator()(const ServerSession* session) const { + return session->getJID().equals(jid, JID::WithResource); + } + JID jid; + }; +} + +ServerStanzaRouter::ServerStanzaRouter() { +} + +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 ServerStanzaRouter::addClientSession(ServerSession* clientSession) { + clientSessions_.push_back(clientSession); +} + +void ServerStanzaRouter::removeClientSession(ServerSession* clientSession) { + clientSessions_.erase(std::remove(clientSessions_.begin(), clientSessions_.end(), clientSession), clientSessions_.end()); +} + +} |