diff options
Diffstat (limited to 'Swiften/FileTransfer')
4 files changed, 26 insertions, 19 deletions
diff --git a/Swiften/FileTransfer/ConnectivityManager.cpp b/Swiften/FileTransfer/ConnectivityManager.cpp index de5eccb..f4e7e96 100644 --- a/Swiften/FileTransfer/ConnectivityManager.cpp +++ b/Swiften/FileTransfer/ConnectivityManager.cpp @@ -23,39 +23,44 @@ ConnectivityManager::ConnectivityManager(NATTraverser* worker) : natTraversalWor } ConnectivityManager::~ConnectivityManager() { - std::set<int> leftOpenPorts = ports; - foreach(int port, leftOpenPorts) { - removeListeningPort(port); + std::set<int> leftOpenUDPPorts = udpPorts; + foreach(int port, leftOpenUDPPorts) { + removeListeningPort(port, NATPortMapping::UDP); + } + std::set<int> leftOpenTCPPorts = tcpPorts; + foreach(int port, leftOpenTCPPorts) { + removeListeningPort(port, NATPortMapping::TCP); } } -void ConnectivityManager::addListeningPort(int port) { - ports.insert(port); +void ConnectivityManager::addListeningPort(int port, NATPortMapping::Protocol protocol) { + udpPorts.insert(port); boost::shared_ptr<NATTraversalGetPublicIPRequest> getIPRequest = natTraversalWorker->createGetPublicIPRequest(); if (getIPRequest) { getIPRequest->onResult.connect(boost::bind(&ConnectivityManager::natTraversalGetPublicIPResult, this, _1)); getIPRequest->run(); } - boost::shared_ptr<NATTraversalForwardPortRequest> forwardPortRequest = natTraversalWorker->createForwardPortRequest(port, port); + boost::shared_ptr<NATTraversalForwardPortRequest> forwardPortRequest = natTraversalWorker->createForwardPortRequest(port, port, protocol); if (forwardPortRequest) { forwardPortRequest->onResult.connect(boost::bind(&ConnectivityManager::natTraversalForwardPortResult, this, _1)); forwardPortRequest->run(); } } -void ConnectivityManager::removeListeningPort(int port) { +void ConnectivityManager::removeListeningPort(int port, NATPortMapping::Protocol protocol) { SWIFT_LOG(debug) << "remove listening port " << port << std::endl; - ports.erase(port); - boost::shared_ptr<NATTraversalRemovePortForwardingRequest> removePortForwardingRequest = natTraversalWorker->createRemovePortForwardingRequest(port, port); + udpPorts.erase(port); + boost::shared_ptr<NATTraversalRemovePortForwardingRequest> removePortForwardingRequest = natTraversalWorker->createRemovePortForwardingRequest(port, port, protocol); if (removePortForwardingRequest) { removePortForwardingRequest->run(); } } -std::vector<HostAddressPort> ConnectivityManager::getHostAddressPorts() const { +std::vector<HostAddressPort> ConnectivityManager::getHostAddressPorts(NATPortMapping::Protocol protocol) const { PlatformNetworkEnvironment env; std::vector<HostAddressPort> results; + const std::set<int>& ports = (protocol == NATPortMapping::TCP ? udpPorts : tcpPorts); //std::vector<HostAddress> addresses; @@ -71,10 +76,11 @@ std::vector<HostAddressPort> ConnectivityManager::getHostAddressPorts() const { return results; } -std::vector<HostAddressPort> ConnectivityManager::getAssistedHostAddressPorts() const { +std::vector<HostAddressPort> ConnectivityManager::getAssistedHostAddressPorts(NATPortMapping::Protocol protocol) const { std::vector<HostAddressPort> results; if (publicAddress) { + const std::set<int>& ports = (protocol == NATPortMapping::TCP ? udpPorts : tcpPorts); foreach (int port, ports) { results.push_back(HostAddressPort(publicAddress.get(), port)); } diff --git a/Swiften/FileTransfer/ConnectivityManager.h b/Swiften/FileTransfer/ConnectivityManager.h index c094c02..c70cb5a 100644 --- a/Swiften/FileTransfer/ConnectivityManager.h +++ b/Swiften/FileTransfer/ConnectivityManager.h @@ -25,11 +25,11 @@ public: ConnectivityManager(NATTraverser*); ~ConnectivityManager(); public: - void addListeningPort(int port); - void removeListeningPort(int port); + void addListeningPort(int port, NATPortMapping::Protocol protocol); + void removeListeningPort(int port, NATPortMapping::Protocol protocol); - std::vector<HostAddressPort> getHostAddressPorts() const; - std::vector<HostAddressPort> getAssistedHostAddressPorts() const; + std::vector<HostAddressPort> getHostAddressPorts(NATPortMapping::Protocol protocol) const; + std::vector<HostAddressPort> getAssistedHostAddressPorts(NATPortMapping::Protocol protocol) const; private: void natTraversalGetPublicIPResult(boost::optional<HostAddress> address); @@ -38,7 +38,8 @@ private: private: NATTraverser* natTraversalWorker; - std::set<int> ports; + std::set<int> udpPorts; + std::set<int> tcpPorts; boost::optional<HostAddress> publicAddress; }; diff --git a/Swiften/FileTransfer/DefaultLocalJingleTransportCandidateGenerator.cpp b/Swiften/FileTransfer/DefaultLocalJingleTransportCandidateGenerator.cpp index 4b205cb..c3921bc 100644 --- a/Swiften/FileTransfer/DefaultLocalJingleTransportCandidateGenerator.cpp +++ b/Swiften/FileTransfer/DefaultLocalJingleTransportCandidateGenerator.cpp @@ -41,7 +41,7 @@ void DefaultLocalJingleTransportCandidateGenerator::generateLocalTransportCandid const unsigned long localPreference = 0; // get direct candidates - std::vector<HostAddressPort> directCandidates = connectivityManager->getHostAddressPorts(); + std::vector<HostAddressPort> directCandidates = connectivityManager->getHostAddressPorts(NATPortMapping::TCP); foreach(HostAddressPort addressPort, directCandidates) { JingleS5BTransportPayload::Candidate candidate; candidate.type = JingleS5BTransportPayload::Candidate::DirectType; @@ -53,7 +53,7 @@ void DefaultLocalJingleTransportCandidateGenerator::generateLocalTransportCandid } // get assissted candidates - std::vector<HostAddressPort> assisstedCandidates = connectivityManager->getAssistedHostAddressPorts(); + std::vector<HostAddressPort> assisstedCandidates = connectivityManager->getAssistedHostAddressPorts(NATPortMapping::TCP); foreach(HostAddressPort addressPort, assisstedCandidates) { JingleS5BTransportPayload::Candidate candidate; candidate.type = JingleS5BTransportPayload::Candidate::AssistedType; diff --git a/Swiften/FileTransfer/FileTransferManagerImpl.cpp b/Swiften/FileTransfer/FileTransferManagerImpl.cpp index 7fd8b07..22dc681 100644 --- a/Swiften/FileTransfer/FileTransferManagerImpl.cpp +++ b/Swiften/FileTransfer/FileTransferManagerImpl.cpp @@ -68,7 +68,7 @@ void FileTransferManagerImpl::startListeningOnPort(int port) { server->start(); bytestreamServer = new SOCKS5BytestreamServer(server, bytestreamRegistry); bytestreamServer->start(); - connectivityManager->addListeningPort(port); + connectivityManager->addListeningPort(port, NATPortMapping::TCP); s5bProxyFinder = new SOCKS5BytestreamProxyFinder(ownJID.getDomain(), iqRouter); s5bProxyFinder->onProxyFound.connect(boost::bind(&FileTransferManagerImpl::addS5BProxy, this, _1)); |