@@ -11,12 +11,14 @@ namespace Shadowsocks.Controller | |||||
class Local | class Local | ||||
{ | { | ||||
private Server config; | |||||
private Server _server; | |||||
private bool _shareOverLAN; | |||||
//private Encryptor encryptor; | //private Encryptor encryptor; | ||||
Socket _listener; | Socket _listener; | ||||
public Local(Server config) | |||||
public Local(Configuration config) | |||||
{ | { | ||||
this.config = config; | |||||
this._server = config.GetCurrentServer(); | |||||
_shareOverLAN = config.shareOverLan; | |||||
//this.encryptor = new Encryptor(config.method, config.password); | //this.encryptor = new Encryptor(config.method, config.password); | ||||
} | } | ||||
@@ -25,9 +27,17 @@ namespace Shadowsocks.Controller | |||||
try | try | ||||
{ | { | ||||
// Create a TCP/IP socket. | // Create a TCP/IP socket. | ||||
_listener = new Socket(AddressFamily.InterNetwork, | |||||
SocketType.Stream, ProtocolType.Tcp); | |||||
IPEndPoint localEndPoint = new IPEndPoint(0, config.local_port); | |||||
_listener = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); | |||||
_listener.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true); | |||||
IPEndPoint localEndPoint = null; | |||||
if (_shareOverLAN) | |||||
{ | |||||
localEndPoint = new IPEndPoint(IPAddress.Any, _server.local_port); | |||||
} | |||||
else | |||||
{ | |||||
localEndPoint = new IPEndPoint(IPAddress.Loopback, _server.local_port); | |||||
} | |||||
// Bind the socket to the local endpoint and listen for incoming connections. | // Bind the socket to the local endpoint and listen for incoming connections. | ||||
_listener.Bind(localEndPoint); | _listener.Bind(localEndPoint); | ||||
@@ -58,37 +68,19 @@ namespace Shadowsocks.Controller | |||||
{ | { | ||||
try | try | ||||
{ | { | ||||
// Get the socket that handles the client request. | |||||
Socket listener = (Socket)ar.AsyncState; | Socket listener = (Socket)ar.AsyncState; | ||||
//if (!listener.Connected) | |||||
//{ | |||||
// return; | |||||
//} | |||||
Socket conn = listener.EndAccept(ar); | Socket conn = listener.EndAccept(ar); | ||||
listener.BeginAccept( | listener.BeginAccept( | ||||
new AsyncCallback(AcceptCallback), | new AsyncCallback(AcceptCallback), | ||||
listener); | listener); | ||||
// Create the state object. | |||||
Handler handler = new Handler(); | Handler handler = new Handler(); | ||||
handler.connection = conn; | handler.connection = conn; | ||||
//if (encryptor.method == "table") | |||||
//{ | |||||
// handler.encryptor = encryptor; | |||||
//} | |||||
//else | |||||
//{ | |||||
// handler.encryptor = new Encryptor(config.method, config.password); | |||||
//} | |||||
handler.encryptor = EncryptorFactory.GetEncryptor(config.method, config.password); | |||||
handler.config = config; | |||||
handler.encryptor = EncryptorFactory.GetEncryptor(_server.method, _server.password); | |||||
handler.config = _server; | |||||
handler.Start(); | handler.Start(); | ||||
//handler.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0, | |||||
// new AsyncCallback(ReadCallback), state); | |||||
} | } | ||||
catch | catch | ||||
{ | { | ||||
@@ -1,4 +1,5 @@ | |||||
using Shadowsocks.Properties; | |||||
using Shadowsocks.Model; | |||||
using Shadowsocks.Properties; | |||||
using System; | using System; | ||||
using System.Collections.Generic; | using System.Collections.Generic; | ||||
using System.Diagnostics; | using System.Diagnostics; | ||||
@@ -12,28 +13,51 @@ namespace Shadowsocks.Controller | |||||
{ | { | ||||
class PACServer | class PACServer | ||||
{ | { | ||||
private static int PORT = 8090; | |||||
private static string PAC_FILE = "pac.txt"; | private static string PAC_FILE = "pac.txt"; | ||||
Socket listener; | |||||
Socket _listener; | |||||
FileSystemWatcher watcher; | FileSystemWatcher watcher; | ||||
public event EventHandler PACFileChanged; | public event EventHandler PACFileChanged; | ||||
public void Start() | |||||
public void Start(Configuration configuration) | |||||
{ | { | ||||
// Create a TCP/IP socket. | |||||
listener = new Socket(AddressFamily.InterNetwork, | |||||
SocketType.Stream, ProtocolType.Tcp); | |||||
IPEndPoint localEndPoint = new IPEndPoint(0, 8090); | |||||
// Bind the socket to the local endpoint and listen for incoming connections. | |||||
listener.Bind(localEndPoint); | |||||
listener.Listen(100); | |||||
listener.BeginAccept( | |||||
new AsyncCallback(AcceptCallback), | |||||
listener); | |||||
WatchPacFile(); | |||||
try | |||||
{ | |||||
// Create a TCP/IP socket. | |||||
_listener = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); | |||||
_listener.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true); | |||||
IPEndPoint localEndPoint = null; | |||||
if (configuration.shareOverLan) | |||||
{ | |||||
localEndPoint = new IPEndPoint(IPAddress.Any, PORT); | |||||
} | |||||
else | |||||
{ | |||||
localEndPoint = new IPEndPoint(IPAddress.Loopback, PORT); | |||||
} | |||||
// Bind the socket to the local endpoint and listen for incoming connections. | |||||
_listener.Bind(localEndPoint); | |||||
_listener.Listen(100); | |||||
_listener.BeginAccept( | |||||
new AsyncCallback(AcceptCallback), | |||||
_listener); | |||||
WatchPacFile(); | |||||
} | |||||
catch (SocketException) | |||||
{ | |||||
_listener.Close(); | |||||
throw; | |||||
} | |||||
} | |||||
public void Stop() | |||||
{ | |||||
_listener.Close(); | |||||
_listener = null; | |||||
} | } | ||||
public string TouchPACFile() | public string TouchPACFile() | ||||
@@ -55,10 +79,10 @@ namespace Shadowsocks.Controller | |||||
try | try | ||||
{ | { | ||||
Socket listener = (Socket)ar.AsyncState; | Socket listener = (Socket)ar.AsyncState; | ||||
Socket conn = listener.EndAccept(ar); | |||||
listener.BeginAccept( | listener.BeginAccept( | ||||
new AsyncCallback(AcceptCallback), | new AsyncCallback(AcceptCallback), | ||||
listener); | listener); | ||||
Socket conn = listener.EndAccept(ar); | |||||
conn.BeginReceive(new byte[1024], 0, 1024, 0, | conn.BeginReceive(new byte[1024], 0, 1024, 0, | ||||
new AsyncCallback(ReceiveCallback), conn); | new AsyncCallback(ReceiveCallback), conn); | ||||
@@ -92,7 +116,6 @@ namespace Shadowsocks.Controller | |||||
return System.Text.Encoding.UTF8.GetString(buffer, 0, n); | return System.Text.Encoding.UTF8.GetString(buffer, 0, n); | ||||
} | } | ||||
} | } | ||||
WatchPacFile(); | |||||
} | } | ||||
private void ReceiveCallback(IAsyncResult ar) | private void ReceiveCallback(IAsyncResult ar) | ||||
@@ -104,7 +127,9 @@ namespace Shadowsocks.Controller | |||||
string pac = GetPACContent(); | string pac = GetPACContent(); | ||||
string proxy = "PROXY 127.0.0.1:8123;"; | |||||
IPEndPoint localEndPoint = (IPEndPoint)conn.LocalEndPoint; | |||||
string proxy = "PROXY " + localEndPoint.Address + ":8123;"; | |||||
pac = pac.Replace("__PROXY__", proxy); | pac = pac.Replace("__PROXY__", proxy); | ||||
@@ -13,8 +13,9 @@ namespace Shadowsocks.Controller | |||||
{ | { | ||||
private Process _process; | private Process _process; | ||||
public void Start(Server config) | |||||
public void Start(Configuration configuration) | |||||
{ | { | ||||
Server server = configuration.GetCurrentServer(); | |||||
if (_process == null) | if (_process == null) | ||||
{ | { | ||||
Process[] existingPolipo = Process.GetProcessesByName("ss_polipo"); | Process[] existingPolipo = Process.GetProcessesByName("ss_polipo"); | ||||
@@ -31,8 +32,9 @@ namespace Shadowsocks.Controller | |||||
} | } | ||||
} | } | ||||
string temppath = Path.GetTempPath(); | string temppath = Path.GetTempPath(); | ||||
string polipoConfig = Resources.polipo_config; | |||||
polipoConfig = polipoConfig.Replace("__SOCKS_PORT__", config.local_port.ToString()); | |||||
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"); | |||||
FileManager.ByteArrayToFile(temppath + "/polipo.conf", System.Text.Encoding.UTF8.GetBytes(polipoConfig)); | FileManager.ByteArrayToFile(temppath + "/polipo.conf", System.Text.Encoding.UTF8.GetBytes(polipoConfig)); | ||||
FileManager.UncompressFile(temppath + "/ss_polipo.exe", Resources.polipo_exe); | FileManager.UncompressFile(temppath + "/ss_polipo.exe", Resources.polipo_exe); | ||||
@@ -45,7 +47,6 @@ namespace Shadowsocks.Controller | |||||
_process.StartInfo.CreateNoWindow = true; | _process.StartInfo.CreateNoWindow = true; | ||||
_process.StartInfo.RedirectStandardOutput = true; | _process.StartInfo.RedirectStandardOutput = true; | ||||
_process.StartInfo.RedirectStandardError = true; | _process.StartInfo.RedirectStandardError = true; | ||||
//process.StandardOutput | |||||
_process.Start(); | _process.Start(); | ||||
} | } | ||||
} | } | ||||
@@ -2,6 +2,7 @@ | |||||
using System; | using System; | ||||
using System.Collections.Generic; | using System.Collections.Generic; | ||||
using System.Text; | using System.Text; | ||||
using System.Threading; | |||||
namespace Shadowsocks.Controller | namespace Shadowsocks.Controller | ||||
{ | { | ||||
@@ -25,6 +26,7 @@ namespace Shadowsocks.Controller | |||||
public event EventHandler ConfigChanged; | public event EventHandler ConfigChanged; | ||||
public event EventHandler EnableStatusChanged; | public event EventHandler EnableStatusChanged; | ||||
public event EventHandler ShareOverLANStatusChanged; | |||||
// when user clicked Edit PAC, and PAC file has already created | // when user clicked Edit PAC, and PAC file has already created | ||||
public event EventHandler<PathEventArgs> PACFileReadyToOpen; | public event EventHandler<PathEventArgs> PACFileReadyToOpen; | ||||
@@ -33,14 +35,14 @@ namespace Shadowsocks.Controller | |||||
{ | { | ||||
_config = Configuration.Load(); | _config = Configuration.Load(); | ||||
polipoRunner = new PolipoRunner(); | polipoRunner = new PolipoRunner(); | ||||
polipoRunner.Start(_config.GetCurrentServer()); | |||||
local = new Local(_config.GetCurrentServer()); | |||||
polipoRunner.Start(_config); | |||||
local = new Local(_config); | |||||
try | try | ||||
{ | { | ||||
local.Start(); | local.Start(); | ||||
pacServer = new PACServer(); | pacServer = new PACServer(); | ||||
pacServer.PACFileChanged += pacServer_PACFileChanged; | pacServer.PACFileChanged += pacServer_PACFileChanged; | ||||
pacServer.Start(); | |||||
pacServer.Start(_config); | |||||
} | } | ||||
catch (Exception e) | catch (Exception e) | ||||
{ | { | ||||
@@ -58,9 +60,9 @@ namespace Shadowsocks.Controller | |||||
local.Stop(); | local.Stop(); | ||||
polipoRunner.Stop(); | polipoRunner.Stop(); | ||||
polipoRunner.Start(_config.GetCurrentServer()); | |||||
polipoRunner.Start(_config); | |||||
local = new Local(_config.GetCurrentServer()); | |||||
local = new Local(_config); | |||||
local.Start(); | local.Start(); | ||||
if (ConfigChanged != null) | if (ConfigChanged != null) | ||||
@@ -92,6 +94,18 @@ namespace Shadowsocks.Controller | |||||
} | } | ||||
} | } | ||||
public void ToggleShareOverLAN(bool enabled) | |||||
{ | |||||
_config.shareOverLan = enabled; | |||||
SaveConfig(_config); | |||||
pacServer.Stop(); | |||||
pacServer.Start(_config); | |||||
if (ShareOverLANStatusChanged != null) | |||||
{ | |||||
ShareOverLANStatusChanged(this, new EventArgs()); | |||||
} | |||||
} | |||||
public void Stop() | public void Stop() | ||||
{ | { | ||||
if (stopped) | if (stopped) | ||||
@@ -1,4 +1,4 @@ | |||||
proxyAddress = "127.0.0.1" | |||||
proxyAddress = "__POLIPO_BIND_IP__" | |||||
socksParentProxy = "127.0.0.1:__SOCKS_PORT__" | socksParentProxy = "127.0.0.1:__SOCKS_PORT__" | ||||
socksProxyType = socks5 | socksProxyType = socks5 | ||||
@@ -15,6 +15,7 @@ namespace Shadowsocks.Model | |||||
public List<Server> configs; | public List<Server> configs; | ||||
public int index; | public int index; | ||||
public bool enabled; | public bool enabled; | ||||
public bool shareOverLan; | |||||
public bool isDefault; | public bool isDefault; | ||||
private static string CONFIG_FILE = "gui-config.json"; | private static string CONFIG_FILE = "gui-config.json"; | ||||
@@ -50,12 +50,14 @@ | |||||
this.panel1 = new System.Windows.Forms.Panel(); | this.panel1 = new System.Windows.Forms.Panel(); | ||||
this.contextMenu1 = new System.Windows.Forms.ContextMenu(); | this.contextMenu1 = new System.Windows.Forms.ContextMenu(); | ||||
this.enableItem = new System.Windows.Forms.MenuItem(); | this.enableItem = new System.Windows.Forms.MenuItem(); | ||||
this.ShareOverLANItem = new System.Windows.Forms.MenuItem(); | |||||
this.ServersItem = new System.Windows.Forms.MenuItem(); | this.ServersItem = new System.Windows.Forms.MenuItem(); | ||||
this.SeperatorItem = new System.Windows.Forms.MenuItem(); | this.SeperatorItem = new System.Windows.Forms.MenuItem(); | ||||
this.ConfigItem = new System.Windows.Forms.MenuItem(); | this.ConfigItem = new System.Windows.Forms.MenuItem(); | ||||
this.menuItem4 = new System.Windows.Forms.MenuItem(); | this.menuItem4 = new System.Windows.Forms.MenuItem(); | ||||
this.editPACFileItem = new System.Windows.Forms.MenuItem(); | this.editPACFileItem = new System.Windows.Forms.MenuItem(); | ||||
this.QRCodeItem = new System.Windows.Forms.MenuItem(); | this.QRCodeItem = new System.Windows.Forms.MenuItem(); | ||||
this.ShowLogItem = new System.Windows.Forms.MenuItem(); | |||||
this.aboutItem = new System.Windows.Forms.MenuItem(); | this.aboutItem = new System.Windows.Forms.MenuItem(); | ||||
this.menuItem3 = new System.Windows.Forms.MenuItem(); | this.menuItem3 = new System.Windows.Forms.MenuItem(); | ||||
this.quitItem = new System.Windows.Forms.MenuItem(); | this.quitItem = new System.Windows.Forms.MenuItem(); | ||||
@@ -64,7 +66,6 @@ | |||||
this.AddButton = new System.Windows.Forms.Button(); | this.AddButton = new System.Windows.Forms.Button(); | ||||
this.ServerGroupBox = new System.Windows.Forms.GroupBox(); | this.ServerGroupBox = new System.Windows.Forms.GroupBox(); | ||||
this.ServersListBox = new System.Windows.Forms.ListBox(); | this.ServersListBox = new System.Windows.Forms.ListBox(); | ||||
this.ShowLogItem = new System.Windows.Forms.MenuItem(); | |||||
this.tableLayoutPanel1.SuspendLayout(); | this.tableLayoutPanel1.SuspendLayout(); | ||||
this.panel1.SuspendLayout(); | this.panel1.SuspendLayout(); | ||||
this.panel3.SuspendLayout(); | this.panel3.SuspendLayout(); | ||||
@@ -286,6 +287,7 @@ | |||||
// | // | ||||
this.contextMenu1.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] { | this.contextMenu1.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] { | ||||
this.enableItem, | this.enableItem, | ||||
this.ShareOverLANItem, | |||||
this.ServersItem, | this.ServersItem, | ||||
this.menuItem4, | this.menuItem4, | ||||
this.editPACFileItem, | this.editPACFileItem, | ||||
@@ -301,9 +303,15 @@ | |||||
this.enableItem.Text = "&Enable"; | this.enableItem.Text = "&Enable"; | ||||
this.enableItem.Click += new System.EventHandler(this.EnableItem_Click); | this.enableItem.Click += new System.EventHandler(this.EnableItem_Click); | ||||
// | // | ||||
// ShareOverLANItem | |||||
// | |||||
this.ShareOverLANItem.Index = 1; | |||||
this.ShareOverLANItem.Text = "Share over LAN"; | |||||
this.ShareOverLANItem.Click += new System.EventHandler(this.ShareOverLANItem_Click); | |||||
// | |||||
// ServersItem | // ServersItem | ||||
// | // | ||||
this.ServersItem.Index = 1; | |||||
this.ServersItem.Index = 2; | |||||
this.ServersItem.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] { | this.ServersItem.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] { | ||||
this.SeperatorItem, | this.SeperatorItem, | ||||
this.ConfigItem}); | this.ConfigItem}); | ||||
@@ -322,35 +330,41 @@ | |||||
// | // | ||||
// menuItem4 | // menuItem4 | ||||
// | // | ||||
this.menuItem4.Index = 2; | |||||
this.menuItem4.Index = 3; | |||||
this.menuItem4.Text = "-"; | this.menuItem4.Text = "-"; | ||||
// | // | ||||
// editPACFileItem | // editPACFileItem | ||||
// | // | ||||
this.editPACFileItem.Index = 3; | |||||
this.editPACFileItem.Index = 4; | |||||
this.editPACFileItem.Text = "Edit &PAC File..."; | this.editPACFileItem.Text = "Edit &PAC File..."; | ||||
this.editPACFileItem.Click += new System.EventHandler(this.EditPACFileItem_Click); | this.editPACFileItem.Click += new System.EventHandler(this.EditPACFileItem_Click); | ||||
// | // | ||||
// QRCodeItem | // QRCodeItem | ||||
// | // | ||||
this.QRCodeItem.Index = 4; | |||||
this.QRCodeItem.Index = 5; | |||||
this.QRCodeItem.Text = "Show &QRCode..."; | this.QRCodeItem.Text = "Show &QRCode..."; | ||||
this.QRCodeItem.Click += new System.EventHandler(this.QRCodeItem_Click); | this.QRCodeItem.Click += new System.EventHandler(this.QRCodeItem_Click); | ||||
// | // | ||||
// ShowLogItem | |||||
// | |||||
this.ShowLogItem.Index = 6; | |||||
this.ShowLogItem.Text = "Show Logs..."; | |||||
this.ShowLogItem.Click += new System.EventHandler(this.ShowLogItem_Click); | |||||
// | |||||
// aboutItem | // aboutItem | ||||
// | // | ||||
this.aboutItem.Index = 6; | |||||
this.aboutItem.Index = 7; | |||||
this.aboutItem.Text = "About..."; | this.aboutItem.Text = "About..."; | ||||
this.aboutItem.Click += new System.EventHandler(this.AboutItem_Click); | this.aboutItem.Click += new System.EventHandler(this.AboutItem_Click); | ||||
// | // | ||||
// menuItem3 | // menuItem3 | ||||
// | // | ||||
this.menuItem3.Index = 7; | |||||
this.menuItem3.Index = 8; | |||||
this.menuItem3.Text = "-"; | this.menuItem3.Text = "-"; | ||||
// | // | ||||
// quitItem | // quitItem | ||||
// | // | ||||
this.quitItem.Index = 8; | |||||
this.quitItem.Index = 9; | |||||
this.quitItem.Text = "&Quit"; | this.quitItem.Text = "&Quit"; | ||||
this.quitItem.Click += new System.EventHandler(this.Quit_Click); | this.quitItem.Click += new System.EventHandler(this.Quit_Click); | ||||
// | // | ||||
@@ -404,12 +418,6 @@ | |||||
this.ServersListBox.TabIndex = 5; | this.ServersListBox.TabIndex = 5; | ||||
this.ServersListBox.SelectedIndexChanged += new System.EventHandler(this.ServersListBox_SelectedIndexChanged); | this.ServersListBox.SelectedIndexChanged += new System.EventHandler(this.ServersListBox_SelectedIndexChanged); | ||||
// | // | ||||
// ShowLogItem | |||||
// | |||||
this.ShowLogItem.Index = 5; | |||||
this.ShowLogItem.Text = "Show Logs..."; | |||||
this.ShowLogItem.Click += new System.EventHandler(this.ShowLogItem_Click); | |||||
// | |||||
// ConfigForm | // ConfigForm | ||||
// | // | ||||
this.AcceptButton = this.OKButton; | this.AcceptButton = this.OKButton; | ||||
@@ -480,6 +488,7 @@ | |||||
private System.Windows.Forms.Label label6; | private System.Windows.Forms.Label label6; | ||||
private System.Windows.Forms.MenuItem QRCodeItem; | private System.Windows.Forms.MenuItem QRCodeItem; | ||||
private System.Windows.Forms.MenuItem ShowLogItem; | private System.Windows.Forms.MenuItem ShowLogItem; | ||||
private System.Windows.Forms.MenuItem ShareOverLANItem; | |||||
} | } | ||||
} | } | ||||
@@ -28,6 +28,7 @@ namespace Shadowsocks.View | |||||
controller.EnableStatusChanged += controller_EnableStatusChanged; | controller.EnableStatusChanged += controller_EnableStatusChanged; | ||||
controller.ConfigChanged += controller_ConfigChanged; | controller.ConfigChanged += controller_ConfigChanged; | ||||
controller.PACFileReadyToOpen += controller_PACFileReadyToOpen; | controller.PACFileReadyToOpen += controller_PACFileReadyToOpen; | ||||
controller.ShareOverLANStatusChanged += controller_ShareOverLANStatusChanged; | |||||
LoadCurrentConfiguration(); | LoadCurrentConfiguration(); | ||||
} | } | ||||
@@ -42,6 +43,11 @@ namespace Shadowsocks.View | |||||
enableItem.Checked = controller.GetConfiguration().enabled; | enableItem.Checked = controller.GetConfiguration().enabled; | ||||
} | } | ||||
void controller_ShareOverLANStatusChanged(object sender, EventArgs e) | |||||
{ | |||||
ShareOverLANItem.Checked = controller.GetConfiguration().shareOverLan; | |||||
} | |||||
void controller_PACFileReadyToOpen(object sender, ShadowsocksController.PathEventArgs e) | void controller_PACFileReadyToOpen(object sender, ShadowsocksController.PathEventArgs e) | ||||
{ | { | ||||
string argument = @"/select, " + e.Path; | string argument = @"/select, " + e.Path; | ||||
@@ -129,6 +135,7 @@ namespace Shadowsocks.View | |||||
UpdateServersMenu(); | UpdateServersMenu(); | ||||
enableItem.Checked = modifiedConfiguration.enabled; | enableItem.Checked = modifiedConfiguration.enabled; | ||||
ShareOverLANItem.Checked = modifiedConfiguration.shareOverLan; | |||||
} | } | ||||
private void UpdateServersMenu() | private void UpdateServersMenu() | ||||
@@ -285,6 +292,12 @@ namespace Shadowsocks.View | |||||
controller.ToggleEnable(enableItem.Checked); | controller.ToggleEnable(enableItem.Checked); | ||||
} | } | ||||
private void ShareOverLANItem_Click(object sender, EventArgs e) | |||||
{ | |||||
ShareOverLANItem.Checked = !ShareOverLANItem.Checked; | |||||
controller.ToggleShareOverLAN(ShareOverLANItem.Checked); | |||||
} | |||||
private void EditPACFileItem_Click(object sender, EventArgs e) | private void EditPACFileItem_Click(object sender, EventArgs e) | ||||
{ | { | ||||
controller.TouchPACFile(); | controller.TouchPACFile(); | ||||