#pragma once #include #include #include #include "Swiften/Network/DomainNameServiceQuery.h" #include "Swiften/Network/Connection.h" #include "Swiften/Network/HostAddressPort.h" #include "Swiften/Base/String.h" #include "Swiften/Network/DomainNameResolveError.h" namespace Swift { class DomainNameAddressQuery; class DomainNameResolver; class ConnectionFactory; class Connector : public boost::bsignals::trackable { public: Connector(const String& hostname, DomainNameResolver*, ConnectionFactory*); void start(); boost::signal)> onConnectFinished; private: void handleServiceQueryResult(const std::vector& result); void handleAddressQueryResult(const HostAddress& address, boost::optional error); void queryAddress(const String& hostname); void tryNextHostname(); void tryConnect(const HostAddressPort& target); void handleConnectionConnectFinished(bool error); private: String hostname; DomainNameResolver* resolver; ConnectionFactory* connectionFactory; boost::shared_ptr serviceQuery; std::deque serviceQueryResults; boost::shared_ptr addressQuery; bool queriedAllHosts; boost::shared_ptr currentConnection; }; };