using System.Collections.Generic; using SabreTools.RedumpLib.Data; using AaruSettings = MPF.ExecutionContexts.Aaru.SettingConstants; using DICSettings = MPF.ExecutionContexts.DiscImageCreator.SettingConstants; using RedumperReadMethod = MPF.ExecutionContexts.Redumper.ReadMethod; using RedumperSectorOrder = MPF.ExecutionContexts.Redumper.SectorOrder; using RedumperSettings = MPF.ExecutionContexts.Redumper.SettingConstants; namespace MPF.Frontend { public class Options { /// /// All settings in the form of a dictionary /// public Dictionary Settings { get; private set; } /// /// Indicate if the program is being run with a clean configuration /// public bool FirstRun { get { return GetBooleanSetting(Settings, "FirstRun", true); } set { Settings["FirstRun"] = value.ToString(); } } #region Internal Program /// /// Path to Aaru /// public string? AaruPath { get { return GetStringSetting(Settings, "AaruPath", "Programs\\Aaru\\Aaru.exe"); } set { Settings["AaruPath"] = value; } } /// /// Path to DiscImageCreator /// public string? DiscImageCreatorPath { get { return GetStringSetting(Settings, "DiscImageCreatorPath", "Programs\\Creator\\DiscImageCreator.exe"); } set { Settings["DiscImageCreatorPath"] = value; } } /// /// Path to Redumper /// public string? RedumperPath { get { return GetStringSetting(Settings, "RedumperPath", "Programs\\Redumper\\redumper.exe"); } set { Settings["RedumperPath"] = value; } } /// /// Currently selected dumping program /// public InternalProgram InternalProgram { get { var valueString = GetStringSetting(Settings, "InternalProgram", InternalProgram.Redumper.ToString()); var valueEnum = ToInternalProgram(valueString); return valueEnum == InternalProgram.NONE ? InternalProgram.Redumper : valueEnum; } set { Settings["InternalProgram"] = value.ToString(); } } #endregion #region UI Defaults /// /// Enable dark mode for UI elements /// public bool EnableDarkMode { get { return GetBooleanSetting(Settings, "EnableDarkMode", false); } set { Settings["EnableDarkMode"] = value.ToString(); } } /// /// Enable purple mode for UI elements /// public bool EnablePurpMode { get { return GetBooleanSetting(Settings, "EnablePurpMode", false); } set { Settings["EnablePurpMode"] = value.ToString(); } } /// /// Custom color setting /// public string? CustomBackgroundColor { get { return GetStringSetting(Settings, "CustomBackgroundColor", null); } set { Settings["CustomBackgroundColor"] = value; } } /// /// Custom color setting /// public string? CustomTextColor { get { return GetStringSetting(Settings, "CustomTextColor", null); } set { Settings["CustomTextColor"] = value; } } /// /// Check for updates on startup /// public bool CheckForUpdatesOnStartup { get { return GetBooleanSetting(Settings, "CheckForUpdatesOnStartup", true); } set { Settings["CheckForUpdatesOnStartup"] = value.ToString(); } } /// /// Fast update label - Skips disc checks and updates path only /// public bool FastUpdateLabel { get { return GetBooleanSetting(Settings, "FastUpdateLabel", false); } set { Settings["FastUpdateLabel"] = value.ToString(); } } /// /// Default output path for dumps /// public string? DefaultOutputPath { get { return GetStringSetting(Settings, "DefaultOutputPath", "ISO"); } set { Settings["DefaultOutputPath"] = value; } } /// /// Default system if none can be detected /// public RedumpSystem? DefaultSystem { get { var valueString = GetStringSetting(Settings, "DefaultSystem", null); var valueEnum = Extensions.ToRedumpSystem(valueString ?? string.Empty); return valueEnum; } set { Settings["DefaultSystem"] = value.LongName(); } } /// /// Default output path for dumps /// /// This is a hidden setting public bool ShowDebugViewMenuItem { get { return GetBooleanSetting(Settings, "ShowDebugViewMenuItem", false); } set { Settings["ShowDebugViewMenuItem"] = value.ToString(); } } #endregion #region Dumping Speeds /// /// Default CD dumping speed /// public int PreferredDumpSpeedCD { get { return GetInt32Setting(Settings, "PreferredDumpSpeedCD", 24); } set { Settings["PreferredDumpSpeedCD"] = value.ToString(); } } /// /// Default DVD dumping speed /// public int PreferredDumpSpeedDVD { get { return GetInt32Setting(Settings, "PreferredDumpSpeedDVD", 16); } set { Settings["PreferredDumpSpeedDVD"] = value.ToString(); } } /// /// Default HD-DVD dumping speed /// public int PreferredDumpSpeedHDDVD { get { return GetInt32Setting(Settings, "PreferredDumpSpeedHDDVD", 8); } set { Settings["PreferredDumpSpeedHDDVD"] = value.ToString(); } } /// /// Default BD dumping speed /// public int PreferredDumpSpeedBD { get { return GetInt32Setting(Settings, "PreferredDumpSpeedBD", 8); } set { Settings["PreferredDumpSpeedBD"] = value.ToString(); } } #endregion #region Aaru /// /// Enable debug output while dumping by default /// public bool AaruEnableDebug { get { return GetBooleanSetting(Settings, AaruSettings.EnableDebug, AaruSettings.EnableDebugDefault); } set { Settings[AaruSettings.EnableDebug] = value.ToString(); } } /// /// Enable verbose output while dumping by default /// public bool AaruEnableVerbose { get { return GetBooleanSetting(Settings, AaruSettings.EnableVerbose, AaruSettings.EnableVerboseDefault); } set { Settings[AaruSettings.EnableVerbose] = value.ToString(); } } /// /// Enable force dumping of media by default /// public bool AaruForceDumping { get { return GetBooleanSetting(Settings, AaruSettings.ForceDumping, AaruSettings.ForceDumpingDefault); } set { Settings[AaruSettings.ForceDumping] = value.ToString(); } } /// /// Default number of sector/subchannel rereads /// public int AaruRereadCount { get { return GetInt32Setting(Settings, AaruSettings.RereadCount, AaruSettings.RereadCountDefault); } set { Settings[AaruSettings.RereadCount] = value.ToString(); } } /// /// Strip personal data information from Aaru metadata by default /// public bool AaruStripPersonalData { get { return GetBooleanSetting(Settings, AaruSettings.StripPersonalData, AaruSettings.StripPersonalDataDefault); } set { Settings[AaruSettings.StripPersonalData] = value.ToString(); } } #endregion #region DiscImageCreator /// /// Enable multi-sector read flag by default /// public bool DICMultiSectorRead { get { return GetBooleanSetting(Settings, DICSettings.MultiSectorRead, DICSettings.MultiSectorReadDefault); } set { Settings[DICSettings.MultiSectorRead] = value.ToString(); } } /// /// Include a default multi-sector read value /// public int DICMultiSectorReadValue { get { return GetInt32Setting(Settings, DICSettings.MultiSectorReadValue, DICSettings.MultiSectorReadValueDefault); } set { Settings[DICSettings.MultiSectorReadValue] = value.ToString(); } } /// /// Enable overly-secure dumping flags by default /// /// /// Split this into component parts later. Currently does: /// - Scan sector protection and set subchannel read level to 2 for CD /// - Set scan file protect flag for DVD /// public bool DICParanoidMode { get { return GetBooleanSetting(Settings, DICSettings.ParanoidMode, DICSettings.ParanoidModeDefault); } set { Settings[DICSettings.ParanoidMode] = value.ToString(); } } /// /// Enable the Quiet flag by default /// public bool DICQuietMode { get { return GetBooleanSetting(Settings, DICSettings.QuietMode, DICSettings.QuietModeDefault); } set { Settings[DICSettings.QuietMode] = value.ToString(); } } /// /// Default number of C2 rereads /// public int DICRereadCount { get { return GetInt32Setting(Settings, DICSettings.RereadCount, DICSettings.RereadCountDefault); } set { Settings[DICSettings.RereadCount] = value.ToString(); } } /// /// Default number of DVD/HD-DVD/BD rereads /// public int DICDVDRereadCount { get { return GetInt32Setting(Settings, DICSettings.DVDRereadCount, DICSettings.DVDRereadCountDefault); } set { Settings[DICSettings.DVDRereadCount] = value.ToString(); } } /// /// Use the CMI flag for supported disc types /// public bool DICUseCMIFlag { get { return GetBooleanSetting(Settings, DICSettings.UseCMIFlag, DICSettings.UseCMIFlagDefault); } set { Settings[DICSettings.UseCMIFlag] = value.ToString(); } } #endregion #region Redumper /// /// Enable debug output while dumping by default /// public bool RedumperEnableDebug { get { return GetBooleanSetting(Settings, RedumperSettings.EnableDebug, RedumperSettings.EnableDebugDefault); } set { Settings[RedumperSettings.EnableDebug] = value.ToString(); } } /// /// Enable Redumper custom lead-in retries for Plextor drives /// public bool RedumperEnableLeadinRetry { get { return GetBooleanSetting(Settings, RedumperSettings.EnableLeadinRetry, RedumperSettings.EnableLeadinRetryDefault); } set { Settings[RedumperSettings.EnableLeadinRetry] = value.ToString(); } } /// /// Enable verbose output while dumping by default /// public bool RedumperEnableVerbose { get { return GetBooleanSetting(Settings, RedumperSettings.EnableVerbose, RedumperSettings.EnableVerboseDefault); } set { Settings[RedumperSettings.EnableVerbose] = value.ToString(); } } /// /// Default number of redumper Plextor leadin retries /// public int RedumperLeadinRetryCount { get { return GetInt32Setting(Settings, RedumperSettings.LeadinRetryCount, RedumperSettings.LeadinRetryCountDefault); } set { Settings[RedumperSettings.LeadinRetryCount] = value.ToString(); } } /// /// Enable options incompatible with redump submissions /// public bool RedumperNonRedumpMode { get { return GetBooleanSetting(Settings, "RedumperNonRedumpMode", false); } set { Settings["RedumperNonRedumpMode"] = value.ToString(); } } /// /// Enable generic drive type by default with Redumper /// public bool RedumperUseGenericDriveType { get { return GetBooleanSetting(Settings, RedumperSettings.UseGenericDriveType, RedumperSettings.UseGenericDriveTypeDefault); } set { Settings[RedumperSettings.UseGenericDriveType] = value.ToString(); } } /// /// Currently selected default redumper read method /// public RedumperReadMethod RedumperReadMethod { get { var valueString = GetStringSetting(Settings, RedumperSettings.ReadMethod, RedumperSettings.ReadMethodDefault); return valueString.ToRedumperReadMethod(); } set { Settings[RedumperSettings.ReadMethod] = value.ToString(); } } /// /// Currently selected default redumper sector order /// public RedumperSectorOrder RedumperSectorOrder { get { var valueString = GetStringSetting(Settings, RedumperSettings.SectorOrder, RedumperSettings.SectorOrderDefault); return valueString.ToRedumperSectorOrder(); } set { Settings[RedumperSettings.SectorOrder] = value.ToString(); } } /// /// Default number of rereads /// public int RedumperRereadCount { get { return GetInt32Setting(Settings, RedumperSettings.RereadCount, RedumperSettings.RereadCountDefault); } set { Settings[RedumperSettings.RereadCount] = value.ToString(); } } #endregion #region Extra Dumping Options /// /// Scan the disc for protection after dumping /// public bool ScanForProtection { get { return GetBooleanSetting(Settings, "ScanForProtection", true); } set { Settings["ScanForProtection"] = value.ToString(); } } /// /// Add placeholder values in the submission info /// public bool AddPlaceholders { get { return GetBooleanSetting(Settings, "AddPlaceholders", true); } set { Settings["AddPlaceholders"] = value.ToString(); } } /// /// Show the disc information window after dumping /// public bool PromptForDiscInformation { get { return GetBooleanSetting(Settings, "PromptForDiscInformation", true); } set { Settings["PromptForDiscInformation"] = value.ToString(); } } /// /// Pull all information from Redump if signed in /// public bool PullAllInformation { get { return GetBooleanSetting(Settings, "PullAllInformation", false); } set { Settings["PullAllInformation"] = value.ToString(); } } /// /// Enable tabs in all input fields /// public bool EnableTabsInInputFields { get { return GetBooleanSetting(Settings, "EnableTabsInInputFields", false); } set { Settings["EnableTabsInInputFields"] = value.ToString(); } } /// /// Limit outputs to Redump-supported values only /// public bool EnableRedumpCompatibility { get { return GetBooleanSetting(Settings, "EnableRedumpCompatibility", true); } set { Settings["EnableRedumpCompatibility"] = value.ToString(); } } /// /// Show disc eject reminder before the disc information window is shown /// public bool ShowDiscEjectReminder { get { return GetBooleanSetting(Settings, "ShowDiscEjectReminder", true); } set { Settings["ShowDiscEjectReminder"] = value.ToString(); } } /// /// Ignore fixed drives when populating the list /// public bool IgnoreFixedDrives { get { return GetBooleanSetting(Settings, "IgnoreFixedDrives", true); } set { Settings["IgnoreFixedDrives"] = value.ToString(); } } /// /// Add the dump filename as a suffix to the auto-generated files /// public bool AddFilenameSuffix { get { return GetBooleanSetting(Settings, "AddFilenameSuffix", false); } set { Settings["AddFilenameSuffix"] = value.ToString(); } } /// /// Output the compressed JSON version of the submission info /// public bool OutputSubmissionJSON { get { return GetBooleanSetting(Settings, "OutputSubmissionJSON", false); } set { Settings["OutputSubmissionJSON"] = value.ToString(); } } /// /// Include log files in serialized JSON data /// public bool IncludeArtifacts { get { return GetBooleanSetting(Settings, "IncludeArtifacts", false); } set { Settings["IncludeArtifacts"] = value.ToString(); } } /// /// Compress output log files to reduce space /// public bool CompressLogFiles { get { return GetBooleanSetting(Settings, "CompressLogFiles", true); } set { Settings["CompressLogFiles"] = value.ToString(); } } /// /// Delete unnecessary files to reduce space /// public bool DeleteUnnecessaryFiles { get { return GetBooleanSetting(Settings, "DeleteUnnecessaryFiles", false); } set { Settings["DeleteUnnecessaryFiles"] = value.ToString(); } } /// /// Create a PS3 IRD file after dumping PS3 BD-ROM discs /// public bool CreateIRDAfterDumping { get { return GetBooleanSetting(Settings, "CreateIRDAfterDumping", false); } set { Settings["CreateIRDAfterDumping"] = value.ToString(); } } #endregion #region Skip Options /// /// Skip detecting media type on disc scan /// public bool SkipMediaTypeDetection { get { return GetBooleanSetting(Settings, "SkipMediaTypeDetection", false); } set { Settings["SkipMediaTypeDetection"] = value.ToString(); } } /// /// Skip detecting known system on disc scan /// public bool SkipSystemDetection { get { return GetBooleanSetting(Settings, "SkipSystemDetection", false); } set { Settings["SkipSystemDetection"] = value.ToString(); } } #endregion #region Protection Scanning Options /// /// Scan archive contents during protection scanning /// public bool ScanArchivesForProtection { get { return GetBooleanSetting(Settings, "ScanArchivesForProtection", true); } set { Settings["ScanArchivesForProtection"] = value.ToString(); } } /// /// Scan for executable packers during protection scanning /// public bool ScanPackersForProtection { get { return GetBooleanSetting(Settings, "ScanPackersForProtection", false); } set { Settings["ScanPackersForProtection"] = value.ToString(); } } /// /// Include debug information with scan results /// public bool IncludeDebugProtectionInformation { get { return GetBooleanSetting(Settings, "IncludeDebugProtectionInformation", false); } set { Settings["IncludeDebugProtectionInformation"] = value.ToString(); } } /// /// Remove drive letters from protection scan output /// public bool HideDriveLetters { get { return GetBooleanSetting(Settings, "HideDriveLetters", false); } set { Settings["HideDriveLetters"] = value.ToString(); } } #endregion #region Logging Options /// /// Enable verbose and debug logs to be written /// public bool VerboseLogging { get { return GetBooleanSetting(Settings, "VerboseLogging", true); } set { Settings["VerboseLogging"] = value.ToString(); } } /// /// Have the log panel expanded by default on startup /// public bool OpenLogWindowAtStartup { get { return GetBooleanSetting(Settings, "OpenLogWindowAtStartup", true); } set { Settings["OpenLogWindowAtStartup"] = value.ToString(); } } #endregion #region Redump Login Information public string? RedumpUsername { get { return GetStringSetting(Settings, "RedumpUsername", ""); } set { Settings["RedumpUsername"] = value; } } // TODO: Figure out a way to keep this encrypted in some way, BASE64 to start? public string? RedumpPassword { get { return GetStringSetting(Settings, "RedumpPassword", ""); } set { Settings["RedumpPassword"] = value; } } /// /// Determine if a complete set of Redump credentials might exist /// public bool HasRedumpLogin { get => !string.IsNullOrEmpty(RedumpUsername) && !string.IsNullOrEmpty(RedumpPassword); } #endregion /// /// Constructor taking a dictionary for settings /// /// public Options(Dictionary? settings = null) { this.Settings = settings ?? []; } /// /// Constructor taking an existing Options object /// /// public Options(Options? source) { Settings = new Dictionary(source?.Settings ?? []); } /// /// Accessor for the internal dictionary /// public string? this[string key] { get => this.Settings[key]; set => this.Settings[key] = value; } #region Helpers /// /// Get the InternalProgram enum value for a given string /// /// String value to convert /// InternalProgram represented by the string, if possible public static InternalProgram ToInternalProgram(string? internalProgram) { return (internalProgram?.ToLowerInvariant()) switch { // Dumping support "aaru" or "chef" or "dichef" or "discimagechef" => InternalProgram.Aaru, "creator" or "dic" or "dicreator" or "discimagecreator" => InternalProgram.DiscImageCreator, "rd" or "redumper" => InternalProgram.Redumper, // Verification support only "cleanrip" or "cr" => InternalProgram.CleanRip, "ps3cfw" or "ps3" or "getkey" or "managunz" or "multiman" => InternalProgram.PS3CFW, "uic" or "umd" or "umdcreator" or "umdimagecreator" => InternalProgram.UmdImageCreator, "xbc" or "xbox" or "xbox360" or "xboxcreator" or "xboxbackupcreator" => InternalProgram.XboxBackupCreator, _ => InternalProgram.NONE, }; } /// /// 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 static bool GetBooleanSetting(Dictionary settings, string key, bool defaultValue) { if (settings.ContainsKey(key)) { if (bool.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 static int GetInt32Setting(Dictionary settings, string key, int defaultValue) { if (settings.ContainsKey(key)) { if (int.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 static string? GetStringSetting(Dictionary settings, string key, string? defaultValue) { if (settings.ContainsKey(key)) return settings[key]; else return defaultValue; } #endregion } }