summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTobias Markmann <tm@ayena.de>2011-10-03 10:31:32 (GMT)
committerRemko Tronçon <git@el-tramo.be>2011-10-03 18:13:14 (GMT)
commitdc3ddc0d08cc48681e5d16866ef4fcc10819b2a1 (patch)
treef056d0f3aa88723c18052b117a9dcb9bd60aebd4
parente88d52fa2de97547a5da506a94617110433dadb8 (diff)
downloadswift-contrib-dc3ddc0d08cc48681e5d16866ef4fcc10819b2a1.zip
swift-contrib-dc3ddc0d08cc48681e5d16866ef4fcc10819b2a1.tar.bz2
Turn NATPortMapping into a class.
License: This patch is BSD-licensed, see http://www.opensource.org/licenses/bsd-license.php
-rw-r--r--Swiften/Network/MiniUPnPInterface.cpp16
-rw-r--r--Swiften/Network/NATPMPInterface.cpp10
-rw-r--r--Swiften/Network/NATPortMapping.h20
3 files changed, 31 insertions, 15 deletions
diff --git a/Swiften/Network/MiniUPnPInterface.cpp b/Swiften/Network/MiniUPnPInterface.cpp
index f6e3b5d..c9f682f 100644
--- a/Swiften/Network/MiniUPnPInterface.cpp
+++ b/Swiften/Network/MiniUPnPInterface.cpp
@@ -51,36 +51,36 @@ boost::optional<HostAddress> MiniUPnPInterface::getPublicIP() {
}
boost::optional<NATPortMapping> MiniUPnPInterface::addPortForward(int actualLocalPort, int actualPublicPort) {
if (!isValid) {
return boost::optional<NATPortMapping>();
}
NATPortMapping mapping(actualLocalPort, actualPublicPort, NATPortMapping::TCP);
- std::string publicPort = boost::lexical_cast<std::string>(mapping.publicPort);
- std::string localPort = boost::lexical_cast<std::string>(mapping.localPort);
- std::string leaseSeconds = boost::lexical_cast<std::string>(mapping.leaseInSeconds);
+ std::string publicPort = boost::lexical_cast<std::string>(mapping.getPublicPort());
+ std::string localPort = boost::lexical_cast<std::string>(mapping.getLocalPort());
+ std::string leaseSeconds = boost::lexical_cast<std::string>(mapping.getLeaseInSeconds());
- int ret = UPNP_AddPortMapping(urls.controlURL, data.first.servicetype, publicPort.c_str(), localPort.c_str(), localAddress.c_str(), 0, mapping.protocol == NATPortMapping::TCP ? "TCP" : "UDP", 0, leaseSeconds.c_str());
+ int ret = UPNP_AddPortMapping(urls.controlURL, data.first.servicetype, publicPort.c_str(), localPort.c_str(), localAddress.c_str(), 0, mapping.getPublicPort() == NATPortMapping::TCP ? "TCP" : "UDP", 0, leaseSeconds.c_str());
if (ret == UPNPCOMMAND_SUCCESS) {
return mapping;
}
else {
return boost::optional<NATPortMapping>();
}
}
bool MiniUPnPInterface::removePortForward(const NATPortMapping& mapping) {
if (!isValid) {
return false;
}
- std::string publicPort = boost::lexical_cast<std::string>(mapping.publicPort);
- std::string localPort = boost::lexical_cast<std::string>(mapping.localPort);
- std::string leaseSeconds = boost::lexical_cast<std::string>(mapping.leaseInSeconds);
+ std::string publicPort = boost::lexical_cast<std::string>(mapping.getPublicPort());
+ std::string localPort = boost::lexical_cast<std::string>(mapping.getLocalPort());
+ std::string leaseSeconds = boost::lexical_cast<std::string>(mapping.getLeaseInSeconds());
- int ret = UPNP_DeletePortMapping(urls.controlURL, data.first.servicetype, publicPort.c_str(), mapping.protocol == NATPortMapping::TCP ? "TCP" : "UDP", 0);
+ int ret = UPNP_DeletePortMapping(urls.controlURL, data.first.servicetype, publicPort.c_str(), mapping.getProtocol() == NATPortMapping::TCP ? "TCP" : "UDP", 0);
return ret == UPNPCOMMAND_SUCCESS;
}
}
diff --git a/Swiften/Network/NATPMPInterface.cpp b/Swiften/Network/NATPMPInterface.cpp
index 298240a..36553ed 100644
--- a/Swiften/Network/NATPMPInterface.cpp
+++ b/Swiften/Network/NATPMPInterface.cpp
@@ -47,49 +47,47 @@ boost::optional<HostAddress> NATPMPInterface::getPublicIP() {
}
else {
SWIFT_LOG(debug) << "Inavlid NAT-PMP response." << std::endl;
return boost::optional<HostAddress>();
}
}
boost::optional<NATPortMapping> NATPMPInterface::addPortForward(int localPort, int publicPort) {
NATPortMapping mapping(localPort, publicPort, NATPortMapping::TCP);
- if (sendnewportmappingrequest(&natpmp, mapping.protocol == NATPortMapping::TCP ? NATPMP_PROTOCOL_TCP : NATPMP_PROTOCOL_UDP, mapping.leaseInSeconds, mapping.publicPort, mapping.localPort) < 0) {
+ if (sendnewportmappingrequest(&natpmp, mapping.getProtocol() == NATPortMapping::TCP ? NATPMP_PROTOCOL_TCP : NATPMP_PROTOCOL_UDP, mapping.getLeaseInSeconds(), mapping.getPublicPort(), mapping.getLocalPort()) < 0) {
SWIFT_LOG(debug) << "Failed to send NAT-PMP port forwarding request!" << std::endl;
return boost::optional<NATPortMapping>();
}
int r = 0;
natpmpresp_t response;
do {
fd_set fds;
struct timeval timeout;
FD_ZERO(&fds);
FD_SET(natpmp.s, &fds);
getnatpmprequesttimeout(&natpmp, &timeout);
select(FD_SETSIZE, &fds, NULL, NULL, &timeout);
r = readnatpmpresponseorretry(&natpmp, &response);
} while(r == NATPMP_TRYAGAIN);
if (r == 0) {
- mapping.localPort = response.pnu.newportmapping.privateport;
- mapping.publicPort = response.pnu.newportmapping.mappedpublicport;
- mapping.leaseInSeconds = response.pnu.newportmapping.lifetime;
- return mapping;
+ NATPortMapping result(response.pnu.newportmapping.privateport, response.pnu.newportmapping.mappedpublicport, NATPortMapping::TCP, response.pnu.newportmapping.lifetime);
+ return result;
}
else {
SWIFT_LOG(debug) << "Invalid NAT-PMP response." << std::endl;
return boost::optional<NATPortMapping>();
}
}
bool NATPMPInterface::removePortForward(const NATPortMapping& mapping) {
- if (sendnewportmappingrequest(&natpmp, mapping.protocol == NATPortMapping::TCP ? NATPMP_PROTOCOL_TCP : NATPMP_PROTOCOL_UDP, 0, 0, mapping.localPort) < 0) {
+ if (sendnewportmappingrequest(&natpmp, mapping.getProtocol() == NATPortMapping::TCP ? NATPMP_PROTOCOL_TCP : NATPMP_PROTOCOL_UDP, 0, 0, mapping.getLocalPort()) < 0) {
SWIFT_LOG(debug) << "Failed to send NAT-PMP remove forwarding request!" << std::endl;
return false;
}
int r = 0;
natpmpresp_t response;
do {
fd_set fds;
struct timeval timeout;
diff --git a/Swiften/Network/NATPortMapping.h b/Swiften/Network/NATPortMapping.h
index 82f62bb..db14500 100644
--- a/Swiften/Network/NATPortMapping.h
+++ b/Swiften/Network/NATPortMapping.h
@@ -3,25 +3,43 @@
* Licensed under the simplified BSD license.
* See Documentation/Licenses/BSD-simplified.txt for more information.
*/
#pragma once
#include <Swiften/Network/HostAddress.h>
namespace Swift {
- struct NATPortMapping {
+ class NATPortMapping {
+ public:
enum Protocol {
TCP,
UDP,
};
NATPortMapping(int localPort, int publicPort, Protocol protocol = TCP, int leaseInSeconds = 60 * 60 * 24) : publicPort(publicPort), localPort(localPort), protocol(protocol), leaseInSeconds(leaseInSeconds) {
}
+ int getPublicPort() const {
+ return publicPort;
+ }
+
+ int getLocalPort() const {
+ return localPort;
+ }
+
+ Protocol getProtocol() const {
+ return protocol;
+ }
+
+ int getLeaseInSeconds() const {
+ return leaseInSeconds;
+ }
+
+ private:
int publicPort;
int localPort;
Protocol protocol;
int leaseInSeconds;
};
}