From 674244418261c46f87a9c28534b6129d5ccb8a4b Mon Sep 17 00:00:00 2001 From: Matt Nadareski Date: Wed, 6 May 2020 14:24:37 -0700 Subject: [PATCH] Start reorganizing options and internals --- DICUI.Check/Program.cs | 10 +- DICUI.Library/DICUI.Library.csproj | 4 +- DICUI.Library/Data/Options.cs | 169 +++++++++++++++++ DICUI.Library/Utilities/DumpEnvironment.cs | 98 ++++++++-- DICUI/Options.cs | 211 --------------------- DICUI/UIOptions.cs | 98 ++++++++++ DICUI/ViewModels.cs | 70 +++---- DICUI/Windows/MainWindow.xaml.cs | 108 +++-------- DICUI/Windows/OptionsWindow.xaml.cs | 24 +-- 9 files changed, 429 insertions(+), 363 deletions(-) create mode 100644 DICUI.Library/Data/Options.cs delete mode 100644 DICUI/Options.cs create mode 100644 DICUI/UIOptions.cs diff --git a/DICUI.Check/Program.cs b/DICUI.Check/Program.cs index e4d0b9c5..a86ac573 100644 --- a/DICUI.Check/Program.cs +++ b/DICUI.Check/Program.cs @@ -102,19 +102,17 @@ namespace DICUI.Check string filepath = Path.GetFullPath(args[i]); // Now populate an environment - var env = new DumpEnvironment + var options = new Options { - OutputDirectory = "", - OutputFilename = filepath, - System = knownSystem, - Type = mediaType, + InternalProgram = internalProgram, ScanForProtection = false, PromptForDiscInformation = false, - InternalProgram = Converters.ToInternalProgram(internalProgram), Username = username, Password = password, }; + + var env = new DumpEnvironment(options, "", filepath, null, knownSystem, mediaType, null); env.FixOutputPaths(); // Finally, attempt to do the output dance diff --git a/DICUI.Library/DICUI.Library.csproj b/DICUI.Library/DICUI.Library.csproj index 714c93d5..a07a2e5d 100644 --- a/DICUI.Library/DICUI.Library.csproj +++ b/DICUI.Library/DICUI.Library.csproj @@ -6,11 +6,11 @@ true - + NET_FRAMEWORK - + {2735412F-7F64-5B0F-8F00-5D77AFBE261E} 1 diff --git a/DICUI.Library/Data/Options.cs b/DICUI.Library/Data/Options.cs new file mode 100644 index 00000000..ee5ed872 --- /dev/null +++ b/DICUI.Library/Data/Options.cs @@ -0,0 +1,169 @@ +using System; +using System.Collections.Generic; + +namespace DICUI.Data +{ + public class Options + { + #region Internal Program + + public string AaruPath { get; set; } + public string CreatorPath { get; set; } + public string DDPath { get; set; } + public string InternalProgram { get; set; } + + #endregion + + #region Extra Paths + + public string DefaultOutputPath { get; set; } + public string SubDumpPath { get; set; } + + #endregion + + #region Dumping Speeds + + public int PreferredDumpSpeedCD { get; set; } + public int PreferredDumpSpeedDVD { get; set; } + public int PreferredDumpSpeedBD { get; set; } + + #endregion + + #region Extra Dumping Options + + public bool QuietMode { get; set; } + public bool ParanoidMode { get; set; } + public bool ScanForProtection { get; set; } + public int RereadAmountForC2 { get; set; } + public bool AddPlaceholders { get; set; } + public bool PromptForDiscInformation { get; set; } + public bool IgnoreFixedDrives { get; set; } + public bool ResetDriveAfterDump { get; set; } + + #endregion + + #region Skip Options + + public bool SkipMediaTypeDetection { get; set; } + public bool SkipSystemDetection { get; set; } + + #endregion + + #region Logging Options + + public bool VerboseLogging { get; set; } + public bool OpenLogWindowAtStartup { get; set; } + + #endregion + + #region Redump Login Information + + public string Username { get; set; } + public string Password { get; set; } + + #endregion + + /// + /// Load settings from a Dictionary + /// + /// Settings dictionary to pull from + public void Load(Dictionary settings) + { + // Internal Program + this.AaruPath = GetStringSetting(settings, "AaruPath", "Programs\\Aaru\\Aaru.exe"); + this.CreatorPath = GetStringSetting(settings, "CreatorPath", "Programs\\Creator\\DiscImageCreator.exe"); + this.DDPath = GetStringSetting(settings, "DDPath", "Programs\\DD\\dd.exe"); + this.InternalProgram = GetStringSetting(settings, "InternalProgram", Data.InternalProgram.DiscImageCreator.ToString()); + + // Extra Paths + this.DefaultOutputPath = GetStringSetting(settings, "DefaultOutputPath", "ISO"); + this.SubDumpPath = GetStringSetting(settings, "SubDumpPath", "Programs\\Subdump\\subdump.exe"); + + // Dumping Speeds + this.PreferredDumpSpeedCD = GetInt32Setting(settings, "PreferredDumpSpeedCD", 72); + this.PreferredDumpSpeedDVD = GetInt32Setting(settings, "PreferredDumpSpeedDVD", 24); + this.PreferredDumpSpeedBD = GetInt32Setting(settings, "PreferredDumpSpeedBD", 16); + + // Extra Dumping Options + this.QuietMode = GetBooleanSetting(settings, "QuietMode", false); + this.ParanoidMode = GetBooleanSetting(settings, "ParanoidMode", false); + this.ScanForProtection = GetBooleanSetting(settings, "ScanForProtection", true); + this.RereadAmountForC2 = GetInt32Setting(settings, "RereadAmountForC2", 20); + this.AddPlaceholders = GetBooleanSetting(settings, "AddPlaceholders", true); + this.PromptForDiscInformation = GetBooleanSetting(settings, "PromptForDiscInformation", true); + this.IgnoreFixedDrives = GetBooleanSetting(settings, "IgnoreFixedDrives", false); + this.ResetDriveAfterDump = GetBooleanSetting(settings, "ResetDriveAfterDump", false); + + // Skip Options + this.SkipMediaTypeDetection = GetBooleanSetting(settings, "SkipMediaTypeDetection", false); + this.SkipSystemDetection = GetBooleanSetting(settings, "SkipSystemDetection", false); + + // Logging Options + this.VerboseLogging = GetBooleanSetting(settings, "VerboseLogging", true); + this.OpenLogWindowAtStartup = GetBooleanSetting(settings, "OpenLogWindowAtStartup", true); + + // Redump Login Information + this.Username = GetStringSetting(settings, "Username", ""); + this.Password = GetStringSetting(settings, "Password", ""); + } + + /// + /// Get a Boolean setting from a settings, dictionary + /// + /// Dictionary representing the settings + /// Setting key to get a value for + /// Default value to return if no value is found + /// Setting value if possible, default value otherwise + private bool GetBooleanSetting(Dictionary settings, string key, bool defaultValue) + { + if (settings.ContainsKey(key)) + { + if (Boolean.TryParse(settings[key], out bool value)) + return value; + else + return defaultValue; + } + else + { + return defaultValue; + } + } + + /// + /// Get an Int32 setting from a settings, dictionary + /// + /// Dictionary representing the settings + /// Setting key to get a value for + /// Default value to return if no value is found + /// Setting value if possible, default value otherwise + private int GetInt32Setting(Dictionary settings, string key, int defaultValue) + { + if (settings.ContainsKey(key)) + { + if (Int32.TryParse(settings[key], out int value)) + return value; + else + return defaultValue; + } + else + { + return defaultValue; + } + } + + /// + /// Get a String setting from a settings, dictionary + /// + /// Dictionary representing the settings + /// Setting key to get a value for + /// Default value to return if no value is found + /// Setting value if possible, default value otherwise + private string GetStringSetting(Dictionary settings, string key, string defaultValue) + { + if (settings.ContainsKey(key)) + return settings[key]; + else + return defaultValue; + } + } +} diff --git a/DICUI.Library/Utilities/DumpEnvironment.cs b/DICUI.Library/Utilities/DumpEnvironment.cs index 81fb1c7b..2bf58424 100644 --- a/DICUI.Library/Utilities/DumpEnvironment.cs +++ b/DICUI.Library/Utilities/DumpEnvironment.cs @@ -18,6 +18,7 @@ namespace DICUI.Utilities /// /// Represents the state of all settings to be used during dumping /// + /// TODO: Look into splitting this up in a more reasonable way public class DumpEnvironment { #region Tool paths @@ -60,16 +61,16 @@ namespace DICUI.Utilities /// public MediaType? Type { get; set; } - /// - /// Parameters object representing what to send to the internal program - /// - public BaseParameters Parameters { get; set; } - /// /// Internal program to run /// public InternalProgram InternalProgram { get; set; } + /// + /// Parameters object representing what to send to the internal program + /// + public BaseParameters Parameters { get; set; } + /// /// Scan for copy protection, where applicable /// @@ -135,10 +136,55 @@ namespace DICUI.Utilities #endregion /// - /// Empty constructor for the rest of the magic + /// Empty constructor for testing only /// - public DumpEnvironment() + /// TODO: Remove this and fix tests + public DumpEnvironment() { } + + /// + /// Constructor for a full DumpEnvironment object from user information + /// + /// + /// + /// + /// + /// + /// + /// + public DumpEnvironment(Options options, + string outputDirectory, + string outputFilename, + Drive drive, + KnownSystem? system, + MediaType? type, + string parameters) { + // Tool paths + this.SubdumpPath = options.SubDumpPath; + + // Output paths + this.OutputDirectory = outputDirectory; + this.OutputFilename = outputFilename; + + // UI information + this.Drive = drive; + this.System = system; + this.Type = type; + this.InternalProgram = Converters.ToInternalProgram(options.InternalProgram); + SetParameters(parameters); + SetInternalToolPath(options); + this.ScanForProtection = options.ScanForProtection; + this.AddPlaceholders = options.AddPlaceholders; + this.PromptForDiscInformation = options.PromptForDiscInformation; + + // Extra arguments + this.QuietMode = options.QuietMode; + this.ParanoidMode = options.ParanoidMode; + this.RereadAmountC2 = options.RereadAmountForC2; + + // Redump login information + this.Username = options.Username; + this.Password = options.Password; } #region Public Functionality @@ -149,23 +195,51 @@ namespace DICUI.Utilities /// String representation of the parameters public void SetParameters(string parameters) { - switch (InternalProgram) + switch (this.InternalProgram) { case InternalProgram.Aaru: - Parameters = new Aaru.Parameters(parameters); + this.Parameters = new Aaru.Parameters(parameters); break; case InternalProgram.DD: - Parameters = new DD.Parameters(parameters); + this.Parameters = new DD.Parameters(parameters); break; case InternalProgram.DiscImageCreator: - Parameters = new DiscImageCreator.Parameters(parameters); + this.Parameters = new DiscImageCreator.Parameters(parameters); break; // This should never happen, but it needs a fallback. default: - Parameters = new DiscImageCreator.Parameters(parameters); + this.Parameters = new DiscImageCreator.Parameters(parameters); + break; + } + } + + /// + /// Set the path on the parameters object based on the intermal program + /// + /// + public void SetInternalToolPath(Options options) + { + switch (this.InternalProgram) + { + case InternalProgram.Aaru: + this.Parameters.Path = options.AaruPath; + break; + + case InternalProgram.DD: + this.Parameters.Path = options.DDPath; + break; + + case InternalProgram.DiscImageCreator: + this.Parameters.Path = options.CreatorPath; + break; + + // This should never happen, but it needs a fallback. + default: + this.InternalProgram = InternalProgram.DiscImageCreator; + this.Parameters.Path = options.CreatorPath; break; } } diff --git a/DICUI/Options.cs b/DICUI/Options.cs deleted file mode 100644 index 2921d564..00000000 --- a/DICUI/Options.cs +++ /dev/null @@ -1,211 +0,0 @@ -using System; -using System.Configuration; -using System.Linq; -using System.Reflection; -using DICUI.Data; - -namespace DICUI -{ - public class Options - { - public string AaruPath { get; private set; } - public string CreatorPath { get; private set; } - public string DDPath { get; private set; } - - public string DefaultOutputPath { get; private set; } - public string SubDumpPath { get; private set; } - - public string InternalProgram { get; set; } - - public int PreferredDumpSpeedCD { get; set; } - public int PreferredDumpSpeedDVD { get; set; } - public int PreferredDumpSpeedBD { get; set; } - - public bool QuietMode { get; set; } - public bool ParanoidMode { get; set; } - public bool ScanForProtection { get; set; } - public int RereadAmountForC2 { get; set; } - public bool AddPlaceholders { get; set; } - public bool PromptForDiscInformation { get; set; } - public bool IgnoreFixedDrives { get; set; } - public bool ResetDriveAfterDump { get; set; } - - public bool SkipMediaTypeDetection { get; set; } - public bool SkipSystemDetection { get; set; } - - public bool VerboseLogging { get; set; } - public bool OpenLogWindowAtStartup { get; set; } - - public string Username { get; set; } - public string Password { get; set; } - - public void Save() - { - Configuration configFile = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None); - - //TODO: reflection is used - //TODO: is remove needed, doesn't the value get directly overridden - Array.ForEach( - GetType().GetProperties(BindingFlags.Public | BindingFlags.Instance), - p => { - configFile.AppSettings.Settings.Remove(p.Name); - configFile.AppSettings.Settings.Add(p.Name, Convert.ToString(p.GetValue(this))); - } - ); - - configFile.Save(ConfigurationSaveMode.Modified); - } - - public void Load() - { - Configuration configFile = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None); - - //TODO: hardcoded, we should find a better way - this.AaruPath = GetStringSetting(configFile, "AaruPath", "Programs\\Aaru\\Aaru.exe"); - this.CreatorPath = GetStringSetting(configFile, "CreatorPath", "Programs\\Creator\\DiscImageCreator.exe"); - this.DDPath = GetStringSetting(configFile, "DDPath", "Programs\\DD\\dd.exe"); - this.SubDumpPath = GetStringSetting(configFile, "SubDumpPath", "Programs\\Subdump\\subdump.exe"); - this.DefaultOutputPath = GetStringSetting(configFile, "DefaultOutputPath", "ISO"); - this.InternalProgram = GetStringSetting(configFile, "InternalProgram", Data.InternalProgram.DiscImageCreator.ToString()); - - this.PreferredDumpSpeedCD = GetInt32Setting(configFile, "PreferredDumpSpeedCD", 72); - this.PreferredDumpSpeedDVD = GetInt32Setting(configFile, "PreferredDumpSpeedDVD", 24); - this.PreferredDumpSpeedBD = GetInt32Setting(configFile, "PreferredDumpSpeedBD", 16); - - 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.SkipSystemDetection = GetBooleanSetting(configFile, "SkipSystemDetection", 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.PromptForDiscInformation = GetBooleanSetting(configFile, "PromptForDiscInformation", true); - this.IgnoreFixedDrives = GetBooleanSetting(configFile, "IgnoreFixedDrives", false); - this.ResetDriveAfterDump = GetBooleanSetting(configFile, "ResetDriveAfterDump", false); - - 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 - public void Set(string key, string value) - { - GetType().GetProperty(key, BindingFlags.Public | BindingFlags.Instance).SetValue(this, value); - } - - public string Get(string key) - { - return GetType().GetProperty(key, BindingFlags.Public | BindingFlags.Instance).GetValue(this) as string; - } - - public int GetPreferredDumpSpeedForMediaType(MediaType? type) - { - switch (type) - { - case MediaType.CDROM: - case MediaType.GDROM: - return PreferredDumpSpeedCD; - case MediaType.DVD: - case MediaType.HDDVD: - case MediaType.NintendoGameCubeGameDisc: - case MediaType.NintendoWiiOpticalDisc: - return PreferredDumpSpeedDVD; - case MediaType.BluRay: - return PreferredDumpSpeedBD; - default: - return 8; - } - } - } -} diff --git a/DICUI/UIOptions.cs b/DICUI/UIOptions.cs new file mode 100644 index 00000000..c78d58ef --- /dev/null +++ b/DICUI/UIOptions.cs @@ -0,0 +1,98 @@ +using System; +using System.Collections.Generic; +using System.Configuration; +using System.Reflection; +using DICUI.Data; + +namespace DICUI +{ + public class UIOptions + { + public Options Options { get; set; } + + /// + /// Default constructor + /// + public UIOptions() + { + Options = new Options(); + } + + /// + /// Move these to some utility class in DICUI application + /// + public void Save() + { + Configuration configFile = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None); + + //TODO: reflection is used + //TODO: is remove needed, doesn't the value get directly overridden + Array.ForEach( + Options.GetType().GetProperties(BindingFlags.Public | BindingFlags.Instance), + p => { + configFile.AppSettings.Settings.Remove(p.Name); + configFile.AppSettings.Settings.Add(p.Name, Convert.ToString(p.GetValue(this))); + } + ); + + configFile.Save(ConfigurationSaveMode.Modified); + } + + public void Load() + { + Configuration configFile = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None); + + var settings = ConvertToDictionary(configFile); + Options.Load(settings); + } + + /// + /// Convert the AppSettings to a dictionary + /// + /// + /// + private Dictionary ConvertToDictionary(Configuration configFile) + { + var settings = configFile.AppSettings.Settings; + var dict = new Dictionary(); + + foreach (string key in settings.AllKeys) + { + dict[key] = settings[key]?.Value ?? string.Empty; + } + + return dict; + } + + //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 + public void Set(string key, string value) + { + Options.GetType().GetProperty(key, BindingFlags.Public | BindingFlags.Instance).SetValue(this, value); + } + + public string Get(string key) + { + return Options.GetType().GetProperty(key, BindingFlags.Public | BindingFlags.Instance).GetValue(this) as string; + } + + public int GetPreferredDumpSpeedForMediaType(MediaType? type) + { + switch (type) + { + case MediaType.CDROM: + case MediaType.GDROM: + return this.Options.PreferredDumpSpeedCD; + case MediaType.DVD: + case MediaType.HDDVD: + case MediaType.NintendoGameCubeGameDisc: + case MediaType.NintendoWiiOpticalDisc: + return this.Options.PreferredDumpSpeedDVD; + case MediaType.BluRay: + return this.Options.PreferredDumpSpeedBD; + default: + return this.Options.PreferredDumpSpeedCD; + } + } + } +} diff --git a/DICUI/ViewModels.cs b/DICUI/ViewModels.cs index 277de7d5..cf7d4822 100644 --- a/DICUI/ViewModels.cs +++ b/DICUI/ViewModels.cs @@ -6,113 +6,113 @@ namespace DICUI { public class OptionsViewModel { - private Options _options; + private UIOptions _uiOptions; - public OptionsViewModel(Options options) + public OptionsViewModel(UIOptions uiOptions) { - this._options = options; + this._uiOptions = uiOptions; } public string InternalProgram { - get { return _options.InternalProgram; } - set { _options.InternalProgram = value; } + get { return _uiOptions.Options.InternalProgram; } + set { _uiOptions.Options.InternalProgram = value; } } public bool QuietMode { - get { return _options.QuietMode; } - set { _options.QuietMode = value; } + get { return _uiOptions.Options.QuietMode; } + set { _uiOptions.Options.QuietMode = value; } } public bool ParanoidMode { - get { return _options.ParanoidMode; } - set { _options.ParanoidMode = value; } + get { return _uiOptions.Options.ParanoidMode; } + set { _uiOptions.Options.ParanoidMode = value; } } public bool ScanForProtection { - get { return _options.ScanForProtection; } - set { _options.ScanForProtection = value; } + get { return _uiOptions.Options.ScanForProtection; } + set { _uiOptions.Options.ScanForProtection = value; } } public string RereadAmountForC2 { - get { return Convert.ToString(_options.RereadAmountForC2); } + get { return Convert.ToString(_uiOptions.Options.RereadAmountForC2); } set { if (Int32.TryParse(value, out int result)) - _options.RereadAmountForC2 = result; + _uiOptions.Options.RereadAmountForC2 = result; } } public bool AddPlaceholders { - get { return _options.AddPlaceholders; } - set { _options.AddPlaceholders = value; } + get { return _uiOptions.Options.AddPlaceholders; } + set { _uiOptions.Options.AddPlaceholders = value; } } public bool PromptForDiscInformation { - get { return _options.PromptForDiscInformation; } - set { _options.PromptForDiscInformation = value; } + get { return _uiOptions.Options.PromptForDiscInformation; } + set { _uiOptions.Options.PromptForDiscInformation = value; } } public bool IgnoreFixedDrives { - get { return _options.IgnoreFixedDrives; } - set { _options.IgnoreFixedDrives = value; } + get { return _uiOptions.Options.IgnoreFixedDrives; } + set { _uiOptions.Options.IgnoreFixedDrives = value; } } public bool ResetDriveAfterDump { - get { return _options.ResetDriveAfterDump; } - set { _options.ResetDriveAfterDump = value; } + get { return _uiOptions.Options.ResetDriveAfterDump; } + set { _uiOptions.Options.ResetDriveAfterDump = value; } } public bool SkipMediaTypeDetection { - get { return _options.SkipMediaTypeDetection; } - set { _options.SkipMediaTypeDetection = value; } + get { return _uiOptions.Options.SkipMediaTypeDetection; } + set { _uiOptions.Options.SkipMediaTypeDetection = value; } } public bool SkipSystemDetection { - get { return _options.SkipSystemDetection; } - set { _options.SkipSystemDetection = value; } + get { return _uiOptions.Options.SkipSystemDetection; } + set { _uiOptions.Options.SkipSystemDetection = value; } } public bool VerboseLogging { - get { return _options.VerboseLogging; } + get { return _uiOptions.Options.VerboseLogging; } set { - _options.VerboseLogging = value; - _options.Save(); + _uiOptions.Options.VerboseLogging = value; + _uiOptions.Save(); } } public bool OpenLogWindowAtStartup { - get { return _options.OpenLogWindowAtStartup; } + get { return _uiOptions.Options.OpenLogWindowAtStartup; } set { - _options.OpenLogWindowAtStartup = value; - _options.Save(); + _uiOptions.Options.OpenLogWindowAtStartup = value; + _uiOptions.Save(); } } public string Username { - get { return _options.Username; } - set { _options.Username = value; } + get { return _uiOptions.Options.Username; } + set { _uiOptions.Options.Username = value; } } public string Password { - get { return _options.Password; } - set { _options.Password = value; } + get { return _uiOptions.Options.Password; } + set { _uiOptions.Options.Password = value; } } } diff --git a/DICUI/Windows/MainWindow.xaml.cs b/DICUI/Windows/MainWindow.xaml.cs index f9eceafb..46c59412 100644 --- a/DICUI/Windows/MainWindow.xaml.cs +++ b/DICUI/Windows/MainWindow.xaml.cs @@ -26,7 +26,7 @@ namespace DICUI.Windows private DumpEnvironment _env; // Option related - private Options _options; + private UIOptions _uiOptions; private OptionsWindow _optionsWindow; // User input related @@ -39,9 +39,9 @@ namespace DICUI.Windows InitializeComponent(); // Initializes and load Options object - _options = new Options(); - _options.Load(); - ViewModels.OptionsViewModel = new OptionsViewModel(_options); + _uiOptions = new UIOptions(); + _uiOptions.Load(); + ViewModels.OptionsViewModel = new OptionsViewModel(_uiOptions); _logWindow = new LogWindow(this); ViewModels.LoggerViewModel.SetWindow(_logWindow); @@ -51,7 +51,7 @@ namespace DICUI.Windows DiskScanButton.IsEnabled = false; CopyProtectScanButton.IsEnabled = false; - if (_options.OpenLogWindowAtStartup) + if (_uiOptions.Options.OpenLogWindowAtStartup) { this.WindowStartupLocation = WindowStartupLocation.Manual; double combinedHeight = this.Height + _logWindow.Height + Constants.LogWindowMarginFromMainWindow; @@ -73,7 +73,7 @@ namespace DICUI.Windows _alreadyShown = true; - if (_options.OpenLogWindowAtStartup) + if (_uiOptions.Options.OpenLogWindowAtStartup) { //TODO: this should be bound directly to WindowVisible property in two way fashion // we need to study how to properly do it in XAML @@ -109,7 +109,7 @@ namespace DICUI.Windows _env.EjectDisc(); } - if (_options.ResetDriveAfterDump) + if (_uiOptions.Options.ResetDriveAfterDump) { ViewModels.LoggerViewModel.VerboseLogLn($"Resetting drive {_env.Drive.Letter}"); _env.ResetDrive(); @@ -242,7 +242,7 @@ namespace DICUI.Windows // lazy initialization if (_optionsWindow == null) { - _optionsWindow = new OptionsWindow(this, _options); + _optionsWindow = new OptionsWindow(this, _uiOptions); _optionsWindow.Closed += delegate { _optionsWindow = null; @@ -369,7 +369,7 @@ namespace DICUI.Windows DiskScanButton.IsEnabled = true; // Populate the list of drives and add it to the combo box - _drives = Validators.CreateListOfDrives(_options.IgnoreFixedDrives); + _drives = Validators.CreateListOfDrives(_uiOptions.Options.IgnoreFixedDrives); DriveLetterComboBox.ItemsSource = _drives; if (DriveLetterComboBox.Items.Count > 0) @@ -391,7 +391,7 @@ namespace DICUI.Windows CopyProtectScanButton.IsEnabled = true; // Get the current media type - if (!_options.SkipSystemDetection && index != -1) + if (!_uiOptions.Options.SkipSystemDetection && index != -1) { ViewModels.LoggerViewModel.VerboseLog("Trying to detect system for drive {0}.. ", _drives[index].Letter); var currentSystem = Validators.GetKnownSystem(_drives[index]); @@ -441,54 +441,13 @@ namespace DICUI.Windows private DumpEnvironment DetermineEnvironment() { // Populate the new environment - var env = new DumpEnvironment() - { - // Paths to tools - SubdumpPath = _options.SubDumpPath, - InternalProgram = Converters.ToInternalProgram(_options.InternalProgram), - - OutputDirectory = OutputDirectoryTextBox.Text, - OutputFilename = OutputFilenameTextBox.Text, - - // Get the currently selected options - Drive = DriveLetterComboBox.SelectedItem as Drive, - - QuietMode = _options.QuietMode, - ParanoidMode = _options.ParanoidMode, - ScanForProtection = _options.ScanForProtection, - RereadAmountC2 = _options.RereadAmountForC2, - AddPlaceholders = _options.AddPlaceholders, - PromptForDiscInformation = _options.PromptForDiscInformation, - - Username = _options.Username, - Password = _options.Password, - - System = SystemTypeComboBox.SelectedItem as KnownSystemComboBoxItem, - Type = MediaTypeComboBox.SelectedItem as MediaType?, - }; - - // Set parameters and path accordingly - env.SetParameters(ParametersTextBox.Text); - switch (env.InternalProgram) - { - case InternalProgram.Aaru: - env.Parameters.Path = _options.AaruPath; - break; - - case InternalProgram.DD: - env.Parameters.Path = _options.DDPath; - break; - - case InternalProgram.DiscImageCreator: - env.Parameters.Path = _options.CreatorPath; - break; - - // This should never happen, but it needs a fallback. - default: - env.InternalProgram = InternalProgram.DiscImageCreator; - env.Parameters.Path = _options.CreatorPath; - break; - } + var env = new DumpEnvironment(_uiOptions.Options, + OutputDirectoryTextBox.Text, + OutputFilenameTextBox.Text, + DriveLetterComboBox.SelectedItem as Drive, + SystemTypeComboBox.SelectedItem as KnownSystemComboBoxItem, + MediaTypeComboBox.SelectedItem as MediaType?, + ParametersTextBox.Text); // Disable automatic reprocessing of the textboxes until we're done OutputDirectoryTextBox.TextChanged -= OutputDirectoryTextBoxTextChanged; @@ -585,7 +544,7 @@ namespace DICUI.Windows // Verify dump output and save it result = _env.VerifyAndSaveDumpOutput(progress, EjectWhenDoneCheckBox.IsChecked, - _options.ResetDriveAfterDump, + _uiOptions.Options.ResetDriveAfterDump, (si) => { // lazy initialization @@ -668,7 +627,7 @@ namespace DICUI.Windows // Set the output directory, if we changed drives or it's not already if (driveChanged || string.IsNullOrEmpty(OutputDirectoryTextBox.Text)) - OutputDirectoryTextBox.Text = Path.Combine(_options.DefaultOutputPath, drive?.VolumeLabel ?? string.Empty); + OutputDirectoryTextBox.Text = Path.Combine(_uiOptions.Options.DefaultOutputPath, drive?.VolumeLabel ?? string.Empty); // Get the extension for the file for the next two statements string extension = null; @@ -744,31 +703,10 @@ namespace DICUI.Windows DriveSpeedComboBox.ItemsSource = values; ViewModels.LoggerViewModel.VerboseLogLn("Supported media speeds: {0}", string.Join(",", values)); - // Find the minimum set to compare against - int preferred = 100; - switch (_currentMediaType) - { - case MediaType.CDROM: - case MediaType.GDROM: - preferred = _options.PreferredDumpSpeedCD; - break; - case MediaType.DVD: - case MediaType.HDDVD: - case MediaType.NintendoGameCubeGameDisc: - case MediaType.NintendoWiiOpticalDisc: - preferred = _options.PreferredDumpSpeedDVD; - break; - case MediaType.BluRay: - preferred = _options.PreferredDumpSpeedBD; - break; - default: - preferred = _options.PreferredDumpSpeedCD; - break; - } - // Set the selected speed - ViewModels.LoggerViewModel.VerboseLogLn("Setting drive speed to: {0}", preferred); - DriveSpeedComboBox.SelectedValue = preferred; + int speed = _uiOptions.GetPreferredDumpSpeedForMediaType(_currentMediaType); + ViewModels.LoggerViewModel.VerboseLogLn("Setting drive speed to: {0}", speed); + DriveSpeedComboBox.SelectedValue = speed; } /// @@ -782,7 +720,7 @@ namespace DICUI.Windows return; // Get the current media type - if (!_options.SkipMediaTypeDetection) + if (!_uiOptions.Options.SkipMediaTypeDetection) { ViewModels.LoggerViewModel.VerboseLog("Trying to detect media type for drive {0}.. ", drive.Letter); _currentMediaType = Validators.GetMediaType(drive); diff --git a/DICUI/Windows/OptionsWindow.xaml.cs b/DICUI/Windows/OptionsWindow.xaml.cs index 9f424ac0..97e7d9d2 100644 --- a/DICUI/Windows/OptionsWindow.xaml.cs +++ b/DICUI/Windows/OptionsWindow.xaml.cs @@ -14,9 +14,9 @@ namespace DICUI.Windows public partial class OptionsWindow : Window { private readonly MainWindow _mainWindow; - private readonly Options _options; + private readonly UIOptions _options; - public OptionsWindow(MainWindow mainWindow, Options options) + public OptionsWindow(MainWindow mainWindow, UIOptions options) { InitializeComponent(); _mainWindow = mainWindow; @@ -101,12 +101,12 @@ namespace DICUI.Windows { Array.ForEach(PathSettings(), setting => TextBoxForPathSetting(setting).Text = _options.Get(setting)); - DumpSpeedCDSlider.Value = _options.PreferredDumpSpeedCD; - DumpSpeedDVDSlider.Value = _options.PreferredDumpSpeedDVD; - DumpSpeedBDSlider.Value = _options.PreferredDumpSpeedBD; + DumpSpeedCDSlider.Value = _options.Options.PreferredDumpSpeedCD; + DumpSpeedDVDSlider.Value = _options.Options.PreferredDumpSpeedDVD; + DumpSpeedBDSlider.Value = _options.Options.PreferredDumpSpeedBD; - RedumpUsernameTextBox.Text = _options.Username; - RedumpPasswordBox.Password = _options.Password; + RedumpUsernameTextBox.Text = _options.Options.Username; + RedumpPasswordBox.Password = _options.Options.Password; } #region Event Handlers @@ -115,12 +115,12 @@ namespace DICUI.Windows { Array.ForEach(PathSettings(), setting => _options.Set(setting, TextBoxForPathSetting(setting).Text)); - _options.PreferredDumpSpeedCD = Convert.ToInt32(DumpSpeedCDSlider.Value); - _options.PreferredDumpSpeedDVD = Convert.ToInt32(DumpSpeedDVDSlider.Value); - _options.PreferredDumpSpeedBD = Convert.ToInt32(DumpSpeedBDSlider.Value); + _options.Options.PreferredDumpSpeedCD = Convert.ToInt32(DumpSpeedCDSlider.Value); + _options.Options.PreferredDumpSpeedDVD = Convert.ToInt32(DumpSpeedDVDSlider.Value); + _options.Options.PreferredDumpSpeedBD = Convert.ToInt32(DumpSpeedBDSlider.Value); - _options.Username = RedumpUsernameTextBox.Text; - _options.Password = RedumpPasswordBox.Password; + _options.Options.Username = RedumpUsernameTextBox.Text; + _options.Options.Password = RedumpPasswordBox.Password; _options.Save(); Hide();