diff options
author | Remko Tronçon <git@el-tramo.be> | 2009-07-19 13:48:19 (GMT) |
---|---|---|
committer | Remko Tronçon <git@el-tramo.be> | 2009-07-19 13:48:19 (GMT) |
commit | 958fe81b045e54ed6dadfe1fa9b14ac317811abf (patch) | |
tree | 4d341a6780bafb187d8aa753de71582f68949da0 /Swiften | |
parent | a6fcd9e7aa12c5e00c61ff809e81fba14babd70c (diff) | |
download | swift-958fe81b045e54ed6dadfe1fa9b14ac317811abf.zip swift-958fe81b045e54ed6dadfe1fa9b14ac317811abf.tar.bz2 |
Factor out common code from ServerFromClientSession.
Diffstat (limited to 'Swiften')
-rw-r--r-- | Swiften/LinkLocal/IncomingLinkLocalSession.cpp | 2 | ||||
-rw-r--r-- | Swiften/LinkLocal/LinkLocalSession.cpp | 2 | ||||
-rw-r--r-- | Swiften/LinkLocal/LinkLocalSession.h | 4 | ||||
-rw-r--r-- | Swiften/LinkLocal/OutgoingLinkLocalSession.cpp | 16 | ||||
-rw-r--r-- | Swiften/LinkLocal/OutgoingLinkLocalSession.h | 4 | ||||
-rw-r--r-- | Swiften/Server/ServerFromClientSession.cpp | 70 | ||||
-rw-r--r-- | Swiften/Server/ServerFromClientSession.h | 22 | ||||
-rw-r--r-- | Swiften/Session/Session.cpp | 6 |
8 files changed, 34 insertions, 92 deletions
diff --git a/Swiften/LinkLocal/IncomingLinkLocalSession.cpp b/Swiften/LinkLocal/IncomingLinkLocalSession.cpp index db4b007..b73e979 100644 --- a/Swiften/LinkLocal/IncomingLinkLocalSession.cpp +++ b/Swiften/LinkLocal/IncomingLinkLocalSession.cpp @@ -57,7 +57,7 @@ void IncomingLinkLocalSession::handleElement(boost::shared_ptr<Element> element) if (isInitialized()) { if (stanza) { - onStanzaReceived(stanza); + onElementReceived(stanza); } else { std::cerr << "Received unexpected element" << std::endl; diff --git a/Swiften/LinkLocal/LinkLocalSession.cpp b/Swiften/LinkLocal/LinkLocalSession.cpp index 0f106ae..60227a7 100644 --- a/Swiften/LinkLocal/LinkLocalSession.cpp +++ b/Swiften/LinkLocal/LinkLocalSession.cpp @@ -43,7 +43,7 @@ void LinkLocalSession::finishSession() { connection->disconnect(); } -void LinkLocalSession::sendStanza(boost::shared_ptr<Stanza> stanza) { +void LinkLocalSession::sendElement(boost::shared_ptr<Element> stanza) { xmppLayer->writeElement(stanza); } diff --git a/Swiften/LinkLocal/LinkLocalSession.h b/Swiften/LinkLocal/LinkLocalSession.h index 6629a2a..4bec14d 100644 --- a/Swiften/LinkLocal/LinkLocalSession.h +++ b/Swiften/LinkLocal/LinkLocalSession.h @@ -35,13 +35,13 @@ namespace Swift { void finishSession(); // TODO: Make non-virtual when OutgoingSession is fixed - virtual void sendStanza(boost::shared_ptr<Stanza>); + virtual void sendElement(boost::shared_ptr<Element>); virtual const JID& getRemoteJID() const = 0; virtual void start() = 0; - boost::signal<void (boost::shared_ptr<Stanza>)> onStanzaReceived; + boost::signal<void (boost::shared_ptr<Element>)> onElementReceived; boost::signal<void (boost::optional<Error>)> onSessionFinished; boost::signal<void ()> onSessionStarted; boost::signal<void (const ByteArray&)> onDataWritten; diff --git a/Swiften/LinkLocal/OutgoingLinkLocalSession.cpp b/Swiften/LinkLocal/OutgoingLinkLocalSession.cpp index f97520a..7415174 100644 --- a/Swiften/LinkLocal/OutgoingLinkLocalSession.cpp +++ b/Swiften/LinkLocal/OutgoingLinkLocalSession.cpp @@ -77,28 +77,28 @@ void OutgoingLinkLocalSession::handleConnected(bool error) { } void OutgoingLinkLocalSession::handleStreamStart(const ProtocolHeader&) { - foreach(const boost::shared_ptr<Stanza>& stanza, queuedStanzas_) { - LinkLocalSession::sendStanza(stanza); + foreach(const boost::shared_ptr<Element>& stanza, queuedElements_) { + LinkLocalSession::sendElement(stanza); } - queuedStanzas_.clear(); + queuedElements_.clear(); setInitialized(); } void OutgoingLinkLocalSession::handleElement(boost::shared_ptr<Element> element) { if (isInitialized()) { - boost::shared_ptr<Stanza> stanza = boost::dynamic_pointer_cast<Stanza>(element); + boost::shared_ptr<Element> stanza = boost::dynamic_pointer_cast<Element>(element); if (stanza) { - onStanzaReceived(stanza); + onElementReceived(stanza); } } } -void OutgoingLinkLocalSession::sendStanza(boost::shared_ptr<Stanza> stanza) { +void OutgoingLinkLocalSession::sendElement(boost::shared_ptr<Element> stanza) { if (isInitialized()) { - LinkLocalSession::sendStanza(stanza); + LinkLocalSession::sendElement(stanza); } else { - queuedStanzas_.push_back(stanza); + queuedElements_.push_back(stanza); } } diff --git a/Swiften/LinkLocal/OutgoingLinkLocalSession.h b/Swiften/LinkLocal/OutgoingLinkLocalSession.h index 76ab803..d3fed0b 100644 --- a/Swiften/LinkLocal/OutgoingLinkLocalSession.h +++ b/Swiften/LinkLocal/OutgoingLinkLocalSession.h @@ -35,7 +35,7 @@ namespace Swift { void start(); - void sendStanza(boost::shared_ptr<Stanza> stanza); + void sendElement(boost::shared_ptr<Element> stanza); private: void handleElement(boost::shared_ptr<Element>); @@ -49,7 +49,7 @@ namespace Swift { String hostname_; int port_; boost::shared_ptr<DNSSDService> resolver_; - std::vector<boost::shared_ptr<Stanza> > queuedStanzas_; + std::vector<boost::shared_ptr<Element> > queuedElements_; ConnectionFactory* connectionFactory_; }; } diff --git a/Swiften/Server/ServerFromClientSession.cpp b/Swiften/Server/ServerFromClientSession.cpp index 45df3be..4489654 100644 --- a/Swiften/Server/ServerFromClientSession.cpp +++ b/Swiften/Server/ServerFromClientSession.cpp @@ -5,8 +5,6 @@ #include "Swiften/Elements/ProtocolHeader.h" #include "Swiften/Server/UserRegistry.h" #include "Swiften/Network/Connection.h" -#include "Swiften/StreamStack/StreamStack.h" -#include "Swiften/StreamStack/ConnectionLayer.h" #include "Swiften/StreamStack/XMPPLayer.h" #include "Swiften/Elements/StreamFeatures.h" #include "Swiften/Elements/ResourceBind.h" @@ -25,62 +23,34 @@ ServerFromClientSession::ServerFromClientSession( PayloadParserFactoryCollection* payloadParserFactories, PayloadSerializerCollection* payloadSerializers, UserRegistry* userRegistry) : + Session(connection, payloadParserFactories, payloadSerializers), id_(id), - connection_(connection), - payloadParserFactories_(payloadParserFactories), - payloadSerializers_(payloadSerializers), userRegistry_(userRegistry), - authenticated_(false), - initialized_(false) { - xmppLayer_ = boost::shared_ptr<XMPPLayer>(new XMPPLayer(payloadParserFactories_, payloadSerializers_)); - connectionLayer_ = boost::shared_ptr<ConnectionLayer>(new ConnectionLayer(connection_)); - streamStack_ = new StreamStack(xmppLayer_, connectionLayer_); + authenticated_(false) { } -ServerFromClientSession::~ServerFromClientSession() { - delete streamStack_; -} - -void ServerFromClientSession::start() { - xmppLayer_->onStreamStart.connect( - boost::bind(&ServerFromClientSession::handleStreamStart, this, _1)); - xmppLayer_->onElement.connect( - boost::bind(&ServerFromClientSession::handleElement, this, _1)); - //xmppLayer_->onError.connect( - // boost::bind(&ServerFromClientSession::setError, this, XMLError)); - xmppLayer_->onDataRead.connect( - boost::bind(boost::ref(onDataRead), _1)); - xmppLayer_->onWriteData.connect( - boost::bind(boost::ref(onDataWritten), _1)); - connection_->onDisconnected.connect(boost::bind(&ServerFromClientSession::handleDisconnected, shared_from_this(), _1)); -} void ServerFromClientSession::handleElement(boost::shared_ptr<Element> element) { - if (initialized_) { - if (boost::shared_ptr<Stanza> stanza = boost::dynamic_pointer_cast<Stanza>(element)) { - onStanzaReceived(stanza); - } - else { - std::cerr << "Received unexpected element" << std::endl; - } + if (isInitialized()) { + onElementReceived(element); } else { if (AuthRequest* authRequest = dynamic_cast<AuthRequest*>(element.get())) { if (authRequest->getMechanism() != "PLAIN") { - xmppLayer_->writeElement(boost::shared_ptr<AuthFailure>(new AuthFailure)); - onSessionFinished(); + getXMPPLayer()->writeElement(boost::shared_ptr<AuthFailure>(new AuthFailure)); + finishSession(NoSupportedAuthMechanismsError); } else { PLAINMessage plainMessage(authRequest->getMessage()); if (userRegistry_->isValidUserPassword(JID(plainMessage.getAuthenticationID(), domain_.getDomain()), plainMessage.getPassword())) { - xmppLayer_->writeElement(boost::shared_ptr<AuthSuccess>(new AuthSuccess())); + getXMPPLayer()->writeElement(boost::shared_ptr<AuthSuccess>(new AuthSuccess())); user_ = plainMessage.getAuthenticationID(); authenticated_ = true; - xmppLayer_->resetParser(); + getXMPPLayer()->resetParser(); } else { - xmppLayer_->writeElement(boost::shared_ptr<AuthFailure>(new AuthFailure)); - onSessionFinished(); + getXMPPLayer()->writeElement(boost::shared_ptr<AuthFailure>(new AuthFailure)); + finishSession(AuthenticationFailedError); } } } @@ -89,12 +59,11 @@ void ServerFromClientSession::handleElement(boost::shared_ptr<Element> element) jid_ = JID(user_, domain_.getDomain(), resourceBind->getResource()); boost::shared_ptr<ResourceBind> resultResourceBind(new ResourceBind()); resultResourceBind->setJID(jid_); - xmppLayer_->writeElement(IQ::createResult(JID(), iq->getID(), resultResourceBind)); + getXMPPLayer()->writeElement(IQ::createResult(JID(), iq->getID(), resultResourceBind)); } else if (iq->getPayload<StartSession>()) { - initialized_ = true; - xmppLayer_->writeElement(IQ::createResult(jid_, iq->getID())); - onSessionStarted(); + getXMPPLayer()->writeElement(IQ::createResult(jid_, iq->getID())); + setInitialized(); } } } @@ -105,7 +74,7 @@ void ServerFromClientSession::handleStreamStart(const ProtocolHeader& incomingHe ProtocolHeader header; header.setFrom(incomingHeader.getTo()); header.setID(id_); - xmppLayer_->writeHeader(header); + getXMPPLayer()->writeHeader(header); boost::shared_ptr<StreamFeatures> features(new StreamFeatures()); if (!authenticated_) { @@ -115,16 +84,7 @@ void ServerFromClientSession::handleStreamStart(const ProtocolHeader& incomingHe features->setHasResourceBind(); features->setHasSession(); } - xmppLayer_->writeElement(features); + getXMPPLayer()->writeElement(features); } -void ServerFromClientSession::sendStanza(boost::shared_ptr<Stanza> stanza) { - xmppLayer_->writeElement(stanza); -} - -void ServerFromClientSession::handleDisconnected(const boost::optional<Connection::Error>&) { - onSessionFinished(); -} - - } diff --git a/Swiften/Server/ServerFromClientSession.h b/Swiften/Server/ServerFromClientSession.h index 733c428..213f5c7 100644 --- a/Swiften/Server/ServerFromClientSession.h +++ b/Swiften/Server/ServerFromClientSession.h @@ -5,6 +5,7 @@ #include <boost/enable_shared_from_this.hpp> #include "Swiften/Base/String.h" +#include "Swiften/Session/Session.h" #include "Swiften/JID/JID.h" #include "Swiften/Network/Connection.h" @@ -21,7 +22,7 @@ namespace Swift { class Connection; class ByteArray; - class ServerFromClientSession : public boost::enable_shared_from_this<ServerFromClientSession> { + class ServerFromClientSession : public Session { public: ServerFromClientSession( const String& id, @@ -29,11 +30,6 @@ namespace Swift { PayloadParserFactoryCollection* payloadParserFactories, PayloadSerializerCollection* payloadSerializers, UserRegistry* userRegistry); - ~ServerFromClientSession(); - - void start(); - - void sendStanza(boost::shared_ptr<Stanza>); const JID& getJID() const { return jid_; @@ -43,28 +39,14 @@ namespace Swift { return domain_; } - boost::signal<void (boost::shared_ptr<Stanza>)> onStanzaReceived; - boost::signal<void ()> onSessionFinished; - boost::signal<void ()> onSessionStarted; - boost::signal<void (const ByteArray&)> onDataWritten; - boost::signal<void (const ByteArray&)> onDataRead; - private: - void handleDisconnected(const boost::optional<Connection::Error>& error); void handleElement(boost::shared_ptr<Element>); void handleStreamStart(const ProtocolHeader& header); private: String id_; - boost::shared_ptr<Connection> connection_; - PayloadParserFactoryCollection* payloadParserFactories_; - PayloadSerializerCollection* payloadSerializers_; UserRegistry* userRegistry_; bool authenticated_; - bool initialized_; - boost::shared_ptr<XMPPLayer> xmppLayer_; - boost::shared_ptr<ConnectionLayer> connectionLayer_; - StreamStack* streamStack_; JID domain_; String user_; JID jid_; diff --git a/Swiften/Session/Session.cpp b/Swiften/Session/Session.cpp index 84354e5..5ee98e7 100644 --- a/Swiften/Session/Session.cpp +++ b/Swiften/Session/Session.cpp @@ -42,10 +42,10 @@ void Session::initializeStreamStack() { xmppLayer = boost::shared_ptr<XMPPLayer>( new XMPPLayer(payloadParserFactories, payloadSerializers)); xmppLayer->onStreamStart.connect( - boost::bind(&Session::handleStreamStart, this, _1)); - xmppLayer->onElement.connect(boost::bind(&Session::handleElement, this, _1)); + boost::bind(&Session::handleStreamStart, shared_from_this(), _1)); + xmppLayer->onElement.connect(boost::bind(&Session::handleElement, shared_from_this(), _1)); xmppLayer->onError.connect( - boost::bind(&Session::finishSession, this, XMLError)); + boost::bind(&Session::finishSession, shared_from_this(), XMLError)); xmppLayer->onDataRead.connect(boost::bind(boost::ref(onDataRead), _1)); xmppLayer->onWriteData.connect(boost::bind(boost::ref(onDataWritten), _1)); connection->onDisconnected.connect( |