diff options
Diffstat (limited to 'Swiften/FileTransfer/SOCKS5BytestreamServerManager.cpp')
-rw-r--r-- | Swiften/FileTransfer/SOCKS5BytestreamServerManager.cpp | 99 |
1 files changed, 64 insertions, 35 deletions
diff --git a/Swiften/FileTransfer/SOCKS5BytestreamServerManager.cpp b/Swiften/FileTransfer/SOCKS5BytestreamServerManager.cpp index cf4ae84..43d3e46 100644 --- a/Swiften/FileTransfer/SOCKS5BytestreamServerManager.cpp +++ b/Swiften/FileTransfer/SOCKS5BytestreamServerManager.cpp @@ -15,7 +15,8 @@ #include <boost/smart_ptr/make_shared.hpp> #include <boost/bind.hpp> -#include <Swiften/FileTransfer/SOCKS5BytestreamServerInitializeRequest.h> +#include <Swiften/FileTransfer/SOCKS5BytestreamServerResourceUser.h> +#include <Swiften/FileTransfer/SOCKS5BytestreamServerPortForwardingUser.h> #include <Swiften/Base/foreach.h> #include <Swiften/Base/Log.h> #include <Swiften/FileTransfer/SOCKS5BytestreamServer.h> @@ -42,7 +43,8 @@ SOCKS5BytestreamServerManager::SOCKS5BytestreamServerManager( networkEnvironment(networkEnvironment), natTraverser(natTraverser), state(Start), - server(NULL) { + server(NULL), + attemptedPortMapping_(false) { } SOCKS5BytestreamServerManager::~SOCKS5BytestreamServerManager() { @@ -57,9 +59,28 @@ SOCKS5BytestreamServerManager::~SOCKS5BytestreamServerManager() { } } +boost::shared_ptr<SOCKS5BytestreamServerResourceUser> SOCKS5BytestreamServerManager::aquireResourceUser() { + boost::shared_ptr<SOCKS5BytestreamServerResourceUser> resourceUser; + if (s5bServerResourceUser_.expired()) { + resourceUser = boost::make_shared<SOCKS5BytestreamServerResourceUser>(this); + s5bServerResourceUser_ = resourceUser; + } + else { + resourceUser = s5bServerResourceUser_.lock(); + } + return resourceUser; +} -boost::shared_ptr<SOCKS5BytestreamServerInitializeRequest> SOCKS5BytestreamServerManager::createInitializeRequest() { - return boost::make_shared<SOCKS5BytestreamServerInitializeRequest>(this); +boost::shared_ptr<SOCKS5BytestreamServerPortForwardingUser> SOCKS5BytestreamServerManager::aquirePortForwardingUser() { + boost::shared_ptr<SOCKS5BytestreamServerPortForwardingUser> portForwardingUser; + if (s5bServerPortForwardingUser_.expired()) { + portForwardingUser = boost::make_shared<SOCKS5BytestreamServerPortForwardingUser>(this); + s5bServerPortForwardingUser_ = portForwardingUser; + } + else { + portForwardingUser = s5bServerPortForwardingUser_.lock(); + } + return portForwardingUser; } std::vector<HostAddressPort> SOCKS5BytestreamServerManager::getHostAddressPorts() const { @@ -121,24 +142,44 @@ void SOCKS5BytestreamServerManager::initialize() { assert(!server); server = new SOCKS5BytestreamServer(connectionServer, bytestreamRegistry); server->start(); + checkInitializeFinished(); + } +} - // Retrieve public addresses - assert(!getPublicIPRequest); - publicAddress = boost::optional<HostAddress>(); - if ((getPublicIPRequest = natTraverser->createGetPublicIPRequest())) { - getPublicIPRequest->onResult.connect( - boost::bind(&SOCKS5BytestreamServerManager::handleGetPublicIPResult, this, _1)); - getPublicIPRequest->start(); - } +bool SOCKS5BytestreamServerManager::isPortForwardingReady() const { + return attemptedPortMapping_ && !getPublicIPRequest && !forwardPortRequest; +} - // Forward ports - assert(!forwardPortRequest); - portMapping = boost::optional<NATPortMapping>(); - if ((forwardPortRequest = natTraverser->createForwardPortRequest(port, port))) { - forwardPortRequest->onResult.connect( - boost::bind(&SOCKS5BytestreamServerManager::handleForwardPortResult, this, _1)); - forwardPortRequest->start(); - } +void SOCKS5BytestreamServerManager::setupPortForwarding() { + assert(server); + attemptedPortMapping_ = true; + + // Retrieve public addresses + assert(!getPublicIPRequest); + publicAddress = boost::optional<HostAddress>(); + if ((getPublicIPRequest = natTraverser->createGetPublicIPRequest())) { + getPublicIPRequest->onResult.connect( + boost::bind(&SOCKS5BytestreamServerManager::handleGetPublicIPResult, this, _1)); + getPublicIPRequest->start(); + } + + // Forward ports + int port = server->getAddressPort().getPort(); + assert(!forwardPortRequest); + portMapping = boost::optional<NATPortMapping>(); + if ((forwardPortRequest = natTraverser->createForwardPortRequest(port, port))) { + forwardPortRequest->onResult.connect( + boost::bind(&SOCKS5BytestreamServerManager::handleForwardPortResult, this, _1)); + forwardPortRequest->start(); + } +} + +void SOCKS5BytestreamServerManager::removePortForwarding() { + // remove port forwards + if (portMapping) { + unforwardPortRequest = natTraverser->createRemovePortForwardingRequest(portMapping.get().getLocalPort(), portMapping.get().getPublicPort()); + unforwardPortRequest->onResult.connect(boost::bind(&SOCKS5BytestreamServerManager::handleUnforwardPortResult, this, _1)); + unforwardPortRequest->start(); } } @@ -156,13 +197,6 @@ void SOCKS5BytestreamServerManager::stop() { connectionServer.reset(); } - // remove port forwards - if (portMapping) { - unforwardPortRequest = natTraverser->createRemovePortForwardingRequest(portMapping.get().getLocalPort(), portMapping.get().getPublicPort()); - unforwardPortRequest->onResult.connect(boost::bind(&SOCKS5BytestreamServerManager::handleUnforwardPortResult, this, _1)); - unforwardPortRequest->start(); - } - state = Start; } @@ -178,8 +212,6 @@ void SOCKS5BytestreamServerManager::handleGetPublicIPResult(boost::optional<Host getPublicIPRequest->stop(); getPublicIPRequest.reset(); - - checkInitializeFinished(); } void SOCKS5BytestreamServerManager::handleForwardPortResult(boost::optional<NATPortMapping> mapping) { @@ -194,8 +226,6 @@ void SOCKS5BytestreamServerManager::handleForwardPortResult(boost::optional<NATP forwardPortRequest->stop(); forwardPortRequest.reset(); - - checkInitializeFinished(); } void SOCKS5BytestreamServerManager::handleUnforwardPortResult(boost::optional<bool> result) { @@ -205,13 +235,12 @@ void SOCKS5BytestreamServerManager::handleUnforwardPortResult(boost::optional<bo else { SWIFT_LOG(warning) << "Failed to remove port forwarding." << std::endl; } + attemptedPortMapping_ = false; unforwardPortRequest.reset(); } void SOCKS5BytestreamServerManager::checkInitializeFinished() { assert(state == Initializing); - if (!getPublicIPRequest && !forwardPortRequest) { - state = Initialized; - onInitialized(true); - } + state = Initialized; + onInitialized(true); } |