diff options
| -rw-r--r-- | Nim/main.cpp | 4 | ||||
| -rw-r--r-- | Swiften/LinkLocal/LinkLocalRoster.cpp | 9 | ||||
| -rw-r--r-- | Swiften/LinkLocal/LinkLocalRoster.h | 1 | ||||
| -rw-r--r-- | Swiften/LinkLocal/LinkLocalSession.cpp | 9 | ||||
| -rw-r--r-- | Swiften/LinkLocal/LinkLocalSession.h | 5 | ||||
| -rw-r--r-- | Swiften/LinkLocal/OutgoingLinkLocalSession.cpp | 47 | ||||
| -rw-r--r-- | Swiften/LinkLocal/OutgoingLinkLocalSession.h | 11 | 
7 files changed, 70 insertions, 16 deletions
| diff --git a/Nim/main.cpp b/Nim/main.cpp index 15c41c7..7ff4954 100644 --- a/Nim/main.cpp +++ b/Nim/main.cpp @@ -175,7 +175,9 @@ class Server {  					if (linkLocalRoster_->hasItem(toJID)) {  						boost::shared_ptr<OutgoingLinkLocalSession> outgoingSession(  								new OutgoingLinkLocalSession( -									selfJID_, toJID, linkLocalRoster_->getHostname(toJID), +									selfJID_, toJID,  +									linkLocalRoster_->getHostname(toJID), +									linkLocalRoster_->getPort(toJID),  									dnsSDService_,   									&payloadParserFactories_, &payloadSerializers_,  									&boostConnectionFactory_)); diff --git a/Swiften/LinkLocal/LinkLocalRoster.cpp b/Swiften/LinkLocal/LinkLocalRoster.cpp index 6809377..ca608a3 100644 --- a/Swiften/LinkLocal/LinkLocalRoster.cpp +++ b/Swiften/LinkLocal/LinkLocalRoster.cpp @@ -128,4 +128,13 @@ String LinkLocalRoster::getHostname(const JID& j) const {  	return "";  } +int LinkLocalRoster::getPort(const JID& j) const { +	for(ServiceMap::const_iterator i = services.begin(); i != services.end(); ++i) { +		if (getJIDForService(i->first) == j) { +			return i->second.port; +		} +	} +	return 0; +} +  } diff --git a/Swiften/LinkLocal/LinkLocalRoster.h b/Swiften/LinkLocal/LinkLocalRoster.h index bd774f4..c18d8fc 100644 --- a/Swiften/LinkLocal/LinkLocalRoster.h +++ b/Swiften/LinkLocal/LinkLocalRoster.h @@ -25,6 +25,7 @@ namespace Swift {  			bool hasItem(const JID&) const;  			String getHostname(const JID&) const; +			int getPort(const JID&) const;  		private:  			RosterItemPayload getRosterItem(const DNSSDService::Service& service, const DNSSDService::ResolveResult& info) const; diff --git a/Swiften/LinkLocal/LinkLocalSession.cpp b/Swiften/LinkLocal/LinkLocalSession.cpp index a308686..0f106ae 100644 --- a/Swiften/LinkLocal/LinkLocalSession.cpp +++ b/Swiften/LinkLocal/LinkLocalSession.cpp @@ -47,8 +47,13 @@ void LinkLocalSession::sendStanza(boost::shared_ptr<Stanza> stanza) {  	xmppLayer->writeElement(stanza);  } -void LinkLocalSession::handleDisconnected(const boost::optional<Connection::Error>&) { -	onSessionFinished(); +void LinkLocalSession::handleDisconnected(const boost::optional<Connection::Error>& connectionError) { +	if (connectionError) { +		onSessionFinished(boost::optional<Error>(ConnectionError)); +	} +	else { +		onSessionFinished(boost::optional<Error>()); +	}  }  void LinkLocalSession::setInitialized() { diff --git a/Swiften/LinkLocal/LinkLocalSession.h b/Swiften/LinkLocal/LinkLocalSession.h index 9a7ac13..6629a2a 100644 --- a/Swiften/LinkLocal/LinkLocalSession.h +++ b/Swiften/LinkLocal/LinkLocalSession.h @@ -2,6 +2,7 @@  #include <boost/shared_ptr.hpp>  #include <boost/signal.hpp> +#include <boost/optional.hpp>  #include <boost/enable_shared_from_this.hpp>  #include "Swiften/JID/JID.h" @@ -22,6 +23,8 @@ namespace Swift {  	class LinkLocalSession :   			public boost::enable_shared_from_this<LinkLocalSession> {  		public: +			enum Error { ConnectionError, UnknownError }; +  			LinkLocalSession(  					const JID& localJID,  					boost::shared_ptr<Connection> connection, @@ -39,7 +42,7 @@ namespace Swift {  			virtual void start() = 0;  			boost::signal<void (boost::shared_ptr<Stanza>)> onStanzaReceived; -			boost::signal<void ()> onSessionFinished; +			boost::signal<void (boost::optional<Error>)> onSessionFinished;  			boost::signal<void ()> onSessionStarted;  			boost::signal<void (const ByteArray&)> onDataWritten;  			boost::signal<void (const ByteArray&)> onDataRead; diff --git a/Swiften/LinkLocal/OutgoingLinkLocalSession.cpp b/Swiften/LinkLocal/OutgoingLinkLocalSession.cpp index 57f3154..f32bcdd 100644 --- a/Swiften/LinkLocal/OutgoingLinkLocalSession.cpp +++ b/Swiften/LinkLocal/OutgoingLinkLocalSession.cpp @@ -1,9 +1,14 @@ +// TODO: Send back errors if we can't make a connection +  #include "Swiften/LinkLocal/OutgoingLinkLocalSession.h"  #include <boost/bind.hpp>  #include "Swiften/Elements/ProtocolHeader.h"  #include "Swiften/Network/Connection.h" +#include "Swiften/Network/ConnectionFactory.h" +#include "Swiften/Network/HostAddress.h" +#include "Swiften/Network/HostAddressPort.h"  #include "Swiften/StreamStack/StreamStack.h"  #include "Swiften/LinkLocal/DNSSDService.h"  #include "Swiften/StreamStack/ConnectionLayer.h" @@ -18,6 +23,7 @@ OutgoingLinkLocalSession::OutgoingLinkLocalSession(  		const JID& localJID,  		const JID& remoteJID,  		const String& hostname, +		int port,  		boost::shared_ptr<DNSSDService> resolver,  		PayloadParserFactoryCollection* payloadParserFactories,   		PayloadSerializerCollection* payloadSerializers, @@ -30,34 +36,46 @@ OutgoingLinkLocalSession::OutgoingLinkLocalSession(  			resolving_(false),  			remoteJID_(remoteJID),  			hostname_(hostname), +			port_(port),  			resolver_(resolver),  			connectionFactory_(connectionFactory) {  }  void OutgoingLinkLocalSession::start() {  	resolving_ = true; -	//resolver_->onHostnameResolved.connect(boost::bind(&OutgoingLinkLocalSession::handleHostnameResolved, this, _1, _2)); +	resolver_->onHostnameResolved.connect(boost::bind(&OutgoingLinkLocalSession::handleHostnameResolved, boost::dynamic_pointer_cast<OutgoingLinkLocalSession>(shared_from_this()), _1, _2)); +	resolver_->resolveHostname(hostname_);  } -#if 0 -void OutgoingLinkLocalSession::handleHostnameResolved(const String& hostname, const HostAddress&) { +void OutgoingLinkLocalSession::handleHostnameResolved(const String& hostname, const boost::optional<HostAddress>& address) {  	if (resolving_) {  		if (hostname == hostname_) { -			boost::shared_ptr<Connection> connection = connectionFactory_->createConnection(); -			connection->onConnected.connect(boost::bind(&Session::handleConnected, shared_from_this())); -			connection->onDisconnected.connect(boost::bind(&Session::handleDisconnected, shared_from_this(), _1)); -			connection_->connect(jid_.getDomain());  			resolving_ = false; -			boost:: +			if (address) { +				boost::shared_ptr<Connection> connection = connectionFactory_->createConnection(); +				setConnection(connection); +				initializeStreamStack(); +				connection->onConnected.connect(boost::bind(&OutgoingLinkLocalSession::handleConnected, boost::dynamic_pointer_cast<OutgoingLinkLocalSession>(shared_from_this()))); +				connection->connect(HostAddressPort(*address, port_)); +			} +			else { +				onSessionFinished(boost::optional<Error>(UnknownError)); +			}  		}  	}  } -#endif -void OutgoingLinkLocalSession::handleStreamStart(const ProtocolHeader&) { +void OutgoingLinkLocalSession::handleConnected() {  	ProtocolHeader header;  	header.setFrom(getLocalJID());  	getXMPPLayer()->writeHeader(header); +} + +void OutgoingLinkLocalSession::handleStreamStart(const ProtocolHeader&) { +	foreach(const boost::shared_ptr<Stanza>& stanza, queuedStanzas_) { +		LinkLocalSession::sendStanza(stanza); +	} +	queuedStanzas_.clear();  	setInitialized();  } @@ -70,5 +88,14 @@ void OutgoingLinkLocalSession::handleElement(boost::shared_ptr<Element> element)  	}  } +void OutgoingLinkLocalSession::sendStanza(boost::shared_ptr<Stanza> stanza) { +	if (isInitialized()) { +		LinkLocalSession::sendStanza(stanza); +	} +	else { +		queuedStanzas_.push_back(stanza); +	} +} +  } diff --git a/Swiften/LinkLocal/OutgoingLinkLocalSession.h b/Swiften/LinkLocal/OutgoingLinkLocalSession.h index ae1e86b..abbec80 100644 --- a/Swiften/LinkLocal/OutgoingLinkLocalSession.h +++ b/Swiften/LinkLocal/OutgoingLinkLocalSession.h @@ -3,6 +3,7 @@  #include <boost/shared_ptr.hpp>  #include <boost/signal.hpp>  #include <boost/enable_shared_from_this.hpp> +#include <vector>  #include "Swiften/LinkLocal/LinkLocalSession.h"  #include "Swiften/JID/JID.h" @@ -16,12 +17,13 @@ namespace Swift {  	class PayloadSerializerCollection;  	class DNSSDService; -	class OutgoingLinkLocalSession : public LinkLocalSession, public boost::enable_shared_from_this<OutgoingLinkLocalSession> { +	class OutgoingLinkLocalSession : public LinkLocalSession {  		public:  			OutgoingLinkLocalSession(  					const JID& localJID,  					const JID& remoteJID,  					const String& hostname, +					int port,  					boost::shared_ptr<DNSSDService> resolver,  					PayloadParserFactoryCollection* payloadParserFactories,   					PayloadSerializerCollection* payloadSerializers, @@ -33,16 +35,21 @@ namespace Swift {  			void start(); +			void sendStanza(boost::shared_ptr<Stanza> stanza); +  		private:  			void handleElement(boost::shared_ptr<Element>);  			void handleStreamStart(const ProtocolHeader&); -			//void handleHostnameResolved(const String& hostname, const HostAddress& address); +			void handleHostnameResolved(const String& hostname, const boost::optional<HostAddress>& address); +			void handleConnected();  		private:  			bool resolving_;  			JID remoteJID_;  			String hostname_; +			int port_;  			boost::shared_ptr<DNSSDService> resolver_; +			std::vector<boost::shared_ptr<Stanza> > queuedStanzas_;  			ConnectionFactory* connectionFactory_;  	};  } | 
 Swift
 Swift