diff --git a/DICUI/Options.cs b/DICUI/Options.cs
index f47a733b..374a3ce6 100644
--- a/DICUI/Options.cs
+++ b/DICUI/Options.cs
@@ -1,5 +1,6 @@
using System;
using System.Configuration;
+using System.Linq;
using System.Reflection;
using DICUI.Data;
@@ -51,27 +52,114 @@ namespace DICUI
Configuration configFile = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
//TODO: hardcoded, we should find a better way
- DICPath = configFile.AppSettings.Settings["DICPath"].Value ?? @"Programs\DiscImageCreator.exe";
- SubDumpPath = configFile.AppSettings.Settings["SubDumpPath"].Value ?? "subdump.exe";
- DefaultOutputPath = configFile.AppSettings.Settings["DefaultOutputPath"].Value ?? "ISO";
+ this.DICPath = GetStringSetting(configFile, "DICPath", "Programs\\DiscImageCreator.exe");
+ this.SubDumpPath = GetStringSetting(configFile, "SubDumpPath", "subdump.exe");
+ this.DefaultOutputPath = GetStringSetting(configFile, "DefaultOutputPath", "ISO");
- this.PreferredDumpSpeedCD = Int32.TryParse(configFile.AppSettings.Settings["PreferredDumpSpeedCD"].Value, out int maxDumpSpeedCD) ? maxDumpSpeedCD : 72;
- this.PreferredDumpSpeedDVD = Int32.TryParse(configFile.AppSettings.Settings["PreferredDumpSpeedDVD"].Value, out int maxDumpSpeedDVD) ? maxDumpSpeedDVD : 24;
- this.PreferredDumpSpeedBD = Int32.TryParse(configFile.AppSettings.Settings["PreferredDumpSpeedBD"].Value, out int maxDumpSpeedBD) ? maxDumpSpeedBD : 16;
+ this.PreferredDumpSpeedCD = GetInt32Setting(configFile, "PreferredDumpSpeedCD", 72);
+ this.PreferredDumpSpeedDVD = GetInt32Setting(configFile, "PreferredDumpSpeedDVD", 24);
+ this.PreferredDumpSpeedBD = GetInt32Setting(configFile, "PreferredDumpSpeedBD", 16);
- this.QuietMode = Boolean.TryParse(configFile.AppSettings.Settings["QuietMode"].Value, out bool quietMode) ? quietMode : false;
- this.ParanoidMode = Boolean.TryParse(configFile.AppSettings.Settings["ParanoidMode"].Value, out bool paranoidMode) ? paranoidMode : false;
- this.ScanForProtection = Boolean.TryParse(configFile.AppSettings.Settings["ScanForProtection"].Value, out bool scanForProtection) ? scanForProtection : true;
- this.SkipMediaTypeDetection = Boolean.TryParse(configFile.AppSettings.Settings["SkipMediaTypeDetection"].Value, out bool skipMediaTypeDetection) ? skipMediaTypeDetection : false;
- this.RereadAmountForC2 = Int32.TryParse(configFile.AppSettings.Settings["RereadAmountForC2"].Value, out int rereadAmountForC2) ? rereadAmountForC2 : 20;
- this.VerboseLogging = Boolean.TryParse(configFile.AppSettings.Settings["VerboseLogging"].Value, out bool verboseLogging) ? verboseLogging : true;
- this.OpenLogWindowAtStartup = Boolean.TryParse(configFile.AppSettings.Settings["OpenLogWindowAtStartup"].Value, out bool openLogWindowAtStartup) ? openLogWindowAtStartup : true;
- this.AddPlaceholders = Boolean.TryParse(configFile.AppSettings.Settings["AddPlaceholders"].Value, out bool addPlaceholders) ? addPlaceholders : true;
+ this.QuietMode = GetBooleanSetting(configFile, "QuietMode", false);
+ this.ParanoidMode = GetBooleanSetting(configFile, "ParanoidMode", false);
+ this.ScanForProtection = GetBooleanSetting(configFile, "ScanForProtection", true);
+ this.SkipMediaTypeDetection = GetBooleanSetting(configFile, "SkipMediaTypeDetection", false);
+ this.RereadAmountForC2 = GetInt32Setting(configFile, "RereadAmountForC2", 20);
+ this.VerboseLogging = GetBooleanSetting(configFile, "VerboseLogging", true);
+ this.OpenLogWindowAtStartup = GetBooleanSetting(configFile, "OpenLogWindowAtStartup", true);
+ this.AddPlaceholders = GetBooleanSetting(configFile, "AddPlaceholders", true);
- this.Username = configFile.AppSettings.Settings["Username"].Value ?? "";
- this.Password = configFile.AppSettings.Settings["Password"].Value ?? "";
+ this.Username = GetStringSetting(configFile, "Username", "");
+ this.Password = GetStringSetting(configFile, "Password", "");
}
+ ///
+ /// Get a boolean setting from a configuration
+ ///
+ /// Current configuration file
+ /// Setting key to get a value for
+ /// Default value to return if no value is found
+ /// Setting value if possible, default value otherwise
+ public bool GetBooleanSetting(Configuration configFile, string key, bool defaultValue)
+ {
+ var settings = configFile.AppSettings.Settings;
+ if (settings.AllKeys.Contains(key))
+ {
+ if (Boolean.TryParse(settings[key].Value, out bool value))
+ return value;
+ else
+ return defaultValue;
+
+ }
+ else
+ {
+ return defaultValue;
+ }
+ }
+
+ ///
+ /// Get a boolean setting from a configuration
+ ///
+ /// Current configuration file
+ /// Setting key to get a value for
+ /// Default value to return if no value is found
+ /// Setting value if possible, default value otherwise
+ public int GetInt32Setting(Configuration configFile, string key, int defaultValue)
+ {
+ var settings = configFile.AppSettings.Settings;
+ if (settings.AllKeys.Contains(key))
+ {
+ if (Int32.TryParse(settings[key].Value, out int value))
+ return value;
+ else
+ return defaultValue;
+
+ }
+ else
+ {
+ return defaultValue;
+ }
+ }
+
+ ///
+ /// Get a boolean setting from a configuration
+ ///
+ /// Current configuration file
+ /// Setting key to get a value for
+ /// Default value to return if no value is found
+ /// Setting value if possible, default value otherwise
+ public long GetInt64Setting(Configuration configFile, string key, long defaultValue)
+ {
+ var settings = configFile.AppSettings.Settings;
+ if (settings.AllKeys.Contains(key))
+ {
+ if (Int64.TryParse(settings[key].Value, out long value))
+ return value;
+ else
+ return defaultValue;
+
+ }
+ else
+ {
+ return defaultValue;
+ }
+ }
+
+ ///
+ /// Get a boolean setting from a configuration
+ ///
+ /// Current configuration file
+ /// Setting key to get a value for
+ /// Default value to return if no value is found
+ /// Setting value if possible, default value otherwise
+ public string GetStringSetting(Configuration configFile, string key, string defaultValue)
+ {
+ var settings = configFile.AppSettings.Settings;
+ if (settings.AllKeys.Contains(key))
+ return settings[key].Value;
+ else
+ return defaultValue;
+ }
//TODO: probably should be generic for non-string options
//TODO: using reflection for Set and Get is orthodox but it works, should be changed to a key,value map probably