← Back to team overview

linuxdcpp-team team mailing list archive

[Branch ~dcplusplus-team/dcplusplus/trunk] Rev 2753: ignore proxy settings when auto-detecting connectivity settings

 

------------------------------------------------------------
revno: 2753
committer: poy <poy@xxxxxxxxxx>
branch nick: trunk
timestamp: Mon 2011-12-26 15:03:56 +0100
message:
  ignore proxy settings when auto-detecting connectivity settings
modified:
  dcpp/BufferedSocket.cpp
  dcpp/ConnectivityManager.cpp
  dcpp/ConnectivityManager.h
  dcpp/NmdcHub.cpp
  dcpp/Socket.cpp
  win32/MainWindow.cpp
  win32/ProxyPage.cpp
  win32/ProxyPage.h


--
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/BufferedSocket.cpp'
--- dcpp/BufferedSocket.cpp	2011-12-23 14:58:25 +0000
+++ dcpp/BufferedSocket.cpp	2011-12-26 14:03:56 +0000
@@ -114,7 +114,7 @@
 	setSocket(move(s));
 
 	Lock l(cs);
-	addTask(CONNECT, new ConnectInfo(aAddress, aPort, localPort, natRole, proxy && (SETTING(OUTGOING_CONNECTIONS) == SettingsManager::OUTGOING_SOCKS5)));
+	addTask(CONNECT, new ConnectInfo(aAddress, aPort, localPort, natRole, proxy && (CONNSETTING(OUTGOING_CONNECTIONS) == SettingsManager::OUTGOING_SOCKS5)));
 }
 
 #define LONG_TIMEOUT 30000

=== modified file 'dcpp/ConnectivityManager.cpp'
--- dcpp/ConnectivityManager.cpp	2011-12-04 22:17:45 +0000
+++ dcpp/ConnectivityManager.cpp	2011-12-26 14:03:56 +0000
@@ -81,7 +81,8 @@
 	// restore auto settings to their default value.
 	int settings[] = { SettingsManager::TCP_PORT, SettingsManager::TLS_PORT, SettingsManager::UDP_PORT,
 		SettingsManager::EXTERNAL_IP, SettingsManager::EXTERNAL_IP6, SettingsManager::NO_IP_OVERRIDE,
-		SettingsManager::BIND_ADDRESS, SettingsManager::BIND_ADDRESS6, SettingsManager::INCOMING_CONNECTIONS };
+		SettingsManager::BIND_ADDRESS, SettingsManager::BIND_ADDRESS6,
+		SettingsManager::INCOMING_CONNECTIONS, SettingsManager::OUTGOING_CONNECTIONS };
 	std::for_each(settings, settings + sizeof(settings) / sizeof(settings[0]), [this](int setting) {
 		if(setting >= SettingsManager::STR_FIRST && setting < SettingsManager::STR_LAST) {
 			autoSettings[setting] = SettingsManager::getInstance()->getDefault(static_cast<SettingsManager::StrSetting>(setting));

=== modified file 'dcpp/ConnectivityManager.h'
--- dcpp/ConnectivityManager.h	2011-12-04 22:17:45 +0000
+++ dcpp/ConnectivityManager.h	2011-12-26 14:03:56 +0000
@@ -19,9 +19,10 @@
 #ifndef DCPLUSPLUS_DCPP_CONNECTIVITY_MANAGER_H
 #define DCPLUSPLUS_DCPP_CONNECTIVITY_MANAGER_H
 
+#include "noexcept.h"
 #include "SettingsManager.h"
+#include "Singleton.h"
 #include "Speaker.h"
-#include "Singleton.h"
 
 #include <string>
 #include <unordered_map>

=== modified file 'dcpp/NmdcHub.cpp'
--- dcpp/NmdcHub.cpp	2011-12-22 22:14:45 +0000
+++ dcpp/NmdcHub.cpp	2011-12-26 14:03:56 +0000
@@ -21,18 +21,18 @@
 
 #include "ChatMessage.h"
 #include "ClientManager.h"
+#include "ConnectionManager.h"
+#include "ConnectivityManager.h"
+#include "CryptoManager.h"
+#include "format.h"
 #include "SearchManager.h"
 #include "ShareManager.h"
-#include "CryptoManager.h"
-#include "ConnectionManager.h"
+#include "Socket.h"
+#include "StringTokenizer.h"
 #include "ThrottleManager.h"
+#include "UserCommand.h"
 #include "version.h"
 
-#include "Socket.h"
-#include "UserCommand.h"
-#include "StringTokenizer.h"
-#include "format.h"
-
 namespace dcpp {
 
 NmdcHub::NmdcHub(const string& aHubURL) :
@@ -803,7 +803,7 @@
 		tmp2[i]++; tmp3[i]++; tmp4[i]++; tmp5[i]++;
 	}
 	char modeChar = '?';
-	if(SETTING(OUTGOING_CONNECTIONS) == SettingsManager::OUTGOING_SOCKS5)
+	if(CONNSETTING(OUTGOING_CONNECTIONS) == SettingsManager::OUTGOING_SOCKS5)
 		modeChar = '5';
 	else if(ClientManager::getInstance()->isActive())
 		modeChar = 'A';

=== modified file 'dcpp/Socket.cpp'
--- dcpp/Socket.cpp	2011-12-08 17:17:49 +0000
+++ dcpp/Socket.cpp	2011-12-26 14:03:56 +0000
@@ -19,6 +19,7 @@
 #include "stdinc.h"
 #include "Socket.h"
 
+#include "ConnectivityManager.h"
 #include "format.h"
 #include "SettingsManager.h"
 #include "TimerManager.h"
@@ -588,7 +589,7 @@
 	auto buf = (const uint8_t*)aBuffer;
 
 	int sent;
-	if(SETTING(OUTGOING_CONNECTIONS) == SettingsManager::OUTGOING_SOCKS5 && proxy) {
+	if(proxy && CONNSETTING(OUTGOING_CONNECTIONS) == SettingsManager::OUTGOING_SOCKS5) {
 		if(udpAddr.sa.sa_family == 0) {
 			throw SocketException(_("Failed to set up the socks server for UDP relay (check socks address and port)"));
 		}
@@ -821,7 +822,7 @@
 	memset(&udpAddr, 0, sizeof(udpAddr));
 	udpAddrLen = sizeof(udpAddr);
 
-	if(SETTING(OUTGOING_CONNECTIONS) == SettingsManager::OUTGOING_SOCKS5) {
+	if(CONNSETTING(OUTGOING_CONNECTIONS) == SettingsManager::OUTGOING_SOCKS5) {
 		try {
 			Socket s(TYPE_TCP);
 			s.setBlocking(false);

=== modified file 'win32/MainWindow.cpp'
--- win32/MainWindow.cpp	2011-12-25 18:48:06 +0000
+++ win32/MainWindow.cpp	2011-12-26 14:03:56 +0000
@@ -1078,6 +1078,7 @@
 	auto prevMapper = SETTING(MAPPER);
 	auto prevBind = SETTING(BIND_ADDRESS);
 	auto prevBind6 = SETTING(BIND_ADDRESS6);
+	auto prevProxy = CONNSETTING(OUTGOING_CONNECTIONS);
 
 	auto prevGeo = BOOLSETTING(GET_USER_COUNTRY);
 	auto prevGeoFormat = SETTING(COUNTRY_FORMAT);
@@ -1103,6 +1104,10 @@
 			showPortsError(e.getError());
 		}
 
+		if(CONNSETTING(OUTGOING_CONNECTIONS) != prevProxy) {
+			Socket::socksUpdated();
+		}
+
 		ClientManager::getInstance()->infoUpdated();
 
 		bool rebuildGeo = prevGeo && SETTING(COUNTRY_FORMAT) != prevGeoFormat;

=== modified file 'win32/ProxyPage.cpp'
--- win32/ProxyPage.cpp	2011-05-04 19:32:00 +0000
+++ win32/ProxyPage.cpp	2011-12-26 14:03:56 +0000
@@ -19,13 +19,14 @@
 #include "stdafx.h"
 #include "ProxyPage.h"
 
+#include <boost/range/algorithm/for_each.hpp>
+
 #include <dcpp/SettingsManager.h>
 #include <dcpp/Socket.h>
 
+#include <dwt/widgets/Label.h>
+#include <dwt/widgets/Grid.h>
 #include <dwt/widgets/RadioButton.h>
-#include <dwt/widgets/Grid.h>
-#include <dwt/widgets/Label.h>
-#include <dwt/util/win32/Version.h>
 
 #include "resource.h"
 #include "WinUtil.h"
@@ -36,7 +37,9 @@
 using dwt::RadioButton;
 
 ProxyPage::ProxyPage(dwt::Widget* parent) :
-PropPage(parent, 1, 1),
+PropPage(parent, 2, 1),
+autoGroup(0),
+autoDetect(0),
 directOut(0),
 socks5(0),
 socksSettings(0),
@@ -45,8 +48,16 @@
 	setHelpId(IDH_PROXYPAGE);
 
 	grid->column(0).mode = GridInfo::FILL;
-	grid->row(0).mode = GridInfo::FILL;
-	grid->row(0).align = GridInfo::STRETCH;
+	grid->row(1).mode = GridInfo::FILL;
+	grid->row(1).align = GridInfo::STRETCH;
+
+	{
+		autoGroup = grid->addChild(GroupBox::Seed(T_("Automatic connectivity setup")));
+		autoGroup->setHelpId(IDH_SETTINGS_CONNECTIVITY_AUTODETECT);
+
+		autoDetect = autoGroup->addChild(CheckBox::Seed(T_("Let DC++ determine the best connectivity settings")));
+		autoDetect->onClicked([this] { handleAutoClicked(); });
+	}
 
 	{
 		GridPtr cur = grid->addChild(GroupBox::Seed(T_("Proxy settings for outgoing connections")))->addChild(Grid::Seed(1, 2));
@@ -92,23 +103,22 @@
 		socksResolve->setHelpId(IDH_SETTINGS_PROXY_SOCKS_RESOLVE);
 	}
 
-	switch(SETTING(OUTGOING_CONNECTIONS)) {
-		case SettingsManager::OUTGOING_SOCKS5: socks5->setChecked(); break;
-		default: directOut->setChecked(); break;
-	}
+	read();
 
-	PropPage::read(items);
+	updateAuto();
 
 	fixControlsOut();
 	directOut->onClicked([this] { fixControlsOut(); });
 	socks5->onClicked([this] { fixControlsOut(); });
+
+	ConnectivityManager::getInstance()->addListener(this);
 }
 
 ProxyPage::~ProxyPage() {
+	ConnectivityManager::getInstance()->removeListener(this);
 }
 
-void ProxyPage::write()
-{
+void ProxyPage::write() {
 	tstring x = socksServer->getText();
 	tstring::size_type i;
 
@@ -118,17 +128,51 @@
 
 	PropPage::write(items);
 
-	int ct = SettingsManager::OUTGOING_DIRECT;
-
-	if(socks5->getChecked())
-		ct = SettingsManager::OUTGOING_SOCKS5;
-
-	if(SETTING(OUTGOING_CONNECTIONS) != ct) {
-		SettingsManager::getInstance()->set(SettingsManager::OUTGOING_CONNECTIONS, ct);
-		Socket::socksUpdated();
+	SettingsManager::getInstance()->set(SettingsManager::OUTGOING_CONNECTIONS,
+		socks5->getChecked() ? SettingsManager::OUTGOING_SOCKS5 : SettingsManager::OUTGOING_DIRECT);
+}
+
+void ProxyPage::read() {
+	switch(SETTING(OUTGOING_CONNECTIONS)) {
+	case SettingsManager::OUTGOING_SOCKS5: socks5->setChecked(); break;
+	default: directOut->setChecked(); break;
 	}
+
+	PropPage::read(items);
+}
+
+void ProxyPage::handleAutoClicked() {
+	// apply immediately so that ConnectivityManager updates.
+	SettingsManager::getInstance()->set(SettingsManager::AUTO_DETECT_CONNECTION, autoDetect->getChecked());
+	ConnectivityManager::getInstance()->fire(ConnectivityManagerListener::SettingChanged());
+}
+
+void ProxyPage::updateAuto() {
+	bool setting = BOOLSETTING(AUTO_DETECT_CONNECTION);
+	autoDetect->setChecked(setting);
+
+	auto controls = grid->getChildren<Control>();
+	boost::for_each(controls, [this, setting](Control* control) {
+		if(control != autoGroup) {
+			control->setEnabled(!setting);
+		}
+	});
 }
 
 void ProxyPage::fixControlsOut() {
-	socksSettings->setEnabled(socks5->getChecked());
+	socksSettings->setEnabled(socks5->getEnabled() && socks5->getChecked());
+}
+
+void ProxyPage::on(SettingChanged) noexcept {
+	callAsync([this] {
+		updateAuto();
+
+		// reload settings in case they have been changed (eg by the "Edit detected settings" feature).
+
+		directOut->setChecked(false);
+		socks5->setChecked(false);
+
+		read();
+		fixControlsOut();
+	});
 }

=== modified file 'win32/ProxyPage.h'
--- win32/ProxyPage.h	2011-03-15 19:52:17 +0000
+++ win32/ProxyPage.h	2011-12-26 14:03:56 +0000
@@ -19,9 +19,11 @@
 #ifndef DCPLUSPLUS_WIN32_PROXY_PAGE_H
 #define DCPLUSPLUS_WIN32_PROXY_PAGE_H
 
+#include <dcpp/ConnectivityManager.h>
+
 #include "PropPage.h"
 
-class ProxyPage : public PropPage
+class ProxyPage : public PropPage, private ConnectivityManagerListener
 {
 public:
 	ProxyPage(dwt::Widget* parent);
@@ -32,6 +34,9 @@
 private:
 	ItemList items;
 
+	GroupBoxPtr autoGroup;
+	CheckBoxPtr autoDetect;
+
 	RadioButtonPtr directOut;
 	RadioButtonPtr socks5;
 
@@ -39,7 +44,14 @@
 	TextBoxPtr socksServer;
 	CheckBoxPtr socksResolve;
 
+	void handleAutoClicked();
+
+	void read();
+	void updateAuto();
 	void fixControlsOut();
+
+	// ConnectivityManagerListener
+	void on(SettingChanged) noexcept;
 };
 
 #endif // !defined(DCPLUSPLUS_WIN32_PROXY_PAGE_H)