diff --git a/CHANGELIST.md b/CHANGELIST.md index 1f5fc241..15bc2fc5 100644 --- a/CHANGELIST.md +++ b/CHANGELIST.md @@ -13,6 +13,7 @@ - Add MPRESS to packer filters - Update RedumpLib to 1.9.1 - Split path creation in OptionsLoader +- Add unused Dreamdump execution context ### 3.6.0 (2025-11-28) diff --git a/MPF.CLI/Features/BaseFeature.cs b/MPF.CLI/Features/BaseFeature.cs index e2aefc9a..09d473d5 100644 --- a/MPF.CLI/Features/BaseFeature.cs +++ b/MPF.CLI/Features/BaseFeature.cs @@ -135,6 +135,15 @@ namespace MPF.CLI.Features break; + // case InternalProgram.Dreamdump: + // if (!File.Exists(Options.DreamdumpPath)) + // { + // Console.Error.WriteLine("A path needs to be supplied in config.json for Dreamdump, exiting..."); + // return false; + // } + + // break; + case InternalProgram.Redumper: if (!File.Exists(Options.RedumperPath)) { diff --git a/MPF.CLI/Features/InteractiveFeature.cs b/MPF.CLI/Features/InteractiveFeature.cs index a67174c8..1d3dcca4 100644 --- a/MPF.CLI/Features/InteractiveFeature.cs +++ b/MPF.CLI/Features/InteractiveFeature.cs @@ -123,6 +123,7 @@ namespace MPF.CLI.Features Console.WriteLine($"{InternalProgram.Redumper.ToString().ToLowerInvariant(),-15} => {InternalProgram.Redumper.LongName()}"); Console.WriteLine($"{InternalProgram.DiscImageCreator.ToString().ToLowerInvariant(),-15} => {InternalProgram.DiscImageCreator.LongName()}"); Console.WriteLine($"{InternalProgram.Aaru.ToString().ToLowerInvariant(),-15} => {InternalProgram.Aaru.LongName()}"); + // Console.WriteLine($"{InternalProgram.Dreamdump.ToString().ToLowerInvariant(),-15} => {InternalProgram.Dreamdump.LongName()}"); Console.WriteLine(); Console.WriteLine("Input the dumping program and press Enter:"); Console.Write("> "); diff --git a/MPF.ExecutionContexts.Test/DreamdumpTests.cs b/MPF.ExecutionContexts.Test/DreamdumpTests.cs new file mode 100644 index 00000000..8a58d04c --- /dev/null +++ b/MPF.ExecutionContexts.Test/DreamdumpTests.cs @@ -0,0 +1,68 @@ +using System.Collections.Generic; +using MPF.ExecutionContexts.Dreamdump; +using SabreTools.RedumpLib.Data; +using Xunit; + +namespace MPF.ExecutionContexts.Test +{ + public class DreamdumpTests + { + #region Default Values + + private static readonly Dictionary AllOptions = new() + { + [SettingConstants.RereadCount] = "1000", + [SettingConstants.SectorOrder] = "DATA_C2_SUB", + }; + + // None of these scenarios are actually supported as all are treated like GD-ROM + [Theory] + [InlineData(null, null, null, "filename.bin", null, "--retries=20 --image-name=\"filename\" --sector-order=DATA_C2_SUB")] + [InlineData(RedumpSystem.IBMPCcompatible, MediaType.CDROM, "/dev/sr0", "path/filename.bin", 2, "--retries=20 --image-name=\"filename\" --image-path=\"path\" --speed=2 --sector-order=DATA_C2_SUB --drive=/dev/sr0")] + [InlineData(RedumpSystem.IBMPCcompatible, MediaType.DVD, "/dev/sr0", "path/filename.bin", 2, "--retries=20 --image-name=\"filename\" --image-path=\"path\" --speed=2 --sector-order=DATA_C2_SUB --drive=/dev/sr0")] + [InlineData(RedumpSystem.NintendoGameCube, MediaType.NintendoGameCubeGameDisc, "/dev/sr0", "path/filename.bin", 2, "--retries=20 --image-name=\"filename\" --image-path=\"path\" --speed=2 --sector-order=DATA_C2_SUB --drive=/dev/sr0")] + [InlineData(RedumpSystem.NintendoWii, MediaType.NintendoWiiOpticalDisc, "/dev/sr0", "path/filename.bin", 2, "--retries=20 --image-name=\"filename\" --image-path=\"path\" --speed=2 --sector-order=DATA_C2_SUB --drive=/dev/sr0")] + [InlineData(RedumpSystem.HDDVDVideo, MediaType.HDDVD, "/dev/sr0", "path/filename.bin", 2, "--retries=20 --image-name=\"filename\" --image-path=\"path\" --speed=2 --sector-order=DATA_C2_SUB --drive=/dev/sr0")] + [InlineData(RedumpSystem.BDVideo, MediaType.BluRay, "/dev/sr0", "path/filename.bin", 2, "--retries=20 --image-name=\"filename\" --image-path=\"path\" --speed=2 --sector-order=DATA_C2_SUB --drive=/dev/sr0")] + [InlineData(RedumpSystem.NintendoWiiU, MediaType.NintendoWiiUOpticalDisc, "/dev/sr0", "path/filename.bin", 2, "--retries=20 --image-name=\"filename\" --image-path=\"path\" --speed=2 --sector-order=DATA_C2_SUB --drive=/dev/sr0")] + public void DefaultValueTest(RedumpSystem? system, + MediaType? type, + string? drivePath, + string filename, + int? driveSpeed, + string? expected) + { + var context = new ExecutionContext(system, type, drivePath, filename, driveSpeed, AllOptions); + string? actual = context.GenerateParameters(); + Assert.Equal(expected, actual); + } + + #endregion + + #region Default + + [Theory] + [InlineData("--force-qtoc --train --retries=20 --image-name=image --image-path=path --read-offset=0 --read-at-once=0 --speed=8 --sector-order=so --drive=/dev/sr0")] + public void DiscTest(string parameters) + { + string? expected = "--force-qtoc --train --retries=20 --image-name=\"image\" --image-path=\"path\" --read-offset=0 --read-at-once=0 --speed=8 --sector-order=so --drive=/dev/sr0"; + var context = new ExecutionContext(parameters); + string? actual = context.GenerateParameters(); + Assert.Equal(expected, actual); + Assert.True(context.IsDumpingCommand()); + } + + [Theory] + [InlineData("--image-name=\"image name.bin\" --image-path=\"directory name\"")] + public void SpacesTest(string parameters) + { + string? expected = "--image-name=\"image name.bin\" --image-path=\"directory name\""; + var context = new ExecutionContext(parameters); + string? actual = context.GenerateParameters(); + Assert.Equal(expected, actual); + Assert.True(context.IsDumpingCommand()); + } + + #endregion + } +} diff --git a/MPF.ExecutionContexts/BaseExecutionContext.cs b/MPF.ExecutionContexts/BaseExecutionContext.cs index d6355438..d265e5b1 100644 --- a/MPF.ExecutionContexts/BaseExecutionContext.cs +++ b/MPF.ExecutionContexts/BaseExecutionContext.cs @@ -294,6 +294,28 @@ namespace MPF.ExecutionContexts return defaultValue; } + /// + /// Get an UInt8 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 + internal static byte GetUInt8Setting(Dictionary settings, string key, byte defaultValue) + { + if (settings.ContainsKey(key)) + { + if (byte.TryParse(settings[key], out byte value)) + return value; + else + return defaultValue; + } + else + { + return defaultValue; + } + } + #endregion #region Parameter Parsing diff --git a/MPF.ExecutionContexts/Dreamdump/CommandStrings.cs b/MPF.ExecutionContexts/Dreamdump/CommandStrings.cs new file mode 100644 index 00000000..bf6407d6 --- /dev/null +++ b/MPF.ExecutionContexts/Dreamdump/CommandStrings.cs @@ -0,0 +1,10 @@ +namespace MPF.ExecutionContexts.Dreamdump +{ + /// + /// Top-level commands for Dreamdump + /// + public static class CommandStrings + { + public const string NONE = ""; + } +} diff --git a/MPF.ExecutionContexts/Dreamdump/Enumerations.cs b/MPF.ExecutionContexts/Dreamdump/Enumerations.cs new file mode 100644 index 00000000..8c6b9241 --- /dev/null +++ b/MPF.ExecutionContexts/Dreamdump/Enumerations.cs @@ -0,0 +1,15 @@ +namespace MPF.ExecutionContexts.Dreamdump +{ + /// + /// Drive sector order option + /// + public enum SectorOrder + { + NONE = 0, + + DATA_C2, + DATA_SUB, + DATA_C2_SUB, + DATA_SUB_C2, + } +} diff --git a/MPF.ExecutionContexts/Dreamdump/ExecutionContext.cs b/MPF.ExecutionContexts/Dreamdump/ExecutionContext.cs new file mode 100644 index 00000000..029dceff --- /dev/null +++ b/MPF.ExecutionContexts/Dreamdump/ExecutionContext.cs @@ -0,0 +1,257 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Text; +using MPF.ExecutionContexts.Data; +using SabreTools.RedumpLib.Data; + +namespace MPF.ExecutionContexts.Dreamdump +{ + /// + /// Represents a generic set of Dreamdump parameters + /// + public sealed class ExecutionContext : BaseExecutionContext + { + #region Generic Dumping Information + + /// + public override string? InputPath + => (_inputs[FlagStrings.Drive] as StringInput)?.Value?.Trim('"'); + + /// + public override string? OutputPath => Path.Combine( + (_inputs[FlagStrings.ImagePath] as StringInput)?.Value?.Trim('"') ?? string.Empty, + (_inputs[FlagStrings.ImageName] as StringInput)?.Value?.Trim('"') ?? string.Empty) + + GetDefaultExtension(MediaType); + + /// + public override int? Speed + { + get + { + return (_inputs[FlagStrings.Speed] as Int32Input)?.Value; + } + set + { + if (value is not null && value > 0) + { + this[FlagStrings.Speed] = true; + (_inputs[FlagStrings.Speed] as Int32Input)?.SetValue(value); + } + else + { + this[FlagStrings.Speed] = false; + (_inputs[FlagStrings.Speed] as Int32Input)?.SetValue(null); + } + } + } + + #endregion + + #region Flag Values + + /// + /// Set of all command flags + /// + private readonly Dictionary _inputs = new() + { + // Special + [FlagStrings.ForceQTOC] = new FlagInput(FlagStrings.ForceQTOC), + [FlagStrings.Train] = new FlagInput(FlagStrings.Train), + [FlagStrings.Retries] = new UInt8Input(FlagStrings.Retries), + + // Paths + [FlagStrings.ImageName] = new StringInput(FlagStrings.ImageName) { Quotes = true }, + [FlagStrings.ImagePath] = new StringInput(FlagStrings.ImagePath) { Quotes = true }, + + // Drive Part + [FlagStrings.ReadOffset] = new Int16Input(FlagStrings.ReadOffset), + [FlagStrings.ReadAtOnce] = new UInt8Input(FlagStrings.ReadAtOnce), + [FlagStrings.Speed] = new UInt16Input(FlagStrings.Speed), + [FlagStrings.SectorOrder] = new StringInput(FlagStrings.SectorOrder), + [FlagStrings.Drive] = new StringInput(FlagStrings.Drive), + }; + + #endregion + + /// + public ExecutionContext(string? parameters) : base(parameters) { } + + /// + public ExecutionContext(RedumpSystem? system, + MediaType? type, + string? drivePath, + string filename, + int? driveSpeed, + Dictionary options) + : base(system, type, drivePath, filename, driveSpeed, options) + { + } + + #region BaseExecutionContext Implementations + + /// + /// Command support is irrelevant for Dreamdump + public override Dictionary> GetCommandSupport() + { + return new Dictionary>() + { + [CommandStrings.NONE] = + [ + // Special + FlagStrings.ForceQTOC, + FlagStrings.Train, + FlagStrings.Retries, + + // Paths + FlagStrings.ImageName, + FlagStrings.ImagePath, + + // Drive Part + FlagStrings.ReadOffset, + FlagStrings.ReadAtOnce, + FlagStrings.Speed, + FlagStrings.SectorOrder, + FlagStrings.Drive, + ], + }; + } + + /// + public override string GenerateParameters() + { + var parameters = new StringBuilder(); + + // Loop though and append all existing + foreach (var kvp in _inputs) + { + // If the value doesn't exist + string formatted = kvp.Value.Format(useEquals: true); + if (formatted.Length == 0) + continue; + + // Append the parameter + parameters.Append($"{formatted} "); + } + + return parameters.ToString().TrimEnd(); + } + + /// + public override string? GetDefaultExtension(MediaType? mediaType) => ".bin"; + + /// + public override MediaType? GetMediaType() => SabreTools.RedumpLib.Data.MediaType.GDROM; + + /// + public override bool IsDumpingCommand() => true; + + /// + protected override void ResetValues() + { + BaseCommand = CommandStrings.NONE; + + flags = []; + + foreach (var kvp in _inputs) + kvp.Value.ClearValue(); + } + + /// + protected override void SetDefaultParameters(string? drivePath, + string filename, + int? driveSpeed, + Dictionary options) + { + BaseCommand = CommandStrings.NONE; + + if (drivePath is not null) + { + this[FlagStrings.Drive] = true; + (_inputs[FlagStrings.Drive] as StringInput)?.SetValue(drivePath); + } + + if (driveSpeed is not null && driveSpeed > 0) + { + this[FlagStrings.Speed] = true; + (_inputs[FlagStrings.Speed] as UInt16Input)?.SetValue((ushort)driveSpeed); + } + else + { + this[FlagStrings.Speed] = false; + (_inputs[FlagStrings.Speed] as UInt16Input)?.SetValue(null); + } + + // Set user-defined options + string? sectorOrder = GetStringSetting(options, SettingConstants.SectorOrder, SettingConstants.SectorOrderDefault); + if (!string.IsNullOrEmpty(sectorOrder) && sectorOrder != SectorOrder.NONE.ToString()) + { + this[FlagStrings.SectorOrder] = true; + (_inputs[FlagStrings.SectorOrder] as StringInput)?.SetValue(sectorOrder!); + } + + // Set the output paths + if (!string.IsNullOrEmpty(filename)) + { + var imagePath = Path.GetDirectoryName(filename); + if (!string.IsNullOrEmpty(imagePath)) + { + this[FlagStrings.ImagePath] = true; + (_inputs[FlagStrings.ImagePath] as StringInput)?.SetValue(imagePath!); + } + + string imageName = Path.GetFileNameWithoutExtension(filename); + if (!string.IsNullOrEmpty(imageName)) + { + this[FlagStrings.ImageName] = true; + (_inputs[FlagStrings.ImageName] as StringInput)?.SetValue(imageName!); + } + } + + byte retries = GetUInt8Setting(options, SettingConstants.RereadCount, SettingConstants.RereadCountDefault); + if (retries > 0) + { + this[FlagStrings.Retries] = true; + (_inputs[FlagStrings.Retries] as UInt8Input)?.SetValue(retries); + } + } + + /// + protected override bool ValidateAndSetParameters(string? parameters) + { + // The string has to be valid by itself first + if (string.IsNullOrEmpty(parameters)) + return false; + + // Now split the string into parts for easier validation + string[] parts = SplitParameterString(parameters!); + + // Setup the modes + BaseCommand = null; + + // Loop through all auxiliary flags, if necessary + int index = 0; + for (int i = index; i < parts.Length; i++) + { + // Match all possible flags + foreach (var kvp in _inputs) + { + // If the value was not a match + if (!kvp.Value.Process(parts, ref i)) + continue; + + // Set the flag + this[kvp.Key] = true; + } + } + + // If the image name was not set, set it with a default value + if (string.IsNullOrEmpty((_inputs[FlagStrings.ImageName] as StringInput)?.Value)) + (_inputs[FlagStrings.ImageName] as StringInput)?.SetValue($"track_{DateTime.Now:yyyyMMdd-HHmm}"); + + return true; + } + + #endregion + } +} diff --git a/MPF.ExecutionContexts/Dreamdump/FlagStrings.cs b/MPF.ExecutionContexts/Dreamdump/FlagStrings.cs new file mode 100644 index 00000000..894345b0 --- /dev/null +++ b/MPF.ExecutionContexts/Dreamdump/FlagStrings.cs @@ -0,0 +1,33 @@ +namespace MPF.ExecutionContexts.Dreamdump +{ + /// + /// Dumping flags for Dreamdump + /// + public static class FlagStrings + { + #region Special + + public const string ForceQTOC = "--force-qtoc"; + public const string Train = "--train"; + public const string Retries = "--retries"; + + #endregion + + #region Paths + + public const string ImageName = "--image-name"; + public const string ImagePath = "--image-path"; + + #endregion + + #region Drive Part + + public const string ReadOffset = "--read-offset"; + public const string ReadAtOnce = "--read-at-once"; // [0,40] (Linux), [0,20] (Windows) + public const string Speed = "--speed"; + public const string SectorOrder = "--sector-order"; + public const string Drive = "--drive"; + + #endregion + } +} diff --git a/MPF.ExecutionContexts/Dreamdump/SettingConstants.cs b/MPF.ExecutionContexts/Dreamdump/SettingConstants.cs new file mode 100644 index 00000000..8a14da72 --- /dev/null +++ b/MPF.ExecutionContexts/Dreamdump/SettingConstants.cs @@ -0,0 +1,11 @@ +namespace MPF.ExecutionContexts.Dreamdump +{ + public static class SettingConstants + { + public const string RereadCount = "DreamdumpRereadCount"; + public const int RereadCountDefault = 20; + + public const string SectorOrder = "DreamdumpSectorOrder"; + public static readonly string SectorOrderDefault = Dreamdump.SectorOrder.NONE.ToString(); + } +} diff --git a/MPF.Frontend.Test/EnumExtensionsTests.cs b/MPF.Frontend.Test/EnumExtensionsTests.cs index 22b57f72..d5536e20 100644 --- a/MPF.Frontend.Test/EnumExtensionsTests.cs +++ b/MPF.Frontend.Test/EnumExtensionsTests.cs @@ -46,6 +46,7 @@ namespace MPF.Frontend.Test [InlineData(InternalProgram.NONE, "Unknown")] [InlineData(InternalProgram.Aaru, "Aaru")] [InlineData(InternalProgram.DiscImageCreator, "DiscImageCreator")] + // [InlineData(InternalProgram.Dreamdump, "Dreamdump")] [InlineData(InternalProgram.Redumper, "Redumper")] [InlineData(InternalProgram.CleanRip, "CleanRip")] [InlineData(InternalProgram.PS3CFW, "PS3 CFW")] @@ -168,6 +169,7 @@ namespace MPF.Frontend.Test [InlineData(InternalProgram.NONE, "Unknown")] [InlineData(InternalProgram.Aaru, "aaru")] [InlineData(InternalProgram.DiscImageCreator, "dic")] + // [InlineData(InternalProgram.Dreamdump, "dreamdump")] [InlineData(InternalProgram.Redumper, "redumper")] [InlineData(InternalProgram.CleanRip, "cleanrip")] [InlineData(InternalProgram.PS3CFW, "ps3cfw")] @@ -210,6 +212,7 @@ namespace MPF.Frontend.Test [InlineData("", InternalProgram.NONE)] [InlineData("aaru", InternalProgram.Aaru)] [InlineData("dic", InternalProgram.DiscImageCreator)] + // [InlineData("dreamdump", InternalProgram.Dreamdump)] [InlineData("redumper", InternalProgram.Redumper)] [InlineData("cleanrip", InternalProgram.CleanRip)] [InlineData("ps3cfw", InternalProgram.PS3CFW)] diff --git a/MPF.Frontend/DumpEnvironment.cs b/MPF.Frontend/DumpEnvironment.cs index 99b1c6dc..d0bcb110 100644 --- a/MPF.Frontend/DumpEnvironment.cs +++ b/MPF.Frontend/DumpEnvironment.cs @@ -157,6 +157,14 @@ namespace MPF.Frontend programFound = InternalProgram.Aaru; } + // if (programFound is null && _internalProgram != InternalProgram.Dreamdump) + // { + // var processor = new Dreamdump(_system); + // var missingFiles = processor.FoundAllFiles(mediaType, outputDirectory, outputFilename); + // if (missingFiles.Count == 0) + // programFound = InternalProgram.Dreamdump; + // } + return programFound; } @@ -188,6 +196,13 @@ namespace MPF.Frontend programFound = InternalProgram.Aaru; } + // if (programFound is null && _internalProgram != InternalProgram.Dreamdump) + // { + // var processor = new Dreamdump(_system); + // if (processor.FoundAnyFiles(mediaType, outputDirectory, outputFilename)) + // programFound = InternalProgram.Dreamdump; + // } + return programFound; } @@ -203,6 +218,7 @@ namespace MPF.Frontend { InternalProgram.Aaru => new ExecutionContexts.Aaru.ExecutionContext(parameters) { ExecutablePath = _options.AaruPath }, InternalProgram.DiscImageCreator => new ExecutionContexts.DiscImageCreator.ExecutionContext(parameters) { ExecutablePath = _options.DiscImageCreatorPath }, + // InternalProgram.Dreamdump => new ExecutionContexts.Dreamdump.ExecutionContext(parameters) { ExecutablePath = _options.DreamdumpPath }, InternalProgram.Redumper => new ExecutionContexts.Redumper.ExecutionContext(parameters) { ExecutablePath = _options.RedumperPath }, // If no dumping program found, set to null @@ -235,6 +251,7 @@ namespace MPF.Frontend InternalProgram.Aaru => new Aaru(_system), InternalProgram.CleanRip => new CleanRip(_system), InternalProgram.DiscImageCreator => new DiscImageCreator(_system), + // InternalProgram.Dreamdump => new Dreamdump(_system), InternalProgram.PS3CFW => new PS3CFW(_system), InternalProgram.Redumper => new Redumper(_system), InternalProgram.UmdImageCreator => new UmdImageCreator(_system), @@ -269,6 +286,7 @@ namespace MPF.Frontend { InternalProgram.Aaru => new ExecutionContexts.Aaru.ExecutionContext(_system, mediaType, _drive.Name, OutputPath, driveSpeed, _options.Settings), InternalProgram.DiscImageCreator => new ExecutionContexts.DiscImageCreator.ExecutionContext(_system, mediaType, _drive.Name, OutputPath, driveSpeed, _options.Settings), + // InternalProgram.Dreamdump => new ExecutionContexts.Dreamdump.ExecutionContext(_system, mediaType, _drive.Name, OutputPath, driveSpeed, _options.Settings), InternalProgram.Redumper => new ExecutionContexts.Redumper.ExecutionContext(_system, mediaType, _drive.Name, OutputPath, driveSpeed, _options.Settings), // If no dumping program found, set to null diff --git a/MPF.Frontend/EnumExtensions.cs b/MPF.Frontend/EnumExtensions.cs index d9f13cb0..26446b6a 100644 --- a/MPF.Frontend/EnumExtensions.cs +++ b/MPF.Frontend/EnumExtensions.cs @@ -6,6 +6,7 @@ using System.Collections.Concurrent; #endif using System.Reflection; using SabreTools.RedumpLib.Data; +using DreamdumpSectorOrder = MPF.ExecutionContexts.Dreamdump.SectorOrder; using LogCompression = MPF.Processors.LogCompression; using RedumperDriveType = MPF.ExecutionContexts.Redumper.DriveType; using RedumperReadMethod = MPF.ExecutionContexts.Redumper.ReadMethod; @@ -118,6 +119,7 @@ namespace MPF.Frontend InternalProgram.Aaru => "Aaru", InternalProgram.DiscImageCreator => "DiscImageCreator", + // InternalProgram.Dreamdump => "Dreamdump", InternalProgram.Redumper => "Redumper", #endregion @@ -295,6 +297,7 @@ namespace MPF.Frontend InternalProgram.Aaru => "aaru", InternalProgram.DiscImageCreator => "dic", + // InternalProgram.Dreamdump => "dreamdump", InternalProgram.Redumper => "redumper", #endregion @@ -317,6 +320,36 @@ namespace MPF.Frontend #region Convert from String + /// + /// Get the DreamdumpSectorOrder enum value for a given string + /// + /// String value to convert + /// DreamdumpSectorOrder represented by the string, if possible + public static DreamdumpSectorOrder ToDreamdumpSectorOrder(this string? order) + { + return (order?.ToLowerInvariant()) switch + { + "data_c2_sub" + or "data c2 sub" + or "data-c2-sub" + or "datac2sub" => DreamdumpSectorOrder.DATA_C2_SUB, + "data_sub_c2" + or "data sub c2" + or "data-sub-c2" + or "datasubc2" => DreamdumpSectorOrder.DATA_SUB_C2, + "data_sub" + or "data sub" + or "data-sub" + or "datasub" => DreamdumpSectorOrder.DATA_SUB, + "data_c2" + or "data c2" + or "data-c2" + or "datac2" => DreamdumpSectorOrder.DATA_C2, + + _ => DreamdumpSectorOrder.NONE, + }; + } + /// /// Get the InterfaceLanguage enum value for a given string /// @@ -362,6 +395,7 @@ namespace MPF.Frontend or "dic" or "dicreator" or "discimagecreator" => InternalProgram.DiscImageCreator, + // "dreamdump" => InternalProgram.Dreamdump, "rd" or "redumper" => InternalProgram.Redumper, diff --git a/MPF.Frontend/Enumerations.cs b/MPF.Frontend/Enumerations.cs index 668aaff1..85c14f45 100644 --- a/MPF.Frontend/Enumerations.cs +++ b/MPF.Frontend/Enumerations.cs @@ -48,6 +48,7 @@ namespace MPF.Frontend // Dumping support Aaru, DiscImageCreator, + // Dreamdump, Redumper, // Verification support only diff --git a/MPF.Frontend/Options.cs b/MPF.Frontend/Options.cs index a7155bc7..4e679435 100644 --- a/MPF.Frontend/Options.cs +++ b/MPF.Frontend/Options.cs @@ -4,6 +4,8 @@ using System.IO; using SabreTools.RedumpLib.Data; using AaruSettings = MPF.ExecutionContexts.Aaru.SettingConstants; using DICSettings = MPF.ExecutionContexts.DiscImageCreator.SettingConstants; +// using DreamdumpSectorOrder = MPF.ExecutionContexts.Dreamdump.SectorOrder; +// using DreamdumpSettings = MPF.ExecutionContexts.Dreamdump.SettingConstants; using LogCompression = MPF.Processors.LogCompression; using RedumperDriveType = MPF.ExecutionContexts.Redumper.DriveType; using RedumperReadMethod = MPF.ExecutionContexts.Redumper.ReadMethod; @@ -64,6 +66,32 @@ namespace MPF.Frontend } } +#pragma warning disable IDE0051 + /// + /// Default Dreamdump path + /// + private static string DefaultDreamdumpPath + { + get + { +#pragma warning disable IDE0072 + string executableName = Environment.OSVersion.Platform switch + { + PlatformID.Unix => "dreamdump", + PlatformID.MacOSX => "dreamdump", + _ => "dreamdump.exe" + }; +#pragma warning restore IDE0072 + +#if NET20 || NET35 + return Path.Combine("Programs", Path.Combine("Dreamdump", executableName)); +#else + return Path.Combine("Programs", "Dreamdump", executableName); +#endif + } + } +#pragma warning restore IDE0051 + /// /// Default Redumper path /// @@ -124,6 +152,15 @@ namespace MPF.Frontend set { Settings["DiscImageCreatorPath"] = value; } } + // /// + // /// Path to Dreamdump + // /// + // public string? DreamdumpPath + // { + // get { return GetStringSetting(Settings, "DreamdumpPath", DefaultDreamdumpPath); } + // set { Settings["DreamdumpPath"] = value; } + // } + /// /// Path to Redumper /// @@ -435,6 +472,44 @@ namespace MPF.Frontend #endregion + #region Dreamdump + + // /// + // /// Enable options incompatible with redump submissions + // /// + // public bool DreamdumpNonRedumpMode + // { + // get { return GetBooleanSetting(Settings, "DreamdumpNonRedumpMode", false); } + // set { Settings["DreamdumpNonRedumpMode"] = value.ToString(); } + // } + + // /// + // /// Currently selected default Dreamdump sector order + // /// + // public DreamdumpSectorOrder DreamdumpSectorOrder + // { + // get + // { + // var valueString = GetStringSetting(Settings, DreamdumpSettings.SectorOrder, DreamdumpSettings.SectorOrderDefault); + // return valueString.ToDreamdumpSectorOrder(); + // } + // set + // { + // Settings[DreamdumpSettings.SectorOrder] = value.ToString(); + // } + // } + + // /// + // /// Default number of rereads + // /// + // public int DreamdumpRereadCount + // { + // get { return GetInt32Setting(Settings, DreamdumpSettings.RereadCount, DreamdumpSettings.RereadCountDefault); } + // set { Settings[DreamdumpSettings.RereadCount] = value.ToString(); } + // } + + #endregion + #region Redumper /// diff --git a/MPF.Frontend/Tools/SubmissionGenerator.cs b/MPF.Frontend/Tools/SubmissionGenerator.cs index 5a567087..3fe8232e 100644 --- a/MPF.Frontend/Tools/SubmissionGenerator.cs +++ b/MPF.Frontend/Tools/SubmissionGenerator.cs @@ -424,6 +424,7 @@ namespace MPF.Frontend.Tools Aaru => InternalProgram.Aaru, CleanRip => InternalProgram.CleanRip, DiscImageCreator => InternalProgram.DiscImageCreator, + // Dreamdump => InternalProgram.Dreamdump, PS3CFW => InternalProgram.PS3CFW, Redumper => InternalProgram.Redumper, UmdImageCreator => InternalProgram.UmdImageCreator, diff --git a/MPF.Frontend/ViewModels/CheckDumpViewModel.cs b/MPF.Frontend/ViewModels/CheckDumpViewModel.cs index 190a3506..efbb3dda 100644 --- a/MPF.Frontend/ViewModels/CheckDumpViewModel.cs +++ b/MPF.Frontend/ViewModels/CheckDumpViewModel.cs @@ -349,7 +349,17 @@ namespace MPF.Frontend.ViewModels InternalProgram internalProgram = Options.InternalProgram; // Create a static list of supported Check programs, not everything - var internalPrograms = new List { InternalProgram.Redumper, InternalProgram.Aaru, InternalProgram.DiscImageCreator, InternalProgram.CleanRip, InternalProgram.PS3CFW, InternalProgram.UmdImageCreator, InternalProgram.XboxBackupCreator }; + var internalPrograms = new List + { + InternalProgram.Redumper, + InternalProgram.Aaru, + InternalProgram.DiscImageCreator, + // InternalProgram.Dreamdump, + InternalProgram.CleanRip, + InternalProgram.PS3CFW, + InternalProgram.UmdImageCreator, + InternalProgram.XboxBackupCreator + }; InternalPrograms = internalPrograms.ConvertAll(ip => new Element(ip)); // Select the current default dumping program diff --git a/MPF.Frontend/ViewModels/MainViewModel.cs b/MPF.Frontend/ViewModels/MainViewModel.cs index 1cafc5de..83194ae0 100644 --- a/MPF.Frontend/ViewModels/MainViewModel.cs +++ b/MPF.Frontend/ViewModels/MainViewModel.cs @@ -2164,6 +2164,9 @@ namespace MPF.Frontend.ViewModels InternalProgram.DiscImageCreator when CurrentMediaType == MediaType.NintendoWiiUOpticalDisc => true, InternalProgram.DiscImageCreator when CurrentMediaType == MediaType.SDCard => true, + // Dreamdump + // InternalProgram.Dreamdump when CurrentMediaType == MediaType.GDROM => true, + // Redumper InternalProgram.Redumper when CurrentMediaType == MediaType.BluRay => true, InternalProgram.Redumper when CurrentMediaType == MediaType.CDROM => true, @@ -2444,9 +2447,10 @@ namespace MPF.Frontend.ViewModels #pragma warning disable IDE0072 return program switch { - InternalProgram.Redumper => File.Exists(Options.RedumperPath), InternalProgram.Aaru => File.Exists(Options.AaruPath), InternalProgram.DiscImageCreator => File.Exists(Options.DiscImageCreatorPath), + // InternalProgram.Dreamdump => File.Exists(Options.DreamdumpPath), + InternalProgram.Redumper => File.Exists(Options.RedumperPath), _ => false, }; #pragma warning restore IDE0072 diff --git a/MPF.Frontend/ViewModels/OptionsViewModel.cs b/MPF.Frontend/ViewModels/OptionsViewModel.cs index 19c07592..05c220d2 100644 --- a/MPF.Frontend/ViewModels/OptionsViewModel.cs +++ b/MPF.Frontend/ViewModels/OptionsViewModel.cs @@ -106,7 +106,13 @@ namespace MPF.Frontend.ViewModels /// private static List> PopulateInternalPrograms() { - var internalPrograms = new List { InternalProgram.Redumper, InternalProgram.DiscImageCreator, InternalProgram.Aaru }; + var internalPrograms = new List + { + InternalProgram.Redumper, + InternalProgram.DiscImageCreator, + InternalProgram.Aaru, + // InternalProgram.Dreamdump, + }; return internalPrograms.ConvertAll(ip => new Element(ip)); }