diff --git a/v2rayN/ServiceLib/Common/JsonUtils.cs b/v2rayN/ServiceLib/Common/JsonUtils.cs index 4d0f8e71..cf5ec25c 100644 --- a/v2rayN/ServiceLib/Common/JsonUtils.cs +++ b/v2rayN/ServiceLib/Common/JsonUtils.cs @@ -70,8 +70,9 @@ namespace ServiceLib.Common /// /// /// + /// /// - public static string Serialize(object? obj, bool indented = true) + public static string Serialize(object? obj, bool indented = true, bool nullValue = false) { var result = string.Empty; try @@ -82,8 +83,8 @@ namespace ServiceLib.Common } var options = new JsonSerializerOptions { - WriteIndented = indented ? true : false, - DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull + WriteIndented = indented, + DefaultIgnoreCondition = nullValue ? JsonIgnoreCondition.Never : JsonIgnoreCondition.WhenWritingNull }; result = JsonSerializer.Serialize(obj, options); } @@ -100,38 +101,5 @@ namespace ServiceLib.Common /// /// public static JsonNode? SerializeToNode(object? obj) => JsonSerializer.SerializeToNode(obj); - - /// - /// Save as json file - /// - /// - /// - /// - /// - public static int ToFile(object? obj, string? filePath, bool nullValue = true) - { - if (filePath is null) - { - return -1; - } - try - { - using var file = File.Create(filePath); - - var options = new JsonSerializerOptions - { - WriteIndented = true, - DefaultIgnoreCondition = nullValue ? JsonIgnoreCondition.Never : JsonIgnoreCondition.WhenWritingNull - }; - - JsonSerializer.Serialize(file, obj, options); - return 0; - } - catch (Exception ex) - { - Logging.SaveLog(ex.Message, ex); - return -1; - } - } } } \ No newline at end of file diff --git a/v2rayN/ServiceLib/Handler/ConfigHandler.cs b/v2rayN/ServiceLib/Handler/ConfigHandler.cs index 8c066868..39d6cb1c 100644 --- a/v2rayN/ServiceLib/Handler/ConfigHandler.cs +++ b/v2rayN/ServiceLib/Handler/ConfigHandler.cs @@ -9,7 +9,6 @@ namespace ServiceLib.Handler public class ConfigHandler { private static readonly string _configRes = Global.ConfigFileName; - private static readonly object _objLock = new(); #region ConfigHandler @@ -67,7 +66,6 @@ namespace ServiceLib.Handler } config.RoutingBasicItem ??= new(); - if (Utils.IsNullOrEmpty(config.RoutingBasicItem.DomainStrategy)) { config.RoutingBasicItem.DomainStrategy = Global.DomainStrategies.First();//"IPIfNonMatch"; @@ -120,15 +118,6 @@ namespace ServiceLib.Handler } config.ConstItem ??= new ConstItem(); - if (Utils.IsNotEmpty(config.ConstItem.DefIEProxyExceptions)) - { - config.SystemProxyItem.SystemProxyExceptions = $"{config.ConstItem.DefIEProxyExceptions};{config.SystemProxyItem.SystemProxyExceptions}"; - config.ConstItem.DefIEProxyExceptions = string.Empty; - } - if (config.SystemProxyItem.SystemProxyExceptions.IsNullOrEmpty()) - { - config.SystemProxyItem.SystemProxyExceptions = Utils.IsWindows() ? Global.SystemProxyExceptionsWindows : Global.SystemProxyExceptionsLinux; - } config.SpeedTestItem ??= new(); if (config.SpeedTestItem.SpeedTestTimeout < 10) @@ -167,6 +156,16 @@ namespace ServiceLib.Handler config.WebDavItem ??= new(); config.CheckUpdateItem ??= new(); + if (Utils.IsNotEmpty(config.ConstItem.DefIEProxyExceptions)) + { + config.SystemProxyItem.SystemProxyExceptions = $"{config.ConstItem.DefIEProxyExceptions};{config.SystemProxyItem.SystemProxyExceptions}"; + config.ConstItem.DefIEProxyExceptions = string.Empty; + } + if (config.SystemProxyItem.SystemProxyExceptions.IsNullOrEmpty()) + { + config.SystemProxyItem.SystemProxyExceptions = Utils.IsWindows() ? Global.SystemProxyExceptionsWindows : Global.SystemProxyExceptionsLinux; + } + return config; } @@ -177,30 +176,26 @@ namespace ServiceLib.Handler /// public static async Task SaveConfig(Config config) { - lock (_objLock) + try { - try - { - //save temp file - var resPath = Utils.GetConfigPath(_configRes); - var tempPath = $"{resPath}_temp"; - if (JsonUtils.ToFile(config, tempPath) != 0) - { - return -1; - } + //save temp file + var resPath = Utils.GetConfigPath(_configRes); + var tempPath = $"{resPath}_temp"; - if (File.Exists(resPath)) - { - File.Delete(resPath); - } - //rename - File.Move(tempPath, resPath); - } - catch (Exception ex) + var content = JsonUtils.Serialize(config, true, true); + if (content.IsNullOrEmpty()) { - Logging.SaveLog("ToJsonFile", ex); return -1; } + await File.WriteAllTextAsync(tempPath, content); + + //rename + File.Move(tempPath, resPath, true); + } + catch (Exception ex) + { + Logging.SaveLog("ToJsonFile", ex); + return -1; } return 0; diff --git a/v2rayN/ServiceLib/Services/CoreConfig/CoreConfigSingboxService.cs b/v2rayN/ServiceLib/Services/CoreConfig/CoreConfigSingboxService.cs index 202b5089..e1f26b1b 100644 --- a/v2rayN/ServiceLib/Services/CoreConfig/CoreConfigSingboxService.cs +++ b/v2rayN/ServiceLib/Services/CoreConfig/CoreConfigSingboxService.cs @@ -409,7 +409,9 @@ namespace ServiceLib.Services.CoreConfig { await GenInbounds(singboxConfig); await GenExperimental(singboxConfig); - JsonUtils.ToFile(singboxConfig, fileName, false); + + var content = JsonUtils.Serialize(singboxConfig, true); + await File.WriteAllTextAsync(fileName, content); } } else diff --git a/v2rayN/ServiceLib/ViewModels/MainWindowViewModel.cs b/v2rayN/ServiceLib/ViewModels/MainWindowViewModel.cs index 9b016ca6..ff680c3d 100644 --- a/v2rayN/ServiceLib/ViewModels/MainWindowViewModel.cs +++ b/v2rayN/ServiceLib/ViewModels/MainWindowViewModel.cs @@ -282,16 +282,16 @@ namespace ServiceLib.ViewModels { try { - Logging.SaveLog("MyAppExit Begin"); - await SysProxyHandler.UpdateSysProxy(_config, true); + Logging.SaveLog("MyAppExitAsync Begin"); await ConfigHandler.SaveConfig(_config); + await SysProxyHandler.UpdateSysProxy(_config, true); await ProfileExHandler.Instance.SaveTo(); await StatisticsHandler.Instance.SaveTo(); StatisticsHandler.Instance.Close(); await CoreHandler.Instance.CoreStop(); - Logging.SaveLog("MyAppExit End"); + Logging.SaveLog("MyAppExitAsync End"); } catch { } finally