@@ -80,6 +80,23 @@ namespace Shadowsocks.Controller | |||
SaveConfig(_config); | |||
} | |||
public bool AddServerBySSURL(string ssURL) | |||
{ | |||
try | |||
{ | |||
var server = new Server(ssURL); | |||
_config.configs.Add(server); | |||
_config.index = _config.configs.Count - 1; | |||
SaveConfig(_config); | |||
return true; | |||
} | |||
catch (Exception e) | |||
{ | |||
Logging.LogUsefulException(e); | |||
return false; | |||
} | |||
} | |||
public void ToggleEnable(bool enabled) | |||
{ | |||
_config.enabled = enabled; | |||
@@ -3,12 +3,13 @@ Enable=启用代理 | |||
Mode=代理模式 | |||
PAC=PAC 模式 | |||
Global=全局模式 | |||
Servers=服务器选择 | |||
Servers=服务器 | |||
Edit Servers...=编辑服务器... | |||
Start on Boot=开机启动 | |||
Share over LAN=在局域网共享代理 | |||
Edit PAC File...=编辑 PAC 文件... | |||
Show QRCode...=显示二维码... | |||
Scan QRCode from Screen...=扫描屏幕上的二维码... | |||
Show Logs...=显示日志... | |||
About...=关于... | |||
Quit=退出 | |||
@@ -94,15 +94,7 @@ namespace Shadowsocks.Model | |||
public static Server GetDefaultServer() | |||
{ | |||
return new Server() | |||
{ | |||
server = "", | |||
server_port = 8388, | |||
local_port = 1080, | |||
method = "aes-256-cfb", | |||
password = "", | |||
remarks = "" | |||
}; | |||
return new Server(); | |||
} | |||
private static void Assert(bool condition) | |||
@@ -5,6 +5,7 @@ using System.IO; | |||
using System.Diagnostics; | |||
using SimpleJson; | |||
using Shadowsocks.Controller; | |||
using System.Text.RegularExpressions; | |||
namespace Shadowsocks.Model | |||
{ | |||
@@ -33,5 +34,41 @@ namespace Shadowsocks.Model | |||
return remarks + " (" + server + ":" + server_port + ")"; | |||
} | |||
} | |||
public Server() | |||
{ | |||
this.server = ""; | |||
this.server_port = 8388; | |||
this.local_port = 1080; | |||
this.method = "aes-256-cfb"; | |||
this.password = ""; | |||
this.remarks = ""; | |||
} | |||
public Server(string ssURL) : this() | |||
{ | |||
string[] r1 = Regex.Split(ssURL, "ss://", RegexOptions.IgnoreCase); | |||
string base64 = r1[1].ToString(); | |||
byte[] bytes = null; | |||
for (var i = 0; i < 3; i++) { | |||
try | |||
{ | |||
bytes = System.Convert.FromBase64String(base64); | |||
} | |||
catch (FormatException) | |||
{ | |||
base64 += "="; | |||
} | |||
} | |||
if (bytes == null) | |||
{ | |||
throw new FormatException(); | |||
} | |||
string[] parts = Encoding.UTF8.GetString(bytes).Split(new char[2] { ':', '@' }); | |||
this.method = parts[0].ToString(); | |||
this.password = parts[1].ToString(); | |||
this.server = parts[2].ToString(); | |||
this.server_port = int.Parse(parts[3].ToString()); | |||
} | |||
} | |||
} |
@@ -135,7 +135,9 @@ namespace Shadowsocks.View | |||
}), | |||
this.ServersItem = CreateMenuGroup("Servers", new MenuItem[] { | |||
this.SeperatorItem = new MenuItem("-"), | |||
this.ConfigItem = CreateMenuItem("Edit Servers...", new EventHandler(this.Config_Click)) | |||
this.ConfigItem = CreateMenuItem("Edit Servers...", new EventHandler(this.Config_Click)), | |||
CreateMenuItem("Show QRCode...", new EventHandler(this.QRCodeItem_Click)), | |||
CreateMenuItem("Scan QRCode from Screen...", new EventHandler(this.ScanQRCodeItem_Click)) | |||
}), | |||
new MenuItem("-"), | |||
this.AutoStartupItem = CreateMenuItem("Start on Boot", new EventHandler(this.AutoStartupItem_Click)), | |||
@@ -143,8 +145,6 @@ namespace Shadowsocks.View | |||
CreateMenuItem("Edit PAC File...", new EventHandler(this.EditPACFileItem_Click)), | |||
CreateMenuItem("Update PAC from GFWList", new EventHandler(this.UpdatePACFromGFWListItem_Click)), | |||
new MenuItem("-"), | |||
CreateMenuItem("Show QRCode...", new EventHandler(this.QRCodeItem_Click)), | |||
CreateMenuItem("Scan QRCode...", new EventHandler(this.ScanQRCodeItem_Click)), | |||
CreateMenuItem("Show Logs...", new EventHandler(this.ShowLogItem_Click)), | |||
CreateMenuItem("About...", new EventHandler(this.AboutItem_Click)), | |||
new MenuItem("-"), | |||
@@ -228,8 +228,10 @@ namespace Shadowsocks.View | |||
private void UpdateServersMenu() | |||
{ | |||
var items = ServersItem.MenuItems; | |||
items.Clear(); | |||
while (items[0] != SeperatorItem) | |||
{ | |||
items.RemoveAt(0); | |||
} | |||
Configuration configuration = controller.GetConfiguration(); | |||
for (int i = 0; i < configuration.configs.Count; i++) | |||
@@ -238,10 +240,8 @@ namespace Shadowsocks.View | |||
MenuItem item = new MenuItem(server.FriendlyName()); | |||
item.Tag = i; | |||
item.Click += AServerItem_Click; | |||
items.Add(item); | |||
items.Add(i, item); | |||
} | |||
items.Add(SeperatorItem); | |||
items.Add(ConfigItem); | |||
if (configuration.index >= 0 && configuration.index < configuration.configs.Count) | |||
{ | |||
@@ -384,8 +384,14 @@ namespace Shadowsocks.View | |||
var result = reader.Decode(image); | |||
if (result != null) | |||
{ | |||
Console.WriteLine(result.Text); | |||
var success = controller.AddServerBySSURL(result.Text); | |||
if (success) | |||
{ | |||
ShowConfigForm(); | |||
return; | |||
} | |||
} | |||
MessageBox.Show(I18N.GetString("Failed to scan QRCode")); | |||
} | |||
} | |||