using shadowsocks_csharp.Model; using System; using System.Collections.Generic; using System.Text; namespace shadowsocks_csharp.Controller { public class ShadowsocksController { // controller: // handle user actions // manipulates UI // interacts with low level logic private Local local; private PACServer pacServer; private Config config; private PolipoRunner polipoRunner; private bool stopped = false; public class PathEventArgs : EventArgs { public string Path; } public event EventHandler ConfigChanged; public event EventHandler EnableStatusChanged; // when user clicked Edit PAC, and PAC file has already created public event EventHandler PACFileReadyToOpen; public ShadowsocksController() { config = Config.Load(); polipoRunner = new PolipoRunner(); polipoRunner.Start(config); local = new Local(config); local.Start(); pacServer = new PACServer(); pacServer.Start(); updateSystemProxy(); } public void SaveConfig(Config newConfig) { Config.Save(newConfig); config = newConfig; local.Stop(); polipoRunner.Stop(); polipoRunner.Start(config); local = new Local(config); local.Start(); if (ConfigChanged != null) { ConfigChanged(this, new EventArgs()); } } public Config GetConfig() { return config; } public void ToggleEnable(bool enabled) { config.enabled = enabled; updateSystemProxy(); SaveConfig(config); if (EnableStatusChanged != null) { EnableStatusChanged(this, new EventArgs()); } } public void Stop() { if (stopped) { return; } stopped = true; local.Stop(); polipoRunner.Stop(); if (config.enabled) { SystemProxy.Disable(); } } public void TouchPACFile() { } private void updateSystemProxy() { if (config.enabled) { SystemProxy.Enable(); } else { SystemProxy.Disable(); } } } }