From cfab98e99d3ef427c6cd8a17b2c33a11da9ac8f1 Mon Sep 17 00:00:00 2001 From: wzxjohn Date: Sun, 9 Nov 2014 15:57:49 +0800 Subject: [PATCH] add about form Version now change with AssemblyVersion add open on lan option Add an option to choose whether to open on lan or not. add log switch and modify detector Add an option to select whether to open log or not. Add a detector to check whether the server setting changed. small bug Fix a small bug add modify detector Don't reload server if config not change. add about form Add an about form instead of just open link. add log switch and modify detector Add an option to select whether to open log or not. Add a detector to check whether the server setting changed. small bug Fix a small bug add modify detector Don't reload server if config not change. --- shadowsocks-csharp.sln | 2 +- shadowsocks-csharp/Controller/Local.cs | 36 +++---- shadowsocks-csharp/Controller/PACServer.cs | 1 + shadowsocks-csharp/Controller/PolipoRunner.cs | 5 +- .../Controller/ShadowsocksController.cs | 76 ++++++++++++- shadowsocks-csharp/Model/Configuration.cs | 3 + shadowsocks-csharp/Program.cs | 7 +- shadowsocks-csharp/View/AboutForm.Designer.cs | 105 ++++++++++++++++++ shadowsocks-csharp/View/AboutForm.cs | 33 ++++++ shadowsocks-csharp/View/AboutForm.resx | 120 +++++++++++++++++++++ shadowsocks-csharp/View/ConfigForm.Designer.cs | 53 +++++++++ shadowsocks-csharp/View/ConfigForm.cs | 111 +++++++++++-------- shadowsocks-csharp/View/QRCodeForm.cs | 14 ++- shadowsocks-csharp/shadowsocks-csharp.csproj | 13 ++- 14 files changed, 507 insertions(+), 72 deletions(-) create mode 100644 shadowsocks-csharp/View/AboutForm.Designer.cs create mode 100644 shadowsocks-csharp/View/AboutForm.cs create mode 100644 shadowsocks-csharp/View/AboutForm.resx diff --git a/shadowsocks-csharp.sln b/shadowsocks-csharp.sln index 83869ae2..120baca6 100755 --- a/shadowsocks-csharp.sln +++ b/shadowsocks-csharp.sln @@ -1,6 +1,6 @@  Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio Express 2012 for Windows Desktop +# Visual Studio 2012 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "shadowsocks-csharp", "shadowsocks-csharp\shadowsocks-csharp.csproj", "{8C02D2F7-7CDB-4D55-9F25-CD03EF4AA062}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "test", "test\test.csproj", "{45913187-0685-4903-B250-DCEF0479CD86}" diff --git a/shadowsocks-csharp/Controller/Local.cs b/shadowsocks-csharp/Controller/Local.cs index 7bd0fb98..a16276d0 100755 --- a/shadowsocks-csharp/Controller/Local.cs +++ b/shadowsocks-csharp/Controller/Local.cs @@ -10,9 +10,9 @@ namespace Shadowsocks.Controller { class Local - { + { private Server _server; - private bool _shareOverLAN; + private bool _shareOverLAN; //private Encryptor encryptor; Socket _listener; public Local(Configuration config) @@ -26,7 +26,7 @@ namespace Shadowsocks.Controller { try { - // Create a TCP/IP socket. + // Create a TCP/IP socket. _listener = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); _listener.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true); IPEndPoint localEndPoint = null; @@ -36,7 +36,7 @@ namespace Shadowsocks.Controller } else { - localEndPoint = new IPEndPoint(IPAddress.Loopback, _server.local_port); + localEndPoint = new IPEndPoint(IPAddress.Loopback, _server.local_port); } // Bind the socket to the local endpoint and listen for incoming connections. @@ -221,7 +221,7 @@ namespace Shadowsocks.Controller // reject socks 4 response = new byte[]{ 0, 91 }; } - connection.BeginSend(response, 0, response.Length, 0, new AsyncCallback(handshakeSendCallback), null); + connection.BeginSend(response, 0, response.Length, 0, new AsyncCallback(HandshakeSendCallback), null); } else { @@ -235,7 +235,7 @@ namespace Shadowsocks.Controller } } - private void handshakeSendCallback(IAsyncResult ar) + private void HandshakeSendCallback(IAsyncResult ar) { try { @@ -267,7 +267,7 @@ namespace Shadowsocks.Controller if (bytesRead > 0) { byte[] response = { 5, 0, 0, 1, 0, 0, 0, 0, 0, 0 }; - connection.BeginSend(response, 0, response.Length, 0, new AsyncCallback(startPipe), null); + connection.BeginSend(response, 0, response.Length, 0, new AsyncCallback(StartPipe), null); } else { @@ -282,15 +282,15 @@ namespace Shadowsocks.Controller } - private void startPipe(IAsyncResult ar) + private void StartPipe(IAsyncResult ar) { try { connection.EndReceive(ar); remote.BeginReceive(remoteRecvBuffer, 0, RecvSize, 0, - new AsyncCallback(pipeRemoteReceiveCallback), null); + new AsyncCallback(PipeRemoteReceiveCallback), null); connection.BeginReceive(connetionRecvBuffer, 0, RecvSize, 0, - new AsyncCallback(pipeConnectionReceiveCallback), null); + new AsyncCallback(PipeConnectionReceiveCallback), null); } catch (Exception e) { @@ -299,7 +299,7 @@ namespace Shadowsocks.Controller } } - private void pipeRemoteReceiveCallback(IAsyncResult ar) + private void PipeRemoteReceiveCallback(IAsyncResult ar) { try @@ -310,7 +310,7 @@ namespace Shadowsocks.Controller { int bytesToSend; encryptor.Decrypt(remoteRecvBuffer, bytesRead, remoteSendBuffer, out bytesToSend); - connection.BeginSend(remoteSendBuffer, 0, bytesToSend, 0, new AsyncCallback(pipeConnectionSendCallback), null); + connection.BeginSend(remoteSendBuffer, 0, bytesToSend, 0, new AsyncCallback(PipeConnectionSendCallback), null); } else { @@ -325,7 +325,7 @@ namespace Shadowsocks.Controller } } - private void pipeConnectionReceiveCallback(IAsyncResult ar) + private void PipeConnectionReceiveCallback(IAsyncResult ar) { try @@ -336,7 +336,7 @@ namespace Shadowsocks.Controller { int bytesToSend; encryptor.Encrypt(connetionRecvBuffer, bytesRead, connetionSendBuffer, out bytesToSend); - remote.BeginSend(connetionSendBuffer, 0, bytesToSend, 0, new AsyncCallback(pipeRemoteSendCallback), null); + remote.BeginSend(connetionSendBuffer, 0, bytesToSend, 0, new AsyncCallback(PipeRemoteSendCallback), null); } else { @@ -350,13 +350,13 @@ namespace Shadowsocks.Controller } } - private void pipeRemoteSendCallback(IAsyncResult ar) + private void PipeRemoteSendCallback(IAsyncResult ar) { try { remote.EndSend(ar); connection.BeginReceive(this.connetionRecvBuffer, 0, RecvSize, 0, - new AsyncCallback(pipeConnectionReceiveCallback), null); + new AsyncCallback(PipeConnectionReceiveCallback), null); } catch (Exception e) { @@ -365,13 +365,13 @@ namespace Shadowsocks.Controller } } - private void pipeConnectionSendCallback(IAsyncResult ar) + private void PipeConnectionSendCallback(IAsyncResult ar) { try { connection.EndSend(ar); remote.BeginReceive(this.remoteRecvBuffer, 0, RecvSize, 0, - new AsyncCallback(pipeRemoteReceiveCallback), null); + new AsyncCallback(PipeRemoteReceiveCallback), null); } catch (Exception e) { diff --git a/shadowsocks-csharp/Controller/PACServer.cs b/shadowsocks-csharp/Controller/PACServer.cs index 422089dc..9ad74abf 100755 --- a/shadowsocks-csharp/Controller/PACServer.cs +++ b/shadowsocks-csharp/Controller/PACServer.cs @@ -15,6 +15,7 @@ namespace Shadowsocks.Controller { private static int PORT = 8090; private static string PAC_FILE = "pac.txt"; + public bool openOnLan; Socket _listener; FileSystemWatcher watcher; diff --git a/shadowsocks-csharp/Controller/PolipoRunner.cs b/shadowsocks-csharp/Controller/PolipoRunner.cs index de1c3c3a..a82333f5 100755 --- a/shadowsocks-csharp/Controller/PolipoRunner.cs +++ b/shadowsocks-csharp/Controller/PolipoRunner.cs @@ -12,6 +12,7 @@ namespace Shadowsocks.Controller class PolipoRunner { private Process _process; + public bool openOnLan; public void Start(Configuration configuration) { @@ -31,10 +32,10 @@ namespace Shadowsocks.Controller Console.WriteLine(e.ToString()); } } - string temppath = Path.GetTempPath(); + string temppath = Path.GetTempPath(); string polipoConfig = Resources.polipo_config; polipoConfig = polipoConfig.Replace("__SOCKS_PORT__", server.local_port.ToString()); - polipoConfig = polipoConfig.Replace("__POLIPO_BIND_IP__", configuration.shareOverLan ? "0.0.0.0" : "127.0.0.1"); + polipoConfig = polipoConfig.Replace("__POLIPO_BIND_IP__", configuration.shareOverLan ? "0.0.0.0" : "127.0.0.1"); FileManager.ByteArrayToFile(temppath + "/polipo.conf", System.Text.Encoding.UTF8.GetBytes(polipoConfig)); FileManager.UncompressFile(temppath + "/ss_polipo.exe", Resources.polipo_exe); diff --git a/shadowsocks-csharp/Controller/ShadowsocksController.cs b/shadowsocks-csharp/Controller/ShadowsocksController.cs index e6e80d05..3335a712 100755 --- a/shadowsocks-csharp/Controller/ShadowsocksController.cs +++ b/shadowsocks-csharp/Controller/ShadowsocksController.cs @@ -1,4 +1,5 @@ -using Shadowsocks.Model; +using System.IO; +using Shadowsocks.Model; using System; using System.Collections.Generic; using System.Text; @@ -34,6 +35,21 @@ namespace Shadowsocks.Controller public ShadowsocksController() { _config = Configuration.Load(); + if (_config.enableLog) + { + SetLog(); + } +<<<<<<< HEAD +======= + + openOnLan = _config.openOnLan; + polipoRunner = new PolipoRunner(); + polipoRunner.openOnLan = openOnLan; + polipoRunner.Start(_config.GetCurrentServer()); + local = new Local(_config.GetCurrentServer()); + local.openOnLan = openOnLan; +>>>>>>> 835265b... add log switch and modify detector + polipoRunner = new PolipoRunner(); polipoRunner.Start(_config); local = new Local(_config); @@ -52,6 +68,39 @@ namespace Shadowsocks.Controller UpdateSystemProxy(); } +<<<<<<< HEAD +======= + public void SaveConfig(Configuration newConfig) + { + Configuration.Save(newConfig); + if (newConfig.noChange && newConfig.openOnLan == openOnLan) + { + return; + } + // some logic in configuration updated the config when saving, we need to read it again + _config = Configuration.Load(); + openOnLan = _config.openOnLan; + + local.Stop(); + polipoRunner.Stop(); + polipoRunner.openOnLan = openOnLan; + polipoRunner.Start(_config.GetCurrentServer()); + + local = new Local(_config.GetCurrentServer()); + local.openOnLan = openOnLan; + local.Start(); + + pacServer.Stop(); + pacServer.openOnLan = openOnLan; + pacServer.Start(); + + if (ConfigChanged != null) + { + ConfigChanged(this, new EventArgs()); + } + } + +>>>>>>> 835265b... add log switch and modify detector public Server GetCurrentServer() { return _config.GetCurrentServer(); @@ -63,9 +112,10 @@ namespace Shadowsocks.Controller return Configuration.Load(); } - public void SaveServers(List servers) + public void SaveServers(List servers, bool noChange) { _config.configs = servers; + _config.noChange = noChange; SaveConfig(_config); } @@ -83,6 +133,7 @@ namespace Shadowsocks.Controller public void ToggleShareOverLAN(bool enabled) { _config.shareOverLan = enabled; + _config.noChange = false; SaveConfig(_config); if (ShareOverLANStatusChanged != null) { @@ -132,6 +183,10 @@ namespace Shadowsocks.Controller protected void SaveConfig(Configuration newConfig) { Configuration.Save(newConfig); + if (newConfig.noChange) + { + return; + } // some logic in configuration updated the config when saving, we need to read it again _config = Configuration.Load(); @@ -173,5 +228,22 @@ namespace Shadowsocks.Controller UpdateSystemProxy(); } + private void SetLog() + { + try + { + FileStream fs = new FileStream("shadowsocks.log", FileMode.Append); + TextWriter tmp = Console.Out; + StreamWriter sw = new StreamWriter(fs); + sw.AutoFlush = true; + Console.SetOut(sw); + Console.SetError(sw); + } + catch (IOException e) + { + Console.WriteLine(e.ToString()); + } + } + } } diff --git a/shadowsocks-csharp/Model/Configuration.cs b/shadowsocks-csharp/Model/Configuration.cs index 65b0a3b6..4869e2c8 100755 --- a/shadowsocks-csharp/Model/Configuration.cs +++ b/shadowsocks-csharp/Model/Configuration.cs @@ -17,6 +17,9 @@ namespace Shadowsocks.Model public bool enabled; public bool shareOverLan; public bool isDefault; + public bool openOnLan; + public bool enableLog; + public bool noChange; private static string CONFIG_FILE = "gui-config.json"; diff --git a/shadowsocks-csharp/Program.cs b/shadowsocks-csharp/Program.cs index a42a97ae..22d049f1 100755 --- a/shadowsocks-csharp/Program.cs +++ b/shadowsocks-csharp/Program.cs @@ -46,15 +46,18 @@ namespace Shadowsocks Console.WriteLine(e.ToString()); } LoadLibrary(dllPath); +<<<<<<< HEAD + + Logging.OpenLogFile(); +======= - Logging.OpenLogFile(); +>>>>>>> 835265b... add log switch and modify detector Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); ShadowsocksController controller = new ShadowsocksController(); // TODO run without a main form to save RAM Application.Run(new ConfigForm(controller)); - } } } diff --git a/shadowsocks-csharp/View/AboutForm.Designer.cs b/shadowsocks-csharp/View/AboutForm.Designer.cs new file mode 100644 index 00000000..11568121 --- /dev/null +++ b/shadowsocks-csharp/View/AboutForm.Designer.cs @@ -0,0 +1,105 @@ +namespace Shadowsocks.View +{ + partial class AboutForm + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.titleLabel = new System.Windows.Forms.Label(); + this.versionLabel = new System.Windows.Forms.Label(); + this.authorLabel = new System.Windows.Forms.Label(); + this.githubLabel = new System.Windows.Forms.LinkLabel(); + this.SuspendLayout(); + // + // titleLabel + // + this.titleLabel.Font = new System.Drawing.Font("Microsoft Sans Serif", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.titleLabel.Location = new System.Drawing.Point(12, 40); + this.titleLabel.Name = "titleLabel"; + this.titleLabel.Size = new System.Drawing.Size(260, 23); + this.titleLabel.TabIndex = 0; + this.titleLabel.Text = "Shadowsocks for Windows"; + this.titleLabel.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + // + // versionLabel + // + this.versionLabel.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.versionLabel.Location = new System.Drawing.Point(12, 84); + this.versionLabel.Name = "versionLabel"; + this.versionLabel.Size = new System.Drawing.Size(260, 23); + this.versionLabel.TabIndex = 0; + this.versionLabel.Text = "Version: 2.0.4.0"; + this.versionLabel.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + // + // authorLabel + // + this.authorLabel.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.authorLabel.Location = new System.Drawing.Point(12, 139); + this.authorLabel.Name = "authorLabel"; + this.authorLabel.Size = new System.Drawing.Size(260, 23); + this.authorLabel.TabIndex = 0; + this.authorLabel.Text = "By: clowwindy"; + this.authorLabel.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + // + // githubLabel + // + this.githubLabel.Font = new System.Drawing.Font("Microsoft Sans Serif", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.githubLabel.Location = new System.Drawing.Point(13, 201); + this.githubLabel.Name = "githubLabel"; + this.githubLabel.Size = new System.Drawing.Size(259, 23); + this.githubLabel.TabIndex = 1; + this.githubLabel.TabStop = true; + this.githubLabel.Text = "GitHub"; + this.githubLabel.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + this.githubLabel.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.githubLabel_LinkClicked); + // + // AboutForm + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(284, 261); + this.Controls.Add(this.githubLabel); + this.Controls.Add(this.authorLabel); + this.Controls.Add(this.versionLabel); + this.Controls.Add(this.titleLabel); + this.MaximizeBox = false; + this.MinimizeBox = false; + this.Name = "AboutForm"; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; + this.Text = "About"; + this.Load += new System.EventHandler(this.AboutForm_Load); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.Label titleLabel; + private System.Windows.Forms.Label versionLabel; + private System.Windows.Forms.Label authorLabel; + private System.Windows.Forms.LinkLabel githubLabel; + } +} \ No newline at end of file diff --git a/shadowsocks-csharp/View/AboutForm.cs b/shadowsocks-csharp/View/AboutForm.cs new file mode 100644 index 00000000..d94c44f8 --- /dev/null +++ b/shadowsocks-csharp/View/AboutForm.cs @@ -0,0 +1,33 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Diagnostics; +using System.Drawing; +using System.Reflection; +using System.Text; +using System.Windows.Forms; + +namespace Shadowsocks.View +{ + public partial class AboutForm : Form + { + public AboutForm() + { + InitializeComponent(); + } + + private void githubLabel_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e) + { + string url = "https://github.com/clowwindy/shadowsocks-csharp"; + System.Diagnostics.Process.Start(url); + } + private void AboutForm_Load(object sender, EventArgs e) + { + Assembly assembly = Assembly.GetExecutingAssembly(); + FileVersionInfo fvi = FileVersionInfo.GetVersionInfo(assembly.Location); + string version = fvi.FileVersion; + versionLabel.Text = "Version: " + version; + } + } +} diff --git a/shadowsocks-csharp/View/AboutForm.resx b/shadowsocks-csharp/View/AboutForm.resx new file mode 100644 index 00000000..7080a7d1 --- /dev/null +++ b/shadowsocks-csharp/View/AboutForm.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/shadowsocks-csharp/View/ConfigForm.Designer.cs b/shadowsocks-csharp/View/ConfigForm.Designer.cs index cf874286..2183f9ab 100755 --- a/shadowsocks-csharp/View/ConfigForm.Designer.cs +++ b/shadowsocks-csharp/View/ConfigForm.Designer.cs @@ -66,6 +66,14 @@ this.AddButton = new System.Windows.Forms.Button(); this.ServerGroupBox = new System.Windows.Forms.GroupBox(); this.ServersListBox = new System.Windows.Forms.ListBox(); +<<<<<<< HEAD +<<<<<<< HEAD +======= + this.openOnLanBox = new System.Windows.Forms.CheckBox(); + this.enableLogBox = new System.Windows.Forms.CheckBox(); +>>>>>>> 835265b... add log switch and modify detector +======= +>>>>>>> 7d539d3... add modify detector this.tableLayoutPanel1.SuspendLayout(); this.panel1.SuspendLayout(); this.panel3.SuspendLayout(); @@ -418,6 +426,33 @@ this.ServersListBox.TabIndex = 5; this.ServersListBox.SelectedIndexChanged += new System.EventHandler(this.ServersListBox_SelectedIndexChanged); // +<<<<<<< HEAD +<<<<<<< HEAD +======= + // openOnLanBox + // + this.openOnLanBox.AutoSize = true; + this.openOnLanBox.Location = new System.Drawing.Point(16, 260); + this.openOnLanBox.Name = "openOnLanBox"; + this.openOnLanBox.Size = new System.Drawing.Size(90, 17); + this.openOnLanBox.TabIndex = 7; + this.openOnLanBox.Text = "Open On Lan"; + this.openOnLanBox.UseVisualStyleBackColor = true; + // + // enableLogBox + // + this.enableLogBox.AutoSize = true; + this.enableLogBox.Location = new System.Drawing.Point(112, 260); + this.enableLogBox.Name = "enableLogBox"; + this.enableLogBox.Size = new System.Drawing.Size(80, 17); + this.enableLogBox.TabIndex = 7; + this.enableLogBox.Text = "Enable Log"; + this.enableLogBox.UseVisualStyleBackColor = true; + this.enableLogBox.CheckedChanged += new System.EventHandler(this.enableLogBox_CheckedChanged); + // +>>>>>>> 835265b... add log switch and modify detector +======= +>>>>>>> 7d539d3... add modify detector // ConfigForm // this.AcceptButton = this.OKButton; @@ -426,6 +461,14 @@ this.AutoSize = true; this.CancelButton = this.MyCancelButton; this.ClientSize = new System.Drawing.Size(489, 286); +<<<<<<< HEAD +<<<<<<< HEAD +======= + this.Controls.Add(this.enableLogBox); + this.Controls.Add(this.openOnLanBox); +>>>>>>> 835265b... add log switch and modify detector +======= +>>>>>>> 7d539d3... add modify detector this.Controls.Add(this.ServersListBox); this.Controls.Add(this.ServerGroupBox); this.Controls.Add(this.panel1); @@ -487,8 +530,18 @@ private System.Windows.Forms.TextBox RemarksTextBox; private System.Windows.Forms.Label label6; private System.Windows.Forms.MenuItem QRCodeItem; +<<<<<<< HEAD +<<<<<<< HEAD private System.Windows.Forms.MenuItem ShowLogItem; private System.Windows.Forms.MenuItem ShareOverLANItem; +======= + private System.Windows.Forms.CheckBox openOnLanBox; + private System.Windows.Forms.CheckBox enableLogBox; +>>>>>>> 835265b... add log switch and modify detector +======= + private System.Windows.Forms.MenuItem ShowLogItem; + private System.Windows.Forms.MenuItem ShareOverLANItem; +>>>>>>> 7d539d3... add modify detector } } diff --git a/shadowsocks-csharp/View/ConfigForm.cs b/shadowsocks-csharp/View/ConfigForm.cs index 8bd980b8..96e5c723 100755 --- a/shadowsocks-csharp/View/ConfigForm.cs +++ b/shadowsocks-csharp/View/ConfigForm.cs @@ -12,13 +12,15 @@ namespace Shadowsocks.View { public partial class ConfigForm : Form { - private ShadowsocksController controller; - private UpdateChecker updateChecker; + private ShadowsocksController controller; + private UpdateChecker updateChecker; + private AboutForm aboutForm; // this is a copy of configuration that we are working on - private Configuration modifiedConfiguration; - private int oldSelectedIndex = -1; - private bool isFirstRun; + private Configuration _modifiedConfiguration; + private Configuration _oldConfiguration; + private int _oldSelectedIndex = -1; + private bool _isFirstRun; public ConfigForm(ShadowsocksController controller) { @@ -82,11 +84,11 @@ namespace Shadowsocks.View IPTextBox.Focus(); } - private bool SaveOldSelectedServer() + private bool SaveOldSelectedServer(object sender) { try { - if (oldSelectedIndex == -1 || oldSelectedIndex >= modifiedConfiguration.configs.Count) + if (_oldSelectedIndex == -1 || _oldSelectedIndex >= _modifiedConfiguration.configs.Count) { return true; } @@ -100,7 +102,27 @@ namespace Shadowsocks.View remarks = RemarksTextBox.Text }; Configuration.CheckServer(server); - modifiedConfiguration.configs[oldSelectedIndex] = server; + + _modifiedConfiguration.configs[_oldSelectedIndex] = server; + if (sender.Equals(OKButton)) + { + if (_oldConfiguration.configs[_oldConfiguration.index].server == + _modifiedConfiguration.configs[_oldSelectedIndex].server && + _oldConfiguration.configs[_oldConfiguration.index].server_port == + _modifiedConfiguration.configs[_oldSelectedIndex].server_port && + _oldConfiguration.configs[_oldConfiguration.index].password == + _modifiedConfiguration.configs[_oldSelectedIndex].password && + _oldConfiguration.configs[_oldConfiguration.index].local_port == + _modifiedConfiguration.configs[_oldSelectedIndex].local_port) + { + _modifiedConfiguration.noChange = true; + } + else + { + _modifiedConfiguration.noChange = false; + _oldConfiguration = _modifiedConfiguration; + } + } return true; } catch (FormatException) @@ -116,15 +138,15 @@ namespace Shadowsocks.View private void LoadSelectedServer() { - if (ServersListBox.SelectedIndex >= 0 && ServersListBox.SelectedIndex < modifiedConfiguration.configs.Count) + if (ServersListBox.SelectedIndex >= 0 && ServersListBox.SelectedIndex < _modifiedConfiguration.configs.Count) { - Server server = modifiedConfiguration.configs[ServersListBox.SelectedIndex]; + Server server = _modifiedConfiguration.configs[ServersListBox.SelectedIndex]; IPTextBox.Text = server.server; ServerPortTextBox.Text = server.server_port.ToString(); PasswordTextBox.Text = server.password; ProxyPortTextBox.Text = server.local_port.ToString(); - EncryptionSelect.Text = server.method == null ? "aes-256-cfb" : server.method; + EncryptionSelect.Text = server.method ?? "aes-256-cfb"; RemarksTextBox.Text = server.remarks; ServerGroupBox.Visible = true; //IPTextBox.Focus(); @@ -138,7 +160,7 @@ namespace Shadowsocks.View private void LoadConfiguration(Configuration configuration) { ServersListBox.Items.Clear(); - foreach (Server server in modifiedConfiguration.configs) + foreach (Server server in _modifiedConfiguration.configs) { ServersListBox.Items.Add(string.IsNullOrEmpty(server.server) ? "New server" : string.IsNullOrEmpty(server.remarks)? server.server + ":" + server.server_port : server.server + ":" + server.server_port + " (" + server.remarks + ")"); } @@ -146,15 +168,16 @@ namespace Shadowsocks.View private void LoadCurrentConfiguration() { - modifiedConfiguration = controller.GetConfiguration(); - LoadConfiguration(modifiedConfiguration); - oldSelectedIndex = modifiedConfiguration.index; - ServersListBox.SelectedIndex = modifiedConfiguration.index; + _modifiedConfiguration = controller.GetConfiguration(); + _oldConfiguration = _modifiedConfiguration; + LoadConfiguration(_modifiedConfiguration); + _oldSelectedIndex = _modifiedConfiguration.index; + ServersListBox.SelectedIndex = _modifiedConfiguration.index; LoadSelectedServer(); UpdateServersMenu(); - enableItem.Checked = modifiedConfiguration.enabled; - ShareOverLANItem.Checked = modifiedConfiguration.shareOverLan; + enableItem.Checked = _modifiedConfiguration.enabled; + ShareOverLANItem.Checked = _modifiedConfiguration.shareOverLan; } private void UpdateServersMenu() @@ -193,56 +216,56 @@ namespace Shadowsocks.View } else { - isFirstRun = true; + _isFirstRun = true; } updateChecker.CheckUpdate(); } private void ServersListBox_SelectedIndexChanged(object sender, EventArgs e) { - if (oldSelectedIndex == ServersListBox.SelectedIndex) + if (_oldSelectedIndex == ServersListBox.SelectedIndex) { // we are moving back to oldSelectedIndex or doing a force move return; } - if (!SaveOldSelectedServer()) + if (!SaveOldSelectedServer(sender)) { // why this won't cause stack overflow? - ServersListBox.SelectedIndex = oldSelectedIndex; + ServersListBox.SelectedIndex = _oldSelectedIndex; return; } LoadSelectedServer(); - oldSelectedIndex = ServersListBox.SelectedIndex; + _oldSelectedIndex = ServersListBox.SelectedIndex; } private void AddButton_Click(object sender, EventArgs e) { - if (!SaveOldSelectedServer()) + if (!SaveOldSelectedServer(sender)) { return; } Server server = Configuration.GetDefaultServer(); - modifiedConfiguration.configs.Add(server); - LoadConfiguration(modifiedConfiguration); - ServersListBox.SelectedIndex = modifiedConfiguration.configs.Count - 1; - oldSelectedIndex = ServersListBox.SelectedIndex; + _modifiedConfiguration.configs.Add(server); + LoadConfiguration(_modifiedConfiguration); + ServersListBox.SelectedIndex = _modifiedConfiguration.configs.Count - 1; + _oldSelectedIndex = ServersListBox.SelectedIndex; } private void DeleteButton_Click(object sender, EventArgs e) { - oldSelectedIndex = ServersListBox.SelectedIndex; - if (oldSelectedIndex >= 0 && oldSelectedIndex < modifiedConfiguration.configs.Count) + _oldSelectedIndex = ServersListBox.SelectedIndex; + if (_oldSelectedIndex >= 0 && _oldSelectedIndex < _modifiedConfiguration.configs.Count) { - modifiedConfiguration.configs.RemoveAt(oldSelectedIndex); + _modifiedConfiguration.configs.RemoveAt(_oldSelectedIndex); } - if (oldSelectedIndex >= modifiedConfiguration.configs.Count) + if (_oldSelectedIndex >= _modifiedConfiguration.configs.Count) { // can be -1 - oldSelectedIndex = modifiedConfiguration.configs.Count - 1; + _oldSelectedIndex = _modifiedConfiguration.configs.Count - 1; } - ServersListBox.SelectedIndex = oldSelectedIndex; - LoadConfiguration(modifiedConfiguration); - ServersListBox.SelectedIndex = oldSelectedIndex; + ServersListBox.SelectedIndex = _oldSelectedIndex; + LoadConfiguration(_modifiedConfiguration); + ServersListBox.SelectedIndex = _oldSelectedIndex; LoadSelectedServer(); } @@ -258,28 +281,28 @@ namespace Shadowsocks.View private void ShowFirstTimeBalloon() { - if (isFirstRun) + if (_isFirstRun) { notifyIcon1.BalloonTipTitle = "Shadowsocks is here"; notifyIcon1.BalloonTipText = "You can turn on/off Shadowsocks in the context menu"; notifyIcon1.BalloonTipIcon = ToolTipIcon.Info; notifyIcon1.ShowBalloonTip(0); - isFirstRun = false; + _isFirstRun = false; } } private void OKButton_Click(object sender, EventArgs e) { - if (!SaveOldSelectedServer()) + if (!SaveOldSelectedServer(sender)) { return; } - if (modifiedConfiguration.configs.Count == 0) + if (_modifiedConfiguration.configs.Count == 0) { MessageBox.Show("Please add at least one server"); - return; + return; } - controller.SaveServers(modifiedConfiguration.configs); + controller.SaveServers(_modifiedConfiguration.configs, _modifiedConfiguration.noChange); this.Hide(); ShowFirstTimeBalloon(); } @@ -298,7 +321,9 @@ namespace Shadowsocks.View private void AboutItem_Click(object sender, EventArgs e) { - Process.Start("https://github.com/clowwindy/shadowsocks-csharp"); + aboutForm = new AboutForm(); + aboutForm.Show(); + //Process.Start("https://github.com/clowwindy/shadowsocks-csharp"); } private void notifyIcon1_DoubleClick(object sender, EventArgs e) diff --git a/shadowsocks-csharp/View/QRCodeForm.cs b/shadowsocks-csharp/View/QRCodeForm.cs index 12c5b6fd..c2ed8304 100755 --- a/shadowsocks-csharp/View/QRCodeForm.cs +++ b/shadowsocks-csharp/View/QRCodeForm.cs @@ -24,12 +24,22 @@ namespace Shadowsocks.View private void GenQR(string ssconfig) { - string qrText = ssconfig; +<<<<<<< HEAD + string qrText = ssconfig; QRCode4CS.Options options = new QRCode4CS.Options(); options.Text = qrText; QRCode4CS.QRCode qrCoded = null; bool success = false; - foreach (var level in new QRErrorCorrectLevel[]{QRErrorCorrectLevel.H, QRErrorCorrectLevel.Q, QRErrorCorrectLevel.M, QRErrorCorrectLevel.L}) + foreach (var level in new QRErrorCorrectLevel[]{QRErrorCorrectLevel.H, QRErrorCorrectLevel.Q, QRErrorCorrectLevel.M, QRErrorCorrectLevel.L}) +======= + string qrText = ssconfig; + QRCode4CS.QRCode qrCoded = new QRCode4CS.QRCode(6, QRErrorCorrectLevel.L); + qrCoded.AddData(qrText); + qrCoded.Make(); + int blockSize = 5; + Bitmap drawArea = new Bitmap((qrCoded.GetModuleCount() * blockSize), (qrCoded.GetModuleCount() * blockSize)); + for (int row = 0; row < qrCoded.GetModuleCount(); row++) +>>>>>>> 7d539d3... add modify detector { for (int i = 3; i < 10; i++) { diff --git a/shadowsocks-csharp/shadowsocks-csharp.csproj b/shadowsocks-csharp/shadowsocks-csharp.csproj index b648b831..fe4b7b1f 100755 --- a/shadowsocks-csharp/shadowsocks-csharp.csproj +++ b/shadowsocks-csharp/shadowsocks-csharp.csproj @@ -62,8 +62,8 @@ - - + + @@ -80,6 +80,12 @@ + + Form + + + AboutForm.cs + Form @@ -98,6 +104,9 @@ QRCodeForm.cs + + AboutForm.cs + ConfigForm.cs Designer