From dd9ce932fce4c76e74f470833d09c2c6e25dad05 Mon Sep 17 00:00:00 2001 From: Vincent Maas Date: Wed, 18 Aug 2021 11:15:56 +0200 Subject: [PATCH] made loading presets code more robust --- ColorControl/AmdService.cs | 22 +------- ColorControl/ColorControl.csproj | 2 +- ColorControl/GraphicsService.cs | 2 +- ColorControl/LgDevice.cs | 4 +- ColorControl/LgService.cs | 34 ++++-------- ColorControl/MainForm.cs | 4 +- ColorControl/NvService.cs | 22 +------- ColorControl/Properties/AssemblyInfo.cs | 4 +- ColorControl/ServiceBase.cs | 74 ++++++++++++++++++++++++- ColorControl/Utils.cs | 14 +++++ 10 files changed, 111 insertions(+), 71 deletions(-) diff --git a/ColorControl/AmdService.cs b/ColorControl/AmdService.cs index 026d5a1..5eb0b12 100644 --- a/ColorControl/AmdService.cs +++ b/ColorControl/AmdService.cs @@ -13,16 +13,11 @@ namespace ColorControl private ADLDisplayInfo _currentDisplay; - public AmdService(string dataPath) : base(dataPath) + public AmdService(string dataPath) : base(dataPath, "AmdPresets.json") { LoadPresets(); } - public AmdPreset GetLastAppliedPreset() - { - return _lastAppliedPreset; - } - public static bool ExecutePresetAsync(string idOrName) { try @@ -45,20 +40,9 @@ namespace ColorControl } } - private void LoadPresets() + protected override List GetDefaultPresets() { - _presetsFilename = Path.Combine(_dataPath, "AmdPresets.json"); - - if (File.Exists(_presetsFilename)) - { - var json = File.ReadAllText(_presetsFilename); - - _presets = _JsonDeserializer.Deserialize>(json); - } - else - { - _presets = AmdPreset.GetDefaultPresets(); - } + return AmdPreset.GetDefaultPresets(); } private void SavePresets() diff --git a/ColorControl/ColorControl.csproj b/ColorControl/ColorControl.csproj index 49ba607..5d2f3a7 100644 --- a/ColorControl/ColorControl.csproj +++ b/ColorControl/ColorControl.csproj @@ -27,7 +27,7 @@ ColorControl Maassoft 0 - 4.1.0.0 + 4.2.0.0 false true true diff --git a/ColorControl/GraphicsService.cs b/ColorControl/GraphicsService.cs index 4d3c785..294c7f4 100644 --- a/ColorControl/GraphicsService.cs +++ b/ColorControl/GraphicsService.cs @@ -13,7 +13,7 @@ namespace ColorControl { private static readonly NLog.Logger Logger = NLog.LogManager.GetCurrentClassLogger(); - public GraphicsService(string dataPath) : base(dataPath) + public GraphicsService(string dataPath, string presetsBaseFilename) : base(dataPath, presetsBaseFilename) { Initialize(); } diff --git a/ColorControl/LgDevice.cs b/ColorControl/LgDevice.cs index eaeac89..af93b18 100644 --- a/ColorControl/LgDevice.cs +++ b/ColorControl/LgDevice.cs @@ -227,11 +227,11 @@ namespace ColorControl if (settings.backlight != null) { - PictureSettings.Backlight = Utils.ParseInt(settings.backlight.Value, PictureSettings.Backlight); + PictureSettings.Backlight = Utils.ParseDynamicAsInt(settings.backlight, PictureSettings.Backlight); } if (settings.contrast != null) { - PictureSettings.Contrast = Utils.ParseInt(settings.contrast.Value, PictureSettings.Contrast); + PictureSettings.Contrast = Utils.ParseDynamicAsInt(settings.contrast, PictureSettings.Contrast); } } diff --git a/ColorControl/LgService.cs b/ColorControl/LgService.cs index 25e7d43..fca54fb 100644 --- a/ColorControl/LgService.cs +++ b/ColorControl/LgService.cs @@ -65,7 +65,7 @@ namespace ColorControl private Task _monitorTask; private int _monitorTaskCounter; - public LgService(string dataPath, bool allowPowerOn) : base(dataPath) + public LgService(string dataPath, bool allowPowerOn) : base(dataPath, "LgPresets.json") { _allowPowerOn = allowPowerOn; @@ -127,33 +127,19 @@ namespace ColorControl return preset; } - - private void LoadPresets() + protected override List GetDefaultPresets() { - _presetsFilename = Path.Combine(_dataPath, "LgPresets.json"); - var toCopy = Path.Combine(Directory.GetCurrentDirectory(), "LgPresets.json"); - if (!File.Exists(_presetsFilename) && File.Exists(toCopy)) + List presets = null; + + var defaultPresetsFileName = Path.Combine(Directory.GetCurrentDirectory(), "LgPresets.json"); + if (File.Exists(defaultPresetsFileName)) { - try - { - File.Copy(toCopy, _presetsFilename); - } - catch (Exception e) - { - Logger.Error($"Error while copying {toCopy} to {_presetsFilename}: {e.Message}"); - } + var json = File.ReadAllText(defaultPresetsFileName); + + presets = _JsonDeserializer.Deserialize>(json); } - if (File.Exists(_presetsFilename)) - { - var json = File.ReadAllText(_presetsFilename); - - _presets = _JsonSerializer.Deserialize>(json); - } - else - { - _presets = new List(); - } + return presets; } private void LoadConfig() diff --git a/ColorControl/MainForm.cs b/ColorControl/MainForm.cs index 8dac6a5..425b417 100644 --- a/ColorControl/MainForm.cs +++ b/ColorControl/MainForm.cs @@ -126,10 +126,10 @@ namespace ColorControl _nvService.AfterApplyPreset += NvServiceAfterApplyPreset; } - catch (Exception) + catch (Exception ex) { //Logger.Error("Error initializing NvService: " + e.ToLogString()); - Logger.Debug("No NVIDIA device detected"); + Logger.Debug($"No NVIDIA device detected: {ex.Message}"); tcMain.TabPages.Remove(tabNVIDIA); } } diff --git a/ColorControl/NvService.cs b/ColorControl/NvService.cs index c5925f4..4ca5582 100644 --- a/ColorControl/NvService.cs +++ b/ColorControl/NvService.cs @@ -69,7 +69,7 @@ namespace ColorControl private Display _currentDisplay; - public NvService(string dataPath) : base(dataPath) + public NvService(string dataPath) : base(dataPath, "NvPresets.json") { var converter = new ColorDataConverter(); _JsonDeserializer.RegisterConverters(new[] { converter }); @@ -126,20 +126,9 @@ namespace ColorControl SavePresets(); } - private void LoadPresets() + protected override List GetDefaultPresets() { - _presetsFilename = Path.Combine(_dataPath, "NvPresets.json"); - - if (File.Exists(_presetsFilename)) - { - var json = File.ReadAllText(_presetsFilename); - - _presets = _JsonDeserializer.Deserialize>(json); - } - else - { - _presets = NvPreset.GetDefaultPresets(); - } + return NvPreset.GetDefaultPresets(); } private void SavePresets() @@ -493,11 +482,6 @@ namespace ColorControl return list; } - public NvPreset GetLastAppliedPreset() - { - return _lastAppliedPreset; - } - protected override void Initialize() { NVIDIA.Initialize(); diff --git a/ColorControl/Properties/AssemblyInfo.cs b/ColorControl/Properties/AssemblyInfo.cs index 2d9b0ff..81134e4 100644 --- a/ColorControl/Properties/AssemblyInfo.cs +++ b/ColorControl/Properties/AssemblyInfo.cs @@ -32,5 +32,5 @@ using System.Runtime.InteropServices; // You can specify all the values or you can default the Build and Revision Numbers // by using the '*' as shown below: // [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("4.1.0.0")] -[assembly: AssemblyFileVersion("4.1.0.0")] +[assembly: AssemblyVersion("4.2.0.0")] +[assembly: AssemblyFileVersion("4.2.0.0")] diff --git a/ColorControl/ServiceBase.cs b/ColorControl/ServiceBase.cs index 354a44f..6c7544d 100644 --- a/ColorControl/ServiceBase.cs +++ b/ColorControl/ServiceBase.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.IO; using System.Linq; using System.Web.Script.Serialization; @@ -7,19 +8,25 @@ namespace ColorControl { abstract class ServiceBase where T : PresetBase { + private static readonly NLog.Logger Logger = NLog.LogManager.GetCurrentClassLogger(); + public event EventHandler AfterApplyPreset; protected string _dataPath; + protected string _presetsBaseFilename; protected string _presetsFilename; + protected string _presetsBackupFilename; protected JavaScriptSerializer _JsonSerializer; protected JavaScriptSerializer _JsonDeserializer; protected bool _initialized = false; protected List _presets; protected T _lastAppliedPreset; + protected string _loadPresetsError; - public ServiceBase(string dataPath) + public ServiceBase(string dataPath, string presetsBaseFilename) { _dataPath = dataPath; + _presetsBaseFilename = presetsBaseFilename; _JsonSerializer = new JavaScriptSerializer(); _JsonDeserializer = new JavaScriptSerializer(); @@ -48,6 +55,11 @@ namespace ColorControl return preset; } + public T GetLastAppliedPreset() + { + return _lastAppliedPreset; + } + protected virtual void Initialize() { @@ -62,5 +74,65 @@ namespace ColorControl { AfterApplyPreset?.Invoke(this, _lastAppliedPreset); } + + protected void LoadPresets() + { + _presetsFilename = Path.Combine(_dataPath, _presetsBaseFilename); + _presetsBackupFilename = Path.Combine(_dataPath, $"{_presetsBaseFilename}.backup"); + + try + { + var presetsExists = File.Exists(_presetsFilename); + if (presetsExists) + { + try + { + var json = File.ReadAllText(_presetsFilename); + + // Hack to convert incorrect triggers + json = json.Replace(@"""Triggers"":0", @"""Triggers"":[]"); + + _presets = _JsonDeserializer.Deserialize>(json); + + if (_presets != null) + { + if (File.Exists(_presetsBackupFilename)) + { + File.Delete(_presetsBackupFilename); + } + File.Copy(_presetsFilename, _presetsBackupFilename); + } + } + catch (Exception ex1) + { + Logger.Error($"Error while loading presets, reverting to default presets: {ex1.Message}"); + _loadPresetsError = ex1.Message; + } + } + if (!presetsExists || _presets == null) + { + Logger.Debug("Reverting to default presets"); + try + { + _presets = GetDefaultPresets(); + } + catch (Exception e) + { + Logger.Error($"Error loading default presets, reverting to empty list: {e.Message}"); + } + } + } + catch (Exception ex) + { + Logger.Error($"General error while loading presets, reverting to empty list: {ex.Message}"); + _loadPresetsError = ex.Message; + } + if (_presets == null) + { + _presets = new List(); + } + } + + protected abstract List GetDefaultPresets(); } } diff --git a/ColorControl/Utils.cs b/ColorControl/Utils.cs index f1f10ae..e9847ba 100644 --- a/ColorControl/Utils.cs +++ b/ColorControl/Utils.cs @@ -1,5 +1,6 @@ using Microsoft.Win32; using Microsoft.Win32.TaskScheduler; +using Newtonsoft.Json.Linq; using NStandard; using NWin32; using NWin32.NativeTypes; @@ -942,6 +943,19 @@ namespace ColorControl return def; } + public static int ParseDynamicAsInt(dynamic value, int def = 0) + { + if (value.Type == JTokenType.Integer) + { + return (int)value.Value; + } + if (value.Type == JTokenType.String) + { + return ParseInt(value.Value, def); + } + return def; + } + public static async Task GetRestJsonAsync(string url, Action callBack = null) { var httpClient = new HttpClient();