diff options
| -rw-r--r-- | Nim/main.cpp | 52 | ||||
| -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 | 
9 files changed, 63 insertions, 115 deletions
| diff --git a/Nim/main.cpp b/Nim/main.cpp index 7ff4954..127878c 100644 --- a/Nim/main.cpp +++ b/Nim/main.cpp @@ -15,7 +15,7 @@  #include "Swiften/EventLoop/MainEventLoop.h"  #include "Swiften/EventLoop/SimpleEventLoop.h"  #include "Swiften/EventLoop/EventOwner.h" -#include "Swiften/Elements/Stanza.h" +#include "Swiften/Elements/Element.h"  #include "Swiften/LinkLocal/LinkLocalServiceInfo.h"  #include "Swiften/LinkLocal/LinkLocalRoster.h"  #include "Swiften/LinkLocal/LinkLocalSession.h" @@ -69,9 +69,9 @@ class Server {  				c->disconnect();  			}  			serverFromClientSession_ = boost::shared_ptr<ServerFromClientSession>(new ServerFromClientSession(idGenerator_.generateID(), c, &payloadParserFactories_, &payloadSerializers_, &userRegistry_)); -			serverFromClientSession_->onStanzaReceived.connect(boost::bind(&Server::handleStanzaReceived, this, _1, serverFromClientSession_)); +			serverFromClientSession_->onElementReceived.connect(boost::bind(&Server::handleElementReceived, this, _1, serverFromClientSession_));  			serverFromClientSession_->onSessionFinished.connect(boost::bind(&Server::handleSessionFinished, this, serverFromClientSession_)); -			serverFromClientSession_->start(); +			serverFromClientSession_->startSession();  		}  		void handleNewLinkLocalConnection(boost::shared_ptr<Connection> connection) { @@ -99,13 +99,15 @@ class Server {  			linkLocalSessions_.erase(std::remove(linkLocalSessions_.begin(), linkLocalSessions_.end(), session), linkLocalSessions_.end());  		} -		void handleLinkLocalStanzaReceived(boost::shared_ptr<Stanza> stanza, boost::shared_ptr<LinkLocalSession> session) { -			JID fromJID = session->getRemoteJID(); -			if (!linkLocalRoster_->hasItem(fromJID)) { -				return; // TODO: Queue +		void handleLinkLocalElementReceived(boost::shared_ptr<Element> element, boost::shared_ptr<LinkLocalSession> session) { +			if (boost::shared_ptr<Stanza> stanza = boost::dynamic_pointer_cast<Stanza>(element)) { +				JID fromJID = session->getRemoteJID(); +				if (!linkLocalRoster_->hasItem(fromJID)) { +					return; // TODO: Queue +				} +				stanza->setFrom(fromJID); +				serverFromClientSession_->sendElement(stanza);  			} -			stanza->setFrom(fromJID); -			serverFromClientSession_->sendStanza(stanza);  		}  		void unregisterService() { @@ -115,7 +117,12 @@ class Server {  			}  		} -		void handleStanzaReceived(boost::shared_ptr<Stanza> stanza, boost::shared_ptr<ServerFromClientSession> session) { +		void handleElementReceived(boost::shared_ptr<Element> element, boost::shared_ptr<ServerFromClientSession> session) { +			boost::shared_ptr<Stanza> stanza = boost::dynamic_pointer_cast<Stanza>(element); +			if (!stanza) { +				return; +			} +  			stanza->setFrom(session->getJID());  			if (!stanza->getTo().isValid()) {  				stanza->setTo(JID(session->getDomain())); @@ -139,28 +146,28 @@ class Server {  				if (boost::shared_ptr<IQ> iq = boost::dynamic_pointer_cast<IQ>(stanza)) {  					if (iq->getPayload<RosterPayload>()) {  						if (iq->getType() == IQ::Get) { -							session->sendStanza(IQ::createResult(iq->getFrom(), iq->getID(), linkLocalRoster_->getRoster())); +							session->sendElement(IQ::createResult(iq->getFrom(), iq->getID(), linkLocalRoster_->getRoster()));  							rosterRequested_ = true;  							foreach(const boost::shared_ptr<Presence> presence, linkLocalRoster_->getAllPresence()) { -								session->sendStanza(presence); +								session->sendElement(presence);  							}  						}  						else { -							session->sendStanza(IQ::createError(iq->getFrom(), iq->getID(), Error::Forbidden, Error::Cancel)); +							session->sendElement(IQ::createError(iq->getFrom(), iq->getID(), Error::Forbidden, Error::Cancel));  						}  					}  					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)); +							session->sendElement(IQ::createResult(iq->getFrom(), iq->getID(), vcard));  						}  						else { -							session->sendStanza(IQ::createError(iq->getFrom(), iq->getID(), Error::Forbidden, Error::Cancel)); +							session->sendElement(IQ::createError(iq->getFrom(), iq->getID(), Error::Forbidden, Error::Cancel));  						}  					}  					else { -						session->sendStanza(IQ::createError(iq->getFrom(), iq->getID(), Error::FeatureNotImplemented, Error::Cancel)); +						session->sendElement(IQ::createError(iq->getFrom(), iq->getID(), Error::FeatureNotImplemented, Error::Cancel));  					}  				}  			} @@ -169,7 +176,7 @@ class Server {  				boost::shared_ptr<LinkLocalSession> outgoingSession =   						getLinkLocalSessionForJID(toJID);  				if (outgoingSession) { -					outgoingSession->sendStanza(stanza); +					outgoingSession->sendElement(stanza);  				}  				else {  					if (linkLocalRoster_->hasItem(toJID)) { @@ -182,10 +189,10 @@ class Server {  									&payloadParserFactories_, &payloadSerializers_,  									&boostConnectionFactory_));  						registerLinkLocalSession(outgoingSession); -						outgoingSession->sendStanza(stanza); +						outgoingSession->sendElement(stanza);  					}  					else { -						session->sendStanza(IQ::createError( +						session->sendElement(IQ::createError(  								stanza->getFrom(), stanza->getID(),   								Error::RecipientUnavailable, Error::Wait));  					} @@ -195,7 +202,7 @@ class Server {  		void registerLinkLocalSession(boost::shared_ptr<LinkLocalSession> session) {  			session->onSessionFinished.connect(boost::bind(&Server::handleLinkLocalSessionFinished, this, session)); -			session->onStanzaReceived.connect(boost::bind(&Server::handleLinkLocalStanzaReceived, this, _1, session)); +			session->onElementReceived.connect(boost::bind(&Server::handleLinkLocalElementReceived, this, _1, session));  			linkLocalSessions_.push_back(session);  			session->start();  		} @@ -213,13 +220,13 @@ class Server {  			if (rosterRequested_) {  				boost::shared_ptr<IQ> iq = IQ::createRequest(IQ::Set, serverFromClientSession_->getJID(), idGenerator_.generateID(), roster);  				iq->setFrom(serverFromClientSession_->getJID().toBare()); -				serverFromClientSession_->sendStanza(iq); +				serverFromClientSession_->sendElement(iq);  			}  		}  		void handlePresenceChanged(boost::shared_ptr<Presence> presence) {  			if (rosterRequested_) { -				serverFromClientSession_->sendStanza(presence); +				serverFromClientSession_->sendElement(presence);  			}  		} @@ -260,7 +267,6 @@ class Server {  		boost::shared_ptr<ServerFromClientSession> serverFromClientSession_;  		boost::shared_ptr<BoostConnectionServer> serverFromNetworkConnectionServer_;  		std::vector< boost::shared_ptr<LinkLocalSession> > linkLocalSessions_; -		std::vector< boost::shared_ptr<Stanza> > queuedOutgoingStanzas_;  		FullPayloadParserFactoryCollection payloadParserFactories_;  		FullPayloadSerializerCollection payloadSerializers_;  		bool dnsSDServiceRegistered_; 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( | 
 Swift
 Swift