diff options
Diffstat (limited to 'Limber')
-rw-r--r-- | Limber/main.cpp | 32 |
1 files changed, 32 insertions, 0 deletions
diff --git a/Limber/main.cpp b/Limber/main.cpp index c3db296..be7387e 100644 --- a/Limber/main.cpp +++ b/Limber/main.cpp @@ -8,11 +8,15 @@ #include <boost/enable_shared_from_this.hpp> #include <boost/thread.hpp> +#include "Swiften/Elements/IQ.h" +#include "Swiften/Elements/RosterPayload.h" +#include "Swiften/Elements/VCard.h" #include "Swiften/Server/SimpleUserRegistry.h" #include "Swiften/Base/ByteArray.h" #include "Swiften/Base/IDGenerator.h" #include "Swiften/EventLoop/MainEventLoop.h" #include "Swiften/EventLoop/SimpleEventLoop.h" +#include "Swiften/Elements/Stanza.h" #include "Swiften/Network/ConnectionServer.h" #include "Swiften/Network/BoostIOServiceThread.h" #include "Swiften/Server/ServerFromClientSession.h" @@ -136,6 +140,7 @@ class Server { void handleNewConnection(boost::shared_ptr<IncomingConnection> c) { ServerFromClientSession* session = new ServerFromClientSession(idGenerator_.generateID(), c, &payloadParserFactories_, &payloadSerializers_, userRegistry_); serverFromClientSessions_.push_back(session); + session->onStanzaReceived.connect(boost::bind(&Server::handleStanzaReceived, this, _1, session)); session->onSessionFinished.connect(boost::bind(&Server::handleSessionFinished, this, session)); } @@ -144,6 +149,33 @@ class Server { delete session; } + void handleStanzaReceived(boost::shared_ptr<Stanza> stanza, ServerFromClientSession* session) { + stanza->setFrom(session->getJID()); + if (!stanza->getTo().isValid()) { + stanza->setTo(JID(session->getDomain())); + } + if (!stanza->getTo().isValid() || stanza->getTo() == session->getDomain() || stanza->getTo() == session->getJID().toBare()) { + if (boost::shared_ptr<IQ> iq = boost::dynamic_pointer_cast<IQ>(stanza)) { + if (iq->getPayload<RosterPayload>()) { + session->sendStanza(IQ::createResult(iq->getFrom(), iq->getID(), boost::shared_ptr<RosterPayload>(new RosterPayload()))); + } + if (iq->getPayload<VCard>()) { + if (iq->getType() == IQ::Get) { + boost::shared_ptr<VCard> vcard(new VCard()); + vcard->setNickname(iq->getFrom().getNode()); + session->sendStanza(IQ::createResult(iq->getFrom(), iq->getID(), vcard)); + } + else { + session->sendStanza(IQ::createError(iq->getFrom(), iq->getID(), Error::Forbidden, Error::Cancel)); + } + } + else { + session->sendStanza(IQ::createError(iq->getFrom(), iq->getID(), Error::FeatureNotImplemented, Error::Cancel)); + } + } + } + } + private: IDGenerator idGenerator_; UserRegistry* userRegistry_; |