/* * Copyright (c) 2012-2013 Remko Tronçon * Licensed under the GNU General Public License v3. * See Documentation/Licenses/GPLv3.txt for more information. */ #pragma once #include #include #include #include #include namespace Swift { class NetworkEnvironment; class NATTraverser; class NATTraversalGetPublicIPRequest; class NATTraversalForwardPortRequest; class SOCKS5BytestreamRegistry; class ConnectionServerFactory; class ConnectionServer; class SOCKS5BytestreamServerInitializeRequest; class SOCKS5BytestreamServer; class SOCKS5BytestreamServerManager { public: SOCKS5BytestreamServerManager( SOCKS5BytestreamRegistry* bytestreamRegistry, ConnectionServerFactory* connectionServerFactory, NetworkEnvironment* networkEnvironment, NATTraverser* natTraverser); ~SOCKS5BytestreamServerManager(); boost::shared_ptr createInitializeRequest(); void stop(); std::vector getHostAddressPorts() const; std::vector getAssistedHostAddressPorts() const; SOCKS5BytestreamServer* getServer() const { return server; } private: bool isInitialized() const; void initialize(); void checkInitializeFinished(); void handleGetPublicIPResult(boost::optional address); void handleForwardPortResult(boost::optional mapping); boost::signal onInitialized; private: friend class SOCKS5BytestreamServerInitializeRequest; SOCKS5BytestreamRegistry* bytestreamRegistry; ConnectionServerFactory* connectionServerFactory; NetworkEnvironment* networkEnvironment; NATTraverser* natTraverser; enum { Start, Initializing, Initialized } state; SOCKS5BytestreamServer* server; boost::shared_ptr connectionServer; int connectionServerPort; boost::shared_ptr getPublicIPRequest; boost::shared_ptr forwardPortRequest; boost::optional publicAddress; boost::optional portMapping; }; }