diff --git a/shadowsocks-csharp/Controller/ShadowsocksController.cs b/shadowsocks-csharp/Controller/ShadowsocksController.cs
index 8d271372..734f27d1 100755
--- a/shadowsocks-csharp/Controller/ShadowsocksController.cs
+++ b/shadowsocks-csharp/Controller/ShadowsocksController.cs
@@ -192,6 +192,28 @@ namespace Shadowsocks.Controller
}
}
+ public void SavePACUrl(string pacUrl)
+ {
+ _config.pacUrl = pacUrl;
+ UpdateSystemProxy();
+ SaveConfig(_config);
+ if (ConfigChanged != null)
+ {
+ ConfigChanged(this, new EventArgs());
+ }
+ }
+
+ public void UseOnlinePAC(bool useOnlinePac)
+ {
+ _config.useOnlinePac = useOnlinePac;
+ UpdateSystemProxy();
+ SaveConfig(_config);
+ if (ConfigChanged != null)
+ {
+ ConfigChanged(this, new EventArgs());
+ }
+ }
+
protected void Reload()
{
// some logic in configuration updated the config when saving, we need to read it again
diff --git a/shadowsocks-csharp/Controller/SystemProxy.cs b/shadowsocks-csharp/Controller/SystemProxy.cs
index dfbc4bc1..5fe8a244 100755
--- a/shadowsocks-csharp/Controller/SystemProxy.cs
+++ b/shadowsocks-csharp/Controller/SystemProxy.cs
@@ -49,9 +49,14 @@ namespace Shadowsocks.Controller
}
else
{
+ string pacUrl;
+ if (config.useOnlinePac && !string.IsNullOrEmpty(config.pacUrl))
+ pacUrl = config.pacUrl;
+ else
+ pacUrl = "http://127.0.0.1:" + config.localPort.ToString() + "/pac?t=" + GetTimestamp(DateTime.Now);
registry.SetValue("ProxyEnable", 0);
registry.SetValue("ProxyServer", "");
- registry.SetValue("AutoConfigURL", "http://127.0.0.1:" + config.localPort.ToString() + "/pac?t=" + GetTimestamp(DateTime.Now));
+ registry.SetValue("AutoConfigURL", pacUrl);
}
}
else
diff --git a/shadowsocks-csharp/Data/cn.txt b/shadowsocks-csharp/Data/cn.txt
index 486ba27d..22a6478b 100644
--- a/shadowsocks-csharp/Data/cn.txt
+++ b/shadowsocks-csharp/Data/cn.txt
@@ -40,6 +40,13 @@ New server=未配置的服务器
QRCode=二维码
+# PAC Url Form
+
+Local PAC=使用本地 PAC
+Online PAC=使用在线 PAC
+Update Online PAC URL=更新在线 PAC 网址
+Please input PAC Url=请输入 PAC 网址
+
# Messages
Shadowsocks Error: {0}=Shadowsocks 错误: {0}
diff --git a/shadowsocks-csharp/Model/Configuration.cs b/shadowsocks-csharp/Model/Configuration.cs
index 56c91759..b78358e8 100755
--- a/shadowsocks-csharp/Model/Configuration.cs
+++ b/shadowsocks-csharp/Model/Configuration.cs
@@ -17,6 +17,8 @@ namespace Shadowsocks.Model
public bool shareOverLan;
public bool isDefault;
public int localPort;
+ public string pacUrl;
+ public bool useOnlinePac;
private static string CONFIG_FILE = "gui-config.json";
diff --git a/shadowsocks-csharp/View/MenuViewController.cs b/shadowsocks-csharp/View/MenuViewController.cs
index 0660f182..53284975 100755
--- a/shadowsocks-csharp/View/MenuViewController.cs
+++ b/shadowsocks-csharp/View/MenuViewController.cs
@@ -35,6 +35,8 @@ namespace Shadowsocks.View
private MenuItem ServersItem;
private MenuItem globalModeItem;
private MenuItem PACModeItem;
+ private MenuItem localPACItem;
+ private MenuItem onlinePACItem;
private ConfigForm configForm;
private string _urlToOpen;
@@ -151,10 +153,15 @@ namespace Shadowsocks.View
CreateMenuItem("Show QRCode...", new EventHandler(this.QRCodeItem_Click)),
CreateMenuItem("Scan QRCode from Screen...", new EventHandler(this.ScanQRCodeItem_Click))
}),
- new MenuItem("-"),
- CreateMenuItem("Edit PAC File...", new EventHandler(this.EditPACFileItem_Click)),
- CreateMenuItem("Update PAC from GFWList", new EventHandler(this.UpdatePACFromGFWListItem_Click)),
- CreateMenuItem("Edit User Rule for GFWList...", new EventHandler(this.EditUserRuleFileForGFWListItem_Click)),
+ CreateMenuGroup("PAC", new MenuItem[] {
+ this.localPACItem = CreateMenuItem("Local PAC", new EventHandler(this.LocalPACItem_Click)),
+ this.onlinePACItem = CreateMenuItem("Online PAC", new EventHandler(this.OnlinePACItem_Click)),
+ new MenuItem("-"),
+ CreateMenuItem("Edit PAC File...", new EventHandler(this.EditPACFileItem_Click)),
+ CreateMenuItem("Update PAC from GFWList", new EventHandler(this.UpdatePACFromGFWListItem_Click)),
+ CreateMenuItem("Edit User Rule for GFWList...", new EventHandler(this.EditUserRuleFileForGFWListItem_Click)),
+ CreateMenuItem("Update Online PAC URL", new EventHandler(this.UpdateOnlinePACURLItem_Click)),
+ }),
new MenuItem("-"),
this.AutoStartupItem = CreateMenuItem("Start on Boot", new EventHandler(this.AutoStartupItem_Click)),
this.ShareOverLANItem = CreateMenuItem("Allow Clients from LAN", new EventHandler(this.ShareOverLANItem_Click)),
@@ -240,6 +247,9 @@ namespace Shadowsocks.View
PACModeItem.Checked = !config.global;
ShareOverLANItem.Checked = config.shareOverLan;
AutoStartupItem.Checked = AutoStartup.Check();
+ onlinePACItem.Enabled = !string.IsNullOrEmpty(config.pacUrl);
+ onlinePACItem.Checked = onlinePACItem.Enabled && config.useOnlinePac;
+ localPACItem.Checked = !onlinePACItem.Checked;
}
private void UpdateServersMenu()
@@ -481,5 +491,38 @@ namespace Shadowsocks.View
MessageBox.Show(I18N.GetString("Failed to update registry"));
}
}
+
+ private void LocalPACItem_Click(object sender, EventArgs e)
+ {
+ if (!localPACItem.Checked)
+ {
+ localPACItem.Checked = true;
+ onlinePACItem.Checked = false;
+ controller.UseOnlinePAC(false);
+ }
+ }
+
+ private void OnlinePACItem_Click(object sender, EventArgs e)
+ {
+ if (!onlinePACItem.Checked)
+ {
+ localPACItem.Checked = false;
+ onlinePACItem.Checked = true;
+ controller.UseOnlinePAC(true);
+ }
+ }
+
+ private void UpdateOnlinePACURLItem_Click(object sender, EventArgs e)
+ {
+ string origPacUrl = controller.GetConfiguration().pacUrl;
+ string pacUrl = Microsoft.VisualBasic.Interaction.InputBox(
+ I18N.GetString("Please input PAC Url"),
+ I18N.GetString("Update Online PAC URL"),
+ origPacUrl, -1, -1);
+ if (!string.IsNullOrEmpty(pacUrl) && pacUrl != origPacUrl)
+ {
+ controller.SavePACUrl(pacUrl);
+ }
+ }
}
}
diff --git a/shadowsocks-csharp/shadowsocks-csharp.csproj b/shadowsocks-csharp/shadowsocks-csharp.csproj
index fd849f85..aa2c9000 100755
--- a/shadowsocks-csharp/shadowsocks-csharp.csproj
+++ b/shadowsocks-csharp/shadowsocks-csharp.csproj
@@ -63,6 +63,7 @@
app.manifest
+