/* * Copyright (c) 2011 Kevin Smith * Licensed under the GNU General Public License v3. * See Documentation/Licenses/GPLv3.txt for more information. */ #pragma once #include #include #include #include namespace Swift { class HTTPConnectProxiedConnectionFactory; class TLSConnectionFactory; class BOSHConnectionPool : public boost::bsignals::trackable { public: BOSHConnectionPool(boost::shared_ptr factory, const std::string& to, long initialRID, const URL& boshHTTPConnectProxyURL, const SafeString& boshHTTPConnectProxyAuthID, const SafeString& boshHTTPConnectProxyAuthPassword); ~BOSHConnectionPool(); void write(const SafeByteArray& data); void writeFooter(); void close(); void restartStream(); boost::signal onSessionTerminated; boost::signal onSessionStarted; boost::signal onXMPPDataRead; boost::signal onBOSHDataRead; boost::signal onBOSHDataWritten; private: void handleDataRead(const SafeByteArray& data); void handleSessionStarted(const std::string& sid, size_t requests); void handleBOSHDataRead(const SafeByteArray& data); void handleBOSHDataWritten(const SafeByteArray& data); void handleSessionTerminated(BOSHError::ref condition); void handleConnectFinished(bool, BOSHConnection::ref connection); void handleConnectionDisconnected(const boost::optional& error, BOSHConnection::ref connection); void handleHTTPError(const std::string& errorCode); private: BOSHConnection::ref createConnection(); void destroyConnection(BOSHConnection::ref connection); void tryToSendQueuedData(); BOSHConnection::ref getSuitableConnection(); private: boost::shared_ptr connectionFactory; std::vector connections; std::string sid; unsigned long rid; std::vector dataQueue; bool pendingTerminate; std::string to; size_t requestLimit; int restartCount; bool pendingRestart; HTTPConnectProxiedConnectionFactory* connectProxyFactory; TLSConnectionFactory* tlsConnectionFactory; }; }