linuxdcpp-team team mailing list archive
-
linuxdcpp-team team
-
Mailing list archive
-
Message #01832
[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);