← Back to team overview

linuxdcpp-team team mailing list archive

[Branch ~dcplusplus-team/dcplusplus/trunk] Rev 2225: Automatic connection detection fixes

 

------------------------------------------------------------
revno: 2225
committer: eMTee <emtee11@xxxxxxxxx>
branch nick: dcplusplus
timestamp: Mon 2010-08-30 22:49:35 +0200
message:
  Automatic connection detection fixes
modified:
  dcpp/ConnectivityManager.cpp
  dcpp/ConnectivityManager.h
  dcpp/UPnPManager.cpp
  dcpp/UPnPManager.h
  win32/NetworkPage.cpp


--
lp:dcplusplus
https://code.launchpad.net/~dcplusplus-team/dcplusplus/trunk

Your team Dcplusplus-team is subscribed to branch lp:dcplusplus.
To unsubscribe from this branch go to https://code.launchpad.net/~dcplusplus-team/dcplusplus/trunk/+edit-subscription
=== modified file 'dcpp/ConnectivityManager.cpp'
--- dcpp/ConnectivityManager.cpp	2010-08-23 16:04:27 +0000
+++ dcpp/ConnectivityManager.cpp	2010-08-30 20:49:35 +0000
@@ -47,6 +47,11 @@
 }
 
 void ConnectivityManager::detectConnection() {
+	if (running)
+		return;
+
+	running = true;
+
 	if (UPnPManager::getInstance()->getOpened()) {
 		UPnPManager::getInstance()->close();
 	}
@@ -60,6 +65,7 @@
 		SettingsManager::getInstance()->set(SettingsManager::INCOMING_CONNECTIONS, SettingsManager::INCOMING_FIREWALL_PASSIVE);
 		log(str(F_("Unable to open %1% port(s). You must set up your connection manually") % e.getError()));
 		fire(ConnectivityManagerListener::Finished());
+		running = false;
 		return;
 	}
 
@@ -69,13 +75,16 @@
 		SettingsManager::getInstance()->set(SettingsManager::INCOMING_CONNECTIONS, SettingsManager::INCOMING_DIRECT);
 		log(_("Public IP address detected, selecting active mode with direct connection"));
 		fire(ConnectivityManagerListener::Finished());
+		running = false;
 		return;
 	}
 
 	SettingsManager::getInstance()->set(SettingsManager::INCOMING_CONNECTIONS, SettingsManager::INCOMING_FIREWALL_UPNP);
 	log(_("Local network with possible NAT detected, trying to map the ports using UPnP..."));
 	
-	UPnPManager::getInstance()->open();
+	if (!UPnPManager::getInstance()->open()) {
+		running = false;
+	}
 }
 
 void ConnectivityManager::setup(bool settingsChanged, int lastConnectionMode) {
@@ -103,6 +112,8 @@
 		}
 		fire(ConnectivityManagerListener::Finished());
 	}
+
+	running = false;
 }
 
 void ConnectivityManager::listen() {

=== modified file 'dcpp/ConnectivityManager.h'
--- dcpp/ConnectivityManager.h	2010-08-23 16:04:27 +0000
+++ dcpp/ConnectivityManager.h	2010-08-30 20:49:35 +0000
@@ -43,18 +43,22 @@
 	void detectConnection();
 	void log(const string& msg);
 	void setup(bool settingsChanged, int lastConnectionMode);
-	void mappingFinished(bool success);
+	bool isRunning() { return running; }
 
 private:
 	friend class Singleton<ConnectivityManager>;
+	friend class UPnPManager;
+	
 	ConnectivityManager();
 	virtual ~ConnectivityManager() throw() { }
 
+	void mappingFinished(bool success);
 	void startSocket();
 	void listen();
 	void disconnect();
 
 	bool autoDetected;
+	bool running;
 };
 
 } // namespace dcpp

=== modified file 'dcpp/UPnPManager.cpp'
--- dcpp/UPnPManager.cpp	2010-08-23 16:04:27 +0000
+++ dcpp/UPnPManager.cpp	2010-08-30 20:49:35 +0000
@@ -33,16 +33,23 @@
 	impls.push_back(impl);
 }
 
-void UPnPManager::open() {
+bool UPnPManager::open() {
 	if(opened)
-		return;
+		return false;
 
 	if(impls.empty()) {
 		log(_("No UPnP implementation available"));
-		return;
+		return false;
 	}
 
+	if(Thread::safeExchange(portMapping, 1) == 1) {
+		log(_("Another UPnP port mapping attempt is in progress..."));
+		return false;
+	} 
+
 	start();
+
+	return true;
 }
 
 void UPnPManager::close() {
@@ -101,6 +108,7 @@
 		ConnectivityManager::getInstance()->mappingFinished(false);
 	}
 
+	portMapping = 0;
 	return 0;
 }
 

=== modified file 'dcpp/UPnPManager.h'
--- dcpp/UPnPManager.h	2010-06-18 12:09:55 +0000
+++ dcpp/UPnPManager.h	2010-08-30 20:49:35 +0000
@@ -39,7 +39,7 @@
 	* first added impl will be tried first.
 	*/
 	void addImplementation(UPnP* impl);
-	void open();
+	bool open();
 	void close();
 
 	bool getOpened() const { return opened; }
@@ -51,6 +51,7 @@
 	Impls impls;
 
 	bool opened;
+	volatile long portMapping;
 
 	UPnPManager() : opened(false) { }
 	virtual ~UPnPManager() throw() { join(); }

=== modified file 'win32/NetworkPage.cpp'
--- win32/NetworkPage.cpp	2010-08-29 13:02:34 +0000
+++ win32/NetworkPage.cpp	2010-08-30 20:49:35 +0000
@@ -198,7 +198,7 @@
 		overrideIP->setChecked(false);
 	}
 	incoming->setEnabled(!enabled);
-	detectNow->setEnabled(enabled);
+	detectNow->setEnabled(enabled && !ConnectivityManager::getInstance()->isRunning());
 
 	//Save the checkbox state for ConnectivityManager
 	SettingsManager::getInstance()->set(SettingsManager::AUTO_DETECT_CONNECTION, enabled);