From dc3ddc0d08cc48681e5d16866ef4fcc10819b2a1 Mon Sep 17 00:00:00 2001
From: Tobias Markmann <tm@ayena.de>
Date: Mon, 3 Oct 2011 12:31:32 +0200
Subject: Turn NATPortMapping into a class.

License: This patch is BSD-licensed, see http://www.opensource.org/licenses/bsd-license.php

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
@@ -57,11 +57,11 @@ boost::optional<NATPortMapping> MiniUPnPInterface::addPortForward(int actualLoca
 
 	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;
 	}
@@ -75,11 +75,11 @@ bool MiniUPnPInterface::removePortForward(const NATPortMapping& mapping) {
 		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
@@ -53,7 +53,7 @@ boost::optional<HostAddress> NATPMPInterface::getPublicIP() {
 
 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>();
 	}
@@ -71,10 +71,8 @@ boost::optional<NATPortMapping> NATPMPInterface::addPortForward(int localPort, i
 	} 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;
@@ -83,7 +81,7 @@ boost::optional<NATPortMapping> NATPMPInterface::addPortForward(int localPort, i
 }
 
 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;
 	}
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
@@ -9,7 +9,8 @@
 #include <Swiften/Network/HostAddress.h>
 
 namespace Swift {
-	struct NATPortMapping {
+	class NATPortMapping {
+	public:
 		enum Protocol {
 			TCP,
 			UDP,
@@ -19,6 +20,23 @@ namespace Swift {
 
 		}
 
+		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;
-- 
cgit v0.10.2-6-g49f6