/* * Copyright (c) 2011 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ #pragma once #include #include #include #include #include #include #include #include namespace Swift { class Connection; class Connector; class ConnectionFactory; class TimerFactory; class DomainNameResolver; class SWIFTEN_API ChainedConnector { public: ChainedConnector(const std::string& hostname, int port, const boost::optional& serviceLookupPrefix, DomainNameResolver*, const std::vector&, TimerFactory*); void setTimeoutMilliseconds(int milliseconds); void start(); void stop(); boost::signal, boost::shared_ptr)> onConnectFinished; private: void finish(boost::shared_ptr connection, boost::shared_ptr); void tryNextConnectionFactory(); void handleConnectorFinished(boost::shared_ptr, boost::shared_ptr); private: std::string hostname; int port; boost::optional serviceLookupPrefix; DomainNameResolver* resolver; std::vector connectionFactories; TimerFactory* timerFactory; int timeoutMilliseconds; std::deque connectionFactoryQueue; boost::shared_ptr currentConnector; boost::shared_ptr lastError; }; }