using System; using System.Collections; using System.Collections.Generic; using MPF.Utilities; namespace MPF.Data { public class Options : IDictionary { private Dictionary _settings; #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 dd for Windows /// public string DDPath { get { return GetStringSetting(_settings, "DDPath", "Programs\\DD\\dd.exe"); } set { _settings["DDPath"] = value; } } /// /// Currently selected dumping program /// public InternalProgram InternalProgram { get { string valueString = GetStringSetting(_settings, "InternalProgram", InternalProgram.DiscImageCreator.ToString()); var valueEnum = Converters.ToInternalProgram(valueString); return valueEnum == InternalProgram.NONE ? InternalProgram.DiscImageCreator : valueEnum; } set { _settings["InternalProgram"] = value.ToString(); } } #endregion #region UI Defaults /// /// 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 KnownSystem DefaultSystem { get { string valueString = GetStringSetting(_settings, "DefaultSystem", KnownSystem.NONE.ToString()); var valueEnum = Converters.ToKnownSystem(valueString); return valueEnum ?? KnownSystem.NONE; } set { _settings["DefaultSystem"] = Converters.GetLongName(value); } } #endregion #region Dumping Speeds /// /// Default CD dumping speed /// public int PreferredDumpSpeedCD { get { return GetInt32Setting(_settings, "PreferredDumpSpeedCD", 72); } set { _settings["PreferredDumpSpeedCD"] = value.ToString(); } } /// /// Default DVD dumping speed /// public int PreferredDumpSpeedDVD { get { return GetInt32Setting(_settings, "PreferredDumpSpeedDVD", 24); } set { _settings["PreferredDumpSpeedDVD"] = value.ToString(); } } /// /// Default BD dumping speed /// public int PreferredDumpSpeedBD { get { return GetInt32Setting(_settings, "PreferredDumpSpeedBD", 16); } set { _settings["PreferredDumpSpeedBD"] = value.ToString(); } } #endregion #region Aaru /// /// Enable debug output while dumping by default /// public bool AaruEnableDebug { get { return GetBooleanSetting(_settings, "AaruEnableDebug", false); } set { _settings["AaruEnableDebug"] = value.ToString(); } } /// /// Enable verbose output while dumping by default /// public bool AaruEnableVerbose { get { return GetBooleanSetting(_settings, "AaruEnableVerbose", false); } set { _settings["AaruEnableVerbose"] = value.ToString(); } } /// /// Enable force dumping of media by default /// public bool AaruForceDumping { get { return GetBooleanSetting(_settings, "AaruForceDumping", true); } set { _settings["AaruForceDumping"] = value.ToString(); } } /// /// Default number of sector/subchannel rereads /// public int AaruRereadCount { get { return GetInt32Setting(_settings, "AaruRereadCount", 5); } set { _settings["AaruRereadCount"] = value.ToString(); } } /// /// Strip personal data information from Aaru metadata by default /// public bool AaruStripPersonalData { get { return GetBooleanSetting(_settings, "AaruStripPersonalData", false); } set { _settings["AaruStripPersonalData"] = value.ToString(); } } #endregion #region DiscImageCreator /// /// 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, "DICParanoidMode", false); } set { _settings["DICParanoidMode"] = value.ToString(); } } /// /// Enable the Quiet flag by default /// public bool DICQuietMode { get { return GetBooleanSetting(_settings, "DICQuietMode", false); } set { _settings["DICQuietMode"] = value.ToString(); } } /// /// Default number of C2 rereads /// public int DICRereadCount { get { return GetInt32Setting(_settings, "DICRereadCount", 20); } set { _settings["DICRereadCount"] = value.ToString(); } } /// /// Reset drive after dumping (useful for older drives) /// public bool DICResetDriveAfterDump { get { return GetBooleanSetting(_settings, "DICResetDriveAfterDump", false); } set { _settings["DICResetDriveAfterDump"] = value.ToString(); } } /// /// Use the CMI flag for supported disc types /// public bool DICUseCMIFlag { get { return GetBooleanSetting(_settings, "DICUseCMIFlag", false); } set { _settings["DICUseCMIFlag"] = 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(); } } /// /// Eject the disc after dumping /// public bool EjectAfterDump { get { return GetBooleanSetting(_settings, "EjectAfterDump", false); } set { _settings["EjectAfterDump"] = value.ToString(); } } /// /// Ignore fixed drives when populating the list /// public bool IgnoreFixedDrives { get { return GetBooleanSetting(_settings, "IgnoreFixedDrives", true); } set { _settings["IgnoreFixedDrives"] = value.ToString(); } } /// /// Show dumping tools in their own window instead of in the log /// public bool ToolsInSeparateWindow { get { return GetBooleanSetting(_settings, "ToolsInSeparateWindow", false); } set { _settings["ToolsInSeparateWindow"] = 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 Logging Options public bool VerboseLogging { get { return GetBooleanSetting(_settings, "VerboseLogging", true); } set { _settings["VerboseLogging"] = value.ToString(); } } 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.IsNullOrWhiteSpace(RedumpUsername) && !string.IsNullOrWhiteSpace(RedumpPassword); } #endregion /// /// Constructor taking a dictionary for settings /// /// public Options(Dictionary settings = null) { this._settings = settings ?? new Dictionary(); } #region Helpers /// /// 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; } #endregion #region IDictionary implementations public ICollection Keys => _settings.Keys; public ICollection Values => _settings.Values; public int Count => _settings.Count; public bool IsReadOnly => ((IDictionary)_settings).IsReadOnly; public string this[string key] { get { return (_settings.ContainsKey(key) ? _settings[key] : null); } set { _settings[key] = value; } } public bool ContainsKey(string key) => _settings.ContainsKey(key); public void Add(string key, string value) => _settings.Add(key, value); public bool Remove(string key) => _settings.Remove(key); public bool TryGetValue(string key, out string value) => _settings.TryGetValue(key, out value); public void Add(KeyValuePair item) => _settings.Add(item.Key, item.Value); public void Clear() => _settings.Clear(); public bool Contains(KeyValuePair item) => ((IDictionary)_settings).Contains(item); public void CopyTo(KeyValuePair[] array, int arrayIndex) => ((IDictionary)_settings).CopyTo(array, arrayIndex); public bool Remove(KeyValuePair item) => ((IDictionary)_settings).Remove(item); public IEnumerator> GetEnumerator() => _settings.GetEnumerator(); IEnumerator IEnumerable.GetEnumerator() => _settings.GetEnumerator(); #endregion } }