/* * Copyright (c) 2011-2018 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, unsigned short port, const boost::optional& serviceLookupPrefix, DomainNameResolver*, const std::vector&, TimerFactory*); ~ChainedConnector(); void setTimeoutMilliseconds(int milliseconds); void start(); void stop(); boost::signals2::signal, std::shared_ptr)> onConnectFinished; private: void finish(std::shared_ptr connection, std::shared_ptr); void tryNextConnectionFactory(); void handleConnectorFinished(std::shared_ptr, std::shared_ptr); private: std::string hostname; unsigned short port; boost::optional serviceLookupPrefix; DomainNameResolver* resolver; std::vector connectionFactories; TimerFactory* timerFactory; int timeoutMilliseconds; std::deque connectionFactoryQueue; std::shared_ptr currentConnector; std::shared_ptr lastError; }; }