using System; using System.Collections.Generic; using System.IO; using Shadowsocks.Controller; using Newtonsoft.Json; namespace Shadowsocks.Model { [Serializable] public class Configuration { public List configs; // when strategy is set, index is ignored public string strategy; public int index; public bool global; public bool enabled; public bool shareOverLan; public bool isDefault; public int localPort; public string pacUrl; public bool useOnlinePac; public bool availabilityStatistics; public bool autoCheckUpdate; public LogViewerConfig logViewer; private static string CONFIG_FILE = "gui-config.json"; public Server GetCurrentServer() { if (index >= 0 && index < configs.Count) { return configs[index]; } else { return GetDefaultServer(); } } public static void CheckServer(Server server) { CheckPort(server.server_port); CheckPassword(server.password); CheckServer(server.server); } public static Configuration Load() { try { string configContent = File.ReadAllText(CONFIG_FILE); Configuration config = JsonConvert.DeserializeObject(configContent); config.isDefault = false; if (config.localPort == 0) { config.localPort = 1080; } if (config.index == -1) { if (config.strategy == null) { config.index = 0; } } return config; } catch (Exception e) { if (!(e is FileNotFoundException)) { Logging.LogUsefulException(e); } return new Configuration { index = 0, isDefault = true, localPort = 1080, autoCheckUpdate = true, configs = new List() { GetDefaultServer() } }; } } public static void Save(Configuration config) { if (config.index >= config.configs.Count) { config.index = config.configs.Count - 1; } if (config.index < -1) { config.index = -1; } if (config.index == -1) { if (config.strategy == null) { config.index = 0; } } config.isDefault = false; try { using (StreamWriter sw = new StreamWriter(File.Open(CONFIG_FILE, FileMode.Create))) { string jsonString = JsonConvert.SerializeObject(config, Formatting.Indented); sw.Write(jsonString); sw.Flush(); } } catch (IOException e) { Console.Error.WriteLine(e); } } public static Server GetDefaultServer() { return new Server(); } private static void Assert(bool condition) { if (!condition) { throw new Exception(I18N.GetString("assertion failure")); } } public static void CheckPort(int port) { if (port <= 0 || port > 65535) { throw new ArgumentException(I18N.GetString("Port out of range")); } } public static void CheckLocalPort(int port) { CheckPort(port); if (port == 8123) { throw new ArgumentException(I18N.GetString("Port can't be 8123")); } } private static void CheckPassword(string password) { if (string.IsNullOrEmpty(password)) { throw new ArgumentException(I18N.GetString("Password can not be blank")); } } private static void CheckServer(string server) { if (string.IsNullOrEmpty(server)) { throw new ArgumentException(I18N.GetString("Server IP can not be blank")); } } } }