diff --git a/MPF.Library/Aaru/Constants.cs b/MPF.Library/Aaru/Constants.cs index 1bd7fa8f..f38036c2 100644 --- a/MPF.Library/Aaru/Constants.cs +++ b/MPF.Library/Aaru/Constants.cs @@ -5,6 +5,8 @@ namespace MPF.Aaru /// public static class CommandStrings { + public const string NONE = ""; + // Database Family public const string DatabasePrefixShort = "db"; public const string DatabasePrefixLong = "database"; diff --git a/MPF.Library/Aaru/Converters.cs b/MPF.Library/Aaru/Converters.cs index 83b5eb27..4587c4ce 100644 --- a/MPF.Library/Aaru/Converters.cs +++ b/MPF.Library/Aaru/Converters.cs @@ -18,407 +18,5 @@ namespace MPF.Aaru } #endregion - - #region Convert to Long Name - - /// - /// Get the string representation of the Command enum values - /// - /// Command value to convert - /// String representing the value, if possible - public static string LongName(Command command) - { - switch (command) - { - // Database Family - case Command.DatabaseStats: - return $"{CommandStrings.DatabasePrefixLong} {CommandStrings.DatabaseStats}"; - case Command.DatabaseUpdate: - return $"{CommandStrings.DatabasePrefixLong} {CommandStrings.DatabaseUpdate}"; - - // Device Family - case Command.DeviceInfo: - return $"{CommandStrings.DevicePrefixLong} {CommandStrings.DeviceInfo}"; - case Command.DeviceList: - return $"{CommandStrings.DevicePrefixLong} {CommandStrings.DeviceList}"; - case Command.DeviceReport: - return $"{CommandStrings.DevicePrefixLong} {CommandStrings.DeviceReport}"; - - // Filesystem Family - case Command.FilesystemExtract: - return $"{CommandStrings.FilesystemPrefixLong} {CommandStrings.FilesystemExtract}"; - case Command.FilesystemList: - return $"{CommandStrings.FilesystemPrefixLong} {CommandStrings.FilesystemListLong}"; - case Command.FilesystemOptions: - return $"{CommandStrings.FilesystemPrefixLong} {CommandStrings.FilesystemOptions}"; - - // Image Family - case Command.ImageAnalyze: - return $"{CommandStrings.ImagePrefixLong} {CommandStrings.ImageAnalyze}"; - case Command.ImageChecksum: - return $"{CommandStrings.ImagePrefixLong} {CommandStrings.ImageChecksumLong}"; - case Command.ImageCompare: - return $"{CommandStrings.ImagePrefixLong} {CommandStrings.ImageCompareLong}"; - case Command.ImageConvert: - return $"{CommandStrings.ImagePrefixLong} {CommandStrings.ImageConvert}"; - case Command.ImageCreateSidecar: - return $"{CommandStrings.ImagePrefixLong} {CommandStrings.ImageCreateSidecar}"; - case Command.ImageDecode: - return $"{CommandStrings.ImagePrefixLong} {CommandStrings.ImageDecode}"; - case Command.ImageEntropy: - return $"{CommandStrings.ImagePrefixLong} {CommandStrings.ImageEntropy}"; - case Command.ImageInfo: - return $"{CommandStrings.ImagePrefixLong} {CommandStrings.ImageInfo}"; - case Command.ImageOptions: - return $"{CommandStrings.ImagePrefixLong} {CommandStrings.ImageOptions}"; - case Command.ImagePrint: - return $"{CommandStrings.ImagePrefixLong} {CommandStrings.ImagePrint}"; - case Command.ImageVerify: - return $"{CommandStrings.ImagePrefixLong} {CommandStrings.ImageVerify}"; - - // Media Family - case Command.MediaDump: - return $"{CommandStrings.MediaPrefixLong} {CommandStrings.MediaDump}"; - case Command.MediaInfo: - return $"{CommandStrings.MediaPrefixLong} {CommandStrings.MediaInfo}"; - case Command.MediaScan: - return $"{CommandStrings.MediaPrefixLong} {CommandStrings.MediaScan}"; - - // Standalone Commands - case Command.Configure: - return CommandStrings.Configure; - case Command.Formats: - return CommandStrings.Formats; - case Command.ListEncodings: - return CommandStrings.ListEncodings; - case Command.ListNamespaces: - return CommandStrings.ListNamespaces; - case Command.Remote: - return CommandStrings.Remote; - - case Command.NONE: - default: - return ""; - } - } - - /// - /// Get the string representation of the Flag enum values - /// - /// Flag value to convert - /// String representing the value, if possible - public static string LongName(Flag flag) - { - switch (flag) - { - // Boolean flags - case Flag.Adler32: - return FlagStrings.Adler32Long; - case Flag.Clear: - return FlagStrings.ClearLong; - case Flag.ClearAll: - return FlagStrings.ClearAllLong; - case Flag.CRC16: - return FlagStrings.CRC16Long; - case Flag.CRC32: - return FlagStrings.CRC32Long; - case Flag.CRC64: - return FlagStrings.CRC64Long; - case Flag.Debug: - return FlagStrings.DebugLong; - case Flag.DiskTags: - return FlagStrings.DiskTagsLong; - case Flag.DuplicatedSectors: - return FlagStrings.DuplicatedSectorsLong; - case Flag.Eject: - return FlagStrings.EjectLong; - case Flag.ExtendedAttributes: - return FlagStrings.ExtendedAttributesLong; - case Flag.Filesystems: - return FlagStrings.FilesystemsLong; - case Flag.FirstPregap: - return FlagStrings.FirstPregapLong; - case Flag.FixOffset: - return FlagStrings.FixOffsetLong; - case Flag.FixSubchannel: - return FlagStrings.FixSubchannelLong; - case Flag.FixSubchannelCrc: - return FlagStrings.FixSubchannelCrcLong; - case Flag.FixSubchannelPosition: - return FlagStrings.FixSubchannelPositionLong; - case Flag.Fletcher16: - return FlagStrings.Fletcher16Long; - case Flag.Fletcher32: - return FlagStrings.Fletcher32Long; - case Flag.Force: - return FlagStrings.ForceLong; - case Flag.GenerateSubchannels: - return FlagStrings.GenerateSubchannelsLong; - case Flag.Help: - return FlagStrings.HelpLong; - case Flag.LongFormat: - return FlagStrings.LongFormatLong; - case Flag.LongSectors: - return FlagStrings.LongSectorsLong; - case Flag.MD5: - return FlagStrings.MD5Long; - case Flag.Metadata: - return FlagStrings.MetadataLong; - case Flag.Partitions: - return FlagStrings.PartitionsLong; - case Flag.Persistent: - return FlagStrings.PersistentLong; - case Flag.Private: - return FlagStrings.PrivateLong; - case Flag.Resume: - return FlagStrings.ResumeLong; - case Flag.RetrySubchannel: - return FlagStrings.RetrySubchannelLong; - case Flag.SectorTags: - return FlagStrings.SectorTagsLong; - case Flag.SeparatedTracks: - return FlagStrings.SeparatedTracksLong; - case Flag.SHA1: - return FlagStrings.SHA1Long; - case Flag.SHA256: - return FlagStrings.SHA256Long; - case Flag.SHA384: - return FlagStrings.SHA384Long; - case Flag.SHA512: - return FlagStrings.SHA512Long; - case Flag.SkipCdiReadyHole: - return FlagStrings.SkipCdiReadyHoleLong; - case Flag.SpamSum: - return FlagStrings.SpamSumLong; - case Flag.StopOnError: - return FlagStrings.StopOnErrorLong; - case Flag.Tape: - return FlagStrings.TapeLong; - case Flag.Trim: - return FlagStrings.TrimLong; - case Flag.Verbose: - return FlagStrings.VerboseLong; - case Flag.VerifyDisc: - return FlagStrings.VerifyDiscLong; - case Flag.VerifySectors: - return FlagStrings.VerifySectorsLong; - case Flag.Version: - return FlagStrings.VersionLong; - case Flag.WholeDisc: - return FlagStrings.WholeDiscLong; - - // Int8 flags - case Flag.Speed: - return FlagStrings.SpeedLong; - - // Int16 flags - case Flag.RetryPasses: - return FlagStrings.RetryPassesLong; - case Flag.Width: - return FlagStrings.WidthLong; - - // Int32 flags - case Flag.BlockSize: - return FlagStrings.BlockSizeLong; - case Flag.Count: - return FlagStrings.CountLong; - case Flag.MediaLastSequence: - return FlagStrings.MediaLastSequenceLong; - case Flag.MediaSequence: - return FlagStrings.MediaSequenceLong; - case Flag.Skip: - return FlagStrings.SkipLong; - - // Int64 flags - case Flag.Length: - return FlagStrings.LengthLong; - case Flag.Start: - return FlagStrings.StartLong; - - // String flags - case Flag.Comments: - return FlagStrings.CommentsLong; - case Flag.Creator: - return FlagStrings.CreatorLong; - case Flag.DriveManufacturer: - return FlagStrings.DriveManufacturerLong; - case Flag.DriveModel: - return FlagStrings.DriveModelLong; - case Flag.DriveRevision: - return FlagStrings.DriveRevisionLong; - case Flag.DriveSerial: - return FlagStrings.DriveSerialLong; - case Flag.Encoding: - return FlagStrings.EncodingLong; - case Flag.FormatConvert: - return FlagStrings.FormatConvertLong; - case Flag.FormatDump: - return FlagStrings.FormatDumpLong; - case Flag.ImgBurnLog: - return FlagStrings.ImgBurnLogLong; - case Flag.MediaBarcode: - return FlagStrings.MediaBarcodeLong; - case Flag.MediaManufacturer: - return FlagStrings.MediaManufacturerLong; - case Flag.MediaModel: - return FlagStrings.MediaModelLong; - case Flag.MediaPartNumber: - return FlagStrings.MediaPartNumberLong; - case Flag.MediaSerial: - return FlagStrings.MediaSerialLong; - case Flag.MediaTitle: - return FlagStrings.MediaTitleLong; - case Flag.MHDDLog: - return FlagStrings.MHDDLogLong; - case Flag.Namespace: - return FlagStrings.NamespaceLong; - case Flag.Options: - return FlagStrings.OptionsLong; - case Flag.OutputPrefix: - return FlagStrings.OutputPrefixLong; - case Flag.ResumeFile: - return FlagStrings.ResumeFileLong; - case Flag.Subchannel: - return FlagStrings.SubchannelLong; - case Flag.XMLSidecar: - return FlagStrings.XMLSidecarLong; - - case Flag.NONE: - default: - return ""; - } - } - - #endregion - - #region Convert From String - - /// - /// Get the Command enum value for a given string - /// - /// First part of String value to convert - /// Second part of String value to convert - /// Output bool if the second command was used - /// Command represented by the string(s), if possible - public static Command StringToCommand(string commandOne, string commandTwo, out bool useSecond) - { - useSecond = false; - switch (commandOne) - { - // Database Family - case CommandStrings.DatabasePrefixShort: - case CommandStrings.DatabasePrefixLong: - useSecond = true; - switch (commandTwo) - { - case CommandStrings.DatabaseStats: - return Command.DatabaseStats; - case CommandStrings.DatabaseUpdate: - return Command.DatabaseUpdate; - } - - break; - - // Device Family - case CommandStrings.DevicePrefixShort: - case CommandStrings.DevicePrefixLong: - useSecond = true; - switch (commandTwo) - { - case CommandStrings.DeviceInfo: - return Command.DeviceInfo; - case CommandStrings.DeviceList: - return Command.DeviceList; - case CommandStrings.DeviceReport: - return Command.DeviceReport; - } - - break; - - // Filesystem Family - case CommandStrings.FilesystemPrefixShort: - case CommandStrings.FilesystemPrefixShortAlt: - case CommandStrings.FilesystemPrefixLong: - useSecond = true; - switch (commandTwo) - { - case CommandStrings.FilesystemExtract: - return Command.FilesystemExtract; - case CommandStrings.FilesystemListShort: - case CommandStrings.FilesystemListLong: - return Command.FilesystemList; - case CommandStrings.DatabaseStats: - return Command.FilesystemOptions; - } - - break; - - // Image Family - case CommandStrings.ImagePrefixShort: - case CommandStrings.ImagePrefixLong: - useSecond = true; - switch (commandTwo) - { - case CommandStrings.ImageAnalyze: - return Command.ImageAnalyze; - case CommandStrings.ImageChecksumShort: - case CommandStrings.ImageChecksumLong: - return Command.ImageChecksum; - case CommandStrings.ImageCompareShort: - case CommandStrings.ImageCompareLong: - return Command.ImageCompare; - case CommandStrings.ImageConvert: - return Command.ImageConvert; - case CommandStrings.ImageCreateSidecar: - return Command.ImageCreateSidecar; - case CommandStrings.ImageDecode: - return Command.ImageDecode; - case CommandStrings.ImageEntropy: - return Command.ImageEntropy; - case CommandStrings.ImageInfo: - return Command.ImageInfo; - case CommandStrings.ImageOptions: - return Command.ImageOptions; - case CommandStrings.ImagePrint: - return Command.ImagePrint; - case CommandStrings.ImageVerify: - return Command.ImageVerify; - } - - break; - - // Media Family - case CommandStrings.MediaPrefixShort: - case CommandStrings.MediaPrefixLong: - useSecond = true; - switch (commandTwo) - { - case CommandStrings.MediaDump: - return Command.MediaDump; - case CommandStrings.MediaInfo: - return Command.MediaInfo; - case CommandStrings.MediaScan: - return Command.MediaScan; - } - - break; - - // Standalone Commands - case CommandStrings.Configure: - return Command.Configure; - case CommandStrings.Formats: - return Command.Formats; - case CommandStrings.ListEncodings: - return Command.ListEncodings; - case CommandStrings.ListNamespaces: - return Command.ListNamespaces; - case CommandStrings.Remote: - return Command.Remote; - } - - return Command.NONE; - } - - #endregion } } diff --git a/MPF.Library/Aaru/Enumerations.cs b/MPF.Library/Aaru/Enumerations.cs deleted file mode 100644 index ac70e975..00000000 --- a/MPF.Library/Aaru/Enumerations.cs +++ /dev/null @@ -1,149 +0,0 @@ -namespace MPF.Aaru -{ - /// - /// Supported Aaru commands - /// - public enum Command : int - { - NONE = 0, - - // Database Family - DatabaseStats, - DatabaseUpdate, - - // Device Family - DeviceInfo, - DeviceList, - DeviceReport, - - // Filesystem Family - FilesystemExtract, - FilesystemList, - FilesystemOptions, - - // Image Family - ImageAnalyze, - ImageChecksum, - ImageCompare, - ImageConvert, - ImageCreateSidecar, - ImageDecode, - ImageEntropy, - ImageInfo, - ImageOptions, - ImagePrint, - ImageVerify, - - // Media Family - MediaDump, - MediaInfo, - MediaScan, - - // Standalone Commands - Configure, - Formats, - ListEncodings, - ListNamespaces, - Remote, - } - - /// - /// Supported Aaru flags - /// - public enum Flag : int - { - NONE = 0, - - // Boolean flags - Adler32, - Clear, - ClearAll, - CRC16, - CRC32, - CRC64, - Debug, - DiskTags, - DuplicatedSectors, - Eject, - ExtendedAttributes, - Filesystems, - FirstPregap, - FixOffset, - FixSubchannel, - FixSubchannelCrc, - FixSubchannelPosition, - Fletcher16, - Fletcher32, - Force, - GenerateSubchannels, - Help, - LongFormat, - LongSectors, - MD5, - Metadata, - Partitions, - Persistent, - Private, - Resume, - RetrySubchannel, - SectorTags, - SeparatedTracks, - SHA1, - SHA256, - SHA384, - SHA512, - SkipCdiReadyHole, - SpamSum, - StopOnError, - Tape, - Trim, - Verbose, - VerifyDisc, - VerifySectors, - Version, - WholeDisc, - - // Int8 flags - Speed, - - // Int16 flags - RetryPasses, - Width, - - // Int32 flags - BlockSize, - Count, - MediaLastSequence, - MediaSequence, - Skip, - - // Int64 flags - Length, - Start, - - // String flags - Comments, - Creator, - DriveManufacturer, - DriveModel, - DriveRevision, - DriveSerial, - Encoding, - FormatConvert, - FormatDump, - ImgBurnLog, - MediaBarcode, - MediaManufacturer, - MediaModel, - MediaPartNumber, - MediaSerial, - MediaTitle, - MHDDLog, - Namespace, - Options, - OutputPrefix, - ResumeFile, - Subchannel, - XMLSidecar, - } -} \ No newline at end of file diff --git a/MPF.Library/Aaru/Parameters.cs b/MPF.Library/Aaru/Parameters.cs index aeb6887c..7e7beae2 100644 --- a/MPF.Library/Aaru/Parameters.cs +++ b/MPF.Library/Aaru/Parameters.cs @@ -38,36 +38,11 @@ namespace MPF.Aaru #region Metadata - /// - /// Base command to run - /// - public Command BaseCommand { get; set; } - /// public override InternalProgram InternalProgram => InternalProgram.Aaru; #endregion - /// - /// Set of flags to pass to the executable - /// - protected Dictionary _flags = new Dictionary(); - public bool? this[Flag key] - { - get - { - if (_flags.ContainsKey(key)) - return _flags[key]; - - return null; - } - set - { - _flags[key] = value; - } - } - protected internal IEnumerable Keys => _flags.Keys; - #region Flag Values public int? BlockSizeValue { get; set; } @@ -391,329 +366,332 @@ namespace MPF.Aaru #region Pre-command flags // Debug - if (this[Flag.Debug] == true) - parameters.Add(Converters.LongName(Flag.Debug)); + if (this[FlagStrings.DebugLong] == true) + parameters.Add(FlagStrings.DebugLong); // Verbose - if (this[Flag.Verbose] == true) - parameters.Add(Converters.LongName(Flag.Verbose)); + if (this[FlagStrings.VerboseLong] == true) + parameters.Add(FlagStrings.VerboseLong); // Version - if (this[Flag.Version] == true) - parameters.Add(Converters.LongName(Flag.Version)); + if (this[FlagStrings.VersionLong] == true) + parameters.Add(FlagStrings.VersionLong); // Help - if (this[Flag.Help] == true) - parameters.Add(Converters.LongName(Flag.Version)); + if (this[FlagStrings.HelpLong] == true) + parameters.Add(FlagStrings.VersionLong); #endregion - if (BaseCommand != Command.NONE) - parameters.Add(Converters.LongName(BaseCommand)); + if (BaseCommand == null) + BaseCommand = CommandStrings.NONE; + + if (!string.IsNullOrWhiteSpace(BaseCommand)) + parameters.Add(BaseCommand); else return null; #region Boolean flags // Adler-32 - if (GetSupportedCommands(Flag.Adler32).Contains(BaseCommand)) + if (IsFlagSupported(FlagStrings.Adler32Long)) { - if (this[Flag.Adler32] == true) - parameters.Add(Converters.LongName(Flag.Adler32)); + if (this[FlagStrings.Adler32Long] == true) + parameters.Add(FlagStrings.Adler32Long); } // Clear - if (GetSupportedCommands(Flag.Clear).Contains(BaseCommand)) + if (IsFlagSupported(FlagStrings.ClearLong)) { - if (this[Flag.Clear] == true) - parameters.Add(Converters.LongName(Flag.Clear)); + if (this[FlagStrings.ClearLong] == true) + parameters.Add(FlagStrings.ClearLong); } // Clear All - if (GetSupportedCommands(Flag.ClearAll).Contains(BaseCommand)) + if (IsFlagSupported(FlagStrings.ClearAllLong)) { - if (this[Flag.ClearAll] == true) - parameters.Add(Converters.LongName(Flag.ClearAll)); + if (this[FlagStrings.ClearAllLong] == true) + parameters.Add(FlagStrings.ClearAllLong); } // CRC16 - if (GetSupportedCommands(Flag.CRC16).Contains(BaseCommand)) + if (IsFlagSupported(FlagStrings.CRC16Long)) { - if (this[Flag.CRC16] == true) - parameters.Add(Converters.LongName(Flag.CRC16)); + if (this[FlagStrings.CRC16Long] == true) + parameters.Add(FlagStrings.CRC16Long); } // CRC32 - if (GetSupportedCommands(Flag.CRC32).Contains(BaseCommand)) + if (IsFlagSupported(FlagStrings.CRC32Long)) { - if (this[Flag.CRC32] == true) - parameters.Add(Converters.LongName(Flag.CRC32)); + if (this[FlagStrings.CRC32Long] == true) + parameters.Add(FlagStrings.CRC32Long); } // CRC64 - if (GetSupportedCommands(Flag.CRC64).Contains(BaseCommand)) + if (IsFlagSupported(FlagStrings.CRC64Long)) { - if (this[Flag.CRC64] == true) - parameters.Add(Converters.LongName(Flag.CRC64)); + if (this[FlagStrings.CRC64Long] == true) + parameters.Add(FlagStrings.CRC64Long); } // Disk Tags - if (GetSupportedCommands(Flag.DiskTags).Contains(BaseCommand)) + if (IsFlagSupported(FlagStrings.DiskTagsLong)) { - if (this[Flag.DiskTags] == true) - parameters.Add(Converters.LongName(Flag.DiskTags)); + if (this[FlagStrings.DiskTagsLong] == true) + parameters.Add(FlagStrings.DiskTagsLong); } // Duplicated Sectors - if (GetSupportedCommands(Flag.DuplicatedSectors).Contains(BaseCommand)) + if (IsFlagSupported(FlagStrings.DuplicatedSectorsLong)) { - if (this[Flag.DuplicatedSectors] == true) - parameters.Add(Converters.LongName(Flag.DuplicatedSectors)); + if (this[FlagStrings.DuplicatedSectorsLong] == true) + parameters.Add(FlagStrings.DuplicatedSectorsLong); } // Eject - if (GetSupportedCommands(Flag.Eject).Contains(BaseCommand)) + if (IsFlagSupported(FlagStrings.EjectLong)) { - if (this[Flag.Eject] == true) - parameters.Add(Converters.LongName(Flag.Eject)); + if (this[FlagStrings.EjectLong] == true) + parameters.Add(FlagStrings.EjectLong); } // Extended Attributes - if (GetSupportedCommands(Flag.ExtendedAttributes).Contains(BaseCommand)) + if (IsFlagSupported(FlagStrings.ExtendedAttributesLong)) { - if (this[Flag.ExtendedAttributes] == true) - parameters.Add(Converters.LongName(Flag.ExtendedAttributes)); + if (this[FlagStrings.ExtendedAttributesLong] == true) + parameters.Add(FlagStrings.ExtendedAttributesLong); } // Filesystems - if (GetSupportedCommands(Flag.Filesystems).Contains(BaseCommand)) + if (IsFlagSupported(FlagStrings.FilesystemsLong)) { - if (this[Flag.Filesystems] == true) - parameters.Add(Converters.LongName(Flag.Filesystems)); + if (this[FlagStrings.FilesystemsLong] == true) + parameters.Add(FlagStrings.FilesystemsLong); } // First Pregap - if (GetSupportedCommands(Flag.FirstPregap).Contains(BaseCommand)) + if (IsFlagSupported(FlagStrings.FirstPregapLong)) { - if (this[Flag.FirstPregap] == true) - parameters.Add(Converters.LongName(Flag.FirstPregap)); + if (this[FlagStrings.FirstPregapLong] == true) + parameters.Add(FlagStrings.FirstPregapLong); } // Fix Offset - if (GetSupportedCommands(Flag.FixOffset).Contains(BaseCommand)) + if (IsFlagSupported(FlagStrings.FixOffsetLong)) { - if (this[Flag.FixOffset] == true) - parameters.Add(Converters.LongName(Flag.FixOffset)); + if (this[FlagStrings.FixOffsetLong] == true) + parameters.Add(FlagStrings.FixOffsetLong); } // Fix Subchannel - if (GetSupportedCommands(Flag.FixSubchannel).Contains(BaseCommand)) + if (IsFlagSupported(FlagStrings.FixSubchannelLong)) { - if (this[Flag.FixSubchannel] == true) - parameters.Add(Converters.LongName(Flag.FixSubchannel)); + if (this[FlagStrings.FixSubchannelLong] == true) + parameters.Add(FlagStrings.FixSubchannelLong); } // Fix Subchannel CRC - if (GetSupportedCommands(Flag.FixSubchannelCrc).Contains(BaseCommand)) + if (IsFlagSupported(FlagStrings.FixSubchannelCrcLong)) { - if (this[Flag.FixSubchannelCrc] == true) - parameters.Add(Converters.LongName(Flag.FixSubchannelCrc)); + if (this[FlagStrings.FixSubchannelCrcLong] == true) + parameters.Add(FlagStrings.FixSubchannelCrcLong); } // Fix Subchannel Position - if (GetSupportedCommands(Flag.FixSubchannelPosition).Contains(BaseCommand)) + if (IsFlagSupported(FlagStrings.FixSubchannelPositionLong)) { - if (this[Flag.FixSubchannelPosition] == true) - parameters.Add(Converters.LongName(Flag.FixSubchannelPosition)); + if (this[FlagStrings.FixSubchannelPositionLong] == true) + parameters.Add(FlagStrings.FixSubchannelPositionLong); } // Fletcher-16 - if (GetSupportedCommands(Flag.Fletcher16).Contains(BaseCommand)) + if (IsFlagSupported(FlagStrings.Fletcher16Long)) { - if (this[Flag.Fletcher16] == true) - parameters.Add(Converters.LongName(Flag.Fletcher16)); + if (this[FlagStrings.Fletcher16Long] == true) + parameters.Add(FlagStrings.Fletcher16Long); } // Fletcher-32 - if (GetSupportedCommands(Flag.Fletcher32).Contains(BaseCommand)) + if (IsFlagSupported(FlagStrings.Fletcher32Long)) { - if (this[Flag.Fletcher32] == true) - parameters.Add(Converters.LongName(Flag.Fletcher32)); + if (this[FlagStrings.Fletcher32Long] == true) + parameters.Add(FlagStrings.Fletcher32Long); } // Force - if (GetSupportedCommands(Flag.Force).Contains(BaseCommand)) + if (IsFlagSupported(FlagStrings.ForceLong)) { - if (this[Flag.Force] == true) - parameters.Add(Converters.LongName(Flag.Force)); + if (this[FlagStrings.ForceLong] == true) + parameters.Add(FlagStrings.ForceLong); } // Generate Subchannels - if (GetSupportedCommands(Flag.GenerateSubchannels).Contains(BaseCommand)) + if (IsFlagSupported(FlagStrings.GenerateSubchannelsLong)) { - if (this[Flag.GenerateSubchannels] == true) - parameters.Add(Converters.LongName(Flag.GenerateSubchannels)); + if (this[FlagStrings.GenerateSubchannelsLong] == true) + parameters.Add(FlagStrings.GenerateSubchannelsLong); } // Long Format - if (GetSupportedCommands(Flag.LongFormat).Contains(BaseCommand)) + if (IsFlagSupported(FlagStrings.LongFormatLong)) { - if (this[Flag.LongFormat] == true) - parameters.Add(Converters.LongName(Flag.LongFormat)); + if (this[FlagStrings.LongFormatLong] == true) + parameters.Add(FlagStrings.LongFormatLong); } // Long Sectors - if (GetSupportedCommands(Flag.LongSectors).Contains(BaseCommand)) + if (IsFlagSupported(FlagStrings.LongSectorsLong)) { - if (this[Flag.LongSectors] == true) - parameters.Add(Converters.LongName(Flag.LongSectors)); + if (this[FlagStrings.LongSectorsLong] == true) + parameters.Add(FlagStrings.LongSectorsLong); } // MD5 - if (GetSupportedCommands(Flag.MD5).Contains(BaseCommand)) + if (IsFlagSupported(FlagStrings.MD5Long)) { - if (this[Flag.MD5] == true) - parameters.Add(Converters.LongName(Flag.MD5)); + if (this[FlagStrings.MD5Long] == true) + parameters.Add(FlagStrings.MD5Long); } // Metadata - if (GetSupportedCommands(Flag.Metadata).Contains(BaseCommand)) + if (IsFlagSupported(FlagStrings.MetadataLong)) { - if (this[Flag.Metadata] == true) - parameters.Add(Converters.LongName(Flag.Metadata)); + if (this[FlagStrings.MetadataLong] == true) + parameters.Add(FlagStrings.MetadataLong); } // Partitions - if (GetSupportedCommands(Flag.Partitions).Contains(BaseCommand)) + if (IsFlagSupported(FlagStrings.PartitionsLong)) { - if (this[Flag.Partitions] == true) - parameters.Add(Converters.LongName(Flag.Partitions)); + if (this[FlagStrings.PartitionsLong] == true) + parameters.Add(FlagStrings.PartitionsLong); } // Persistent - if (GetSupportedCommands(Flag.Persistent).Contains(BaseCommand)) + if (IsFlagSupported(FlagStrings.PersistentLong)) { - if (this[Flag.Persistent] == true) - parameters.Add(Converters.LongName(Flag.Persistent)); + if (this[FlagStrings.PersistentLong] == true) + parameters.Add(FlagStrings.PersistentLong); } // Private - if (GetSupportedCommands(Flag.Private).Contains(BaseCommand)) + if (IsFlagSupported(FlagStrings.PrivateLong)) { - if (this[Flag.Private] == true) - parameters.Add(Converters.LongName(Flag.Private)); + if (this[FlagStrings.PrivateLong] == true) + parameters.Add(FlagStrings.PrivateLong); } // Resume - if (GetSupportedCommands(Flag.Resume).Contains(BaseCommand)) + if (IsFlagSupported(FlagStrings.ResumeLong)) { - if (this[Flag.Resume] == true) - parameters.Add(Converters.LongName(Flag.Resume)); + if (this[FlagStrings.ResumeLong] == true) + parameters.Add(FlagStrings.ResumeLong); } // Retry Subchannel - if (GetSupportedCommands(Flag.RetrySubchannel).Contains(BaseCommand)) + if (IsFlagSupported(FlagStrings.RetrySubchannelLong)) { - if (this[Flag.RetrySubchannel] == true) - parameters.Add(Converters.LongName(Flag.RetrySubchannel)); + if (this[FlagStrings.RetrySubchannelLong] == true) + parameters.Add(FlagStrings.RetrySubchannelLong); } // Sector Tags - if (GetSupportedCommands(Flag.SectorTags).Contains(BaseCommand)) + if (IsFlagSupported(FlagStrings.SectorTagsLong)) { - if (this[Flag.SectorTags] == true) - parameters.Add(Converters.LongName(Flag.SectorTags)); + if (this[FlagStrings.SectorTagsLong] == true) + parameters.Add(FlagStrings.SectorTagsLong); } // Separated Tracks - if (GetSupportedCommands(Flag.SeparatedTracks).Contains(BaseCommand)) + if (IsFlagSupported(FlagStrings.SeparatedTracksLong)) { - if (this[Flag.SeparatedTracks] == true) - parameters.Add(Converters.LongName(Flag.SeparatedTracks)); + if (this[FlagStrings.SeparatedTracksLong] == true) + parameters.Add(FlagStrings.SeparatedTracksLong); } // SHA-1 - if (GetSupportedCommands(Flag.SHA1).Contains(BaseCommand)) + if (IsFlagSupported(FlagStrings.SHA1Long)) { - if (this[Flag.SHA1] == true) - parameters.Add(Converters.LongName(Flag.SHA1)); + if (this[FlagStrings.SHA1Long] == true) + parameters.Add(FlagStrings.SHA1Long); } // SHA-256 - if (GetSupportedCommands(Flag.SHA256).Contains(BaseCommand)) + if (IsFlagSupported(FlagStrings.SHA256Long)) { - if (this[Flag.SHA256] == true) - parameters.Add(Converters.LongName(Flag.SHA256)); + if (this[FlagStrings.SHA256Long] == true) + parameters.Add(FlagStrings.SHA256Long); } // SHA-384 - if (GetSupportedCommands(Flag.SHA384).Contains(BaseCommand)) + if (IsFlagSupported(FlagStrings.SHA384Long)) { - if (this[Flag.SHA384] == true) - parameters.Add(Converters.LongName(Flag.SHA384)); + if (this[FlagStrings.SHA384Long] == true) + parameters.Add(FlagStrings.SHA384Long); } // SHA-512 - if (GetSupportedCommands(Flag.SHA512).Contains(BaseCommand)) + if (IsFlagSupported(FlagStrings.SHA512Long)) { - if (this[Flag.SHA512] == true) - parameters.Add(Converters.LongName(Flag.SHA512)); + if (this[FlagStrings.SHA512Long] == true) + parameters.Add(FlagStrings.SHA512Long); } // Skip CD-i Ready Hole - if (GetSupportedCommands(Flag.SkipCdiReadyHole).Contains(BaseCommand)) + if (IsFlagSupported(FlagStrings.SkipCdiReadyHoleLong)) { - if (this[Flag.SkipCdiReadyHole] == true) - parameters.Add(Converters.LongName(Flag.SkipCdiReadyHole)); + if (this[FlagStrings.SkipCdiReadyHoleLong] == true) + parameters.Add(FlagStrings.SkipCdiReadyHoleLong); } // SpamSum - if (GetSupportedCommands(Flag.SpamSum).Contains(BaseCommand)) + if (IsFlagSupported(FlagStrings.SpamSumLong)) { - if (this[Flag.SpamSum] == true) - parameters.Add(Converters.LongName(Flag.SpamSum)); + if (this[FlagStrings.SpamSumLong] == true) + parameters.Add(FlagStrings.SpamSumLong); } // Stop on Error - if (GetSupportedCommands(Flag.StopOnError).Contains(BaseCommand)) + if (IsFlagSupported(FlagStrings.StopOnErrorLong)) { - if (this[Flag.StopOnError] == true) - parameters.Add(Converters.LongName(Flag.StopOnError)); + if (this[FlagStrings.StopOnErrorLong] == true) + parameters.Add(FlagStrings.StopOnErrorLong); } // Tape - if (GetSupportedCommands(Flag.Tape).Contains(BaseCommand)) + if (IsFlagSupported(FlagStrings.TapeLong)) { - if (this[Flag.Tape] == true) - parameters.Add(Converters.LongName(Flag.Tape)); + if (this[FlagStrings.TapeLong] == true) + parameters.Add(FlagStrings.TapeLong); } // Trim - if (GetSupportedCommands(Flag.Trim).Contains(BaseCommand)) + if (IsFlagSupported(FlagStrings.TrimLong)) { - if (this[Flag.Trim] == true) - parameters.Add(Converters.LongName(Flag.Trim)); + if (this[FlagStrings.TrimLong] == true) + parameters.Add(FlagStrings.TrimLong); } // Verify Disc - if (GetSupportedCommands(Flag.VerifyDisc).Contains(BaseCommand)) + if (IsFlagSupported(FlagStrings.VerifyDiscLong)) { - if (this[Flag.VerifyDisc] == true) - parameters.Add(Converters.LongName(Flag.VerifyDisc)); + if (this[FlagStrings.VerifyDiscLong] == true) + parameters.Add(FlagStrings.VerifyDiscLong); } // Verify Sectors - if (GetSupportedCommands(Flag.VerifySectors).Contains(BaseCommand)) + if (IsFlagSupported(FlagStrings.VerifySectorsLong)) { - if (this[Flag.VerifySectors] == true) - parameters.Add(Converters.LongName(Flag.VerifySectors)); + if (this[FlagStrings.VerifySectorsLong] == true) + parameters.Add(FlagStrings.VerifySectorsLong); } // Whole Disc - if (GetSupportedCommands(Flag.WholeDisc).Contains(BaseCommand)) + if (IsFlagSupported(FlagStrings.WholeDiscLong)) { - if (this[Flag.WholeDisc] == true) - parameters.Add(Converters.LongName(Flag.WholeDisc)); + if (this[FlagStrings.WholeDiscLong] == true) + parameters.Add(FlagStrings.WholeDiscLong); } #endregion @@ -721,10 +699,10 @@ namespace MPF.Aaru #region Int8 flags // Speed - if (GetSupportedCommands(Flag.Speed).Contains(BaseCommand)) + if (IsFlagSupported(FlagStrings.SpeedLong)) { - if (this[Flag.Speed] == true && SpeedValue != null) - parameters.Add($"{Converters.LongName(Flag.Speed)} {SpeedValue}"); + if (this[FlagStrings.SpeedLong] == true && SpeedValue != null) + parameters.Add($"{FlagStrings.SpeedLong} {SpeedValue}"); } #endregion @@ -732,17 +710,17 @@ namespace MPF.Aaru #region Int16 flags // Retry Passes - if (GetSupportedCommands(Flag.RetryPasses).Contains(BaseCommand)) + if (IsFlagSupported(FlagStrings.RetryPassesLong)) { - if (this[Flag.RetryPasses] == true && RetryPassesValue != null) - parameters.Add($"{Converters.LongName(Flag.RetryPasses)} {RetryPassesValue}"); + if (this[FlagStrings.RetryPassesLong] == true && RetryPassesValue != null) + parameters.Add($"{FlagStrings.RetryPassesLong} {RetryPassesValue}"); } // Width - if (GetSupportedCommands(Flag.Width).Contains(BaseCommand)) + if (IsFlagSupported(FlagStrings.WidthLong)) { - if (this[Flag.Width] == true && WidthValue != null) - parameters.Add($"{Converters.LongName(Flag.Width)} {WidthValue}"); + if (this[FlagStrings.WidthLong] == true && WidthValue != null) + parameters.Add($"{FlagStrings.WidthLong} {WidthValue}"); } #endregion @@ -750,38 +728,38 @@ namespace MPF.Aaru #region Int32 flags // Block Size - if (GetSupportedCommands(Flag.BlockSize).Contains(BaseCommand)) + if (IsFlagSupported(FlagStrings.BlockSizeLong)) { - if (this[Flag.BlockSize] == true && BlockSizeValue != null) - parameters.Add($"{Converters.LongName(Flag.BlockSize)} {BlockSizeValue}"); + if (this[FlagStrings.BlockSizeLong] == true && BlockSizeValue != null) + parameters.Add($"{FlagStrings.BlockSizeLong} {BlockSizeValue}"); } // Count - if (GetSupportedCommands(Flag.Count).Contains(BaseCommand)) + if (IsFlagSupported(FlagStrings.CountLong)) { - if (this[Flag.Count] == true && CountValue != null) - parameters.Add($"{Converters.LongName(Flag.Count)} {CountValue}"); + if (this[FlagStrings.CountLong] == true && CountValue != null) + parameters.Add($"{FlagStrings.CountLong} {CountValue}"); } // Media Last Sequence - if (GetSupportedCommands(Flag.MediaLastSequence).Contains(BaseCommand)) + if (IsFlagSupported(FlagStrings.MediaLastSequenceLong)) { - if (this[Flag.MediaLastSequence] == true && MediaLastSequenceValue != null) - parameters.Add($"{Converters.LongName(Flag.MediaLastSequence)} {MediaLastSequenceValue}"); + if (this[FlagStrings.MediaLastSequenceLong] == true && MediaLastSequenceValue != null) + parameters.Add($"{FlagStrings.MediaLastSequenceLong} {MediaLastSequenceValue}"); } // Media Sequence - if (GetSupportedCommands(Flag.MediaSequence).Contains(BaseCommand)) + if (IsFlagSupported(FlagStrings.MediaSequenceLong)) { - if (this[Flag.MediaSequence] == true && MediaSequenceValue != null) - parameters.Add($"{Converters.LongName(Flag.MediaSequence)} {MediaSequenceValue}"); + if (this[FlagStrings.MediaSequenceLong] == true && MediaSequenceValue != null) + parameters.Add($"{FlagStrings.MediaSequenceLong} {MediaSequenceValue}"); } // Skip - if (GetSupportedCommands(Flag.Skip).Contains(BaseCommand)) + if (IsFlagSupported(FlagStrings.SkipLong)) { - if (this[Flag.Skip] == true && SkipValue != null) - parameters.Add($"{Converters.LongName(Flag.Skip)} {SkipValue}"); + if (this[FlagStrings.SkipLong] == true && SkipValue != null) + parameters.Add($"{FlagStrings.SkipLong} {SkipValue}"); } #endregion @@ -789,22 +767,22 @@ namespace MPF.Aaru #region Int64 flags // Length - if (GetSupportedCommands(Flag.Length).Contains(BaseCommand)) + if (IsFlagSupported(FlagStrings.LengthLong)) { - if (this[Flag.Length] == true && LengthValue != null) + if (this[FlagStrings.LengthLong] == true && LengthValue != null) { if (LengthValue >= 0) - parameters.Add($"{Converters.LongName(Flag.Length)} {LengthValue}"); - else if (LengthValue == -1 && BaseCommand == Command.ImageDecode) - parameters.Add($"{Converters.LongName(Flag.Length)} all"); + parameters.Add($"{FlagStrings.LengthLong} {LengthValue}"); + else if (LengthValue == -1 && BaseCommand == CommandStrings.ImageDecode) + parameters.Add($"{FlagStrings.LengthLong} all"); } } // Start - if (GetSupportedCommands(Flag.Start).Contains(BaseCommand)) + if (IsFlagSupported(FlagStrings.StartLong)) { - if (this[Flag.Start] == true && StartValue != null) - parameters.Add($"{Converters.LongName(Flag.Start)} {StartValue}"); + if (this[FlagStrings.StartLong] == true && StartValue != null) + parameters.Add($"{FlagStrings.StartLong} {StartValue}"); } #endregion @@ -812,164 +790,164 @@ namespace MPF.Aaru #region String flags // Comments - if (GetSupportedCommands(Flag.Comments).Contains(BaseCommand)) + if (IsFlagSupported(FlagStrings.CommentsLong)) { - if (this[Flag.Comments] == true && CommentsValue != null) - parameters.Add($"{Converters.LongName(Flag.Comments)} \"{CommentsValue}\""); + if (this[FlagStrings.CommentsLong] == true && CommentsValue != null) + parameters.Add($"{FlagStrings.CommentsLong} \"{CommentsValue}\""); } // Creator - if (GetSupportedCommands(Flag.Creator).Contains(BaseCommand)) + if (IsFlagSupported(FlagStrings.CreatorLong)) { - if (this[Flag.Creator] == true && CreatorValue != null) - parameters.Add($"{Converters.LongName(Flag.Creator)} \"{CreatorValue}\""); + if (this[FlagStrings.CreatorLong] == true && CreatorValue != null) + parameters.Add($"{FlagStrings.CreatorLong} \"{CreatorValue}\""); } // Drive Manufacturer - if (GetSupportedCommands(Flag.DriveManufacturer).Contains(BaseCommand)) + if (IsFlagSupported(FlagStrings.DriveManufacturerLong)) { - if (this[Flag.DriveManufacturer] == true && DriveManufacturerValue != null) - parameters.Add($"{Converters.LongName(Flag.DriveManufacturer)} \"{DriveManufacturerValue}\""); + if (this[FlagStrings.DriveManufacturerLong] == true && DriveManufacturerValue != null) + parameters.Add($"{FlagStrings.DriveManufacturerLong} \"{DriveManufacturerValue}\""); } // Drive Model - if (GetSupportedCommands(Flag.DriveModel).Contains(BaseCommand)) + if (IsFlagSupported(FlagStrings.DriveModelLong)) { - if (this[Flag.DriveModel] == true && DriveModelValue != null) - parameters.Add($"{Converters.LongName(Flag.DriveModel)} \"{DriveModelValue}\""); + if (this[FlagStrings.DriveModelLong] == true && DriveModelValue != null) + parameters.Add($"{FlagStrings.DriveModelLong} \"{DriveModelValue}\""); } // Drive Revision - if (GetSupportedCommands(Flag.DriveRevision).Contains(BaseCommand)) + if (IsFlagSupported(FlagStrings.DriveRevisionLong)) { - if (this[Flag.DriveRevision] == true && DriveRevisionValue != null) - parameters.Add($"{Converters.LongName(Flag.DriveRevision)} \"{DriveRevisionValue}\""); + if (this[FlagStrings.DriveRevisionLong] == true && DriveRevisionValue != null) + parameters.Add($"{FlagStrings.DriveRevisionLong} \"{DriveRevisionValue}\""); } // Drive Serial - if (GetSupportedCommands(Flag.DriveSerial).Contains(BaseCommand)) + if (IsFlagSupported(FlagStrings.DriveSerialLong)) { - if (this[Flag.DriveSerial] == true && DriveSerialValue != null) - parameters.Add($"{Converters.LongName(Flag.DriveSerial)} \"{DriveSerialValue}\""); + if (this[FlagStrings.DriveSerialLong] == true && DriveSerialValue != null) + parameters.Add($"{FlagStrings.DriveSerialLong} \"{DriveSerialValue}\""); } // Encoding - if (GetSupportedCommands(Flag.Encoding).Contains(BaseCommand)) + if (IsFlagSupported(FlagStrings.EncodingLong)) { - if (this[Flag.Encoding] == true && EncodingValue != null) - parameters.Add($"{Converters.LongName(Flag.Encoding)} \"{EncodingValue}\""); + if (this[FlagStrings.EncodingLong] == true && EncodingValue != null) + parameters.Add($"{FlagStrings.EncodingLong} \"{EncodingValue}\""); } // Format (Convert) - if (GetSupportedCommands(Flag.FormatConvert).Contains(BaseCommand)) + if (IsFlagSupported(FlagStrings.FormatConvertLong)) { - if (this[Flag.FormatConvert] == true && FormatConvertValue != null) - parameters.Add($"{Converters.LongName(Flag.FormatConvert)} \"{FormatConvertValue}\""); + if (this[FlagStrings.FormatConvertLong] == true && FormatConvertValue != null) + parameters.Add($"{FlagStrings.FormatConvertLong} \"{FormatConvertValue}\""); } // Format (Dump) - if (GetSupportedCommands(Flag.FormatDump).Contains(BaseCommand)) + if (IsFlagSupported(FlagStrings.FormatDumpLong)) { - if (this[Flag.FormatDump] == true && FormatDumpValue != null) - parameters.Add($"{Converters.LongName(Flag.FormatDump)} \"{FormatDumpValue}\""); + if (this[FlagStrings.FormatDumpLong] == true && FormatDumpValue != null) + parameters.Add($"{FlagStrings.FormatDumpLong} \"{FormatDumpValue}\""); } // ImgBurn Log - if (GetSupportedCommands(Flag.ImgBurnLog).Contains(BaseCommand)) + if (IsFlagSupported(FlagStrings.ImgBurnLogLong)) { - if (this[Flag.ImgBurnLog] == true && ImgBurnLogValue != null) - parameters.Add($"{Converters.LongName(Flag.ImgBurnLog)} \"{ImgBurnLogValue}\""); + if (this[FlagStrings.ImgBurnLogLong] == true && ImgBurnLogValue != null) + parameters.Add($"{FlagStrings.ImgBurnLogLong} \"{ImgBurnLogValue}\""); } // Media Barcode - if (GetSupportedCommands(Flag.MediaBarcode).Contains(BaseCommand)) + if (IsFlagSupported(FlagStrings.MediaBarcodeLong)) { - if (this[Flag.MediaBarcode] == true && MediaBarcodeValue != null) - parameters.Add($"{Converters.LongName(Flag.MediaBarcode)} \"{MediaBarcodeValue}\""); + if (this[FlagStrings.MediaBarcodeLong] == true && MediaBarcodeValue != null) + parameters.Add($"{FlagStrings.MediaBarcodeLong} \"{MediaBarcodeValue}\""); } // Media Manufacturer - if (GetSupportedCommands(Flag.MediaManufacturer).Contains(BaseCommand)) + if (IsFlagSupported(FlagStrings.MediaManufacturerLong)) { - if (this[Flag.MediaManufacturer] == true && MediaManufacturerValue != null) - parameters.Add($"{Converters.LongName(Flag.MediaManufacturer)} \"{MediaManufacturerValue}\""); + if (this[FlagStrings.MediaManufacturerLong] == true && MediaManufacturerValue != null) + parameters.Add($"{FlagStrings.MediaManufacturerLong} \"{MediaManufacturerValue}\""); } // Media Model - if (GetSupportedCommands(Flag.MediaModel).Contains(BaseCommand)) + if (IsFlagSupported(FlagStrings.MediaModelLong)) { - if (this[Flag.MediaModel] == true && MediaModelValue != null) - parameters.Add($"{Converters.LongName(Flag.MediaModel)} \"{MediaModelValue}\""); + if (this[FlagStrings.MediaModelLong] == true && MediaModelValue != null) + parameters.Add($"{FlagStrings.MediaModelLong} \"{MediaModelValue}\""); } // Media Part Number - if (GetSupportedCommands(Flag.MediaPartNumber).Contains(BaseCommand)) + if (IsFlagSupported(FlagStrings.MediaPartNumberLong)) { - if (this[Flag.MediaPartNumber] == true && MediaPartNumberValue != null) - parameters.Add($"{Converters.LongName(Flag.MediaPartNumber)} \"{MediaPartNumberValue}\""); + if (this[FlagStrings.MediaPartNumberLong] == true && MediaPartNumberValue != null) + parameters.Add($"{FlagStrings.MediaPartNumberLong} \"{MediaPartNumberValue}\""); } // Media Serial - if (GetSupportedCommands(Flag.MediaSerial).Contains(BaseCommand)) + if (IsFlagSupported(FlagStrings.MediaSerialLong)) { - if (this[Flag.MediaSerial] == true && MediaSerialValue != null) - parameters.Add($"{Converters.LongName(Flag.MediaSerial)} \"{MediaSerialValue}\""); + if (this[FlagStrings.MediaSerialLong] == true && MediaSerialValue != null) + parameters.Add($"{FlagStrings.MediaSerialLong} \"{MediaSerialValue}\""); } // Media Title - if (GetSupportedCommands(Flag.MediaTitle).Contains(BaseCommand)) + if (IsFlagSupported(FlagStrings.MediaTitleLong)) { - if (this[Flag.MediaTitle] == true && MediaTitleValue != null) - parameters.Add($"{Converters.LongName(Flag.MediaTitle)} \"{MediaTitleValue}\""); + if (this[FlagStrings.MediaTitleLong] == true && MediaTitleValue != null) + parameters.Add($"{FlagStrings.MediaTitleLong} \"{MediaTitleValue}\""); } // MHDD Log - if (GetSupportedCommands(Flag.MHDDLog).Contains(BaseCommand)) + if (IsFlagSupported(FlagStrings.MHDDLogLong)) { - if (this[Flag.MHDDLog] == true && MHDDLogValue != null) - parameters.Add($"{Converters.LongName(Flag.MHDDLog)} \"{MHDDLogValue}\""); + if (this[FlagStrings.MHDDLogLong] == true && MHDDLogValue != null) + parameters.Add($"{FlagStrings.MHDDLogLong} \"{MHDDLogValue}\""); } // Namespace - if (GetSupportedCommands(Flag.Namespace).Contains(BaseCommand)) + if (IsFlagSupported(FlagStrings.NamespaceLong)) { - if (this[Flag.Namespace] == true && NamespaceValue != null) - parameters.Add($"{Converters.LongName(Flag.Namespace)} \"{NamespaceValue}\""); + if (this[FlagStrings.NamespaceLong] == true && NamespaceValue != null) + parameters.Add($"{FlagStrings.NamespaceLong} \"{NamespaceValue}\""); } // Options - if (GetSupportedCommands(Flag.Options).Contains(BaseCommand)) + if (IsFlagSupported(FlagStrings.OptionsLong)) { - if (this[Flag.Options] == true && OptionsValue != null) - parameters.Add($"{Converters.LongName(Flag.Options)} \"{OptionsValue}\""); + if (this[FlagStrings.OptionsLong] == true && OptionsValue != null) + parameters.Add($"{FlagStrings.OptionsLong} \"{OptionsValue}\""); } // Output Prefix - if (GetSupportedCommands(Flag.OutputPrefix).Contains(BaseCommand)) + if (IsFlagSupported(FlagStrings.OutputPrefixLong)) { - if (this[Flag.OutputPrefix] == true && OutputPrefixValue != null) - parameters.Add($"{Converters.LongName(Flag.OutputPrefix)} \"{OutputPrefixValue}\""); + if (this[FlagStrings.OutputPrefixLong] == true && OutputPrefixValue != null) + parameters.Add($"{FlagStrings.OutputPrefixLong} \"{OutputPrefixValue}\""); } // Resume File - if (GetSupportedCommands(Flag.ResumeFile).Contains(BaseCommand)) + if (IsFlagSupported(FlagStrings.ResumeFileLong)) { - if (this[Flag.ResumeFile] == true && ResumeFileValue != null) - parameters.Add($"{Converters.LongName(Flag.ResumeFile)} \"{ResumeFileValue}\""); + if (this[FlagStrings.ResumeFileLong] == true && ResumeFileValue != null) + parameters.Add($"{FlagStrings.ResumeFileLong} \"{ResumeFileValue}\""); } // Subchannel - if (GetSupportedCommands(Flag.Subchannel).Contains(BaseCommand)) + if (IsFlagSupported(FlagStrings.SubchannelLong)) { - if (this[Flag.Subchannel] == true && SubchannelValue != null) - parameters.Add($"{Converters.LongName(Flag.Subchannel)} \"{SubchannelValue}\""); + if (this[FlagStrings.SubchannelLong] == true && SubchannelValue != null) + parameters.Add($"{FlagStrings.SubchannelLong} \"{SubchannelValue}\""); } // XML Sidecar - if (GetSupportedCommands(Flag.XMLSidecar).Contains(BaseCommand)) + if (IsFlagSupported(FlagStrings.XMLSidecarLong)) { - if (this[Flag.XMLSidecar] == true && XMLSidecarValue != null) - parameters.Add($"{Converters.LongName(Flag.XMLSidecar)} \"{XMLSidecarValue}\""); + if (this[FlagStrings.XMLSidecarLong] == true && XMLSidecarValue != null) + parameters.Add($"{FlagStrings.XMLSidecarLong} \"{XMLSidecarValue}\""); } #endregion @@ -978,19 +956,19 @@ namespace MPF.Aaru switch (BaseCommand) { // Input value only - case Command.DeviceInfo: - case Command.DeviceReport: - case Command.FilesystemList: - case Command.ImageAnalyze: - case Command.ImageChecksum: - case Command.ImageCreateSidecar: - case Command.ImageDecode: - case Command.ImageEntropy: - case Command.ImageInfo: - case Command.ImagePrint: - case Command.ImageVerify: - case Command.MediaInfo: - case Command.MediaScan: + case CommandStrings.DevicePrefixLong + " " + CommandStrings.DeviceInfo: + case CommandStrings.DevicePrefixLong + " " + CommandStrings.DeviceReport: + case CommandStrings.FilesystemPrefixLong + " " + CommandStrings.FilesystemListLong: + case CommandStrings.ImagePrefixLong + " " + CommandStrings.ImageAnalyze: + case CommandStrings.ImagePrefixLong + " " + CommandStrings.ImageChecksumLong: + case CommandStrings.ImagePrefixLong + " " + CommandStrings.ImageCreateSidecar: + case CommandStrings.ImagePrefixLong + " " + CommandStrings.ImageDecode: + case CommandStrings.ImagePrefixLong + " " + CommandStrings.ImageEntropy: + case CommandStrings.ImagePrefixLong + " " + CommandStrings.ImageInfo: + case CommandStrings.ImagePrefixLong + " " + CommandStrings.ImagePrint: + case CommandStrings.ImagePrefixLong + " " + CommandStrings.ImageVerify: + case CommandStrings.MediaPrefixLong + " " + CommandStrings.MediaInfo: + case CommandStrings.MediaPrefixLong + " " + CommandStrings.MediaScan: if (string.IsNullOrWhiteSpace(InputValue)) return null; @@ -998,7 +976,7 @@ namespace MPF.Aaru break; // Two input values - case Command.ImageCompare: + case CommandStrings.ImagePrefixLong + " " + CommandStrings.ImageCompareLong: if (string.IsNullOrWhiteSpace(Input1Value) || string.IsNullOrWhiteSpace(Input2Value)) return null; @@ -1007,9 +985,9 @@ namespace MPF.Aaru break; // Input and Output value - case Command.FilesystemExtract: - case Command.ImageConvert: - case Command.MediaDump: + case CommandStrings.FilesystemPrefixLong + " " + CommandStrings.FilesystemExtract: + case CommandStrings.ImagePrefixLong + " " + CommandStrings.ImageConvert: + case CommandStrings.MediaPrefixLong + " " + CommandStrings.MediaDump: if (string.IsNullOrWhiteSpace(InputValue) || string.IsNullOrWhiteSpace(OutputValue)) return null; @@ -1018,8 +996,8 @@ namespace MPF.Aaru break; // Remote host value only - case Command.DeviceList: - case Command.Remote: + case CommandStrings.DevicePrefixLong + " " + CommandStrings.DeviceList: + case CommandStrings.Remote: if (string.IsNullOrWhiteSpace(RemoteHostValue)) return null; @@ -1030,6 +1008,304 @@ namespace MPF.Aaru return string.Join(" ", parameters); } + /// + public override Dictionary> GetCommandSupport() + { + return new Dictionary>() + { + #region Database Family + + [CommandStrings.DatabasePrefixLong + " " + CommandStrings.DatabaseStats] = new List() + { + }, + + [CommandStrings.DatabasePrefixLong + " " + CommandStrings.DatabaseUpdate] = new List() + { + FlagStrings.ClearLong, + FlagStrings.ClearAllLong, + }, + + #endregion + + #region Device Family + + [CommandStrings.DevicePrefixLong + " " + CommandStrings.DeviceInfo] = new List() + { + FlagStrings.OutputPrefixLong, + }, + + [CommandStrings.DevicePrefixLong + " " + CommandStrings.DeviceList] = new List() + { + }, + + [CommandStrings.DevicePrefixLong + " " + CommandStrings.DeviceReport] = new List() + { + }, + + #endregion + + #region Filesystem Family + + [CommandStrings.FilesystemPrefixLong + " " + CommandStrings.FilesystemExtract] = new List() + { + FlagStrings.EncodingLong, + FlagStrings.EncodingShort, + FlagStrings.ExtendedAttributesLong, + FlagStrings.ExtendedAttributesShort, + FlagStrings.NamespaceLong, + FlagStrings.NamespaceShort, + FlagStrings.OptionsLong, + FlagStrings.OptionsShort, + }, + + [CommandStrings.FilesystemPrefixLong + " " + CommandStrings.FilesystemListLong] = new List() + { + FlagStrings.EncodingLong, + FlagStrings.EncodingShort, + FlagStrings.LongFormatLong, + FlagStrings.LongFormatShort, + FlagStrings.NamespaceLong, + FlagStrings.NamespaceShort, + FlagStrings.OptionsLong, + FlagStrings.OptionsShort, + }, + + [CommandStrings.FilesystemPrefixLong + " " + CommandStrings.FilesystemOptions] = new List() + { + }, + + #endregion + + #region Image Family + + [CommandStrings.ImagePrefixLong + " " + CommandStrings.ImageAnalyze] = new List() + { + FlagStrings.EncodingLong, + FlagStrings.EncodingShort, + FlagStrings.FilesystemsLong, + FlagStrings.FilesystemsShort, + FlagStrings.PartitionsLong, + FlagStrings.PartitionsShort, + FlagStrings.VerifyDiscLong, + FlagStrings.VerifyDiscShort, + FlagStrings.VerifySectorsLong, + FlagStrings.VerifySectorsShort, + }, + + [CommandStrings.ImagePrefixLong + " " + CommandStrings.ImageChecksumLong] = new List() + { + FlagStrings.Adler32Long, + FlagStrings.Adler32Short, + FlagStrings.CRC16Long, + FlagStrings.CRC32Long, + FlagStrings.CRC32Short, + FlagStrings.CRC64Long, + FlagStrings.Fletcher16Long, + FlagStrings.Fletcher32Long, + FlagStrings.MD5Long, + FlagStrings.MD5Short, + FlagStrings.SeparatedTracksLong, + FlagStrings.SeparatedTracksShort, + FlagStrings.SHA1Long, + FlagStrings.SHA1Short, + FlagStrings.SHA256Long, + FlagStrings.SHA384Long, + FlagStrings.SHA512Long, + FlagStrings.SpamSumLong, + FlagStrings.SpamSumShort, + FlagStrings.WholeDiscLong, + FlagStrings.WholeDiscShort, + }, + + [CommandStrings.ImagePrefixLong + " " + CommandStrings.ImageCompareLong] = new List() + { + }, + + [CommandStrings.ImagePrefixLong + " " + CommandStrings.ImageConvert] = new List() + { + FlagStrings.CommentsLong, + FlagStrings.CountLong, + FlagStrings.CountShort, + FlagStrings.CreatorLong, + FlagStrings.DriveManufacturerLong, + FlagStrings.DriveModelLong, + FlagStrings.DriveRevisionLong, + FlagStrings.DriveSerialLong, + FlagStrings.ForceLong, + FlagStrings.ForceShort, + FlagStrings.FormatConvertLong, + FlagStrings.FormatConvertShort, + FlagStrings.MediaBarcodeLong, + FlagStrings.MediaLastSequenceLong, + FlagStrings.MediaManufacturerLong, + FlagStrings.MediaModelLong, + FlagStrings.MediaPartNumberLong, + FlagStrings.MediaSequenceLong, + FlagStrings.MediaSerialLong, + FlagStrings.MediaTitleLong, + FlagStrings.OptionsLong, + FlagStrings.OptionsShort, + FlagStrings.ResumeFileLong, + FlagStrings.ResumeFileShort, + FlagStrings.XMLSidecarLong, + FlagStrings.XMLSidecarShort, + }, + + [CommandStrings.ImagePrefixLong + " " + CommandStrings.ImageCreateSidecar] = new List() + { + FlagStrings.BlockSizeLong, + FlagStrings.BlockSizeShort, + FlagStrings.EncodingLong, + FlagStrings.EncodingShort, + FlagStrings.TapeLong, + FlagStrings.TapeShort, + }, + + [CommandStrings.ImagePrefixLong + " " + CommandStrings.ImageDecode] = new List() + { + FlagStrings.DiskTagsLong, + FlagStrings.DiskTagsShort, + FlagStrings.LengthLong, + FlagStrings.LengthShort, + FlagStrings.SectorTagsLong, + FlagStrings.SectorTagsShort, + FlagStrings.StartLong, + FlagStrings.StartShort, + }, + + [CommandStrings.ImagePrefixLong + " " + CommandStrings.ImageEntropy] = new List() + { + FlagStrings.DuplicatedSectorsLong, + FlagStrings.DuplicatedSectorsShort, + FlagStrings.SeparatedTracksLong, + FlagStrings.SeparatedTracksShort, + FlagStrings.WholeDiscLong, + FlagStrings.WholeDiscShort, + }, + + [CommandStrings.ImagePrefixLong + " " + CommandStrings.ImageInfo] = new List() + { + }, + + [CommandStrings.ImagePrefixLong + " " + CommandStrings.ImageOptions] = new List() + { + }, + + [CommandStrings.ImagePrefixLong + " " + CommandStrings.ImagePrint] = new List() + { + FlagStrings.LengthLong, + FlagStrings.LengthShort, + FlagStrings.LongSectorsLong, + FlagStrings.LongSectorsShort, + FlagStrings.StartLong, + FlagStrings.StartShort, + FlagStrings.WidthLong, + FlagStrings.WidthShort, + }, + + [CommandStrings.ImagePrefixLong + " " + CommandStrings.ImageVerify] = new List() + { + FlagStrings.VerifyDiscLong, + FlagStrings.VerifyDiscShort, + FlagStrings.VerifySectorsLong, + FlagStrings.VerifySectorsShort, + }, + + #endregion + + #region Media Family + + [CommandStrings.MediaPrefixLong + " " + CommandStrings.MediaDump] = new List() + { + FlagStrings.EjectLong, + FlagStrings.EncodingLong, + FlagStrings.EncodingShort, + FlagStrings.FirstPregapLong, + FlagStrings.FixOffsetLong, + FlagStrings.FixSubchannelLong, + FlagStrings.FixSubchannelCrcLong, + FlagStrings.FixSubchannelPositionLong, + FlagStrings.ForceLong, + FlagStrings.ForceShort, + FlagStrings.FormatConvertLong, + FlagStrings.FormatConvertShort, + FlagStrings.GenerateSubchannelsLong, + FlagStrings.MetadataLong, + FlagStrings.OptionsLong, + FlagStrings.OptionsShort, + FlagStrings.PersistentLong, + FlagStrings.PrivateLong, + FlagStrings.ResumeLong, + FlagStrings.ResumeShort, + FlagStrings.RetryPassesLong, + FlagStrings.RetryPassesShort, + FlagStrings.RetrySubchannelLong, + FlagStrings.SkipLong, + FlagStrings.SkipShort, + FlagStrings.SkipCdiReadyHoleLong, + FlagStrings.SpeedLong, + FlagStrings.StopOnErrorLong, + FlagStrings.StopOnErrorShort, + FlagStrings.SubchannelLong, + FlagStrings.TrimLong, + FlagStrings.XMLSidecarLong, + FlagStrings.XMLSidecarShort, + }, + + [CommandStrings.MediaPrefixLong + " " + CommandStrings.MediaInfo] = new List() + { + FlagStrings.OutputPrefixLong, + FlagStrings.OutputPrefixShort, + }, + + [CommandStrings.MediaPrefixLong + " " + CommandStrings.MediaScan] = new List() + { + FlagStrings.ImgBurnLogLong, + FlagStrings.ImgBurnLogShort, + FlagStrings.MHDDLogLong, + FlagStrings.MHDDLogShort, + }, + + #endregion + + #region Standalone Commands + + [CommandStrings.NONE] = new List() + { + FlagStrings.DebugLong, + FlagStrings.DebugShort, + FlagStrings.HelpLong, + FlagStrings.HelpShort, + FlagStrings.HelpShortAlt, + FlagStrings.VerboseLong, + FlagStrings.VerboseShort, + FlagStrings.VersionLong, + }, + + [CommandStrings.Configure] = new List() + { + }, + + [CommandStrings.Formats] = new List() + { + }, + + [CommandStrings.ListEncodings] = new List() + { + }, + + [CommandStrings.ListNamespaces] = new List() + { + }, + + [CommandStrings.Remote] = new List() + { + }, + + #endregion + }; + } + /// public override string GetDefaultExtension(MediaType? mediaType) => Converters.Extension(mediaType); @@ -1080,7 +1356,7 @@ namespace MPF.Aaru { switch (BaseCommand) { - case Command.MediaDump: + case CommandStrings.MediaDump: return true; default: @@ -1091,9 +1367,9 @@ namespace MPF.Aaru /// protected override void ResetValues() { - BaseCommand = Command.NONE; + BaseCommand = CommandStrings.NONE; - _flags = new Dictionary(); + flags = new Dictionary(); BlockSizeValue = null; CommentsValue = null; @@ -1138,14 +1414,14 @@ namespace MPF.Aaru /// protected override void SetDefaultParameters(char driveLetter, string filename, int? driveSpeed, Options options) { - BaseCommand = Command.MediaDump; + BaseCommand = $"{CommandStrings.MediaPrefixLong} {CommandStrings.MediaDump}"; InputValue = $"\\\\?\\{driveLetter}:"; OutputValue = filename; if (driveSpeed != null) { - this[Flag.Speed] = true; + this[FlagStrings.SpeedLong] = true; SpeedValue = (sbyte?)driveSpeed; } @@ -1157,24 +1433,24 @@ namespace MPF.Aaru // Set retry count if (options.AaruRereadCount > 0) { - this[Flag.RetryPasses] = true; + this[FlagStrings.RetryPassesLong] = true; RetryPassesValue = (short)options.AaruRereadCount; } // Set user-defined options - this[Flag.Debug] = options.AaruEnableDebug; - this[Flag.Verbose] = options.AaruEnableVerbose; - this[Flag.Force] = options.AaruForceDumping; - this[Flag.Private] = options.AaruStripPersonalData; + this[FlagStrings.DebugLong] = options.AaruEnableDebug; + this[FlagStrings.VerboseLong] = options.AaruEnableVerbose; + this[FlagStrings.ForceLong] = options.AaruForceDumping; + this[FlagStrings.PrivateLong] = options.AaruStripPersonalData; // TODO: Look at dump-media formats and the like and see what options there are there to fill in defaults // Now sort based on disc type switch (this.Type) { case MediaType.CDROM: - this[Flag.FirstPregap] = true; - this[Flag.FixOffset] = true; - this[Flag.Subchannel] = true; + this[FlagStrings.FirstPregapLong] = true; + this[FlagStrings.FixOffsetLong] = true; + this[FlagStrings.SubchannelLong] = true; SubchannelValue = "any"; break; case MediaType.DVD: @@ -1208,6 +1484,8 @@ namespace MPF.Aaru /// protected override bool ValidateAndSetParameters(string parameters) { + BaseCommand = CommandStrings.NONE; + // The string has to be valid by itself first if (string.IsNullOrWhiteSpace(parameters)) return false; @@ -1228,30 +1506,34 @@ namespace MPF.Aaru int keyCount = Keys.Count(); // Debug - ProcessFlagParameter(parts, FlagStrings.DebugShort, FlagStrings.DebugLong, Flag.Debug, ref start); + ProcessFlagParameter(parts, FlagStrings.DebugShort, FlagStrings.DebugLong, ref start); // Verbose - ProcessFlagParameter(parts, FlagStrings.VerboseShort, FlagStrings.VerboseLong, Flag.Verbose, ref start); + ProcessFlagParameter(parts, FlagStrings.VerboseShort, FlagStrings.VerboseLong, ref start); // Version - ProcessFlagParameter(parts, null, FlagStrings.VersionLong, Flag.Version, ref start); + ProcessFlagParameter(parts, null, FlagStrings.VersionLong, ref start); // Help - ProcessFlagParameter(parts, FlagStrings.HelpShort, FlagStrings.HelpLong, Flag.Help, ref start); - ProcessFlagParameter(parts, FlagStrings.HelpShortAlt, null, Flag.Help, ref start); + ProcessFlagParameter(parts, FlagStrings.HelpShort, FlagStrings.HelpLong, ref start); + ProcessFlagParameter(parts, FlagStrings.HelpShortAlt, FlagStrings.HelpLong, ref start); // If we didn't add any new flags, break out since we might be at command handling if (keyCount == Keys.Count()) break; } - // Determine what the commandline should look like given the first item - BaseCommand = Converters.StringToCommand(parts[start], parts.Count > start ? parts[start + 1] : null, out bool useSecond); - if (BaseCommand == Command.NONE) + // If the required starting index doesn't exist, we can't do anything + if (!DoesExist(parts, start)) return false; - // Set the start according to what the full command was - start += useSecond ? 2 : 1; + // Determine what the commandline should look like given the first item + BaseCommand = NormalizeCommand(parts, ref start); + if (string.IsNullOrWhiteSpace(BaseCommand)) + return false; + + // Set the start position + start++; // Loop through all auxilary flags, if necessary int i = 0; @@ -1270,140 +1552,140 @@ namespace MPF.Aaru #region Boolean flags // Adler-32 - ProcessFlagParameter(parts, FlagStrings.Adler32Short, FlagStrings.Adler32Long, Flag.Adler32, ref i); + ProcessFlagParameter(parts, FlagStrings.Adler32Short, FlagStrings.Adler32Long, ref i); // Clear - ProcessFlagParameter(parts, null, FlagStrings.ClearLong, Flag.Clear, ref i); + ProcessFlagParameter(parts, null, FlagStrings.ClearLong, ref i); // Clear All - ProcessFlagParameter(parts, null, FlagStrings.ClearAllLong, Flag.ClearAll, ref i); + ProcessFlagParameter(parts, null, FlagStrings.ClearAllLong, ref i); // CRC16 - ProcessFlagParameter(parts, null, FlagStrings.CRC16Long, Flag.CRC16, ref i); + ProcessFlagParameter(parts, null, FlagStrings.CRC16Long, ref i); // CRC32 - ProcessFlagParameter(parts, FlagStrings.CRC32Short, FlagStrings.CRC32Long, Flag.CRC32, ref i); + ProcessFlagParameter(parts, FlagStrings.CRC32Short, FlagStrings.CRC32Long, ref i); // CRC64 - ProcessFlagParameter(parts, null, FlagStrings.CRC64Long, Flag.CRC64, ref i); + ProcessFlagParameter(parts, null, FlagStrings.CRC64Long, ref i); // Disk Tags - ProcessFlagParameter(parts, FlagStrings.DiskTagsShort, FlagStrings.DiskTagsLong, Flag.DiskTags, ref i); + ProcessFlagParameter(parts, FlagStrings.DiskTagsShort, FlagStrings.DiskTagsLong, ref i); // Deduplicated Sectors - ProcessFlagParameter(parts, FlagStrings.DuplicatedSectorsShort, FlagStrings.DuplicatedSectorsLong, Flag.DuplicatedSectors, ref i); + ProcessFlagParameter(parts, FlagStrings.DuplicatedSectorsShort, FlagStrings.DuplicatedSectorsLong, ref i); // Eject - ProcessFlagParameter(parts, null, FlagStrings.EjectLong, Flag.Eject, ref i); + ProcessFlagParameter(parts, null, FlagStrings.EjectLong, ref i); // Extended Attributes - ProcessFlagParameter(parts, FlagStrings.ExtendedAttributesShort, FlagStrings.ExtendedAttributesLong, Flag.ExtendedAttributes, ref i); + ProcessFlagParameter(parts, FlagStrings.ExtendedAttributesShort, FlagStrings.ExtendedAttributesLong, ref i); // Filesystems - ProcessFlagParameter(parts, FlagStrings.FilesystemsShort, FlagStrings.FilesystemsLong, Flag.Filesystems, ref i); + ProcessFlagParameter(parts, FlagStrings.FilesystemsShort, FlagStrings.FilesystemsLong, ref i); // First Pregap - ProcessFlagParameter(parts, null, FlagStrings.FirstPregapLong, Flag.FirstPregap, ref i); + ProcessFlagParameter(parts, null, FlagStrings.FirstPregapLong, ref i); // Fix Offset - ProcessFlagParameter(parts, null, FlagStrings.FixOffsetLong, Flag.FixOffset, ref i); + ProcessFlagParameter(parts, null, FlagStrings.FixOffsetLong, ref i); // Fix Subchannel - ProcessFlagParameter(parts, null, FlagStrings.FixSubchannelLong, Flag.FixSubchannel, ref i); + ProcessFlagParameter(parts, null, FlagStrings.FixSubchannelLong, ref i); // Fix Subchannel CRC - ProcessFlagParameter(parts, null, FlagStrings.FixSubchannelCrcLong, Flag.FixSubchannelCrc, ref i); + ProcessFlagParameter(parts, null, FlagStrings.FixSubchannelCrcLong, ref i); // Fix Subchannel Position - ProcessFlagParameter(parts, null, FlagStrings.FixSubchannelPositionLong, Flag.FixSubchannelPosition, ref i); + ProcessFlagParameter(parts, null, FlagStrings.FixSubchannelPositionLong, ref i); // Fletcher-16 - ProcessFlagParameter(parts, null, FlagStrings.Fletcher16Long, Flag.Fletcher16, ref i); + ProcessFlagParameter(parts, null, FlagStrings.Fletcher16Long, ref i); // Fletcher-32 - ProcessFlagParameter(parts, null, FlagStrings.Fletcher32Long, Flag.Fletcher32, ref i); + ProcessFlagParameter(parts, null, FlagStrings.Fletcher32Long, ref i); // Force - ProcessFlagParameter(parts, FlagStrings.ForceShort, FlagStrings.ForceLong, Flag.Force, ref i); + ProcessFlagParameter(parts, FlagStrings.ForceShort, FlagStrings.ForceLong, ref i); // Generate Subchannels - ProcessFlagParameter(parts, null, FlagStrings.GenerateSubchannelsLong, Flag.GenerateSubchannels, ref i); + ProcessFlagParameter(parts, null, FlagStrings.GenerateSubchannelsLong, ref i); // Long Format - ProcessFlagParameter(parts, FlagStrings.LongFormatShort, FlagStrings.LongFormatLong, Flag.LongFormat, ref i); + ProcessFlagParameter(parts, FlagStrings.LongFormatShort, FlagStrings.LongFormatLong, ref i); // Long Sectors - ProcessFlagParameter(parts, FlagStrings.LongSectorsShort, FlagStrings.LongSectorsLong, Flag.LongSectors, ref i); + ProcessFlagParameter(parts, FlagStrings.LongSectorsShort, FlagStrings.LongSectorsLong, ref i); // MD5 - ProcessFlagParameter(parts, FlagStrings.MD5Short, FlagStrings.MD5Long, Flag.MD5, ref i); + ProcessFlagParameter(parts, FlagStrings.MD5Short, FlagStrings.MD5Long, ref i); // Metadata - ProcessFlagParameter(parts, null, FlagStrings.MetadataLong, Flag.Metadata, ref i); + ProcessFlagParameter(parts, null, FlagStrings.MetadataLong, ref i); // Partitions - ProcessFlagParameter(parts, FlagStrings.PartitionsShort, FlagStrings.PartitionsLong, Flag.Partitions, ref i); + ProcessFlagParameter(parts, FlagStrings.PartitionsShort, FlagStrings.PartitionsLong, ref i); // Persistent - ProcessFlagParameter(parts, null, FlagStrings.PersistentLong, Flag.Persistent, ref i); + ProcessFlagParameter(parts, null, FlagStrings.PersistentLong, ref i); // Private - ProcessFlagParameter(parts, null, FlagStrings.PrivateLong, Flag.Private, ref i); + ProcessFlagParameter(parts, null, FlagStrings.PrivateLong, ref i); // Resume - ProcessFlagParameter(parts, FlagStrings.ResumeShort, FlagStrings.ResumeLong, Flag.Resume, ref i); + ProcessFlagParameter(parts, FlagStrings.ResumeShort, FlagStrings.ResumeLong, ref i); // Retry Subchannel - ProcessFlagParameter(parts, null, FlagStrings.RetrySubchannelLong, Flag.RetrySubchannel, ref i); + ProcessFlagParameter(parts, null, FlagStrings.RetrySubchannelLong, ref i); // Sector Tags - ProcessFlagParameter(parts, FlagStrings.SectorTagsShort, FlagStrings.SectorTagsLong, Flag.SectorTags, ref i); + ProcessFlagParameter(parts, FlagStrings.SectorTagsShort, FlagStrings.SectorTagsLong, ref i); // Separated Tracks - ProcessFlagParameter(parts, FlagStrings.SeparatedTracksShort, FlagStrings.SeparatedTracksLong, Flag.SeparatedTracks, ref i); + ProcessFlagParameter(parts, FlagStrings.SeparatedTracksShort, FlagStrings.SeparatedTracksLong, ref i); // SHA-1 - ProcessFlagParameter(parts, FlagStrings.SHA1Short, FlagStrings.SHA1Long, Flag.SHA1, ref i); + ProcessFlagParameter(parts, FlagStrings.SHA1Short, FlagStrings.SHA1Long, ref i); // SHA-256 - ProcessFlagParameter(parts, null, FlagStrings.SHA256Long, Flag.SHA256, ref i); + ProcessFlagParameter(parts, null, FlagStrings.SHA256Long, ref i); // SHA-384 - ProcessFlagParameter(parts, null, FlagStrings.SHA384Long, Flag.SHA384, ref i); + ProcessFlagParameter(parts, null, FlagStrings.SHA384Long, ref i); // SHA-512 - ProcessFlagParameter(parts, null, FlagStrings.SHA512Long, Flag.SHA512, ref i); + ProcessFlagParameter(parts, null, FlagStrings.SHA512Long, ref i); // Skip CD-i Ready Hole - ProcessFlagParameter(parts, null, FlagStrings.SkipCdiReadyHoleLong, Flag.SkipCdiReadyHole, ref i); + ProcessFlagParameter(parts, null, FlagStrings.SkipCdiReadyHoleLong, ref i); // SpamSum - ProcessFlagParameter(parts, FlagStrings.SpamSumShort, FlagStrings.SpamSumLong, Flag.SpamSum, ref i); + ProcessFlagParameter(parts, FlagStrings.SpamSumShort, FlagStrings.SpamSumLong, ref i); // Stop on Error - ProcessFlagParameter(parts, FlagStrings.StopOnErrorShort, FlagStrings.StopOnErrorLong, Flag.StopOnError, ref i); + ProcessFlagParameter(parts, FlagStrings.StopOnErrorShort, FlagStrings.StopOnErrorLong, ref i); // Tape - ProcessFlagParameter(parts, FlagStrings.TapeShort, FlagStrings.TapeLong, Flag.Tape, ref i); + ProcessFlagParameter(parts, FlagStrings.TapeShort, FlagStrings.TapeLong, ref i); // Trim - ProcessFlagParameter(parts, null, FlagStrings.TrimLong, Flag.Trim, ref i); + ProcessFlagParameter(parts, null, FlagStrings.TrimLong, ref i); // Verify Disc - ProcessFlagParameter(parts, FlagStrings.VerifyDiscShort, FlagStrings.VerifyDiscLong, Flag.VerifyDisc, ref i); + ProcessFlagParameter(parts, FlagStrings.VerifyDiscShort, FlagStrings.VerifyDiscLong, ref i); // Verify Sectors - ProcessFlagParameter(parts, FlagStrings.VerifySectorsShort, FlagStrings.VerifySectorsLong, Flag.VerifySectors, ref i); + ProcessFlagParameter(parts, FlagStrings.VerifySectorsShort, FlagStrings.VerifySectorsLong, ref i); // Whole Disc - ProcessFlagParameter(parts, FlagStrings.WholeDiscShort, FlagStrings.WholeDiscLong, Flag.VerifySectors, ref i); + ProcessFlagParameter(parts, FlagStrings.WholeDiscShort, FlagStrings.WholeDiscLong, ref i); #endregion #region Int8 flags // Speed - byteValue = ProcessInt8Parameter(parts, null, FlagStrings.SpeedLong, Flag.Speed, ref i); + byteValue = ProcessInt8Parameter(parts, null, FlagStrings.SpeedLong, ref i); if (byteValue == null && byteValue != SByte.MinValue) SpeedValue = byteValue; @@ -1412,12 +1694,12 @@ namespace MPF.Aaru #region Int16 flags // Retry Passes - shortValue = ProcessInt16Parameter(parts, FlagStrings.RetryPassesShort, FlagStrings.RetryPassesLong, Flag.RetryPasses, ref i); + shortValue = ProcessInt16Parameter(parts, FlagStrings.RetryPassesShort, FlagStrings.RetryPassesLong, ref i); if (shortValue != null && shortValue != Int16.MinValue) RetryPassesValue = shortValue; // Width - shortValue = ProcessInt16Parameter(parts, FlagStrings.WidthShort, FlagStrings.WidthLong, Flag.Width, ref i); + shortValue = ProcessInt16Parameter(parts, FlagStrings.WidthShort, FlagStrings.WidthLong, ref i); if (shortValue != null && shortValue != Int16.MinValue) WidthValue = shortValue; @@ -1426,27 +1708,27 @@ namespace MPF.Aaru #region Int32 flags // Block Size - intValue = ProcessInt32Parameter(parts, FlagStrings.BlockSizeShort, FlagStrings.BlockSizeLong, Flag.BlockSize, ref i); + intValue = ProcessInt32Parameter(parts, FlagStrings.BlockSizeShort, FlagStrings.BlockSizeLong, ref i); if (intValue != null && intValue != Int32.MinValue) BlockSizeValue = intValue; // Count - intValue = ProcessInt32Parameter(parts, FlagStrings.CountShort, FlagStrings.CountLong, Flag.Count, ref i); + intValue = ProcessInt32Parameter(parts, FlagStrings.CountShort, FlagStrings.CountLong, ref i); if (intValue != null && intValue != Int32.MinValue) CountValue = intValue; // Media Last Sequence - intValue = ProcessInt32Parameter(parts, null, FlagStrings.MediaLastSequenceLong, Flag.MediaLastSequence, ref i); + intValue = ProcessInt32Parameter(parts, null, FlagStrings.MediaLastSequenceLong, ref i); if (intValue != null && intValue != Int32.MinValue) MediaLastSequenceValue = intValue; // Media Sequence - intValue = ProcessInt32Parameter(parts, null, FlagStrings.MediaSequenceLong, Flag.MediaSequence, ref i); + intValue = ProcessInt32Parameter(parts, null, FlagStrings.MediaSequenceLong, ref i); if (intValue != null && intValue != Int32.MinValue) MediaSequenceValue = intValue; // Skip - intValue = ProcessInt32Parameter(parts, FlagStrings.SkipShort, FlagStrings.SkipLong, Flag.Skip, ref i); + intValue = ProcessInt32Parameter(parts, FlagStrings.SkipShort, FlagStrings.SkipLong, ref i); if (intValue != null && intValue != Int32.MinValue) SkipValue = intValue; @@ -1455,20 +1737,20 @@ namespace MPF.Aaru #region Int64 flags // Length - longValue = ProcessInt64Parameter(parts, FlagStrings.LengthShort, FlagStrings.LengthLong, Flag.Length, ref i); + longValue = ProcessInt64Parameter(parts, FlagStrings.LengthShort, FlagStrings.LengthLong, ref i); if (longValue != null && longValue != Int64.MinValue) { LengthValue = longValue; } else { - stringValue = ProcessStringParameter(parts, FlagStrings.LengthShort, FlagStrings.LengthLong, Flag.Length, ref i); + stringValue = ProcessStringParameter(parts, FlagStrings.LengthShort, FlagStrings.LengthLong, ref i); if (string.Equals(stringValue, "all")) LengthValue = -1; } // Start -- Required value - longValue = ProcessInt64Parameter(parts, FlagStrings.StartShort, FlagStrings.StartLong, Flag.Start, ref i); + longValue = ProcessInt64Parameter(parts, FlagStrings.StartShort, FlagStrings.StartLong, ref i); if (longValue == null) return false; else if (longValue != Int64.MinValue) @@ -1479,112 +1761,112 @@ namespace MPF.Aaru #region String flags // Comments - stringValue = ProcessStringParameter(parts, null, FlagStrings.CommentsLong, Flag.Comments, ref i); + stringValue = ProcessStringParameter(parts, null, FlagStrings.CommentsLong, ref i); if (!string.IsNullOrEmpty(stringValue)) CommentsValue = stringValue; // Creator - stringValue = ProcessStringParameter(parts, null, FlagStrings.CreatorLong, Flag.Creator, ref i); + stringValue = ProcessStringParameter(parts, null, FlagStrings.CreatorLong, ref i); if (!string.IsNullOrEmpty(stringValue)) CreatorValue = stringValue; // Drive Manufacturer - stringValue = ProcessStringParameter(parts, null, FlagStrings.DriveManufacturerLong, Flag.DriveManufacturer, ref i); + stringValue = ProcessStringParameter(parts, null, FlagStrings.DriveManufacturerLong, ref i); if (!string.IsNullOrEmpty(stringValue)) DriveManufacturerValue = stringValue; // Drive Model - stringValue = ProcessStringParameter(parts, null, FlagStrings.DriveModelLong, Flag.DriveModel, ref i); + stringValue = ProcessStringParameter(parts, null, FlagStrings.DriveModelLong, ref i); if (!string.IsNullOrEmpty(stringValue)) DriveModelValue = stringValue; // Drive Revision - stringValue = ProcessStringParameter(parts, null, FlagStrings.DriveRevisionLong, Flag.DriveRevision, ref i); + stringValue = ProcessStringParameter(parts, null, FlagStrings.DriveRevisionLong, ref i); if (!string.IsNullOrEmpty(stringValue)) DriveRevisionValue = stringValue; // Drive Serial - stringValue = ProcessStringParameter(parts, null, FlagStrings.DriveSerialLong, Flag.DriveSerial, ref i); + stringValue = ProcessStringParameter(parts, null, FlagStrings.DriveSerialLong, ref i); if (!string.IsNullOrEmpty(stringValue)) DriveSerialValue = stringValue; // Encoding -- TODO: List of encodings? - stringValue = ProcessStringParameter(parts, FlagStrings.EncodingShort, FlagStrings.EncodingLong, Flag.Encoding, ref i); + stringValue = ProcessStringParameter(parts, FlagStrings.EncodingShort, FlagStrings.EncodingLong, ref i); if (!string.IsNullOrEmpty(stringValue)) EncodingValue = stringValue; // Format (Convert) -- TODO: List of formats? - stringValue = ProcessStringParameter(parts, FlagStrings.FormatConvertShort, FlagStrings.FormatConvertLong, Flag.FormatConvert, ref i); + stringValue = ProcessStringParameter(parts, FlagStrings.FormatConvertShort, FlagStrings.FormatConvertLong, ref i); if (!string.IsNullOrEmpty(stringValue)) FormatConvertValue = stringValue; // Format (Dump) -- TODO: List of formats? - stringValue = ProcessStringParameter(parts, FlagStrings.FormatDumpShort, FlagStrings.FormatDumpLong, Flag.FormatDump, ref i); + stringValue = ProcessStringParameter(parts, FlagStrings.FormatDumpShort, FlagStrings.FormatDumpLong, ref i); if (!string.IsNullOrEmpty(stringValue)) FormatDumpValue = stringValue; // ImgBurn Log - stringValue = ProcessStringParameter(parts, FlagStrings.ImgBurnLogShort, FlagStrings.ImgBurnLogLong, Flag.ImgBurnLog, ref i); + stringValue = ProcessStringParameter(parts, FlagStrings.ImgBurnLogShort, FlagStrings.ImgBurnLogLong, ref i); if (!string.IsNullOrEmpty(stringValue)) ImgBurnLogValue = stringValue; // Media Barcode - stringValue = ProcessStringParameter(parts, null, FlagStrings.MediaBarcodeLong, Flag.MediaBarcode, ref i); + stringValue = ProcessStringParameter(parts, null, FlagStrings.MediaBarcodeLong, ref i); if (!string.IsNullOrEmpty(stringValue)) MediaBarcodeValue = stringValue; // Media Manufacturer - stringValue = ProcessStringParameter(parts, null, FlagStrings.MediaManufacturerLong, Flag.MediaManufacturer, ref i); + stringValue = ProcessStringParameter(parts, null, FlagStrings.MediaManufacturerLong, ref i); if (!string.IsNullOrEmpty(stringValue)) MediaManufacturerValue = stringValue; // Media Model - stringValue = ProcessStringParameter(parts, null, FlagStrings.MediaModelLong, Flag.MediaModel, ref i); + stringValue = ProcessStringParameter(parts, null, FlagStrings.MediaModelLong, ref i); if (!string.IsNullOrEmpty(stringValue)) MediaModelValue = stringValue; // Media Part Number - stringValue = ProcessStringParameter(parts, null, FlagStrings.MediaPartNumberLong, Flag.MediaPartNumber, ref i); + stringValue = ProcessStringParameter(parts, null, FlagStrings.MediaPartNumberLong, ref i); if (!string.IsNullOrEmpty(stringValue)) MediaPartNumberValue = stringValue; // Media Serial - stringValue = ProcessStringParameter(parts, null, FlagStrings.MediaSerialLong, Flag.MediaSerial, ref i); + stringValue = ProcessStringParameter(parts, null, FlagStrings.MediaSerialLong, ref i); if (!string.IsNullOrEmpty(stringValue)) MediaSerialValue = stringValue; // Media Title - stringValue = ProcessStringParameter(parts, null, FlagStrings.MediaTitleLong, Flag.MediaTitle, ref i); + stringValue = ProcessStringParameter(parts, null, FlagStrings.MediaTitleLong, ref i); if (!string.IsNullOrEmpty(stringValue)) MediaTitleValue = stringValue; // MHDD Log - stringValue = ProcessStringParameter(parts, FlagStrings.MHDDLogShort, FlagStrings.MHDDLogLong, Flag.MHDDLog, ref i); + stringValue = ProcessStringParameter(parts, FlagStrings.MHDDLogShort, FlagStrings.MHDDLogLong, ref i); if (!string.IsNullOrEmpty(stringValue)) MHDDLogValue = stringValue; // Namespace - stringValue = ProcessStringParameter(parts, FlagStrings.NamespaceShort, FlagStrings.NamespaceLong, Flag.Namespace, ref i); + stringValue = ProcessStringParameter(parts, FlagStrings.NamespaceShort, FlagStrings.NamespaceLong, ref i); if (!string.IsNullOrEmpty(stringValue)) NamespaceValue = stringValue; // Options -- TODO: Validate options? - stringValue = ProcessStringParameter(parts, FlagStrings.OptionsShort, FlagStrings.OptionsLong, Flag.Options, ref i); + stringValue = ProcessStringParameter(parts, FlagStrings.OptionsShort, FlagStrings.OptionsLong, ref i); if (!string.IsNullOrEmpty(stringValue)) OptionsValue = stringValue; // Output Prefix - stringValue = ProcessStringParameter(parts, FlagStrings.OutputPrefixShort, FlagStrings.OutputPrefixLong, Flag.OutputPrefix, ref i); + stringValue = ProcessStringParameter(parts, FlagStrings.OutputPrefixShort, FlagStrings.OutputPrefixLong, ref i); if (!string.IsNullOrEmpty(stringValue)) OutputPrefixValue = stringValue; // Resume File - stringValue = ProcessStringParameter(parts, FlagStrings.ResumeFileShort, FlagStrings.ResumeFileLong, Flag.ResumeFile, ref i); + stringValue = ProcessStringParameter(parts, FlagStrings.ResumeFileShort, FlagStrings.ResumeFileLong, ref i); if (!string.IsNullOrEmpty(stringValue)) ResumeFileValue = stringValue; // Subchannel - stringValue = ProcessStringParameter(parts, null, FlagStrings.SubchannelLong, Flag.Subchannel, ref i); + stringValue = ProcessStringParameter(parts, null, FlagStrings.SubchannelLong, ref i); if (!string.IsNullOrEmpty(stringValue)) { if (string.Equals(stringValue, "any") @@ -1603,7 +1885,7 @@ namespace MPF.Aaru } // XML Sidecar - stringValue = ProcessStringParameter(parts, FlagStrings.XMLSidecarShort, FlagStrings.XMLSidecarLong, Flag.XMLSidecar, ref i); + stringValue = ProcessStringParameter(parts, FlagStrings.XMLSidecarShort, FlagStrings.XMLSidecarLong, ref i); if (!string.IsNullOrEmpty(stringValue)) XMLSidecarValue = stringValue; @@ -1618,19 +1900,19 @@ namespace MPF.Aaru switch (BaseCommand) { // Input value only - case Command.DeviceInfo: - case Command.DeviceReport: - case Command.FilesystemList: - case Command.ImageAnalyze: - case Command.ImageChecksum: - case Command.ImageCreateSidecar: - case Command.ImageDecode: - case Command.ImageEntropy: - case Command.ImageInfo: - case Command.ImagePrint: - case Command.ImageVerify: - case Command.MediaInfo: - case Command.MediaScan: + case CommandStrings.DevicePrefixLong + " " + CommandStrings.DeviceInfo: + case CommandStrings.DevicePrefixLong + " " + CommandStrings.DeviceReport: + case CommandStrings.FilesystemPrefixLong + " " + CommandStrings.FilesystemListLong: + case CommandStrings.ImagePrefixLong + " " + CommandStrings.ImageAnalyze: + case CommandStrings.ImagePrefixLong + " " + CommandStrings.ImageChecksumLong: + case CommandStrings.ImagePrefixLong + " " + CommandStrings.ImageCreateSidecar: + case CommandStrings.ImagePrefixLong + " " + CommandStrings.ImageDecode: + case CommandStrings.ImagePrefixLong + " " + CommandStrings.ImageEntropy: + case CommandStrings.ImagePrefixLong + " " + CommandStrings.ImageInfo: + case CommandStrings.ImagePrefixLong + " " + CommandStrings.ImagePrint: + case CommandStrings.ImagePrefixLong + " " + CommandStrings.ImageVerify: + case CommandStrings.MediaPrefixLong + " " + CommandStrings.MediaInfo: + case CommandStrings.MediaPrefixLong + " " + CommandStrings.MediaScan: if (!DoesExist(parts, i)) return false; @@ -1639,7 +1921,7 @@ namespace MPF.Aaru break; // Two input values - case Command.ImageCompare: + case CommandStrings.ImagePrefixLong + " " + CommandStrings.ImageCompareLong: if (!DoesExist(parts, i)) return false; @@ -1654,9 +1936,9 @@ namespace MPF.Aaru break; // Input and Output value - case Command.FilesystemExtract: - case Command.ImageConvert: - case Command.MediaDump: + case CommandStrings.FilesystemPrefixLong + " " + CommandStrings.FilesystemExtract: + case CommandStrings.ImagePrefixLong + " " + CommandStrings.ImageConvert: + case CommandStrings.MediaPrefixLong + " " + CommandStrings.MediaDump: if (!DoesExist(parts, i)) return false; @@ -1671,8 +1953,8 @@ namespace MPF.Aaru break; // Remote host value only - case Command.DeviceList: - case Command.Remote: + case CommandStrings.DevicePrefixLong + " " + CommandStrings.DeviceList: + case CommandStrings.Remote: if (!DoesExist(parts, i)) return false; @@ -1693,493 +1975,229 @@ namespace MPF.Aaru #region Private Extra Methods /// - /// Get the list of commands that use a given flag + /// Normalize a command string to use long form values for easier lookup /// - /// Flag value to get commands for - /// List of Commands, if possible - private static List GetSupportedCommands(Flag flag) + /// Command string to normalize + /// Normalized command + private string NormalizeCommand(List parts, ref int start) { - var commands = new List(); - switch (flag) - { - case Flag.Adler32: - commands.Add(Command.ImageChecksum); - break; - case Flag.BlockSize: - commands.Add(Command.ImageCreateSidecar); - break; - case Flag.Clear: - commands.Add(Command.DatabaseUpdate); - break; - case Flag.ClearAll: - commands.Add(Command.DatabaseUpdate); - break; - case Flag.Comments: - commands.Add(Command.ImageConvert); - break; - case Flag.Count: - commands.Add(Command.ImageConvert); - break; - case Flag.CRC16: - commands.Add(Command.ImageChecksum); - break; - case Flag.CRC32: - commands.Add(Command.ImageChecksum); - break; - case Flag.CRC64: - commands.Add(Command.ImageChecksum); - break; - case Flag.Creator: - commands.Add(Command.ImageConvert); - break; - case Flag.Debug: - commands.Add(Command.NONE); - break; - case Flag.DiskTags: - commands.Add(Command.ImageDecode); - break; - case Flag.DriveManufacturer: - commands.Add(Command.ImageConvert); - break; - case Flag.DriveModel: - commands.Add(Command.ImageConvert); - break; - case Flag.DriveRevision: - commands.Add(Command.ImageConvert); - break; - case Flag.DriveSerial: - commands.Add(Command.ImageConvert); - break; - case Flag.DuplicatedSectors: - commands.Add(Command.ImageEntropy); - break; - case Flag.Eject: - commands.Add(Command.MediaDump); - break; - case Flag.Encoding: - commands.Add(Command.FilesystemExtract); - commands.Add(Command.FilesystemList); - commands.Add(Command.ImageAnalyze); - commands.Add(Command.ImageCreateSidecar); - commands.Add(Command.MediaDump); - break; - case Flag.ExtendedAttributes: - commands.Add(Command.FilesystemExtract); - break; - case Flag.Filesystems: - commands.Add(Command.ImageAnalyze); - break; - case Flag.FirstPregap: - commands.Add(Command.MediaDump); - break; - case Flag.FixOffset: - commands.Add(Command.MediaDump); - break; - case Flag.FixSubchannel: - commands.Add(Command.MediaDump); - break; - case Flag.FixSubchannelCrc: - commands.Add(Command.MediaDump); - break; - case Flag.FixSubchannelPosition: - commands.Add(Command.MediaDump); - break; - case Flag.Fletcher16: - commands.Add(Command.ImageChecksum); - break; - case Flag.Fletcher32: - commands.Add(Command.ImageChecksum); - break; - case Flag.Force: - commands.Add(Command.ImageConvert); - commands.Add(Command.MediaDump); - break; - case Flag.FormatConvert: - commands.Add(Command.ImageConvert); - break; - case Flag.FormatDump: - commands.Add(Command.MediaDump); - break; - case Flag.GenerateSubchannels: - commands.Add(Command.MediaDump); - break; - case Flag.Help: - commands.Add(Command.NONE); - break; - case Flag.ImgBurnLog: - commands.Add(Command.MediaScan); - break; - case Flag.Length: - commands.Add(Command.ImageDecode); - commands.Add(Command.ImagePrint); - break; - case Flag.LongFormat: - commands.Add(Command.FilesystemList); - break; - case Flag.LongSectors: - commands.Add(Command.ImagePrint); - break; - case Flag.MD5: - commands.Add(Command.ImageChecksum); - break; - case Flag.MediaBarcode: - commands.Add(Command.ImageConvert); - break; - case Flag.MediaLastSequence: - commands.Add(Command.ImageConvert); - break; - case Flag.MediaManufacturer: - commands.Add(Command.ImageConvert); - break; - case Flag.MediaModel: - commands.Add(Command.ImageConvert); - break; - case Flag.MediaPartNumber: - commands.Add(Command.ImageConvert); - break; - case Flag.MediaSequence: - commands.Add(Command.ImageConvert); - break; - case Flag.MediaSerial: - commands.Add(Command.ImageConvert); - break; - case Flag.MediaTitle: - commands.Add(Command.ImageConvert); - break; - case Flag.Metadata: - commands.Add(Command.MediaDump); - break; - case Flag.MHDDLog: - commands.Add(Command.MediaScan); - break; - case Flag.Namespace: - commands.Add(Command.FilesystemExtract); - commands.Add(Command.FilesystemList); - break; - case Flag.Options: - commands.Add(Command.FilesystemExtract); - commands.Add(Command.FilesystemList); - commands.Add(Command.ImageConvert); - commands.Add(Command.MediaDump); - break; - case Flag.OutputPrefix: - commands.Add(Command.DeviceInfo); - commands.Add(Command.MediaInfo); - break; - case Flag.Partitions: - commands.Add(Command.ImageAnalyze); - break; - case Flag.Persistent: - commands.Add(Command.MediaDump); - break; - case Flag.Private: - commands.Add(Command.MediaDump); - break; - case Flag.Resume: - commands.Add(Command.MediaDump); - break; - case Flag.ResumeFile: - commands.Add(Command.ImageConvert); - break; - case Flag.RetryPasses: - commands.Add(Command.MediaDump); - break; - case Flag.RetrySubchannel: - commands.Add(Command.MediaDump); - break; - case Flag.SectorTags: - commands.Add(Command.ImageDecode); - break; - case Flag.SeparatedTracks: - commands.Add(Command.ImageChecksum); - commands.Add(Command.ImageEntropy); - break; - case Flag.SHA1: - commands.Add(Command.ImageChecksum); - break; - case Flag.SHA256: - commands.Add(Command.ImageChecksum); - break; - case Flag.SHA384: - commands.Add(Command.ImageChecksum); - break; - case Flag.SHA512: - commands.Add(Command.ImageChecksum); - break; - case Flag.Skip: - commands.Add(Command.MediaDump); - break; - case Flag.SkipCdiReadyHole: - commands.Add(Command.MediaDump); - break; - case Flag.SpamSum: - commands.Add(Command.ImageChecksum); - break; - case Flag.Speed: - commands.Add(Command.MediaDump); - break; - case Flag.Start: - commands.Add(Command.ImageDecode); - commands.Add(Command.ImagePrint); - break; - case Flag.StopOnError: - commands.Add(Command.MediaDump); - break; - case Flag.Subchannel: - commands.Add(Command.MediaDump); - break; - case Flag.Tape: - commands.Add(Command.ImageCreateSidecar); - break; - case Flag.Trim: - commands.Add(Command.MediaDump); - break; - case Flag.Verbose: - commands.Add(Command.NONE); - break; - case Flag.VerifyDisc: - commands.Add(Command.ImageAnalyze); - commands.Add(Command.ImageVerify); - break; - case Flag.VerifySectors: - commands.Add(Command.ImageAnalyze); - commands.Add(Command.ImageVerify); - break; - case Flag.Version: - commands.Add(Command.NONE); - break; - case Flag.WholeDisc: - commands.Add(Command.ImageChecksum); - commands.Add(Command.ImageEntropy); - break; - case Flag.Width: - commands.Add(Command.ImagePrint); - break; - case Flag.XMLSidecar: - commands.Add(Command.ImageConvert); - commands.Add(Command.MediaDump); - break; - - case Flag.NONE: - default: - return commands; - } - - return commands; - } - - #endregion - - #region Process Parameter Helpers - - /// - /// Process a flag parameter - /// - /// List of parts to be referenced - /// Short flag string, if available - /// Long flag string, if available - /// Flag value corresponding to the flag - /// Reference to the position in the parts - /// True if the parameter was processed successfully or skipped, false otherwise - private bool ProcessFlagParameter(List parts, string shortFlagString, string longFlagString, Flag flag, ref int i) - { - if (parts == null) - return false; - - if (parts[i] == shortFlagString || parts[i] == longFlagString) - { - if (!GetSupportedCommands(flag).Contains(BaseCommand)) - return false; - - this[flag] = true; - } - - return true; - } - - /// - /// Process a boolean parameter - /// - /// List of parts to be referenced - /// Short flag string, if available - /// Long flag string, if available - /// Flag value corresponding to the flag - /// Reference to the position in the parts - /// True if the parameter was processed successfully or skipped, false otherwise - private bool ProcessBooleanParameter(List parts, string shortFlagString, string longFlagString, Flag flag, ref int i) - { - if (parts == null) - return false; - - if (parts[i] == shortFlagString || parts[i] == longFlagString) - { - if (!GetSupportedCommands(flag).Contains(BaseCommand)) - return false; - else if (!DoesExist(parts, i + 1)) - return false; - else if (!IsValidBool(parts[i + 1])) - return false; - - this[flag] = bool.Parse(parts[i + 1]); - i++; - } - - return true; - } - - /// - /// Process an sbyte parameter - /// - /// List of parts to be referenced - /// Short flag string, if available - /// Long flag string, if available - /// Flag value corresponding to the flag - /// Reference to the position in the parts - /// SByte value if success, Int16.MinValue if skipped, null on error/returns> - private sbyte? ProcessInt8Parameter(List parts, string shortFlagString, string longFlagString, Flag flag, ref int i) - { - if (parts == null) + // Invalid start means invalid command + if (start < 0 || start >= parts.Count) return null; - if (parts[i] == shortFlagString || parts[i] == longFlagString) - { - if (!GetSupportedCommands(flag).Contains(BaseCommand)) - return null; - else if (!DoesExist(parts, i + 1)) - return null; - else if (!IsValidInt8(parts[i + 1])) - return null; + string partOne = parts[start]; + string partTwo = string.Empty; + if (start + 1 < parts.Count) + partTwo = parts[start + 1]; - this[flag] = true; - i++; - return sbyte.Parse(parts[i]); - } + string normalized = NormalizeCommand($"{partOne} {partTwo}".Trim()); - return SByte.MinValue; + // Null normalization means invalid command + if (normalized == null) + return null; + + // Determine if start should be incremented + if (normalized.Split(' ').Length > 1) + start++; + + return normalized; } /// - /// Process an Int16 parameter + /// Normalize a command string to use long form values for easier lookup /// - /// List of parts to be referenced - /// Short flag string, if available - /// Long flag string, if available - /// Flag value corresponding to the flag - /// Reference to the position in the parts - /// Int16 value if success, Int16.MinValue if skipped, null on error/returns> - private short? ProcessInt16Parameter(List parts, string shortFlagString, string longFlagString, Flag flag, ref int i) + /// Command string to normalize + /// Normalized command + private string NormalizeCommand(string baseCommand) { - if (parts == null) + // If the base command is inavlid, just return nulls + if (string.IsNullOrWhiteSpace(baseCommand)) return null; - if (parts[i] == shortFlagString || parts[i] == longFlagString) - { - if (!GetSupportedCommands(flag).Contains(BaseCommand)) - return null; - else if (!DoesExist(parts, i + 1)) - return null; - else if (!IsValidInt16(parts[i + 1])) - return null; + // Split the command otherwise + string[] splitCommand = baseCommand.Split(' '); + string family, command; - this[flag] = true; - i++; - return short.Parse(parts[i]); + + // For commands with a family + if (splitCommand.Length > 1) + { + // Handle the family first + switch (splitCommand[0]) + { + case CommandStrings.DatabasePrefixShort: + case CommandStrings.DatabasePrefixLong: + family = CommandStrings.DatabasePrefixLong; + switch (splitCommand[1]) + { + case CommandStrings.DatabaseStats: + command = CommandStrings.DatabaseStats; + break; + case CommandStrings.DatabaseUpdate: + command = CommandStrings.DatabaseUpdate; + break; + default: + command = null; + break; + } + + break; + + case CommandStrings.DevicePrefixShort: + case CommandStrings.DevicePrefixLong: + family = CommandStrings.DevicePrefixLong; + switch (splitCommand[1]) + { + case CommandStrings.DeviceInfo: + command = CommandStrings.DeviceInfo; + break; + case CommandStrings.DeviceList: + command = CommandStrings.DeviceList; + break; + case CommandStrings.DeviceReport: + command = CommandStrings.DeviceReport; + break; + default: + command = null; + break; + } + + break; + + case CommandStrings.FilesystemPrefixShort: + case CommandStrings.FilesystemPrefixShortAlt: + case CommandStrings.FilesystemPrefixLong: + family = CommandStrings.FilesystemPrefixLong; + switch (splitCommand[1]) + { + case CommandStrings.FilesystemExtract: + command = CommandStrings.FilesystemExtract; + break; + case CommandStrings.FilesystemListShort: + case CommandStrings.FilesystemListLong: + command = CommandStrings.FilesystemListLong; + break; + case CommandStrings.FilesystemOptions: + command = CommandStrings.FilesystemOptions; + break; + default: + command = null; + break; + } + + break; + + case CommandStrings.ImagePrefixShort: + case CommandStrings.ImagePrefixLong: + family = CommandStrings.DevicePrefixLong; + switch (splitCommand[1]) + { + case CommandStrings.ImageAnalyze: + command = CommandStrings.ImageAnalyze; + break; + case CommandStrings.ImageChecksumShort: + case CommandStrings.ImageChecksumLong: + command = CommandStrings.ImageChecksumLong; + break; + case CommandStrings.ImageCompareShort: + case CommandStrings.ImageCompareLong: + command = CommandStrings.ImageChecksumLong; + break; + case CommandStrings.ImageConvert: + command = CommandStrings.ImageConvert; + break; + case CommandStrings.ImageCreateSidecar: + command = CommandStrings.ImageCreateSidecar; + break; + case CommandStrings.ImageDecode: + command = CommandStrings.ImageDecode; + break; + case CommandStrings.ImageEntropy: + command = CommandStrings.ImageEntropy; + break; + case CommandStrings.ImageInfo: + command = CommandStrings.ImageInfo; + break; + case CommandStrings.ImageOptions: + command = CommandStrings.ImageOptions; + break; + case CommandStrings.ImagePrint: + command = CommandStrings.ImagePrint; + break; + case CommandStrings.ImageVerify: + command = CommandStrings.ImageVerify; + break; + default: + command = null; + break; + } + + break; + + case CommandStrings.MediaPrefixShort: + case CommandStrings.MediaPrefixLong: + family = CommandStrings.DevicePrefixLong; + switch (splitCommand[1]) + { + case CommandStrings.MediaDump: + command = CommandStrings.MediaDump; + break; + case CommandStrings.MediaInfo: + command = CommandStrings.MediaInfo; + break; + case CommandStrings.MediaScan: + command = CommandStrings.MediaScan; + break; + default: + command = null; + break; + } + + break; + + default: + family = null; + command = null; + break; + } } - return Int16.MinValue; - } + // For standalone commands + else + { + family = null; + switch (splitCommand[0]) + { + case CommandStrings.Configure: + command = CommandStrings.Configure; + break; + case CommandStrings.Formats: + command = CommandStrings.Formats; + break; + case CommandStrings.ListEncodings: + command = CommandStrings.ListEncodings; + break; + case CommandStrings.ListNamespaces: + command = CommandStrings.ListNamespaces; + break; + case CommandStrings.Remote: + command = CommandStrings.Remote; + break; + default: + command = null; + break; + } + } - /// - /// Process an Int32 parameter - /// - /// List of parts to be referenced - /// Short flag string, if available - /// Long flag string, if available - /// Flag value corresponding to the flag - /// Reference to the position in the parts - /// Int32 value if success, Int32.MinValue if skipped, null on error/returns> - private int? ProcessInt32Parameter(List parts, string shortFlagString, string longFlagString, Flag flag, ref int i) - { - if (parts == null) + // If the command itself is invalid, then return null + if (string.IsNullOrWhiteSpace(command)) return null; - if (parts[i] == shortFlagString || parts[i] == longFlagString) - { - if (!GetSupportedCommands(flag).Contains(BaseCommand)) - return null; - else if (!DoesExist(parts, i + 1)) - return null; - else if (!IsValidInt32(parts[i + 1])) - return null; - - this[flag] = true; - i++; - return int.Parse(parts[i]); - } - - return Int32.MinValue; - } - - /// - /// Process an Int64 parameter - /// - /// List of parts to be referenced - /// Short flag string, if available - /// Long flag string, if available - /// Flag value corresponding to the flag - /// Reference to the position in the parts - /// Int64 value if success, Int64.MinValue if skipped, null on error/returns> - private long? ProcessInt64Parameter(List parts, string shortFlagString, string longFlagString, Flag flag, ref int i) - { - if (parts == null) - return null; - - if (parts[i] == shortFlagString || parts[i] == longFlagString) - { - if (!GetSupportedCommands(flag).Contains(BaseCommand)) - return null; - else if (!DoesExist(parts, i + 1)) - return null; - else if (!IsValidInt64(parts[i + 1])) - return null; - - this[flag] = true; - i++; - return long.Parse(parts[i]); - } - - return Int64.MinValue; - } - - /// - /// Process a string parameter - /// - /// List of parts to be referenced - /// Short flag string, if available - /// Long flag string, if available - /// Flag value corresponding to the flag - /// Reference to the position in the parts - /// String value if possible, string.Empty on missing, null on error - private string ProcessStringParameter(List parts, string shortFlagString, string longFlagString, Flag flag, ref int i) - { - if (parts == null) - return null; - - if (parts[i] == shortFlagString || parts[i] == longFlagString) - { - if (!GetSupportedCommands(flag).Contains(BaseCommand)) - return null; - else if (!DoesExist(parts, i + 1)) - return null; - else if (string.IsNullOrWhiteSpace(parts[i + 1])) - return null; - - this[flag] = true; - i++; - return parts[i].Trim('"'); - } - - return string.Empty; + // Combine the result + if (!string.IsNullOrWhiteSpace(family)) + return $"{family} {command}"; + else + return command; } #endregion @@ -2912,7 +2930,7 @@ namespace MPF.Aaru dmihash = checksum.Value; break; } - } + } } } diff --git a/MPF.Library/CleanRIp/Parameters.cs b/MPF.Library/CleanRIp/Parameters.cs index 84008c0c..00ecb9ac 100644 --- a/MPF.Library/CleanRIp/Parameters.cs +++ b/MPF.Library/CleanRIp/Parameters.cs @@ -3,7 +3,6 @@ using System.IO; using System.Linq; using System.Text.RegularExpressions; using MPF.Data; -using MPF.Utilities; namespace MPF.CleanRip { diff --git a/MPF.Library/DD/Constants.cs b/MPF.Library/DD/Constants.cs index b675770f..487677ff 100644 --- a/MPF.Library/DD/Constants.cs +++ b/MPF.Library/DD/Constants.cs @@ -5,6 +5,7 @@ namespace MPF.DD /// public static class CommandStrings { + public const string NONE = ""; public const string List = "--list"; } diff --git a/MPF.Library/DD/Converters.cs b/MPF.Library/DD/Converters.cs index 38e2fb40..a59ae0fc 100644 --- a/MPF.Library/DD/Converters.cs +++ b/MPF.Library/DD/Converters.cs @@ -18,87 +18,5 @@ namespace MPF.DD } #endregion - - #region Convert to Long Name - - /// - /// Get the string representation of the Command enum values - /// - /// Command value to convert - /// String representing the value, if possible - public static string LongName(Command command) - { - switch (command) - { - case Command.List: - return CommandStrings.List; - - case Command.NONE: - default: - return ""; - } - } - - /// - /// Get the string representation of the Flag enum values - /// - /// Flag value to convert - /// String representing the value, if possible - public static string LongName(Flag flag) - { - switch (flag) - { - // Boolean flags - case Flag.Progress: - return FlagStrings.Progress; - case Flag.Size: - return FlagStrings.Size; - - // Int64 flags - case Flag.BlockSize: - return FlagStrings.BlockSize; - case Flag.Count: - return FlagStrings.Count; - case Flag.Seek: - return FlagStrings.Seek; - case Flag.Skip: - return FlagStrings.Skip; - - // String flags - case Flag.Filter: - return FlagStrings.Filter; - case Flag.InputFile: - return FlagStrings.InputFile; - case Flag.OutputFile: - return FlagStrings.OutputFile; - - case Flag.NONE: - default: - return ""; - } - } - - #endregion - - #region Convert From String - - /// - /// Get the Command enum value for a given string - /// - /// String value to convert - /// Command represented by the string(s), if possible - public static Command StringToCommand(string command) - { - switch (command) - { - case CommandStrings.List: - return Command.List; - - default: - return Command.NONE; - } - } - - #endregion } } \ No newline at end of file diff --git a/MPF.Library/DD/Enumerations.cs b/MPF.Library/DD/Enumerations.cs deleted file mode 100644 index a4968d36..00000000 --- a/MPF.Library/DD/Enumerations.cs +++ /dev/null @@ -1,34 +0,0 @@ -namespace MPF.DD -{ - /// - /// Supported DD commands - /// - public enum Command: int - { - NONE = 0, // For DD, this represents a normal dump - List, - } - - /// - /// Supported DD flags - /// - public enum Flag : int - { - NONE = 0, - - // Boolean flags - Progress, - Size, - - // Int64 flags - BlockSize, - Count, - Seek, - Skip, - - // String flags - Filter, - InputFile, - OutputFile, - } -} \ No newline at end of file diff --git a/MPF.Library/DD/Parameters.cs b/MPF.Library/DD/Parameters.cs index bf102d11..fab708fd 100644 --- a/MPF.Library/DD/Parameters.cs +++ b/MPF.Library/DD/Parameters.cs @@ -1,10 +1,8 @@ -using System; -using System.Collections.Generic; +using System.Collections.Generic; using System.IO; using System.Linq; using System.Text.RegularExpressions; using MPF.Data; -using MPF.Utilities; namespace MPF.DD { @@ -16,7 +14,7 @@ namespace MPF.DD #region Generic Dumping Information /// - public override string InputPath => InputFileValue; + public override string InputPath => InputFileValue?.TrimStart('\\', '?'); /// public override string OutputPath => OutputFileValue; @@ -33,36 +31,11 @@ namespace MPF.DD #region Metadata - /// - /// Base command to run - /// - public Command BaseCommand { get; set; } - /// public override InternalProgram InternalProgram => InternalProgram.DD; #endregion - /// - /// Set of flags to pass to the executable - /// - protected Dictionary _flags = new Dictionary(); - public bool? this[Flag key] - { - get - { - if (_flags.ContainsKey(key)) - return _flags[key]; - - return null; - } - set - { - _flags[key] = value; - } - } - protected internal IEnumerable Keys => _flags.Keys; - #region Flag Values public long? BlockSizeValue { get; set; } @@ -161,23 +134,26 @@ namespace MPF.DD { List parameters = new List(); - if (BaseCommand != Command.NONE) - parameters.Add(Converters.LongName(BaseCommand)); + if (BaseCommand == null) + BaseCommand = CommandStrings.NONE; + + if (!string.IsNullOrEmpty(BaseCommand)) + parameters.Add(BaseCommand); #region Boolean flags // Progress - if (GetSupportedCommands(Flag.Progress).Contains(BaseCommand)) + if (IsFlagSupported(FlagStrings.Progress)) { - if (this[Flag.Progress] == true) - parameters.Add($"{this[Flag.Progress]}"); + if (this[FlagStrings.Progress] == true) + parameters.Add($"{FlagStrings.Progress}"); } // Size - if (GetSupportedCommands(Flag.Size).Contains(BaseCommand)) + if (IsFlagSupported(FlagStrings.Size)) { - if (this[Flag.Size] == true) - parameters.Add($"{this[Flag.Size]}"); + if (this[FlagStrings.Size] == true) + parameters.Add($"{FlagStrings.Size}"); } #endregion @@ -185,31 +161,31 @@ namespace MPF.DD #region Int64 flags // Block Size - if (GetSupportedCommands(Flag.BlockSize).Contains(BaseCommand)) + if (IsFlagSupported(FlagStrings.BlockSize)) { - if (this[Flag.BlockSize] == true && BlockSizeValue != null) - parameters.Add($"{Converters.LongName(Flag.BlockSize)}={BlockSizeValue}"); + if (this[FlagStrings.BlockSize] == true && BlockSizeValue != null) + parameters.Add($"{FlagStrings.BlockSize}={BlockSizeValue}"); } // Count - if (GetSupportedCommands(Flag.Count).Contains(BaseCommand)) + if (IsFlagSupported(FlagStrings.Count)) { - if (this[Flag.Count] == true && CountValue != null) - parameters.Add($"{Converters.LongName(Flag.Count)}={CountValue}"); + if (this[FlagStrings.Count] == true && CountValue != null) + parameters.Add($"{FlagStrings.Count}={CountValue}"); } // Seek - if (GetSupportedCommands(Flag.Seek).Contains(BaseCommand)) + if (IsFlagSupported(FlagStrings.Seek)) { - if (this[Flag.Seek] == true && SeekValue != null) - parameters.Add($"{Converters.LongName(Flag.Seek)}={SeekValue}"); + if (this[FlagStrings.Seek] == true && SeekValue != null) + parameters.Add($"{FlagStrings.Seek}={SeekValue}"); } // Skip - if (GetSupportedCommands(Flag.Skip).Contains(BaseCommand)) + if (IsFlagSupported(FlagStrings.Skip)) { - if (this[Flag.Skip] == true && SkipValue != null) - parameters.Add($"{Converters.LongName(Flag.Skip)}={SkipValue}"); + if (this[FlagStrings.Skip] == true && SkipValue != null) + parameters.Add($"{FlagStrings.Skip}={SkipValue}"); } #endregion @@ -217,33 +193,57 @@ namespace MPF.DD #region String flags // Filter - if (GetSupportedCommands(Flag.Filter).Contains(BaseCommand)) + if (IsFlagSupported(FlagStrings.Filter)) { - if (this[Flag.Filter] == true && FilterValue != null) - parameters.Add($"{Converters.LongName(Flag.Filter)}={FilterValue}"); + if (this[FlagStrings.Filter] == true && FilterValue != null) + parameters.Add($"{FlagStrings.Filter}={FilterValue}"); } // Input File - if (GetSupportedCommands(Flag.InputFile).Contains(BaseCommand)) + if (IsFlagSupported(FlagStrings.InputFile)) { - if (this[Flag.InputFile] == true && InputFileValue != null) - parameters.Add($"{Converters.LongName(Flag.InputFile)}={InputFileValue}"); + if (this[FlagStrings.InputFile] == true && InputFileValue != null) + parameters.Add($"{FlagStrings.InputFile}=\"{InputFileValue}\""); else return null; } // Output File - if (GetSupportedCommands(Flag.OutputFile).Contains(BaseCommand)) + if (IsFlagSupported(FlagStrings.OutputFile)) { - if (this[Flag.OutputFile] == true && OutputFileValue != null) - parameters.Add($"{Converters.LongName(Flag.OutputFile)}={OutputFileValue}"); + if (this[FlagStrings.OutputFile] == true && OutputFileValue != null) + parameters.Add($"{FlagStrings.OutputFile}=\"{OutputFileValue}\""); else return null; } #endregion - return string.Empty; + return string.Join(" ", parameters); + } + + /// + public override Dictionary> GetCommandSupport() + { + return new Dictionary>() + { + [CommandStrings.NONE] = new List() + { + FlagStrings.BlockSize, + FlagStrings.Count, + FlagStrings.Filter, + FlagStrings.InputFile, + FlagStrings.OutputFile, + FlagStrings.Progress, + FlagStrings.Seek, + FlagStrings.Size, + FlagStrings.Skip, + }, + + [CommandStrings.List] = new List() + { + }, + }; } /// @@ -254,7 +254,7 @@ namespace MPF.DD { switch (this.BaseCommand) { - case Command.List: + case CommandStrings.List: return false; default: return true; @@ -264,9 +264,9 @@ namespace MPF.DD /// protected override void ResetValues() { - BaseCommand = Command.NONE; + BaseCommand = CommandStrings.NONE; - _flags = new Dictionary(); + flags = new Dictionary(); BlockSizeValue = null; CountValue = null; @@ -279,16 +279,16 @@ namespace MPF.DD /// protected override void SetDefaultParameters(char driveLetter, string filename, int? driveSpeed, Options options) { - BaseCommand = Command.NONE; + BaseCommand = CommandStrings.NONE; - this[Flag.InputFile] = true; + this[FlagStrings.InputFile] = true; InputFileValue = $"\\\\?\\{driveLetter}:"; - this[Flag.OutputFile] = true; + this[FlagStrings.OutputFile] = true; OutputFileValue = filename; // TODO: Add more common block sizes - this[Flag.BlockSize] = true; + this[FlagStrings.BlockSize] = true; switch (this.Type) { case MediaType.FloppyDisk: @@ -300,13 +300,15 @@ namespace MPF.DD break; } - this[Flag.Progress] = true; - this[Flag.Size] = true; + this[FlagStrings.Progress] = true; + this[FlagStrings.Size] = true; } /// protected override bool ValidateAndSetParameters(string parameters) { + BaseCommand = CommandStrings.NONE; + // The string has to be valid by itself first if (string.IsNullOrWhiteSpace(parameters)) return false; @@ -321,13 +323,14 @@ namespace MPF.DD // Determine what the commandline should look like given the first item int start = 0; - BaseCommand = Converters.StringToCommand(parts[0]); - if (BaseCommand != Command.NONE) + if (parts[0] == CommandStrings.List) + { + BaseCommand = parts[0]; start = 1; + } // Loop through all auxilary flags, if necessary - int i = 0; - for (i = start; i < parts.Count; i++) + for (int i = start; i < parts.Count; i++) { // Flag read-out values long? longValue = null; @@ -339,41 +342,33 @@ namespace MPF.DD #region Boolean flags // Progress - ProcessBooleanParameter(parts, FlagStrings.Progress, Flag.Progress, ref i); + ProcessFlagParameter(parts, FlagStrings.Progress, ref i); // Size - ProcessBooleanParameter(parts, FlagStrings.Size, Flag.Size, ref i); + ProcessFlagParameter(parts, FlagStrings.Size, ref i); #endregion #region Int64 flags // Block Size - longValue = ProcessInt64Parameter(parts, FlagStrings.BlockSize, Flag.BlockSize, ref i); - if (longValue == Int64.MinValue) - return false; - else if (longValue != null) + longValue = ProcessInt64Parameter(parts, FlagStrings.BlockSize, ref i); + if (longValue != null) BlockSizeValue = longValue; // Count - longValue = ProcessInt64Parameter(parts, FlagStrings.Count, Flag.Count, ref i); - if (longValue == Int64.MinValue) - return false; - else if (longValue != null) + longValue = ProcessInt64Parameter(parts, FlagStrings.Count, ref i); + if (longValue != null) CountValue = longValue; // Seek - longValue = ProcessInt64Parameter(parts, FlagStrings.Seek, Flag.Seek, ref i); - if (longValue == Int64.MinValue) - return false; - else if (longValue != null) + longValue = ProcessInt64Parameter(parts, FlagStrings.Seek, ref i); + if (longValue != null) SeekValue = longValue; // Skip - longValue = ProcessInt64Parameter(parts, FlagStrings.Skip, Flag.Skip, ref i); - if (longValue == Int64.MinValue) - return false; - else if (longValue != null) + longValue = ProcessInt64Parameter(parts, FlagStrings.Skip, ref i); + if (longValue != null) SkipValue = longValue; #endregion @@ -381,22 +376,18 @@ namespace MPF.DD #region String flags // Filter (fixed, removable, disk, partition) - stringValue = ProcessStringParameter(parts, FlagStrings.Filter, Flag.Filter, ref i); + stringValue = ProcessStringParameter(parts, FlagStrings.Filter, ref i); if (!string.IsNullOrEmpty(stringValue)) FilterValue = stringValue; // Input File - stringValue = ProcessStringParameter(parts, FlagStrings.InputFile, Flag.InputFile, ref i); - if (string.Equals(stringValue, string.Empty)) - return false; - else if (stringValue != null) + stringValue = ProcessStringParameter(parts, FlagStrings.InputFile, ref i); + if (!string.IsNullOrEmpty(stringValue)) InputFileValue = stringValue; // Output File - stringValue = ProcessStringParameter(parts, FlagStrings.OutputFile, Flag.OutputFile, ref i); - if (string.Equals(stringValue, string.Empty)) - return false; - else if (stringValue != null) + stringValue = ProcessStringParameter(parts, FlagStrings.OutputFile, ref i); + if (!string.IsNullOrEmpty(stringValue)) OutputFileValue = stringValue; #endregion @@ -406,212 +397,5 @@ namespace MPF.DD } #endregion - - #region Private Extra Methods - - /// - /// Get the list of commands that use a given flag - /// - /// Flag value to get commands for - /// List of Commands, if possible - private static List GetSupportedCommands(Flag flag) - { - var commands = new List(); - switch (flag) - { - #region Boolean flags - - case Flag.Progress: - commands.Add(Command.NONE); - break; - case Flag.Size: - commands.Add(Command.NONE); - break; - - #endregion - - #region Int64 flags - - case Flag.BlockSize: - commands.Add(Command.NONE); - break; - case Flag.Count: - commands.Add(Command.NONE); - break; - case Flag.Seek: - commands.Add(Command.NONE); - break; - case Flag.Skip: - commands.Add(Command.NONE); - break; - - #endregion - - #region String flags - - case Flag.Filter: - commands.Add(Command.NONE); - break; - case Flag.InputFile: - commands.Add(Command.NONE); - break; - case Flag.OutputFile: - commands.Add(Command.NONE); - break; - - #endregion - - case Flag.NONE: - default: - return commands; - } - - return commands; - } - - #endregion - - #region Process Parameter Helpers - - /// - /// Process a boolean parameter - /// - /// List of parts to be referenced - /// Flag string to check - /// Flag value corresponding to the flag - /// Reference to the position in the parts - /// True if the parameter was processed successfully or skipped, false otherwise - private bool ProcessBooleanParameter(List parts, string flagString, Flag flag, ref int i) - { - if (parts == null) - return false; - - if (parts[i] == flagString) - { - if (!GetSupportedCommands(flag).Contains(BaseCommand)) - return false; - - this[flag] = true; - } - - return true; - } - - /// - /// Process an Int64 parameter - /// - /// List of parts to be referenced - /// Flag string to check - /// Flag value corresponding to the flag - /// Reference to the position in the parts - /// Int64 value if success, Int64.MinValue if skipped, null on error/returns> - private long? ProcessInt64Parameter(List parts, string flagString, Flag flag, ref int i) - { - if (parts == null) - return null; - - if (parts[i].StartsWith(flagString)) - { - if (!GetSupportedCommands(flag).Contains(BaseCommand)) - return null; - - string[] commandParts = parts[i].Split('='); - if (commandParts.Length != 2) - return null; - - string valuePart = commandParts[1]; - long factor = 1; - - // Characters - if (valuePart.EndsWith("c", StringComparison.Ordinal)) - { - factor = 1; - valuePart.TrimEnd('c'); - } - - // Words - else if (valuePart.EndsWith("w", StringComparison.Ordinal)) - { - factor = 2; - valuePart.TrimEnd('w'); - } - - // Double Words - else if (valuePart.EndsWith("d", StringComparison.Ordinal)) - { - factor = 4; - valuePart.TrimEnd('d'); - } - - // Quad Words - else if (valuePart.EndsWith("q", StringComparison.Ordinal)) - { - factor = 8; - valuePart.TrimEnd('q'); - } - - // Kilobytes - else if (valuePart.EndsWith("k", StringComparison.Ordinal)) - { - factor = 1024; - valuePart.TrimEnd('k'); - } - - // Megabytes - else if (valuePart.EndsWith("M", StringComparison.Ordinal)) - { - factor = 1024 * 1024; - valuePart.TrimEnd('M'); - } - - // Gigabytes - else if (valuePart.EndsWith("G", StringComparison.Ordinal)) - { - factor = 1024 * 1024 * 1024; - valuePart.TrimEnd('G'); - } - - if (!IsValidInt64(valuePart)) - return null; - - this[flag] = true; - return long.Parse(valuePart) * factor; - } - - return Int64.MinValue; - } - - /// - /// Process a string parameter - /// - /// List of parts to be referenced - /// Flag string to check - /// Flag value corresponding to the flag - /// Reference to the position in the parts - /// String value if possible, string.Empty on missing, null on error - private string ProcessStringParameter(List parts, string flagString, Flag flag, ref int i) - { - if (parts == null) - return null; - - if (parts[i] == flagString) - { - if (!GetSupportedCommands(flag).Contains(BaseCommand)) - return null; - - string[] commandParts = parts[i].Split('='); - if (commandParts.Length != 2) - return null; - - string valuePart = commandParts[1]; - - this[flag] = true; - return valuePart.Trim('"'); - } - - return string.Empty; - } - - #endregion } } diff --git a/MPF.Library/Data/BaseParameters.cs b/MPF.Library/Data/BaseParameters.cs index 883c9854..5f297a68 100644 --- a/MPF.Library/Data/BaseParameters.cs +++ b/MPF.Library/Data/BaseParameters.cs @@ -34,6 +34,49 @@ namespace MPF.Data #region Generic Dumping Information + /// + /// Base command to run + /// + public string BaseCommand { get; set; } + + /// + /// Set of flags to pass to the executable + /// + protected Dictionary flags = new Dictionary(); + protected internal IEnumerable Keys => flags.Keys; + + /// + /// Safe access to currently set flags + /// + public bool? this[string key] + { + get + { + if (flags.ContainsKey(key)) + return flags[key]; + + return null; + } + set + { + flags[key] = value; + } + } + + /// + /// Process to track external program + /// + private Process process; + + #endregion + + #region Virtual Dumping Information + + /// + /// Command to flag support mappings + /// + public Dictionary> CommandSupport => GetCommandSupport(); + /// /// Input path for operations /// @@ -50,11 +93,6 @@ namespace MPF.Data /// public virtual int? Speed { get; set; } = null; - /// - /// Process to track external program - /// - private Process process; - #endregion #region Metadata @@ -130,6 +168,12 @@ namespace MPF.Data #region Virtual Methods + /// + /// Get all commands mapped to the supported flags + /// + /// Mappings from command to supported flags + public virtual Dictionary> GetCommandSupport() => null; + /// /// Blindly generate a parameter string based on the inputs /// @@ -162,6 +206,22 @@ namespace MPF.Data /// True if it's a dumping command, false otherwise public virtual bool IsDumpingCommand() => true; + /// + /// Gets if the flag is supported by the current command + /// + /// Flag value to check + /// True if the flag value is supported, false otherwise + public virtual bool IsFlagSupported(string flag) + { + if (CommandSupport == null) + return false; + if (this.BaseCommand == null) + return false; + if (!CommandSupport.ContainsKey(this.BaseCommand)) + return false; + return CommandSupport[this.BaseCommand].Contains(flag); + } + /// /// Returns if the current Parameter object is valid /// @@ -311,7 +371,10 @@ namespace MPF.Data /// True if it's a flag, false otherwise protected static bool IsFlag(string parameter) { - if (parameter.Trim('\"').StartsWith("/")) + parameter = parameter.Trim('\"'); + if (parameter.StartsWith("/")) + return true; + else if (parameter.StartsWith("-")) return true; return false; @@ -349,7 +412,8 @@ namespace MPF.Data /// True if it's a valid byte, false otherwise protected static bool IsValidInt8(string parameter, sbyte lowerBound = -1, sbyte upperBound = -1) { - if (!sbyte.TryParse(parameter, out sbyte temp)) + (string value, long _) = ExtractFactorFromValue(parameter); + if (!sbyte.TryParse(value, out sbyte temp)) return false; else if (lowerBound != -1 && temp < lowerBound) return false; @@ -368,7 +432,8 @@ namespace MPF.Data /// True if it's a valid Int16, false otherwise protected static bool IsValidInt16(string parameter, short lowerBound = -1, short upperBound = -1) { - if (!short.TryParse(parameter, out short temp)) + (string value, long _) = ExtractFactorFromValue(parameter); + if (!short.TryParse(value, out short temp)) return false; else if (lowerBound != -1 && temp < lowerBound) return false; @@ -387,7 +452,8 @@ namespace MPF.Data /// True if it's a valid Int32, false otherwise protected static bool IsValidInt32(string parameter, int lowerBound = -1, int upperBound = -1) { - if (!int.TryParse(parameter, out int temp)) + (string value, long _) = ExtractFactorFromValue(parameter); + if (!int.TryParse(value, out int temp)) return false; else if (lowerBound != -1 && temp < lowerBound) return false; @@ -406,7 +472,8 @@ namespace MPF.Data /// True if it's a valid Int64, false otherwise protected static bool IsValidInt64(string parameter, long lowerBound = -1, long upperBound = -1) { - if (!long.TryParse(parameter, out long temp)) + (string value, long _) = ExtractFactorFromValue(parameter); + if (!long.TryParse(value, out long temp)) return false; else if (lowerBound != -1 && temp < lowerBound) return false; @@ -416,6 +483,571 @@ namespace MPF.Data return true; } + /// + /// Process a flag parameter + /// + /// List of parts to be referenced + /// Flag string, if available + /// Reference to the position in the parts + /// True if the parameter was processed successfully or skipped, false otherwise + protected bool ProcessFlagParameter(List parts, string flagString, ref int i) + { + return ProcessFlagParameter(parts, null, flagString, ref i); + } + + /// + /// Process a flag parameter + /// + /// List of parts to be referenced + /// Short flag string, if available + /// Long flag string, if available + /// Reference to the position in the parts + /// True if the parameter was processed successfully or skipped, false otherwise + protected bool ProcessFlagParameter(List parts, string shortFlagString, string longFlagString, ref int i) + { + if (parts == null) + return false; + + if (parts[i] == shortFlagString || parts[i] == longFlagString) + { + if (!IsFlagSupported(longFlagString)) + return false; + + this[longFlagString] = true; + } + + return true; + } + + /// + /// Process a boolean parameter + /// + /// List of parts to be referenced + /// Flag string, if available + /// Reference to the position in the parts + /// True if missing values are allowed, false otherwise + /// True if the parameter was processed successfully or skipped, false otherwise + protected bool ProcessBooleanParameter(List parts, string flagString, ref int i, bool missingAllowed = false) + { + return ProcessBooleanParameter(parts, null, flagString, ref i, missingAllowed); + } + + /// + /// Process a boolean parameter + /// + /// List of parts to be referenced + /// Short flag string, if available + /// Long flag string, if available + /// Reference to the position in the parts + /// True if missing values are allowed, false otherwise + /// True if the parameter was processed successfully or skipped, false otherwise + protected bool ProcessBooleanParameter(List parts, string shortFlagString, string longFlagString, ref int i, bool missingAllowed = false) + { + if (parts == null) + return false; + + if (parts[i] == shortFlagString || parts[i] == longFlagString) + { + if (!IsFlagSupported(longFlagString)) + { + return false; + } + else if (!DoesExist(parts, i + 1)) + { + if (missingAllowed) + { + this[longFlagString] = true; + return true; + } + else + { + return false; + } + } + else if (IsFlag(parts[i + 1])) + { + if (missingAllowed) + { + this[longFlagString] = true; + return true; + } + else + { + return false; + } + } + else if (!IsValidBool(parts[i + 1])) + { + if (missingAllowed) + { + this[longFlagString] = true; + return true; + } + else + { + return false; + } + } + + this[longFlagString] = bool.Parse(parts[i + 1]); + i++; + } + + return true; + } + + /// + /// Process a sbyte parameter + /// + /// List of parts to be referenced + /// Flag string, if available + /// Reference to the position in the parts + /// True if missing values are allowed, false otherwise + /// SByte value if success, SByte.MinValue if skipped, null on error/returns> + protected sbyte? ProcessInt8Parameter(List parts, string flagString, ref int i, bool missingAllowed = false) + { + return ProcessInt8Parameter(parts, null, flagString, ref i, missingAllowed); + } + + /// + /// Process an sbyte parameter + /// + /// List of parts to be referenced + /// Short flag string, if available + /// Long flag string, if available + /// Reference to the position in the parts + /// True if missing values are allowed, false otherwise + /// SByte value if success, SByte.MinValue if skipped, null on error/returns> + protected sbyte? ProcessInt8Parameter(List parts, string shortFlagString, string longFlagString, ref int i, bool missingAllowed = false) + { + if (parts == null) + return null; + + if (parts[i] == shortFlagString || parts[i] == longFlagString) + { + if (!IsFlagSupported(longFlagString)) + { + return null; + } + else if (!DoesExist(parts, i + 1)) + { + if (missingAllowed) + this[longFlagString] = true; + + return null; + } + else if (IsFlag(parts[i + 1])) + { + if (missingAllowed) + this[longFlagString] = true; + + return null; + } + else if (!IsValidInt8(parts[i + 1])) + { + if (missingAllowed) + this[longFlagString] = true; + + return null; + } + + this[longFlagString] = true; + i++; + + (string value, long factor) = ExtractFactorFromValue(parts[i]); + return (sbyte)(sbyte.Parse(value) * factor); + } + else if (parts[i].StartsWith(shortFlagString + "=") || parts[i].StartsWith(longFlagString + "=")) + { + if (!IsFlagSupported(longFlagString)) + return null; + + string[] commandParts = parts[i].Split('='); + if (commandParts.Length != 2) + return null; + + string valuePart = commandParts[1]; + + (string value, long factor) = ExtractFactorFromValue(valuePart); + return (sbyte)(sbyte.Parse(value) * factor); + } + + return SByte.MinValue; + } + + /// + /// Process an Int16 parameter + /// + /// List of parts to be referenced + /// Flag string, if available + /// Reference to the position in the parts + /// True if missing values are allowed, false otherwise + /// Int16 value if success, Int16.MinValue if skipped, null on error/returns> + protected short? ProcessInt16Parameter(List parts, string flagString, ref int i, bool missingAllowed = false) + { + return ProcessInt16Parameter(parts, null, flagString, ref i, missingAllowed); + } + + /// + /// Process an Int16 parameter + /// + /// List of parts to be referenced + /// Short flag string, if available + /// Long flag string, if available + /// Reference to the position in the parts + /// True if missing values are allowed, false otherwise + /// Int16 value if success, Int16.MinValue if skipped, null on error/returns> + protected short? ProcessInt16Parameter(List parts, string shortFlagString, string longFlagString, ref int i, bool missingAllowed = false) + { + if (parts == null) + return null; + + if (parts[i] == shortFlagString || parts[i] == longFlagString) + { + if (!IsFlagSupported(longFlagString)) + { + return null; + } + else if (!DoesExist(parts, i + 1)) + { + if (missingAllowed) + this[longFlagString] = true; + + return null; + } + else if (IsFlag(parts[i + 1])) + { + if (missingAllowed) + this[longFlagString] = true; + + return null; + } + else if (!IsValidInt16(parts[i + 1])) + { + if (missingAllowed) + this[longFlagString] = true; + + return null; + } + + this[longFlagString] = true; + i++; + (string value, long factor) = ExtractFactorFromValue(parts[i]); + return (short)(short.Parse(value) * factor); + } + else if (parts[i].StartsWith(shortFlagString + "=") || parts[i].StartsWith(longFlagString + "=")) + { + if (!IsFlagSupported(longFlagString)) + return null; + + string[] commandParts = parts[i].Split('='); + if (commandParts.Length != 2) + return null; + + string valuePart = commandParts[1]; + + (string value, long factor) = ExtractFactorFromValue(valuePart); + return (short)(short.Parse(value) * factor); + } + + return Int16.MinValue; + } + + /// + /// Process an Int32 parameter + /// + /// List of parts to be referenced + /// Flag string, if available + /// Reference to the position in the parts + /// True if missing values are allowed, false otherwise + /// Int32 value if success, Int32.MinValue if skipped, null on error/returns> + protected int? ProcessInt32Parameter(List parts, string flagString, ref int i, bool missingAllowed = false) + { + return ProcessInt32Parameter(parts, null, flagString, ref i, missingAllowed); + } + + /// + /// Process an Int32 parameter + /// + /// List of parts to be referenced + /// Short flag string, if available + /// Long flag string, if available + /// Reference to the position in the parts + /// True if missing values are allowed, false otherwise + /// Int32 value if success, Int32.MinValue if skipped, null on error/returns> + protected int? ProcessInt32Parameter(List parts, string shortFlagString, string longFlagString, ref int i, bool missingAllowed = false) + { + if (parts == null) + return null; + + if (parts[i] == shortFlagString || parts[i] == longFlagString) + { + if (!IsFlagSupported(longFlagString)) + { + return null; + } + else if (!DoesExist(parts, i + 1)) + { + if (missingAllowed) + this[longFlagString] = true; + + return null; + } + else if (IsFlag(parts[i + 1])) + { + if (missingAllowed) + this[longFlagString] = true; + + return null; + } + else if (!IsValidInt32(parts[i + 1])) + { + if (missingAllowed) + this[longFlagString] = true; + + return null; + } + + this[longFlagString] = true; + i++; + (string value, long factor) = ExtractFactorFromValue(parts[i]); + return (int)(int.Parse(value) * factor); + } + else if (parts[i].StartsWith(shortFlagString + "=") || parts[i].StartsWith(longFlagString + "=")) + { + if (!IsFlagSupported(longFlagString)) + return null; + + string[] commandParts = parts[i].Split('='); + if (commandParts.Length != 2) + return null; + + string valuePart = commandParts[1]; + + (string value, long factor) = ExtractFactorFromValue(valuePart); + return (int)(int.Parse(value) * factor); + } + + return Int32.MinValue; + } + + /// + /// Process an Int64 parameter + /// + /// List of parts to be referenced + /// Flag string, if available + /// Reference to the position in the parts + /// True if missing values are allowed, false otherwise + /// Int64 value if success, Int64.MinValue if skipped, null on error/returns> + protected long? ProcessInt64Parameter(List parts, string flagString, ref int i, bool missingAllowed = false) + { + return ProcessInt64Parameter(parts, null, flagString, ref i, missingAllowed); + } + + /// + /// Process an Int64 parameter + /// + /// List of parts to be referenced + /// Short flag string, if available + /// Long flag string, if available + /// Reference to the position in the parts + /// True if missing values are allowed, false otherwise + /// Int64 value if success, Int64.MinValue if skipped, null on error/returns> + protected long? ProcessInt64Parameter(List parts, string shortFlagString, string longFlagString, ref int i, bool missingAllowed = false) + { + if (parts == null) + return null; + + if (parts[i] == shortFlagString || parts[i] == longFlagString) + { + if (!IsFlagSupported(longFlagString)) + { + return null; + } + else if (!DoesExist(parts, i + 1)) + { + if (missingAllowed) + this[longFlagString] = true; + + return null; + } + else if (IsFlag(parts[i + 1])) + { + if (missingAllowed) + this[longFlagString] = true; + + return null; + } + else if (!IsValidInt64(parts[i + 1])) + { + if (missingAllowed) + this[longFlagString] = true; + + return null; + } + + this[longFlagString] = true; + i++; + (string value, long factor) = ExtractFactorFromValue(parts[i]); + return long.Parse(value) * factor; + } + else if (parts[i].StartsWith(shortFlagString + "=") || parts[i].StartsWith(longFlagString + "=")) + { + if (!IsFlagSupported(longFlagString)) + return null; + + string[] commandParts = parts[i].Split('='); + if (commandParts.Length != 2) + return null; + + string valuePart = commandParts[1]; + + (string value, long factor) = ExtractFactorFromValue(valuePart); + return long.Parse(value) * factor; + } + + return Int64.MinValue; + } + + /// + /// Process an Int64 parameter + /// + /// List of parts to be referenced + /// Flag string, if available + /// Reference to the position in the parts + /// True if missing values are allowed, false otherwise + /// String value if possible, string.Empty on missing, null on error + protected string ProcessStringParameter(List parts, string flagString, ref int i, bool missingAllowed = false) + { + return ProcessStringParameter(parts, null, flagString, ref i, missingAllowed); + } + + /// + /// Process a string parameter + /// + /// List of parts to be referenced + /// Short flag string, if available + /// Long flag string, if available + /// Reference to the position in the parts + /// True if missing values are allowed, false otherwise + /// String value if possible, string.Empty on missing, null on error + protected string ProcessStringParameter(List parts, string shortFlagString, string longFlagString, ref int i, bool missingAllowed = false) + { + if (parts == null) + return null; + + if (parts[i] == shortFlagString || parts[i] == longFlagString) + { + if (!IsFlagSupported(longFlagString)) + { + return null; + } + else if (!DoesExist(parts, i + 1)) + { + if (missingAllowed) + this[longFlagString] = true; + + return null; + } + else if (IsFlag(parts[i + 1])) + { + if (missingAllowed) + this[longFlagString] = true; + + return null; + } + else if (string.IsNullOrWhiteSpace(parts[i + 1])) + { + if (missingAllowed) + this[longFlagString] = true; + + return null; + } + + this[longFlagString] = true; + i++; + return parts[i].Trim('"'); + } + else if (parts[i].StartsWith(shortFlagString + "=") || parts[i].StartsWith(longFlagString + "=")) + { + if (!IsFlagSupported(longFlagString)) + return null; + + string[] commandParts = parts[i].Split('='); + if (commandParts.Length != 2) + return null; + + string valuePart = commandParts[1]; + + this[longFlagString] = true; + return valuePart.Trim('"'); + } + + return string.Empty; + } + + /// + /// Get yhe trimmed value and multiplication factor from a value + /// + /// String value to treat as suffixed number + /// Trimmed value and multiplication factor + private static (string trimmed, long factor) ExtractFactorFromValue(string value) + { + value = value.Trim('"'); + long factor = 1; + + // Characters + if (value.EndsWith("c", StringComparison.Ordinal)) + { + factor = 1; + value = value.TrimEnd('c'); + } + + // Words + else if (value.EndsWith("w", StringComparison.Ordinal)) + { + factor = 2; + value = value.TrimEnd('w'); + } + + // Double Words + else if (value.EndsWith("d", StringComparison.Ordinal)) + { + factor = 4; + value = value.TrimEnd('d'); + } + + // Quad Words + else if (value.EndsWith("q", StringComparison.Ordinal)) + { + factor = 8; + value = value.TrimEnd('q'); + } + + // Kilobytes + else if (value.EndsWith("k", StringComparison.Ordinal)) + { + factor = 1024; + value = value.TrimEnd('k'); + } + + // Megabytes + else if (value.EndsWith("M", StringComparison.Ordinal)) + { + factor = 1024 * 1024; + value = value.TrimEnd('M'); + } + + // Gigabytes + else if (value.EndsWith("G", StringComparison.Ordinal)) + { + factor = 1024 * 1024 * 1024; + value = value.TrimEnd('G'); + } + + return (value, factor); + } + #endregion #region Common Information Extraction diff --git a/MPF.Library/Data/DumpEnvironment.cs b/MPF.Library/Data/DumpEnvironment.cs index ee4f735e..0c09a195 100644 --- a/MPF.Library/Data/DumpEnvironment.cs +++ b/MPF.Library/Data/DumpEnvironment.cs @@ -320,7 +320,7 @@ namespace MPF.Data var parameters = new DiscImageCreator.Parameters(string.Empty) { - BaseCommand = DiscImageCreator.Command.Eject, + BaseCommand = DiscImageCreator.CommandStrings.Eject, DriveLetter = Drive.Letter.ToString(), ExecutablePath = Options.DiscImageCreatorPath, }; @@ -350,7 +350,7 @@ namespace MPF.Data DiscImageCreator.Parameters parameters = new DiscImageCreator.Parameters(string.Empty) { - BaseCommand = DiscImageCreator.Command.Reset, + BaseCommand = DiscImageCreator.CommandStrings.Reset, DriveLetter = Drive.Letter.ToString(), ExecutablePath = Options.DiscImageCreatorPath, }; diff --git a/MPF.Library/DiscImageCreator/Constants.cs b/MPF.Library/DiscImageCreator/Constants.cs index 8faac4ff..82344bb9 100644 --- a/MPF.Library/DiscImageCreator/Constants.cs +++ b/MPF.Library/DiscImageCreator/Constants.cs @@ -5,6 +5,7 @@ namespace MPF.DiscImageCreator /// public static class CommandStrings { + public const string NONE = ""; public const string Audio = "audio"; public const string BluRay = "bd"; public const string Close = "close"; diff --git a/MPF.Library/DiscImageCreator/Converters.cs b/MPF.Library/DiscImageCreator/Converters.cs index a1b08ca2..836076ea 100644 --- a/MPF.Library/DiscImageCreator/Converters.cs +++ b/MPF.Library/DiscImageCreator/Converters.cs @@ -11,31 +11,31 @@ namespace MPF.DiscImageCreator /// /// Command value to check /// KnownSystem if possible, null on error - public static KnownSystem? ToKnownSystem(Command baseCommand) + public static KnownSystem? ToKnownSystem(string baseCommand) { switch (baseCommand) { - case Command.Audio: + case CommandStrings.Audio: return KnownSystem.AudioCD; - case Command.CompactDisc: - case Command.Data: - case Command.DigitalVideoDisc: - case Command.Disk: - case Command.Floppy: - case Command.Tape: + case CommandStrings.CompactDisc: + case CommandStrings.Data: + case CommandStrings.DigitalVideoDisc: + case CommandStrings.Disk: + case CommandStrings.Floppy: + case CommandStrings.Tape: return KnownSystem.IBMPCCompatible; - case Command.GDROM: - case Command.Swap: + case CommandStrings.GDROM: + case CommandStrings.Swap: return KnownSystem.SegaDreamcast; - case Command.BluRay: + case CommandStrings.BluRay: return KnownSystem.SonyPlayStation3; - case Command.SACD: + case CommandStrings.SACD: return KnownSystem.SuperAudioCD; - case Command.XBOX: - case Command.XBOXSwap: + case CommandStrings.XBOX: + case CommandStrings.XBOXSwap: return KnownSystem.MicrosoftXBOX; - case Command.XGD2Swap: - case Command.XGD3Swap: + case CommandStrings.XGD2Swap: + case CommandStrings.XGD3Swap: return KnownSystem.MicrosoftXBOX360; default: return null; @@ -48,33 +48,33 @@ namespace MPF.DiscImageCreator /// Command value to check /// MediaType if possible, null on error /// This takes the "safe" route by assuming the larger of any given format - public static MediaType? ToMediaType(Command baseCommand) + public static MediaType? ToMediaType(string baseCommand) { switch (baseCommand) { - case Command.Audio: - case Command.CompactDisc: - case Command.Data: - case Command.SACD: + case CommandStrings.Audio: + case CommandStrings.CompactDisc: + case CommandStrings.Data: + case CommandStrings.SACD: return MediaType.CDROM; - case Command.GDROM: - case Command.Swap: + case CommandStrings.GDROM: + case CommandStrings.Swap: return MediaType.GDROM; - case Command.DigitalVideoDisc: - case Command.XBOX: - case Command.XBOXSwap: - case Command.XGD2Swap: - case Command.XGD3Swap: + case CommandStrings.DigitalVideoDisc: + case CommandStrings.XBOX: + case CommandStrings.XBOXSwap: + case CommandStrings.XGD2Swap: + case CommandStrings.XGD3Swap: return MediaType.DVD; - case Command.BluRay: + case CommandStrings.BluRay: return MediaType.BluRay; // Non-optical - case Command.Floppy: + case CommandStrings.Floppy: return MediaType.FloppyDisk; - case Command.Disk: + case CommandStrings.Disk: return MediaType.HardDisk; - case Command.Tape: + case CommandStrings.Tape: return MediaType.DataCartridge; default: return null; @@ -120,222 +120,5 @@ namespace MPF.DiscImageCreator } #endregion - - #region Convert to Long Name - - /// - /// Get the string representation of the Command enum values - /// - /// Command value to convert - /// String representing the value, if possible - public static string LongName(Command command) - { - switch (command) - { - case Command.Audio: - return CommandStrings.Audio; - case Command.BluRay: - return CommandStrings.BluRay; - case Command.Close: - return CommandStrings.Close; - case Command.CompactDisc: - return CommandStrings.CompactDisc; - case Command.Data: - return CommandStrings.Data; - case Command.DigitalVideoDisc: - return CommandStrings.DigitalVideoDisc; - case Command.Disk: - return CommandStrings.Disk; - case Command.DriveSpeed: - return CommandStrings.DriveSpeed; - case Command.Eject: - return CommandStrings.Eject; - case Command.Floppy: - return CommandStrings.Floppy; - case Command.GDROM: - return CommandStrings.GDROM; - case Command.MDS: - return CommandStrings.MDS; - case Command.Merge: - return CommandStrings.Merge; - case Command.Reset: - return CommandStrings.Reset; - case Command.SACD: - return CommandStrings.SACD; - case Command.Start: - return CommandStrings.Start; - case Command.Stop: - return CommandStrings.Stop; - case Command.Sub: - return CommandStrings.Sub; - case Command.Swap: - return CommandStrings.Swap; - case Command.Tape: - return CommandStrings.Tape; - case Command.XBOX: - return CommandStrings.XBOX; - case Command.XBOXSwap: - return CommandStrings.XBOXSwap; - case Command.XGD2Swap: - return CommandStrings.XGD2Swap; - case Command.XGD3Swap: - return CommandStrings.XGD3Swap; - - case Command.NONE: - default: - return ""; - } - } - - /// - /// Get the string representation of the Flag enum values - /// - /// Flag value to convert - /// String representing the value, if possible - public static string LongName(Flag flag) - { - switch (flag) - { - case Flag.AddOffset: - return FlagStrings.AddOffset; - case Flag.AMSF: - return FlagStrings.AMSF; - case Flag.AtariJaguar: - return FlagStrings.AtariJaguar; - case Flag.BEOpcode: - return FlagStrings.BEOpcode; - case Flag.C2Opcode: - return FlagStrings.C2Opcode; - case Flag.CopyrightManagementInformation: - return FlagStrings.CopyrightManagementInformation; - case Flag.D8Opcode: - return FlagStrings.D8Opcode; - case Flag.DisableBeep: - return FlagStrings.DisableBeep; - case Flag.ExtractMicroSoftCabFile: - return FlagStrings.ExtractMicroSoftCabFile; - case Flag.Fix: - return FlagStrings.Fix; - case Flag.ForceUnitAccess: - return FlagStrings.ForceUnitAccess; - case Flag.MultiSectorRead: - return FlagStrings.MultiSectorRead; - case Flag.MultiSession: - return FlagStrings.MultiSession; - case Flag.NoFixSubP: - return FlagStrings.NoFixSubP; - case Flag.NoFixSubQ: - return FlagStrings.NoFixSubQ; - case Flag.NoFixSubQLibCrypt: - return FlagStrings.NoFixSubQLibCrypt; - case Flag.NoFixSubRtoW: - return FlagStrings.NoFixSubRtoW; - case Flag.NoFixSubQSecuROM: - return FlagStrings.NoFixSubQSecuROM; - case Flag.NoSkipSS: - return FlagStrings.NoSkipSS; - case Flag.PadSector: - return FlagStrings.PadSector; - case Flag.Raw: - return FlagStrings.Raw; - case Flag.Resume: - return FlagStrings.Resume; - case Flag.Reverse: - return FlagStrings.Reverse; - case Flag.ScanAntiMod: - return FlagStrings.ScanAntiMod; - case Flag.ScanFileProtect: - return FlagStrings.ScanFileProtect; - case Flag.ScanSectorProtect: - return FlagStrings.ScanSectorProtect; - case Flag.SeventyFour: - return FlagStrings.SeventyFour; - case Flag.SkipSector: - return FlagStrings.SkipSector; - case Flag.SubchannelReadLevel: - return FlagStrings.SubchannelReadLevel; - case Flag.UseAnchorVolumeDescriptorPointer: - return FlagStrings.UseAnchorVolumeDescriptorPointer; - case Flag.VideoNow: - return FlagStrings.VideoNow; - case Flag.VideoNowColor: - return FlagStrings.VideoNowColor; - case Flag.VideoNowXP: - return FlagStrings.VideoNowXP; - - case Flag.NONE: - default: - return ""; - } - } - - #endregion - - #region Convert From String - - /// - /// Get the Command enum value for a given string - /// - /// String value to convert - /// Command represented by the string(s), if possible - public static Command StringToCommand(string command) - { - switch (command) - { - case CommandStrings.Audio: - return Command.Audio; - case CommandStrings.BluRay: - return Command.BluRay; - case CommandStrings.Close: - return Command.Close; - case CommandStrings.CompactDisc: - return Command.CompactDisc; - case CommandStrings.Data: - return Command.Data; - case CommandStrings.DigitalVideoDisc: - return Command.DigitalVideoDisc; - case CommandStrings.Disk: - return Command.Disk; - case CommandStrings.DriveSpeed: - return Command.DriveSpeed; - case CommandStrings.Eject: - return Command.Eject; - case CommandStrings.Floppy: - return Command.Floppy; - case CommandStrings.GDROM: - return Command.GDROM; - case CommandStrings.MDS: - return Command.MDS; - case CommandStrings.Merge: - return Command.Merge; - case CommandStrings.Reset: - return Command.Reset; - case CommandStrings.SACD: - return Command.SACD; - case CommandStrings.Start: - return Command.Start; - case CommandStrings.Stop: - return Command.Stop; - case CommandStrings.Sub: - return Command.Sub; - case CommandStrings.Swap: - return Command.Swap; - case CommandStrings.Tape: - return Command.Tape; - case CommandStrings.XBOX: - return Command.XBOX; - case CommandStrings.XBOXSwap: - return Command.XBOXSwap; - case CommandStrings.XGD2Swap: - return Command.XGD2Swap; - case CommandStrings.XGD3Swap: - return Command.XGD3Swap; - - default: - return Command.NONE; - } - } - - #endregion } } \ No newline at end of file diff --git a/MPF.Library/DiscImageCreator/Enumerations.cs b/MPF.Library/DiscImageCreator/Enumerations.cs deleted file mode 100644 index a79ebc57..00000000 --- a/MPF.Library/DiscImageCreator/Enumerations.cs +++ /dev/null @@ -1,75 +0,0 @@ -namespace MPF.DiscImageCreator -{ - /// - /// Supported DiscImageCreator commands - /// - public enum Command : int - { - NONE = 0, - Audio, - BluRay, - Close, - CompactDisc, - Data, - DigitalVideoDisc, - Disk, - DriveSpeed, - Eject, - Floppy, - GDROM, - MDS, - Merge, - Reset, - SACD, - Start, - Stop, - Sub, - Swap, - Tape, - XBOX, - XBOXSwap, - XGD2Swap, - XGD3Swap, - } - - /// - /// Supported DiscImageCreator flags - /// - public enum Flag : int - { - NONE = 0, - AddOffset, - AMSF, - AtariJaguar, - BEOpcode, - C2Opcode, - CopyrightManagementInformation, - D8Opcode, - DisableBeep, - ExtractMicroSoftCabFile, - Fix, - ForceUnitAccess, - MultiSectorRead, - MultiSession, - NoFixSubP, - NoFixSubQ, - NoFixSubQLibCrypt, - NoFixSubRtoW, - NoFixSubQSecuROM, - NoSkipSS, - PadSector, - Raw, - Resume, - Reverse, - ScanAntiMod, - ScanFileProtect, - ScanSectorProtect, - SeventyFour, - SkipSector, - SubchannelReadLevel, - UseAnchorVolumeDescriptorPointer, - VideoNow, - VideoNowColor, - VideoNowXP, - } -} \ No newline at end of file diff --git a/MPF.Library/DiscImageCreator/Parameters.cs b/MPF.Library/DiscImageCreator/Parameters.cs index 7175ef0a..3e98faf6 100644 --- a/MPF.Library/DiscImageCreator/Parameters.cs +++ b/MPF.Library/DiscImageCreator/Parameters.cs @@ -35,36 +35,11 @@ namespace MPF.DiscImageCreator #region Metadata - /// - /// Base command to run - /// - public Command BaseCommand { get; set; } - /// public override InternalProgram InternalProgram => InternalProgram.DiscImageCreator; #endregion - /// - /// Set of flags to pass to the executable - /// - protected Dictionary _flags = new Dictionary(); - public bool? this[Flag key] - { - get - { - if (_flags.ContainsKey(key)) - return _flags[key]; - - return null; - } - set - { - _flags[key] = value; - } - } - protected internal IEnumerable Keys => _flags.Keys; - #region Common Input Values /// @@ -765,32 +740,35 @@ namespace MPF.DiscImageCreator { List parameters = new List(); - if (BaseCommand != Command.NONE) - parameters.Add(Converters.LongName(BaseCommand)); + if (BaseCommand == null) + BaseCommand = CommandStrings.NONE; + + if (!string.IsNullOrWhiteSpace(BaseCommand)) + parameters.Add(BaseCommand); else return null; // Drive Letter - if (BaseCommand == Command.Audio - || BaseCommand == Command.BluRay - || BaseCommand == Command.Close - || BaseCommand == Command.CompactDisc - || BaseCommand == Command.Data - || BaseCommand == Command.DigitalVideoDisc - || BaseCommand == Command.Disk - || BaseCommand == Command.DriveSpeed - || BaseCommand == Command.Eject - || BaseCommand == Command.Floppy - || BaseCommand == Command.GDROM - || BaseCommand == Command.Reset - || BaseCommand == Command.SACD - || BaseCommand == Command.Start - || BaseCommand == Command.Stop - || BaseCommand == Command.Swap - || BaseCommand == Command.XBOX - || BaseCommand == Command.XBOXSwap - || BaseCommand == Command.XGD2Swap - || BaseCommand == Command.XGD3Swap) + if (BaseCommand == CommandStrings.Audio + || BaseCommand == CommandStrings.BluRay + || BaseCommand == CommandStrings.Close + || BaseCommand == CommandStrings.CompactDisc + || BaseCommand == CommandStrings.Data + || BaseCommand == CommandStrings.DigitalVideoDisc + || BaseCommand == CommandStrings.Disk + || BaseCommand == CommandStrings.DriveSpeed + || BaseCommand == CommandStrings.Eject + || BaseCommand == CommandStrings.Floppy + || BaseCommand == CommandStrings.GDROM + || BaseCommand == CommandStrings.Reset + || BaseCommand == CommandStrings.SACD + || BaseCommand == CommandStrings.Start + || BaseCommand == CommandStrings.Stop + || BaseCommand == CommandStrings.Swap + || BaseCommand == CommandStrings.XBOX + || BaseCommand == CommandStrings.XBOXSwap + || BaseCommand == CommandStrings.XGD2Swap + || BaseCommand == CommandStrings.XGD3Swap) { if (DriveLetter != null) parameters.Add(DriveLetter); @@ -799,24 +777,24 @@ namespace MPF.DiscImageCreator } // Filename - if (BaseCommand == Command.Audio - || BaseCommand == Command.BluRay - || BaseCommand == Command.CompactDisc - || BaseCommand == Command.Data - || BaseCommand == Command.DigitalVideoDisc - || BaseCommand == Command.Disk - || BaseCommand == Command.Floppy - || BaseCommand == Command.GDROM - || BaseCommand == Command.MDS - || BaseCommand == Command.Merge - || BaseCommand == Command.SACD - || BaseCommand == Command.Swap - || BaseCommand == Command.Sub - || BaseCommand == Command.Tape - || BaseCommand == Command.XBOX - || BaseCommand == Command.XBOXSwap - || BaseCommand == Command.XGD2Swap - || BaseCommand == Command.XGD3Swap) + if (BaseCommand == CommandStrings.Audio + || BaseCommand == CommandStrings.BluRay + || BaseCommand == CommandStrings.CompactDisc + || BaseCommand == CommandStrings.Data + || BaseCommand == CommandStrings.DigitalVideoDisc + || BaseCommand == CommandStrings.Disk + || BaseCommand == CommandStrings.Floppy + || BaseCommand == CommandStrings.GDROM + || BaseCommand == CommandStrings.MDS + || BaseCommand == CommandStrings.Merge + || BaseCommand == CommandStrings.SACD + || BaseCommand == CommandStrings.Swap + || BaseCommand == CommandStrings.Sub + || BaseCommand == CommandStrings.Tape + || BaseCommand == CommandStrings.XBOX + || BaseCommand == CommandStrings.XBOXSwap + || BaseCommand == CommandStrings.XGD2Swap + || BaseCommand == CommandStrings.XGD3Swap) { if (Filename != null) parameters.Add("\"" + Filename.Trim('"') + "\""); @@ -825,7 +803,7 @@ namespace MPF.DiscImageCreator } // Optiarc Filename - if (BaseCommand == Command.Merge) + if (BaseCommand == CommandStrings.Merge) { if (OptiarcFilename != null) parameters.Add("\"" + OptiarcFilename.Trim('"') + "\""); @@ -834,18 +812,18 @@ namespace MPF.DiscImageCreator } // Drive Speed - if (BaseCommand == Command.Audio - || BaseCommand == Command.BluRay - || BaseCommand == Command.CompactDisc - || BaseCommand == Command.Data - || BaseCommand == Command.DigitalVideoDisc - || BaseCommand == Command.GDROM - || BaseCommand == Command.SACD - || BaseCommand == Command.Swap - || BaseCommand == Command.XBOX - || BaseCommand == Command.XBOXSwap - || BaseCommand == Command.XGD2Swap - || BaseCommand == Command.XGD3Swap) + if (BaseCommand == CommandStrings.Audio + || BaseCommand == CommandStrings.BluRay + || BaseCommand == CommandStrings.CompactDisc + || BaseCommand == CommandStrings.Data + || BaseCommand == CommandStrings.DigitalVideoDisc + || BaseCommand == CommandStrings.GDROM + || BaseCommand == CommandStrings.SACD + || BaseCommand == CommandStrings.Swap + || BaseCommand == CommandStrings.XBOX + || BaseCommand == CommandStrings.XBOXSwap + || BaseCommand == CommandStrings.XGD2Swap + || BaseCommand == CommandStrings.XGD3Swap) { if (DriveSpeed != null) parameters.Add(DriveSpeed.ToString()); @@ -854,8 +832,8 @@ namespace MPF.DiscImageCreator } // LBA Markers - if (BaseCommand == Command.Audio - || BaseCommand == Command.Data) + if (BaseCommand == CommandStrings.Audio + || BaseCommand == CommandStrings.Data) { if (StartLBAValue != null && StartLBAValue > 0 && EndLBAValue != null && EndLBAValue > 0) @@ -868,36 +846,36 @@ namespace MPF.DiscImageCreator } // Add Offset - if (GetSupportedCommands(Flag.AddOffset).Contains(BaseCommand)) + if (IsFlagSupported(FlagStrings.AddOffset)) { - if (this[Flag.AddOffset] == true) + if (this[FlagStrings.AddOffset] == true) { - parameters.Add(Converters.LongName(Flag.AddOffset)); + parameters.Add(FlagStrings.AddOffset); if (AddOffsetValue != null) parameters.Add(AddOffsetValue.ToString()); } } // AMSF Dumping - if (GetSupportedCommands(Flag.AMSF).Contains(BaseCommand)) + if (IsFlagSupported(FlagStrings.AMSF)) { - if (this[Flag.AMSF] == true) - parameters.Add(Converters.LongName(Flag.AMSF)); + if (this[FlagStrings.AMSF] == true) + parameters.Add(FlagStrings.AMSF); } // Atari Jaguar CD - if (GetSupportedCommands(Flag.AtariJaguar).Contains(BaseCommand)) + if (IsFlagSupported(FlagStrings.AtariJaguar)) { - if (this[Flag.AtariJaguar] == true) - parameters.Add(Converters.LongName(Flag.AtariJaguar)); + if (this[FlagStrings.AtariJaguar] == true) + parameters.Add(FlagStrings.AtariJaguar); } // BE Opcode - if (GetSupportedCommands(Flag.BEOpcode).Contains(BaseCommand)) + if (IsFlagSupported(FlagStrings.BEOpcode)) { - if (this[Flag.BEOpcode] == true && this[Flag.D8Opcode] != true) + if (this[FlagStrings.BEOpcode] == true && this[FlagStrings.D8Opcode] != true) { - parameters.Add(Converters.LongName(Flag.BEOpcode)); + parameters.Add(FlagStrings.BEOpcode); if (BEOpcodeValue != null && (BEOpcodeValue == "raw" || BEOpcodeValue == "pack")) parameters.Add(BEOpcodeValue); @@ -905,11 +883,11 @@ namespace MPF.DiscImageCreator } // C2 Opcode - if (GetSupportedCommands(Flag.C2Opcode).Contains(BaseCommand)) + if (IsFlagSupported(FlagStrings.C2Opcode)) { - if (this[Flag.C2Opcode] == true) + if (this[FlagStrings.C2Opcode] == true) { - parameters.Add(Converters.LongName(Flag.C2Opcode)); + parameters.Add(FlagStrings.C2Opcode); if (C2OpcodeValue[0] != null) { if (C2OpcodeValue[0] > 0) @@ -948,39 +926,39 @@ namespace MPF.DiscImageCreator } // Copyright Management Information - if (GetSupportedCommands(Flag.CopyrightManagementInformation).Contains(BaseCommand)) + if (IsFlagSupported(FlagStrings.CopyrightManagementInformation)) { - if (this[Flag.CopyrightManagementInformation] == true) - parameters.Add(Converters.LongName(Flag.CopyrightManagementInformation)); + if (this[FlagStrings.CopyrightManagementInformation] == true) + parameters.Add(FlagStrings.CopyrightManagementInformation); } // D8 Opcode - if (GetSupportedCommands(Flag.D8Opcode).Contains(BaseCommand)) + if (IsFlagSupported(FlagStrings.D8Opcode)) { - if (this[Flag.D8Opcode] == true) - parameters.Add(Converters.LongName(Flag.D8Opcode)); + if (this[FlagStrings.D8Opcode] == true) + parameters.Add(FlagStrings.D8Opcode); } // Disable Beep - if (GetSupportedCommands(Flag.DisableBeep).Contains(BaseCommand)) + if (IsFlagSupported(FlagStrings.DisableBeep)) { - if (this[Flag.DisableBeep] == true) - parameters.Add(Converters.LongName(Flag.DisableBeep)); + if (this[FlagStrings.DisableBeep] == true) + parameters.Add(FlagStrings.DisableBeep); } // Extract MicroSoftCabFile - if (GetSupportedCommands(Flag.ExtractMicroSoftCabFile).Contains(BaseCommand)) + if (IsFlagSupported(FlagStrings.ExtractMicroSoftCabFile)) { - if (this[Flag.ExtractMicroSoftCabFile] == true) - parameters.Add(Converters.LongName(Flag.ExtractMicroSoftCabFile)); + if (this[FlagStrings.ExtractMicroSoftCabFile] == true) + parameters.Add(FlagStrings.ExtractMicroSoftCabFile); } // Fix - if (GetSupportedCommands(Flag.Fix).Contains(BaseCommand)) + if (IsFlagSupported(FlagStrings.Fix)) { - if (this[Flag.Fix] == true) + if (this[FlagStrings.Fix] == true) { - parameters.Add(Converters.LongName(Flag.Fix)); + parameters.Add(FlagStrings.Fix); if (FixValue != null) parameters.Add(FixValue.ToString()); else @@ -989,109 +967,109 @@ namespace MPF.DiscImageCreator } // Force Unit Access - if (GetSupportedCommands(Flag.ForceUnitAccess).Contains(BaseCommand)) + if (IsFlagSupported(FlagStrings.ForceUnitAccess)) { - if (this[Flag.ForceUnitAccess] == true) + if (this[FlagStrings.ForceUnitAccess] == true) { - parameters.Add(Converters.LongName(Flag.ForceUnitAccess)); + parameters.Add(FlagStrings.ForceUnitAccess); if (ForceUnitAccessValue != null) parameters.Add(ForceUnitAccessValue.ToString()); } } // Multi-Sector Read - if (GetSupportedCommands(Flag.MultiSectorRead).Contains(BaseCommand)) + if (IsFlagSupported(FlagStrings.MultiSectorRead)) { - if (this[Flag.MultiSectorRead] == true) - parameters.Add(Converters.LongName(Flag.MultiSectorRead)); + if (this[FlagStrings.MultiSectorRead] == true) + parameters.Add(FlagStrings.MultiSectorRead); } // Multi-Session - if (GetSupportedCommands(Flag.MultiSession).Contains(BaseCommand)) + if (IsFlagSupported(FlagStrings.MultiSession)) { - if (this[Flag.MultiSession] == true) - parameters.Add(Converters.LongName(Flag.MultiSession)); + if (this[FlagStrings.MultiSession] == true) + parameters.Add(FlagStrings.MultiSession); } // Not fix SubP - if (GetSupportedCommands(Flag.NoFixSubP).Contains(BaseCommand)) + if (IsFlagSupported(FlagStrings.NoFixSubP)) { - if (this[Flag.NoFixSubP] == true) - parameters.Add(Converters.LongName(Flag.NoFixSubP)); + if (this[FlagStrings.NoFixSubP] == true) + parameters.Add(FlagStrings.NoFixSubP); } // Not fix SubQ - if (GetSupportedCommands(Flag.NoFixSubQ).Contains(BaseCommand)) + if (IsFlagSupported(FlagStrings.NoFixSubQ)) { - if (this[Flag.NoFixSubQ] == true) - parameters.Add(Converters.LongName(Flag.NoFixSubQ)); + if (this[FlagStrings.NoFixSubQ] == true) + parameters.Add(FlagStrings.NoFixSubQ); } // Not fix SubQ (PlayStation LibCrypt) - if (GetSupportedCommands(Flag.NoFixSubQLibCrypt).Contains(BaseCommand)) + if (IsFlagSupported(FlagStrings.NoFixSubQLibCrypt)) { - if (this[Flag.NoFixSubQLibCrypt] == true) - parameters.Add(Converters.LongName(Flag.NoFixSubQLibCrypt)); + if (this[FlagStrings.NoFixSubQLibCrypt] == true) + parameters.Add(FlagStrings.NoFixSubQLibCrypt); } // Not fix SubQ (SecuROM) - if (GetSupportedCommands(Flag.NoFixSubQSecuROM).Contains(BaseCommand)) + if (IsFlagSupported(FlagStrings.NoFixSubQSecuROM)) { - if (this[Flag.NoFixSubQSecuROM] == true) - parameters.Add(Converters.LongName(Flag.NoFixSubQSecuROM)); + if (this[FlagStrings.NoFixSubQSecuROM] == true) + parameters.Add(FlagStrings.NoFixSubQSecuROM); } // Not fix SubRtoW - if (GetSupportedCommands(Flag.NoFixSubRtoW).Contains(BaseCommand)) + if (IsFlagSupported(FlagStrings.NoFixSubRtoW)) { - if (this[Flag.NoFixSubRtoW] == true) - parameters.Add(Converters.LongName(Flag.NoFixSubRtoW)); + if (this[FlagStrings.NoFixSubRtoW] == true) + parameters.Add(FlagStrings.NoFixSubRtoW); } // Not skip security sectors - if (GetSupportedCommands(Flag.NoSkipSS).Contains(BaseCommand)) + if (IsFlagSupported(FlagStrings.NoSkipSS)) { - if (this[Flag.NoSkipSS] == true) + if (this[FlagStrings.NoSkipSS] == true) { - parameters.Add(Converters.LongName(Flag.NoSkipSS)); + parameters.Add(FlagStrings.NoSkipSS); if (NoSkipSecuritySectorValue != null) parameters.Add(NoSkipSecuritySectorValue.ToString()); } } // Pad sectors - if (GetSupportedCommands(Flag.PadSector).Contains(BaseCommand)) + if (IsFlagSupported(FlagStrings.PadSector)) { - if (this[Flag.PadSector] == true) + if (this[FlagStrings.PadSector] == true) { - parameters.Add(Converters.LongName(Flag.PadSector)); + parameters.Add(FlagStrings.PadSector); if (PadSectorValue != null) parameters.Add(PadSectorValue.ToString()); } } // Raw read (2064 byte/sector) - if (GetSupportedCommands(Flag.Raw).Contains(BaseCommand)) + if (IsFlagSupported(FlagStrings.Raw)) { - if (this[Flag.Raw] == true) - parameters.Add(Converters.LongName(Flag.Raw)); + if (this[FlagStrings.Raw] == true) + parameters.Add(FlagStrings.Raw); } // Resume - if (GetSupportedCommands(Flag.Resume).Contains(BaseCommand)) + if (IsFlagSupported(FlagStrings.Resume)) { - if (this[Flag.Resume] == true) - parameters.Add(Converters.LongName(Flag.Resume)); + if (this[FlagStrings.Resume] == true) + parameters.Add(FlagStrings.Resume); } // Reverse read - if (GetSupportedCommands(Flag.Reverse).Contains(BaseCommand)) + if (IsFlagSupported(FlagStrings.Reverse)) { - if (this[Flag.Reverse] == true) + if (this[FlagStrings.Reverse] == true) { - parameters.Add(Converters.LongName(Flag.Reverse)); + parameters.Add(FlagStrings.Reverse); - if (BaseCommand == Command.DigitalVideoDisc) + if (BaseCommand == CommandStrings.DigitalVideoDisc) { if (ReverseStartLBAValue == null || ReverseEndLBAValue == null) return null; @@ -1103,18 +1081,18 @@ namespace MPF.DiscImageCreator } // Scan PlayStation anti-mod strings - if (GetSupportedCommands(Flag.ScanAntiMod).Contains(BaseCommand)) + if (IsFlagSupported(FlagStrings.ScanAntiMod)) { - if (this[Flag.ScanAntiMod] == true) - parameters.Add(Converters.LongName(Flag.ScanAntiMod)); + if (this[FlagStrings.ScanAntiMod] == true) + parameters.Add(FlagStrings.ScanAntiMod); } // Scan file to detect protect - if (GetSupportedCommands(Flag.ScanFileProtect).Contains(BaseCommand)) + if (IsFlagSupported(FlagStrings.ScanFileProtect)) { - if (this[Flag.ScanFileProtect] == true) + if (this[FlagStrings.ScanFileProtect] == true) { - parameters.Add(Converters.LongName(Flag.ScanFileProtect)); + parameters.Add(FlagStrings.ScanFileProtect); if (ScanFileProtectValue != null) { if (ScanFileProtectValue > 0) @@ -1126,25 +1104,25 @@ namespace MPF.DiscImageCreator } // Scan file to detect protect - if (GetSupportedCommands(Flag.ScanSectorProtect).Contains(BaseCommand)) + if (IsFlagSupported(FlagStrings.ScanSectorProtect)) { - if (this[Flag.ScanSectorProtect] == true) - parameters.Add(Converters.LongName(Flag.ScanSectorProtect)); + if (this[FlagStrings.ScanSectorProtect] == true) + parameters.Add(FlagStrings.ScanSectorProtect); } // Scan 74:00:00 (Saturn) - if (GetSupportedCommands(Flag.SeventyFour).Contains(BaseCommand)) + if (IsFlagSupported(FlagStrings.SeventyFour)) { - if (this[Flag.SeventyFour] == true) - parameters.Add(Converters.LongName(Flag.SeventyFour)); + if (this[FlagStrings.SeventyFour] == true) + parameters.Add(FlagStrings.SeventyFour); } // Skip sectors - if (GetSupportedCommands(Flag.SkipSector).Contains(BaseCommand)) + if (IsFlagSupported(FlagStrings.SkipSector)) { - if (this[Flag.SkipSector] == true) + if (this[FlagStrings.SkipSector] == true) { - parameters.Add(Converters.LongName(Flag.SkipSector)); + parameters.Add(FlagStrings.SkipSector); if (SkipSectorValue[0] != null) { if (SkipSectorValue[0] > 0) @@ -1161,11 +1139,11 @@ namespace MPF.DiscImageCreator } // Set Subchannel read level - if (GetSupportedCommands(Flag.SubchannelReadLevel).Contains(BaseCommand)) + if (IsFlagSupported(FlagStrings.SubchannelReadLevel)) { - if (this[Flag.SubchannelReadLevel] == true) + if (this[FlagStrings.SubchannelReadLevel] == true) { - parameters.Add(Converters.LongName(Flag.SubchannelReadLevel)); + parameters.Add(FlagStrings.SubchannelReadLevel); if (SubchannelReadLevelValue != null) { if (SubchannelReadLevelValue >= 0 && SubchannelReadLevelValue <= 2) @@ -1177,18 +1155,18 @@ namespace MPF.DiscImageCreator } // Use Anchor Volume Descriptor Pointer - if (GetSupportedCommands(Flag.UseAnchorVolumeDescriptorPointer).Contains(BaseCommand)) + if (IsFlagSupported(FlagStrings.UseAnchorVolumeDescriptorPointer)) { - if (this[Flag.UseAnchorVolumeDescriptorPointer] == true) - parameters.Add(Converters.LongName(Flag.UseAnchorVolumeDescriptorPointer)); + if (this[FlagStrings.UseAnchorVolumeDescriptorPointer] == true) + parameters.Add(FlagStrings.UseAnchorVolumeDescriptorPointer); } // VideoNow - if (GetSupportedCommands(Flag.VideoNow).Contains(BaseCommand)) + if (IsFlagSupported(FlagStrings.VideoNow)) { - if (this[Flag.VideoNow] == true) + if (this[FlagStrings.VideoNow] == true) { - parameters.Add(Converters.LongName(Flag.VideoNow)); + parameters.Add(FlagStrings.VideoNow); if (VideoNowValue != null) { if (VideoNowValue >= 0) @@ -1200,22 +1178,237 @@ namespace MPF.DiscImageCreator } // VideoNow Color - if (GetSupportedCommands(Flag.VideoNowColor).Contains(BaseCommand)) + if (IsFlagSupported(FlagStrings.VideoNowColor)) { - if (this[Flag.VideoNowColor] == true) - parameters.Add(Converters.LongName(Flag.VideoNowColor)); + if (this[FlagStrings.VideoNowColor] == true) + parameters.Add(FlagStrings.VideoNowColor); } // VideoNowXP - if (GetSupportedCommands(Flag.VideoNowXP).Contains(BaseCommand)) + if (IsFlagSupported(FlagStrings.VideoNowXP)) { - if (this[Flag.VideoNowXP] == true) - parameters.Add(Converters.LongName(Flag.VideoNowXP)); + if (this[FlagStrings.VideoNowXP] == true) + parameters.Add(FlagStrings.VideoNowXP); } return string.Join(" ", parameters); } + /// + public override Dictionary> GetCommandSupport() + { + return new Dictionary>() + { + [CommandStrings.Audio] = new List() + { + FlagStrings.BEOpcode, + FlagStrings.C2Opcode, + FlagStrings.D8Opcode, + FlagStrings.DisableBeep, + FlagStrings.ForceUnitAccess, + FlagStrings.MultiSession, + FlagStrings.NoFixSubP, + FlagStrings.NoFixSubQ, + FlagStrings.NoFixSubRtoW, + FlagStrings.Reverse, + FlagStrings.ScanAntiMod, + FlagStrings.ScanFileProtect, + FlagStrings.ScanSectorProtect, + FlagStrings.SkipSector, + FlagStrings.SubchannelReadLevel, + }, + + [CommandStrings.BluRay] = new List() + { + FlagStrings.DisableBeep, + FlagStrings.ForceUnitAccess, + FlagStrings.NoSkipSS, + FlagStrings.UseAnchorVolumeDescriptorPointer, + }, + + [CommandStrings.Close] = new List() + { + }, + + [CommandStrings.CompactDisc] = new List() + { + FlagStrings.AddOffset, + FlagStrings.AMSF, + FlagStrings.AtariJaguar, + FlagStrings.BEOpcode, + FlagStrings.C2Opcode, + FlagStrings.D8Opcode, + FlagStrings.DisableBeep, + FlagStrings.ExtractMicroSoftCabFile, + FlagStrings.ForceUnitAccess, + FlagStrings.MultiSectorRead, + FlagStrings.MultiSession, + FlagStrings.NoFixSubP, + FlagStrings.NoFixSubQ, + FlagStrings.NoFixSubQLibCrypt, + FlagStrings.NoFixSubQSecuROM, + FlagStrings.NoFixSubRtoW, + FlagStrings.ScanAntiMod, + FlagStrings.ScanFileProtect, + FlagStrings.ScanSectorProtect, + FlagStrings.SeventyFour, + FlagStrings.SubchannelReadLevel, + FlagStrings.VideoNow, + FlagStrings.VideoNowColor, + FlagStrings.VideoNowXP, + }, + + [CommandStrings.Data] = new List() + { + FlagStrings.BEOpcode, + FlagStrings.C2Opcode, + FlagStrings.D8Opcode, + FlagStrings.DisableBeep, + FlagStrings.ForceUnitAccess, + FlagStrings.MultiSession, + FlagStrings.NoFixSubP, + FlagStrings.NoFixSubQ, + FlagStrings.NoFixSubRtoW, + FlagStrings.Reverse, + FlagStrings.ScanAntiMod, + FlagStrings.ScanFileProtect, + FlagStrings.ScanSectorProtect, + FlagStrings.SkipSector, + FlagStrings.SubchannelReadLevel, + }, + + [CommandStrings.DigitalVideoDisc] = new List() + { + FlagStrings.CopyrightManagementInformation, + FlagStrings.DisableBeep, + FlagStrings.Fix, + FlagStrings.ForceUnitAccess, + FlagStrings.PadSector, + FlagStrings.Raw, + FlagStrings.Resume, + FlagStrings.Reverse, + FlagStrings.ScanFileProtect, + FlagStrings.UseAnchorVolumeDescriptorPointer, + }, + + [CommandStrings.Disk] = new List() + { + }, + + [CommandStrings.DriveSpeed] = new List() + { + }, + + [CommandStrings.Eject] = new List() + { + }, + + [CommandStrings.Floppy] = new List() + { + }, + + [CommandStrings.GDROM] = new List() + { + FlagStrings.BEOpcode, + FlagStrings.C2Opcode, + FlagStrings.D8Opcode, + FlagStrings.DisableBeep, + FlagStrings.ForceUnitAccess, + FlagStrings.NoFixSubP, + FlagStrings.NoFixSubQ, + FlagStrings.NoFixSubRtoW, + FlagStrings.SubchannelReadLevel, + }, + + [CommandStrings.MDS] = new List() + { + }, + + [CommandStrings.Merge] = new List() + { + }, + + [CommandStrings.Reset] = new List() + { + }, + + [CommandStrings.SACD] = new List() + { + FlagStrings.DisableBeep, + FlagStrings.ForceUnitAccess, + }, + + [CommandStrings.Start] = new List() + { + }, + + [CommandStrings.Stop] = new List() + { + }, + + [CommandStrings.Sub] = new List() + { + }, + + [CommandStrings.Swap] = new List() + { + FlagStrings.AddOffset, + FlagStrings.BEOpcode, + FlagStrings.C2Opcode, + FlagStrings.D8Opcode, + FlagStrings.DisableBeep, + FlagStrings.ForceUnitAccess, + FlagStrings.MultiSession, + FlagStrings.NoFixSubP, + FlagStrings.NoFixSubQ, + FlagStrings.NoFixSubQLibCrypt, + FlagStrings.NoFixSubQSecuROM, + FlagStrings.NoFixSubRtoW, + FlagStrings.ScanAntiMod, + FlagStrings.ScanFileProtect, + FlagStrings.ScanSectorProtect, + FlagStrings.SeventyFour, + FlagStrings.SubchannelReadLevel, + FlagStrings.VideoNow, + FlagStrings.VideoNowColor, + FlagStrings.VideoNowXP, + }, + + [CommandStrings.Tape] = new List() + { + }, + + [CommandStrings.XBOX] = new List() + { + FlagStrings.DisableBeep, + FlagStrings.ForceUnitAccess, + FlagStrings.NoSkipSS, + FlagStrings.UseAnchorVolumeDescriptorPointer, + }, + + [CommandStrings.XBOXSwap] = new List() + { + FlagStrings.DisableBeep, + FlagStrings.ForceUnitAccess, + FlagStrings.NoSkipSS, + }, + + [CommandStrings.XGD2Swap] = new List() + { + FlagStrings.DisableBeep, + FlagStrings.ForceUnitAccess, + FlagStrings.NoSkipSS, + }, + + [CommandStrings.XGD3Swap] = new List() + { + FlagStrings.DisableBeep, + FlagStrings.ForceUnitAccess, + FlagStrings.NoSkipSS, + }, + }; + } + /// public override string GetDefaultExtension(MediaType? mediaType) => Converters.Extension(mediaType); @@ -1330,21 +1523,21 @@ namespace MPF.DiscImageCreator { switch (BaseCommand) { - case Command.Audio: - case Command.BluRay: - case Command.CompactDisc: - case Command.Data: - case Command.DigitalVideoDisc: - case Command.Disk: - case Command.Floppy: - case Command.GDROM: - case Command.SACD: - case Command.Swap: - case Command.Tape: - case Command.XBOX: - case Command.XBOXSwap: - case Command.XGD2Swap: - case Command.XGD3Swap: + case CommandStrings.Audio: + case CommandStrings.BluRay: + case CommandStrings.CompactDisc: + case CommandStrings.Data: + case CommandStrings.DigitalVideoDisc: + case CommandStrings.Disk: + case CommandStrings.Floppy: + case CommandStrings.GDROM: + case CommandStrings.SACD: + case CommandStrings.Swap: + case CommandStrings.Tape: + case CommandStrings.XBOX: + case CommandStrings.XBOXSwap: + case CommandStrings.XGD2Swap: + case CommandStrings.XGD3Swap: return true; default: @@ -1355,7 +1548,7 @@ namespace MPF.DiscImageCreator /// protected override void ResetValues() { - BaseCommand = Command.NONE; + BaseCommand = CommandStrings.NONE; DriveLetter = null; DriveSpeed = null; @@ -1365,7 +1558,7 @@ namespace MPF.DiscImageCreator StartLBAValue = null; EndLBAValue = null; - _flags = new Dictionary(); + flags = new Dictionary(); AddOffsetValue = null; BEOpcodeValue = null; @@ -1394,7 +1587,7 @@ namespace MPF.DiscImageCreator // Set disable beep flag, if needed if (options.DICQuietMode) - this[Flag.DisableBeep] = true; + this[FlagStrings.DisableBeep] = true; // Set the C2 reread count switch (options.DICRereadCount) @@ -1414,45 +1607,45 @@ namespace MPF.DiscImageCreator switch (this.Type) { case MediaType.CDROM: - this[Flag.C2Opcode] = true; + this[FlagStrings.C2Opcode] = true; switch (this.System) { case KnownSystem.AppleMacintosh: case KnownSystem.IBMPCCompatible: - this[Flag.NoFixSubQSecuROM] = true; - this[Flag.ScanFileProtect] = true; - this[Flag.ScanSectorProtect] = options.DICParanoidMode; - this[Flag.SubchannelReadLevel] = options.DICParanoidMode; - if (this[Flag.SubchannelReadLevel] == true) + this[FlagStrings.NoFixSubQSecuROM] = true; + this[FlagStrings.ScanFileProtect] = true; + this[FlagStrings.ScanSectorProtect] = options.DICParanoidMode; + this[FlagStrings.SubchannelReadLevel] = options.DICParanoidMode; + if (this[FlagStrings.SubchannelReadLevel] == true) SubchannelReadLevelValue = 2; break; case KnownSystem.AtariJaguarCD: - this[Flag.AtariJaguar] = true; + this[FlagStrings.AtariJaguar] = true; break; case KnownSystem.HasbroVideoNow: case KnownSystem.HasbroVideoNowColor: case KnownSystem.HasbroVideoNowJr: case KnownSystem.HasbroVideoNowXP: - this[Flag.AddOffset] = true; + this[FlagStrings.AddOffset] = true; this.AddOffsetValue = 18032; break; case KnownSystem.SonyPlayStation: - this[Flag.ScanAntiMod] = true; - this[Flag.NoFixSubQLibCrypt] = true; + this[FlagStrings.ScanAntiMod] = true; + this[FlagStrings.NoFixSubQLibCrypt] = true; break; } break; case MediaType.DVD: - this[Flag.CopyrightManagementInformation] = options.DICUseCMIFlag; - this[Flag.ScanFileProtect] = options.DICParanoidMode; + this[FlagStrings.CopyrightManagementInformation] = options.DICUseCMIFlag; + this[FlagStrings.ScanFileProtect] = options.DICParanoidMode; break; case MediaType.GDROM: - this[Flag.C2Opcode] = true; + this[FlagStrings.C2Opcode] = true; break; case MediaType.HDDVD: - this[Flag.CopyrightManagementInformation] = options.DICUseCMIFlag; + this[FlagStrings.CopyrightManagementInformation] = options.DICUseCMIFlag; break; case MediaType.BluRay: // Currently no defaults set @@ -1460,10 +1653,10 @@ namespace MPF.DiscImageCreator // Special Formats case MediaType.NintendoGameCubeGameDisc: - this[Flag.Raw] = true; + this[FlagStrings.Raw] = true; break; case MediaType.NintendoWiiOpticalDisc: - this[Flag.Raw] = true; + this[FlagStrings.Raw] = true; break; // Non-optical @@ -1476,6 +1669,8 @@ namespace MPF.DiscImageCreator /// protected override bool ValidateAndSetParameters(string parameters) { + BaseCommand = CommandStrings.NONE; + // The string has to be valid by itself first if (string.IsNullOrWhiteSpace(parameters)) return false; @@ -1489,36 +1684,37 @@ namespace MPF.DiscImageCreator .ToList(); // Determine what the commandline should look like given the first item - BaseCommand = Converters.StringToCommand(parts[0]); - if (BaseCommand == Command.NONE) - return false; + BaseCommand = parts[0]; // Loop through ordered command-specific flags int index = -1; switch (BaseCommand) { - case Command.Audio: - if (!DoesExist(parts, 1) || !IsValidDriveLetter(parts[1])) + case CommandStrings.Audio: + if (parts.Count < 6) + return false; + + if (!IsValidDriveLetter(parts[1])) return false; else DriveLetter = parts[1]; - if (!DoesExist(parts, 2) || IsFlag(parts[2])) + if (IsFlag(parts[2])) return false; else Filename = parts[2]; - if (!DoesExist(parts, 3) || !IsValidInt32(parts[3], lowerBound: 0, upperBound: 72)) + if (!IsValidInt32(parts[3], lowerBound: 0, upperBound: 72)) return false; else DriveSpeed = Int32.Parse(parts[3]); - if (!DoesExist(parts, 4) || !IsValidInt32(parts[4], lowerBound: 0)) + if (!IsValidInt32(parts[4], lowerBound: 0)) return false; else StartLBAValue = Int32.Parse(parts[4]); - if (!DoesExist(parts, 5) || !IsValidInt32(parts[5], lowerBound: 0)) + if (!IsValidInt32(parts[5], lowerBound: 0)) return false; else EndLBAValue = Int32.Parse(parts[5]); @@ -1526,18 +1722,21 @@ namespace MPF.DiscImageCreator index = 6; break; - case Command.BluRay: - if (!DoesExist(parts, 1) || !IsValidDriveLetter(parts[1])) + case CommandStrings.BluRay: + if (parts.Count < 4) + return false; + + if (!IsValidDriveLetter(parts[1])) return false; else DriveLetter = parts[1]; - if (!DoesExist(parts, 2) || IsFlag(parts[2])) + if (IsFlag(parts[2])) return false; else Filename = parts[2]; - if (!DoesExist(parts, 3) || !IsValidInt32(parts[3], lowerBound: 0, upperBound: 72)) + if (!IsValidInt32(parts[3], lowerBound: 0, upperBound: 72)) return false; else DriveSpeed = Int32.Parse(parts[3]); @@ -1545,29 +1744,32 @@ namespace MPF.DiscImageCreator index = 4; break; - case Command.Close: - if (!DoesExist(parts, 1) || !IsValidDriveLetter(parts[1])) + case CommandStrings.Close: + if (parts.Count != 2) + return false; + + if (!IsValidDriveLetter(parts[1])) return false; else DriveLetter = parts[1]; - if (parts.Count > 2) - return false; - break; - case Command.CompactDisc: - if (!DoesExist(parts, 1) || !IsValidDriveLetter(parts[1])) + case CommandStrings.CompactDisc: + if (parts.Count < 4) + return false; + + if (!IsValidDriveLetter(parts[1])) return false; else DriveLetter = parts[1]; - if (!DoesExist(parts, 2) || IsFlag(parts[2])) + if (IsFlag(parts[2])) return false; else Filename = parts[2]; - if (!DoesExist(parts, 3) || !IsValidInt32(parts[3], lowerBound: 0, upperBound: 72)) + if (!IsValidInt32(parts[3], lowerBound: 0, upperBound: 72)) return false; else DriveSpeed = Int32.Parse(parts[3]); @@ -1575,28 +1777,31 @@ namespace MPF.DiscImageCreator index = 4; break; - case Command.Data: - if (!DoesExist(parts, 1) || !IsValidDriveLetter(parts[1])) + case CommandStrings.Data: + if (parts.Count < 6) + return false; + + if (!IsValidDriveLetter(parts[1])) return false; else DriveLetter = parts[1]; - if (!DoesExist(parts, 2) || IsFlag(parts[2])) + if (IsFlag(parts[2])) return false; else Filename = parts[2]; - if (!DoesExist(parts, 3) || !IsValidInt32(parts[3], lowerBound: 0, upperBound: 72)) + if (!IsValidInt32(parts[3], lowerBound: 0, upperBound: 72)) return false; else DriveSpeed = Int32.Parse(parts[3]); - if (!DoesExist(parts, 4) || !IsValidInt32(parts[4], lowerBound: 0)) + if (!IsValidInt32(parts[4], lowerBound: 0)) return false; else StartLBAValue = Int32.Parse(parts[4]); - if (!DoesExist(parts, 5) || !IsValidInt32(parts[5], lowerBound: 0)) + if (!IsValidInt32(parts[5], lowerBound: 0)) return false; else EndLBAValue = Int32.Parse(parts[5]); @@ -1604,18 +1809,21 @@ namespace MPF.DiscImageCreator index = 6; break; - case Command.DigitalVideoDisc: - if (!DoesExist(parts, 1) || !IsValidDriveLetter(parts[1])) + case CommandStrings.DigitalVideoDisc: + if (parts.Count < 4) + return false; + + if (!IsValidDriveLetter(parts[1])) return false; else DriveLetter = parts[1]; - if (!DoesExist(parts, 2) || IsFlag(parts[2])) + if (IsFlag(parts[2])) return false; else Filename = parts[2]; - if (!DoesExist(parts, 3) || !IsValidInt32(parts[3], lowerBound: 0, upperBound: 24)) // Officially 0-16 + if (!IsValidInt32(parts[3], lowerBound: 0, upperBound: 24)) // Officially 0-16 return false; else DriveSpeed = Int32.Parse(parts[3]); @@ -1623,72 +1831,75 @@ namespace MPF.DiscImageCreator index = 4; break; - case Command.Disk: - if (!DoesExist(parts, 1) || !IsValidDriveLetter(parts[1])) + case CommandStrings.Disk: + if (parts.Count != 3) + return false; + + if (!IsValidDriveLetter(parts[1])) return false; else DriveLetter = parts[1]; - if (!DoesExist(parts, 2) || IsFlag(parts[2])) + if (IsFlag(parts[2])) return false; else Filename = parts[2]; - if (parts.Count > 3) - return false; - break; - case Command.DriveSpeed: - if (!DoesExist(parts, 1) || !IsValidDriveLetter(parts[1])) + case CommandStrings.DriveSpeed: + if (parts.Count != 2) + return false; + + if (!IsValidDriveLetter(parts[1])) return false; else DriveLetter = parts[1]; - if (parts.Count > 2) - return false; - break; - case Command.Eject: - if (!DoesExist(parts, 1) || !IsValidDriveLetter(parts[1])) + case CommandStrings.Eject: + if (parts.Count != 2) + return false; + + if (!IsValidDriveLetter(parts[1])) return false; else DriveLetter = parts[1]; - if (parts.Count > 2) - return false; - break; - case Command.Floppy: - if (!DoesExist(parts, 1) || !IsValidDriveLetter(parts[1])) + case CommandStrings.Floppy: + if (parts.Count != 3) + return false; + + if (!IsValidDriveLetter(parts[1])) return false; else DriveLetter = parts[1]; - if (!DoesExist(parts, 2) || IsFlag(parts[2])) + if (IsFlag(parts[2])) return false; else Filename = parts[2]; - if (parts.Count > 3) - return false; - break; - case Command.GDROM: - if (!DoesExist(parts, 1) || !IsValidDriveLetter(parts[1])) + case CommandStrings.GDROM: + if (parts.Count < 4) + return false; + + if (!IsValidDriveLetter(parts[1])) return false; else DriveLetter = parts[1]; - if (!DoesExist(parts, 2) || IsFlag(parts[2])) + if (IsFlag(parts[2])) return false; else Filename = parts[2]; - if (!DoesExist(parts, 3) || !IsValidInt32(parts[3], lowerBound: 0, upperBound: 72)) + if (!IsValidInt32(parts[3], lowerBound: 0, upperBound: 72)) return false; else DriveSpeed = Int32.Parse(parts[3]); @@ -1696,56 +1907,59 @@ namespace MPF.DiscImageCreator index = 4; break; - case Command.MDS: - if (!DoesExist(parts, 1) || IsFlag(parts[1]) || !File.Exists(parts[1])) + case CommandStrings.MDS: + if (parts.Count != 2) + return false; + + if (IsFlag(parts[1]) || !File.Exists(parts[1])) return false; else Filename = parts[1]; - if (parts.Count > 2) - return false; - break; - case Command.Merge: - if (!DoesExist(parts, 1) || IsFlag(parts[1]) || !File.Exists(parts[1])) + case CommandStrings.Merge: + if (parts.Count != 3) + return false; + + if (IsFlag(parts[1]) || !File.Exists(parts[1])) return false; else Filename = parts[1]; - if (!DoesExist(parts, 2) || IsFlag(parts[2]) || !File.Exists(parts[2])) + if (IsFlag(parts[2]) || !File.Exists(parts[2])) return false; else OptiarcFilename = parts[2]; - if (parts.Count > 3) - return false; - break; - case Command.Reset: - if (!DoesExist(parts, 1) || !IsValidDriveLetter(parts[1])) + case CommandStrings.Reset: + if (parts.Count != 2) + return false; + + if (!IsValidDriveLetter(parts[1])) return false; else DriveLetter = parts[1]; - if (parts.Count > 2) - return false; - break; - case Command.SACD: - if (!DoesExist(parts, 1) || !IsValidDriveLetter(parts[1])) + case CommandStrings.SACD: + if (parts.Count < 4) + return false; + + if (!IsValidDriveLetter(parts[1])) return false; else DriveLetter = parts[1]; - if (!DoesExist(parts, 2) || IsFlag(parts[2])) + if (IsFlag(parts[2])) return false; else Filename = parts[2]; - if (!DoesExist(parts, 3) || !IsValidInt32(parts[3], lowerBound: 0, upperBound: 16)) + if (!IsValidInt32(parts[3], lowerBound: 0, upperBound: 16)) return false; else DriveSpeed = Int32.Parse(parts[3]); @@ -1753,51 +1967,54 @@ namespace MPF.DiscImageCreator index = 4; break; - case Command.Start: - if (!DoesExist(parts, 1) || !IsValidDriveLetter(parts[1])) + case CommandStrings.Start: + if (parts.Count != 2) + return false; + + if (!IsValidDriveLetter(parts[1])) return false; else DriveLetter = parts[1]; - if (parts.Count > 2) - return false; - break; - case Command.Stop: - if (!DoesExist(parts, 1) || !IsValidDriveLetter(parts[1])) + case CommandStrings.Stop: + if (parts.Count != 2) + return false; + + if (!IsValidDriveLetter(parts[1])) return false; else DriveLetter = parts[1]; - if (parts.Count > 2) - return false; - break; - case Command.Sub: - if (!DoesExist(parts, 1) || IsFlag(parts[1]) || !File.Exists(parts[1])) + case CommandStrings.Sub: + if (parts.Count != 2) + return false; + + if (IsFlag(parts[1]) || !File.Exists(parts[1])) return false; else Filename = parts[1]; - if (parts.Count > 2) - return false; - break; - case Command.Swap: - if (!DoesExist(parts, 1) || !IsValidDriveLetter(parts[1])) + case CommandStrings.Swap: + if (parts.Count < 4) + return false; + + if (!IsValidDriveLetter(parts[1])) return false; else DriveLetter = parts[1]; - if (!DoesExist(parts, 2) || IsFlag(parts[2])) + if (IsFlag(parts[2])) return false; else Filename = parts[2]; - if (!DoesExist(parts, 3) || !IsValidInt32(parts[3], lowerBound: 0, upperBound: 72)) + if (!IsValidInt32(parts[3], lowerBound: 0, upperBound: 72)) return false; else DriveSpeed = Int32.Parse(parts[3]); @@ -1805,29 +2022,32 @@ namespace MPF.DiscImageCreator index = 4; break; - case Command.Tape: - if (!DoesExist(parts, 1) || IsFlag(parts[1]) || !File.Exists(parts[1])) + case CommandStrings.Tape: + if (parts.Count != 2) + return false; + + if (IsFlag(parts[1]) || !File.Exists(parts[1])) return false; else Filename = parts[1]; - if (parts.Count > 2) - return false; - break; - case Command.XBOX: - if (!DoesExist(parts, 1) || !IsValidDriveLetter(parts[1])) + case CommandStrings.XBOX: + if (parts.Count < 4) + return false; + + if (!IsValidDriveLetter(parts[1])) return false; else DriveLetter = parts[1]; - if (!DoesExist(parts, 2) || IsFlag(parts[2])) + if (IsFlag(parts[2])) return false; else Filename = parts[2]; - if (!DoesExist(parts, 3) || !IsValidInt32(parts[3], lowerBound: 0, upperBound: 72)) + if (!IsValidInt32(parts[3], lowerBound: 0, upperBound: 72)) return false; else DriveSpeed = Int32.Parse(parts[3]); @@ -1835,20 +2055,23 @@ namespace MPF.DiscImageCreator index = 4; break; - case Command.XBOXSwap: - case Command.XGD2Swap: - case Command.XGD3Swap: - if (!DoesExist(parts, 1) || !IsValidDriveLetter(parts[1])) + case CommandStrings.XBOXSwap: + case CommandStrings.XGD2Swap: + case CommandStrings.XGD3Swap: + if (parts.Count < 4) + return false; + + if (!IsValidDriveLetter(parts[1])) return false; else DriveLetter = parts[1]; - if (!DoesExist(parts, 2) || IsFlag(parts[2])) + if (IsFlag(parts[2])) return false; else Filename = parts[2]; - if (!DoesExist(parts, 3) || !IsValidInt32(parts[3], lowerBound: 0, upperBound: 72)) + if (!IsValidInt32(parts[3], lowerBound: 0, upperBound: 72)) return false; else DriveSpeed = Int32.Parse(parts[3]); @@ -1869,448 +2092,197 @@ namespace MPF.DiscImageCreator { for (int i = index; i < parts.Count; i++) { - switch (parts[i]) + // Flag read-out values + int? intValue = null; + string stringValue = null; + + // Add Offset + intValue = ProcessInt32Parameter(parts, FlagStrings.AddOffset, ref i, missingAllowed: true); + if (intValue != null && intValue != Int32.MinValue) + AddOffsetValue = intValue; + + // AMSF + ProcessFlagParameter(parts, FlagStrings.AMSF, ref i); + + // Atari Jaguar + ProcessFlagParameter(parts, FlagStrings.AtariJaguar, ref i); + + // BE Opcode + stringValue = ProcessStringParameter(parts, FlagStrings.BEOpcode, ref i); + if (!string.IsNullOrEmpty(stringValue)) { - case FlagStrings.AddOffset: - if (!GetSupportedCommands(Flag.AddOffset).Contains(BaseCommand)) - { - return false; - } - else if (!DoesExist(parts, i + 1)) - { - this[Flag.AddOffset] = true; - break; - } - else if (IsFlag(parts[i + 1])) - { - this[Flag.AddOffset] = true; - break; - } - else if (!IsValidInt32(parts[i + 1])) - { - return false; - } - - this[Flag.AddOffset] = true; - AddOffsetValue = Int32.Parse(parts[i + 1]); - i++; - break; - - case FlagStrings.AMSF: - if (!GetSupportedCommands(Flag.AMSF).Contains(BaseCommand)) - return false; - - this[Flag.AMSF] = true; - break; - - case FlagStrings.AtariJaguar: - if (!GetSupportedCommands(Flag.AtariJaguar).Contains(BaseCommand)) - return false; - - this[Flag.AtariJaguar] = true; - break; - - case FlagStrings.BEOpcode: - if (!GetSupportedCommands(Flag.BEOpcode).Contains(BaseCommand)) - { - return false; - } - else if (!DoesExist(parts, i + 1)) - { - this[Flag.BEOpcode] = true; - break; - } - else if (IsFlag(parts[i + 1])) - { - this[Flag.BEOpcode] = true; - break; - } - else if (!string.Equals(parts[i + 1], "raw", StringComparison.OrdinalIgnoreCase) - && !string.Equals(parts[i + 1], "pack", StringComparison.OrdinalIgnoreCase)) - { - return false; - } - - this[Flag.BEOpcode] = true; - BEOpcodeValue = parts[i + 1].ToLowerInvariant(); - i++; - break; - - case FlagStrings.C2Opcode: - if (!GetSupportedCommands(Flag.C2Opcode).Contains(BaseCommand)) - return false; - - this[Flag.C2Opcode] = true; - for (int j = 0; j < 4; j++) - { - if (!DoesExist(parts, i + 1)) - { - break; - } - else if (IsFlag(parts[i + 1])) - { - break; - } - else if (!IsValidInt32(parts[i + 1], lowerBound: 0)) - { - return false; - } - else - { - C2OpcodeValue[j] = Int32.Parse(parts[i + 1]); - i++; - } - } - - break; - - case FlagStrings.CopyrightManagementInformation: - if (!GetSupportedCommands(Flag.CopyrightManagementInformation).Contains(BaseCommand)) - return false; - - this[Flag.CopyrightManagementInformation] = true; - break; - - case FlagStrings.D8Opcode: - if (!GetSupportedCommands(Flag.D8Opcode).Contains(BaseCommand)) - return false; - - this[Flag.D8Opcode] = true; - break; - - case FlagStrings.DisableBeep: - if (!GetSupportedCommands(Flag.DisableBeep).Contains(BaseCommand)) - return false; - - this[Flag.DisableBeep] = true; - break; - - case FlagStrings.ExtractMicroSoftCabFile: - if (!GetSupportedCommands(Flag.ExtractMicroSoftCabFile).Contains(BaseCommand)) - return false; - - this[Flag.ExtractMicroSoftCabFile] = true; - break; - - case FlagStrings.Fix: - if (!GetSupportedCommands(Flag.Fix).Contains(BaseCommand)) - return false; - else if (!DoesExist(parts, i + 1)) - return false; - else if (!IsValidInt32(parts[i + 1], lowerBound: 0)) - return false; - - this[Flag.Fix] = true; - FixValue = Int32.Parse(parts[i + 1]); - i++; - break; - - case FlagStrings.ForceUnitAccess: - if (!GetSupportedCommands(Flag.ForceUnitAccess).Contains(BaseCommand)) - { - return false; - } - else if (!DoesExist(parts, i + 1)) - { - this[Flag.ForceUnitAccess] = true; - break; - } - else if (IsFlag(parts[i + 1])) - { - this[Flag.ForceUnitAccess] = true; - break; - } - else if (!IsValidInt32(parts[i + 1], lowerBound: 0)) - { - return false; - } - - this[Flag.ForceUnitAccess] = true; - ForceUnitAccessValue = Int32.Parse(parts[i + 1]); - i++; - break; - - case FlagStrings.MultiSectorRead: - if (!GetSupportedCommands(Flag.MultiSectorRead).Contains(BaseCommand)) - return false; - - this[Flag.MultiSectorRead] = true; - break; - - case FlagStrings.MultiSession: - if (!GetSupportedCommands(Flag.MultiSession).Contains(BaseCommand)) - return false; - - this[Flag.MultiSession] = true; - break; - - case FlagStrings.NoFixSubP: - if (!GetSupportedCommands(Flag.NoFixSubP).Contains(BaseCommand)) - return false; - - this[Flag.NoFixSubP] = true; - break; - - case FlagStrings.NoFixSubQ: - if (!GetSupportedCommands(Flag.NoFixSubQ).Contains(BaseCommand)) - return false; - - this[Flag.NoFixSubQ] = true; - break; - - case FlagStrings.NoFixSubQLibCrypt: - if (!GetSupportedCommands(Flag.NoFixSubQLibCrypt).Contains(BaseCommand)) - return false; - - this[Flag.NoFixSubQLibCrypt] = true; - break; - - case FlagStrings.NoFixSubQSecuROM: - if (!GetSupportedCommands(Flag.NoFixSubQSecuROM).Contains(BaseCommand)) - return false; - - this[Flag.NoFixSubQSecuROM] = true; - break; - - case FlagStrings.NoFixSubRtoW: - if (!GetSupportedCommands(Flag.NoFixSubRtoW).Contains(BaseCommand)) - return false; - - this[Flag.NoFixSubRtoW] = true; - break; - - case FlagStrings.NoSkipSS: - if (!GetSupportedCommands(Flag.NoSkipSS).Contains(BaseCommand)) - { - return false; - } - else if (!DoesExist(parts, i + 1)) - { - this[Flag.NoSkipSS] = true; - break; - } - else if (IsFlag(parts[i + 1])) - { - this[Flag.NoSkipSS] = true; - break; - } - else if (!IsValidInt32(parts[i + 1], lowerBound: 0)) - { - return false; - } - - this[Flag.NoSkipSS] = true; - NoSkipSecuritySectorValue = Int32.Parse(parts[i + 1]); - i++; - break; - - case FlagStrings.PadSector: - if (!GetSupportedCommands(Flag.PadSector).Contains(BaseCommand)) - { - return false; - } - else if (!DoesExist(parts, i + 1)) - { - this[Flag.PadSector] = true; - break; - } - else if (IsFlag(parts[i + 1])) - { - this[Flag.PadSector] = true; - break; - } - else if (!IsValidInt32(parts[i + 1], lowerBound: 0, upperBound: 1)) - { - return false; - } - - this[Flag.PadSector] = true; - PadSectorValue = Int32.Parse(parts[i + 1]); - i++; - break; - - case FlagStrings.Raw: - if (!GetSupportedCommands(Flag.Raw).Contains(BaseCommand)) - return false; - - this[Flag.Raw] = true; - break; - - case FlagStrings.Resume: - if (!GetSupportedCommands(Flag.Resume).Contains(BaseCommand)) - return false; - - this[Flag.Resume] = true; - break; - - case FlagStrings.Reverse: - if (!GetSupportedCommands(Flag.Reverse).Contains(BaseCommand)) - return false; - - // DVD specifically requires StartLBA and EndLBA - if (BaseCommand == Command.DigitalVideoDisc) - { - if (!DoesExist(parts, i + 1) || !DoesExist(parts, i + 2)) - return false; - else if (!IsValidInt32(parts[i + 1], lowerBound: 0) || !IsValidInt32(parts[i + 2], lowerBound: 0)) - return false; - - ReverseStartLBAValue = Int32.Parse(parts[i + 1]); - ReverseEndLBAValue = Int32.Parse(parts[i + 2]); - i += 2; - } - - this[Flag.Reverse] = true; - break; - - case FlagStrings.ScanAntiMod: - if (!GetSupportedCommands(Flag.ScanAntiMod).Contains(BaseCommand)) - return false; - - this[Flag.ScanAntiMod] = true; - break; - - case FlagStrings.ScanFileProtect: - if (!GetSupportedCommands(Flag.ScanFileProtect).Contains(BaseCommand)) - { - return false; - } - else if (!DoesExist(parts, i + 1)) - { - this[Flag.ScanFileProtect] = true; - break; - } - else if (IsFlag(parts[i + 1])) - { - this[Flag.ScanFileProtect] = true; - break; - } - else if (!IsValidInt32(parts[i + 1], lowerBound: 0)) - { - return false; - } - - this[Flag.ScanFileProtect] = true; - ScanFileProtectValue = Int32.Parse(parts[i + 1]); - i++; - break; - - case FlagStrings.ScanSectorProtect: - if (!GetSupportedCommands(Flag.ScanSectorProtect).Contains(BaseCommand)) - return false; - - this[Flag.ScanSectorProtect] = true; - break; - - case FlagStrings.SeventyFour: - if (!GetSupportedCommands(Flag.SeventyFour).Contains(BaseCommand)) - return false; - - this[Flag.SeventyFour] = true; - break; - - case FlagStrings.SkipSector: - if (!GetSupportedCommands(Flag.SkipSector).Contains(BaseCommand)) - return false; - - this[Flag.SkipSector] = true; - for (int j = 0; j < 2; j++) - { - if (!DoesExist(parts, i + 1)) - { - break; - } - else if (IsFlag(parts[i + 1])) - { - break; - } - else if (!IsValidInt32(parts[i + 1], lowerBound: 0)) - { - return false; - } - else - { - SkipSectorValue[j] = Int32.Parse(parts[i + 1]); - i++; - } - } - - break; - - case FlagStrings.SubchannelReadLevel: - if (!GetSupportedCommands(Flag.SubchannelReadLevel).Contains(BaseCommand)) - { - return false; - } - else if (!DoesExist(parts, i + 1)) - { - this[Flag.SubchannelReadLevel] = true; - break; - } - else if (IsFlag(parts[i + 1])) - { - this[Flag.SubchannelReadLevel] = true; - break; - } - else if (!IsValidInt32(parts[i + 1], lowerBound: 0, upperBound: 2)) - { - return false; - } - - this[Flag.SubchannelReadLevel] = true; - SubchannelReadLevelValue = Int32.Parse(parts[i + 1]); - i++; - break; - - case FlagStrings.UseAnchorVolumeDescriptorPointer: - if (!GetSupportedCommands(Flag.UseAnchorVolumeDescriptorPointer).Contains(BaseCommand)) - return false; - - this[Flag.UseAnchorVolumeDescriptorPointer] = true; - break; - - case FlagStrings.VideoNow: - if (!GetSupportedCommands(Flag.VideoNow).Contains(BaseCommand)) - { - return false; - } - else if (!DoesExist(parts, i + 1)) - { - this[Flag.VideoNow] = true; - break; - } - else if (IsFlag(parts[i + 1])) - { - this[Flag.VideoNow] = true; - break; - } - else if (!IsValidInt32(parts[i + 1], lowerBound: 0)) - { - return false; - } - - this[Flag.VideoNow] = true; - VideoNowValue = Int32.Parse(parts[i + 1]); - i++; - break; - - case FlagStrings.VideoNowColor: - if (!GetSupportedCommands(Flag.VideoNowColor).Contains(BaseCommand)) - return false; - - this[Flag.VideoNowColor] = true; - break; - - case FlagStrings.VideoNowXP: - if (!GetSupportedCommands(Flag.VideoNowXP).Contains(BaseCommand)) - return false; - - this[Flag.VideoNowXP] = true; - break; - - default: - return false; + if (string.Equals(stringValue, "raw") || string.Equals(stringValue, "pack")) + BEOpcodeValue = stringValue; + else + i--; } + + // C2 Opcode + if (parts[i] == FlagStrings.C2Opcode && IsFlagSupported(FlagStrings.C2Opcode)) + { + this[FlagStrings.C2Opcode] = true; + for (int j = 0; j < 4; j++) + { + if (!DoesExist(parts, i + 1)) + { + break; + } + else if (IsFlag(parts[i + 1])) + { + break; + } + else if (!IsValidInt32(parts[i + 1], lowerBound: 0)) + { + return false; + } + else + { + C2OpcodeValue[j] = Int32.Parse(parts[i + 1]); + i++; + } + } + } + + // Copyright Management Information + ProcessFlagParameter(parts, FlagStrings.CopyrightManagementInformation, ref i); + + // D8 Opcode + ProcessFlagParameter(parts, FlagStrings.D8Opcode, ref i); + + // Disable Beep + ProcessFlagParameter(parts, FlagStrings.DisableBeep, ref i); + + // Extract MS-CAB + ProcessFlagParameter(parts, FlagStrings.ExtractMicroSoftCabFile, ref i); + + // Fix + intValue = ProcessInt32Parameter(parts, FlagStrings.Fix, ref i); + if (intValue != null && intValue != Int32.MinValue) + FixValue = intValue; + + // Force Unit Access + intValue = ProcessInt32Parameter(parts, FlagStrings.ForceUnitAccess, ref i, missingAllowed: true); + if (intValue != null && intValue != Int32.MinValue && intValue >= 0) + ForceUnitAccessValue = intValue; + + // Multi-Sector Read + ProcessFlagParameter(parts, FlagStrings.MultiSectorRead, ref i); + + // Multi-Session + ProcessFlagParameter(parts, FlagStrings.MultiSession, ref i); + + // NoFixSubP + ProcessFlagParameter(parts, FlagStrings.NoFixSubP, ref i); + + // NoFixSubQ + ProcessFlagParameter(parts, FlagStrings.NoFixSubQ, ref i); + + // NoFixSubQLibCrypt + ProcessFlagParameter(parts, FlagStrings.NoFixSubQLibCrypt, ref i); + + // NoFixSubQSecuROM + ProcessFlagParameter(parts, FlagStrings.NoFixSubQSecuROM, ref i); + + // NoFixSubRtoW + ProcessFlagParameter(parts, FlagStrings.NoFixSubRtoW, ref i); + + // NoSkipSS + intValue = ProcessInt32Parameter(parts, FlagStrings.NoSkipSS, ref i, missingAllowed: true); + if (intValue != null && intValue != Int32.MinValue && intValue >= 0) + NoSkipSecuritySectorValue = intValue; + + // PadSector + intValue = ProcessInt32Parameter(parts, FlagStrings.PadSector, ref i, missingAllowed: true); + if (intValue != null && intValue != Int32.MinValue && intValue >= 0) + PadSectorValue = intValue; + + // Raw + ProcessFlagParameter(parts, FlagStrings.Raw, ref i); + + // Resume + ProcessFlagParameter(parts, FlagStrings.Resume, ref i); + + // Reverse + if (parts[i] == FlagStrings.Reverse && IsFlagSupported(FlagStrings.Reverse)) + { + // DVD specifically requires StartLBA and EndLBA + if (BaseCommand == CommandStrings.DigitalVideoDisc) + { + if (!DoesExist(parts, i + 1) || !DoesExist(parts, i + 2)) + return false; + else if (!IsValidInt32(parts[i + 1], lowerBound: 0) || !IsValidInt32(parts[i + 2], lowerBound: 0)) + return false; + + ReverseStartLBAValue = Int32.Parse(parts[i + 1]); + ReverseEndLBAValue = Int32.Parse(parts[i + 2]); + i += 2; + } + + this[FlagStrings.Reverse] = true; + } + + // ScanAntiMod + ProcessFlagParameter(parts, FlagStrings.ScanAntiMod, ref i); + + // ScanFileProtect + intValue = ProcessInt32Parameter(parts, FlagStrings.ScanFileProtect, ref i, missingAllowed: true); + if (intValue != null && intValue != Int32.MinValue && intValue >= 0) + ScanFileProtectValue = intValue; + + // ScanSectorProtect + ProcessFlagParameter(parts, FlagStrings.ScanSectorProtect, ref i); + + // SeventyFour + ProcessFlagParameter(parts, FlagStrings.SeventyFour, ref i); + + // SkipSector + if (parts[i] == FlagStrings.SkipSector && IsFlagSupported(FlagStrings.SkipSector)) + { + bool stillValid = true; + for (int j = 0; j < 2; j++) + { + if (!DoesExist(parts, i + 1)) + { + break; + } + else if (IsFlag(parts[i + 1])) + { + break; + } + else if (!IsValidInt32(parts[i + 1], lowerBound: 0)) + { + stillValid = false; + break; + } + else + { + SkipSectorValue[j] = Int32.Parse(parts[i + 1]); + i++; + } + } + + if (stillValid) + this[FlagStrings.SkipSector] = true; + } + + // SubchannelReadLevel + intValue = ProcessInt32Parameter(parts, FlagStrings.SubchannelReadLevel, ref i, missingAllowed: true); + if (intValue != null && intValue != Int32.MinValue && intValue >= 0 && intValue <= 2) + SubchannelReadLevelValue = intValue; + + // SeventyFour + ProcessFlagParameter(parts, FlagStrings.UseAnchorVolumeDescriptorPointer, ref i); + + // VideoNow + intValue = ProcessInt32Parameter(parts, FlagStrings.VideoNow, ref i, missingAllowed: true); + if (intValue != null && intValue != Int32.MinValue && intValue >= 0) + VideoNowValue = intValue; + + // VideoNowColor + ProcessFlagParameter(parts, FlagStrings.VideoNowColor, ref i); + + // VideoNowXP + ProcessFlagParameter(parts, FlagStrings.VideoNowXP, ref i); } } @@ -2321,203 +2293,6 @@ namespace MPF.DiscImageCreator #region Private Extra Methods - /// - /// Get the list of commands that use a given flag - /// - /// Flag value to get commands for - /// List of DiscImageCreator.Commands, if possible - private static List GetSupportedCommands(Flag flag) - { - var commands = new List(); - switch (flag) - { - case Flag.AddOffset: - commands.Add(Command.CompactDisc); - commands.Add(Command.Swap); - break; - case Flag.AMSF: - commands.Add(Command.CompactDisc); - break; - case Flag.AtariJaguar: - commands.Add(Command.CompactDisc); - break; - case Flag.BEOpcode: - commands.Add(Command.Audio); - commands.Add(Command.CompactDisc); - commands.Add(Command.Data); - commands.Add(Command.GDROM); - commands.Add(Command.Swap); - break; - case Flag.C2Opcode: - commands.Add(Command.Audio); - commands.Add(Command.CompactDisc); - commands.Add(Command.Data); - commands.Add(Command.GDROM); - commands.Add(Command.Swap); - break; - case Flag.CopyrightManagementInformation: - commands.Add(Command.DigitalVideoDisc); - break; - case Flag.D8Opcode: - commands.Add(Command.Audio); - commands.Add(Command.CompactDisc); - commands.Add(Command.Data); - commands.Add(Command.GDROM); - commands.Add(Command.Swap); - break; - case Flag.DisableBeep: - commands.Add(Command.Audio); - commands.Add(Command.BluRay); - commands.Add(Command.CompactDisc); - commands.Add(Command.Data); - commands.Add(Command.DigitalVideoDisc); - commands.Add(Command.GDROM); - commands.Add(Command.SACD); - commands.Add(Command.Swap); - commands.Add(Command.XBOX); - commands.Add(Command.XBOXSwap); - commands.Add(Command.XGD2Swap); - commands.Add(Command.XGD3Swap); - break; - case Flag.ExtractMicroSoftCabFile: - commands.Add(Command.CompactDisc); - break; - case Flag.Fix: - commands.Add(Command.DigitalVideoDisc); - break; - case Flag.ForceUnitAccess: - commands.Add(Command.Audio); - commands.Add(Command.BluRay); - commands.Add(Command.CompactDisc); - commands.Add(Command.Data); - commands.Add(Command.DigitalVideoDisc); - commands.Add(Command.GDROM); - commands.Add(Command.SACD); - commands.Add(Command.Swap); - commands.Add(Command.XBOX); - commands.Add(Command.XBOXSwap); - commands.Add(Command.XGD2Swap); - commands.Add(Command.XGD3Swap); - break; - case Flag.MultiSectorRead: - commands.Add(Command.CompactDisc); - break; - case Flag.MultiSession: - commands.Add(Command.Audio); - commands.Add(Command.CompactDisc); - commands.Add(Command.Data); - commands.Add(Command.Swap); - break; - case Flag.NoFixSubP: - commands.Add(Command.Audio); - commands.Add(Command.CompactDisc); - commands.Add(Command.Data); - commands.Add(Command.GDROM); - commands.Add(Command.Swap); - break; - case Flag.NoFixSubQ: - commands.Add(Command.Audio); - commands.Add(Command.CompactDisc); - commands.Add(Command.Data); - commands.Add(Command.GDROM); - commands.Add(Command.Swap); - break; - case Flag.NoFixSubQLibCrypt: - commands.Add(Command.CompactDisc); - commands.Add(Command.Swap); - break; - case Flag.NoFixSubQSecuROM: - commands.Add(Command.CompactDisc); - commands.Add(Command.Swap); - break; - case Flag.NoFixSubRtoW: - commands.Add(Command.Audio); - commands.Add(Command.CompactDisc); - commands.Add(Command.Data); - commands.Add(Command.GDROM); - commands.Add(Command.Swap); - break; - case Flag.NoSkipSS: - commands.Add(Command.BluRay); - commands.Add(Command.XBOX); - commands.Add(Command.XBOXSwap); - commands.Add(Command.XGD2Swap); - commands.Add(Command.XGD3Swap); - break; - case Flag.PadSector: - commands.Add(Command.DigitalVideoDisc); - break; - case Flag.Raw: - commands.Add(Command.DigitalVideoDisc); - break; - case Flag.Resume: - commands.Add(Command.DigitalVideoDisc); - break; - case Flag.Reverse: - commands.Add(Command.Audio); - commands.Add(Command.Data); - commands.Add(Command.DigitalVideoDisc); - break; - case Flag.ScanAntiMod: - commands.Add(Command.Audio); - commands.Add(Command.CompactDisc); - commands.Add(Command.Data); - commands.Add(Command.Swap); - break; - case Flag.ScanFileProtect: - commands.Add(Command.Audio); - commands.Add(Command.CompactDisc); - commands.Add(Command.Data); - commands.Add(Command.DigitalVideoDisc); - commands.Add(Command.Swap); - break; - case Flag.ScanSectorProtect: - commands.Add(Command.Audio); - commands.Add(Command.CompactDisc); - commands.Add(Command.Data); - commands.Add(Command.Swap); - break; - case Flag.SeventyFour: - commands.Add(Command.CompactDisc); - commands.Add(Command.Swap); - break; - case Flag.SkipSector: - commands.Add(Command.Audio); - commands.Add(Command.Data); - break; - case Flag.SubchannelReadLevel: - commands.Add(Command.Audio); - commands.Add(Command.CompactDisc); - commands.Add(Command.Data); - commands.Add(Command.GDROM); - commands.Add(Command.Swap); - break; - case Flag.UseAnchorVolumeDescriptorPointer: - commands.Add(Command.BluRay); - commands.Add(Command.DigitalVideoDisc); - commands.Add(Command.XBOX); - break; - case Flag.VideoNow: - commands.Add(Command.CompactDisc); - commands.Add(Command.Swap); - break; - case Flag.VideoNowColor: - commands.Add(Command.CompactDisc); - commands.Add(Command.Swap); - break; - case Flag.VideoNowXP: - commands.Add(Command.CompactDisc); - commands.Add(Command.Swap); - break; - - case Flag.NONE: - default: - return commands; - } - - return commands; - } - /// /// Set the DIC command to be used for a given system and media type /// @@ -2528,7 +2303,7 @@ namespace MPF.DiscImageCreator // If we have an invalid combination, we should BaseCommand = null if (!Validators.GetValidMediaTypes(system).Contains(type)) { - BaseCommand = Command.NONE; + BaseCommand = null; return; } @@ -2536,46 +2311,46 @@ namespace MPF.DiscImageCreator { case MediaType.CDROM: if (system == KnownSystem.SuperAudioCD) - BaseCommand = Command.SACD; + BaseCommand = CommandStrings.SACD; else - BaseCommand = Command.CompactDisc; + BaseCommand = CommandStrings.CompactDisc; return; case MediaType.DVD: if (system == KnownSystem.MicrosoftXBOX || system == KnownSystem.MicrosoftXBOX360) { - BaseCommand = Command.XBOX; + BaseCommand = CommandStrings.XBOX; return; } - BaseCommand = Command.DigitalVideoDisc; + BaseCommand = CommandStrings.DigitalVideoDisc; return; case MediaType.GDROM: - BaseCommand = Command.GDROM; + BaseCommand = CommandStrings.GDROM; return; case MediaType.HDDVD: - BaseCommand = Command.DigitalVideoDisc; + BaseCommand = CommandStrings.DigitalVideoDisc; return; case MediaType.BluRay: - BaseCommand = Command.BluRay; + BaseCommand = CommandStrings.BluRay; return; case MediaType.NintendoGameCubeGameDisc: - BaseCommand = Command.DigitalVideoDisc; + BaseCommand = CommandStrings.DigitalVideoDisc; return; case MediaType.NintendoWiiOpticalDisc: - BaseCommand = Command.DigitalVideoDisc; + BaseCommand = CommandStrings.DigitalVideoDisc; return; case MediaType.FloppyDisk: - BaseCommand = Command.Floppy; + BaseCommand = CommandStrings.Floppy; return; case MediaType.HardDisk: - BaseCommand = Command.Disk; + BaseCommand = CommandStrings.Disk; return; case MediaType.DataCartridge: - BaseCommand = Command.Tape; + BaseCommand = CommandStrings.Tape; return; default: - BaseCommand = Command.NONE; + BaseCommand = null; return; } } diff --git a/MPF.Library/UmdImageCreator/Parameters.cs b/MPF.Library/UmdImageCreator/Parameters.cs index 5682d259..f8b0bcf7 100644 --- a/MPF.Library/UmdImageCreator/Parameters.cs +++ b/MPF.Library/UmdImageCreator/Parameters.cs @@ -3,7 +3,6 @@ using System.Collections.Generic; using System.IO; using System.Linq; using MPF.Data; -using MPF.Utilities; namespace MPF.UmdImageCreator { diff --git a/MPF.Test/Utilities/ConvertersTest.cs b/MPF.Test/Utilities/ConvertersTest.cs index a7d28ac1..b098fef7 100644 --- a/MPF.Test/Utilities/ConvertersTest.cs +++ b/MPF.Test/Utilities/ConvertersTest.cs @@ -15,48 +15,48 @@ namespace MPF.Test.Utilities public static IEnumerable KnownSystems = KnownSystemComboBoxItem.GenerateElements().Select(e => new object[] { e }); [Theory] - [InlineData(DiscImageCreator.Command.Audio, MediaType.CDROM)] - [InlineData(DiscImageCreator.Command.BluRay, MediaType.BluRay)] - [InlineData(DiscImageCreator.Command.Close, null)] - [InlineData(DiscImageCreator.Command.CompactDisc, MediaType.CDROM)] - [InlineData(DiscImageCreator.Command.Data, MediaType.CDROM)] - [InlineData(DiscImageCreator.Command.DigitalVideoDisc, MediaType.DVD)] - [InlineData(DiscImageCreator.Command.Eject, null)] - [InlineData(DiscImageCreator.Command.Floppy, MediaType.FloppyDisk)] - [InlineData(DiscImageCreator.Command.GDROM, MediaType.GDROM)] - [InlineData(DiscImageCreator.Command.MDS, null)] - [InlineData(DiscImageCreator.Command.Reset, null)] - [InlineData(DiscImageCreator.Command.SACD, MediaType.CDROM)] - [InlineData(DiscImageCreator.Command.Start, null)] - [InlineData(DiscImageCreator.Command.Stop, null)] - [InlineData(DiscImageCreator.Command.Sub, null)] - [InlineData(DiscImageCreator.Command.Swap, MediaType.GDROM)] - [InlineData(DiscImageCreator.Command.XBOX, MediaType.DVD)] - public void BaseCommandToMediaTypeTest(DiscImageCreator.Command command, MediaType? expected) + [InlineData(DiscImageCreator.CommandStrings.Audio, MediaType.CDROM)] + [InlineData(DiscImageCreator.CommandStrings.BluRay, MediaType.BluRay)] + [InlineData(DiscImageCreator.CommandStrings.Close, null)] + [InlineData(DiscImageCreator.CommandStrings.CompactDisc, MediaType.CDROM)] + [InlineData(DiscImageCreator.CommandStrings.Data, MediaType.CDROM)] + [InlineData(DiscImageCreator.CommandStrings.DigitalVideoDisc, MediaType.DVD)] + [InlineData(DiscImageCreator.CommandStrings.Eject, null)] + [InlineData(DiscImageCreator.CommandStrings.Floppy, MediaType.FloppyDisk)] + [InlineData(DiscImageCreator.CommandStrings.GDROM, MediaType.GDROM)] + [InlineData(DiscImageCreator.CommandStrings.MDS, null)] + [InlineData(DiscImageCreator.CommandStrings.Reset, null)] + [InlineData(DiscImageCreator.CommandStrings.SACD, MediaType.CDROM)] + [InlineData(DiscImageCreator.CommandStrings.Start, null)] + [InlineData(DiscImageCreator.CommandStrings.Stop, null)] + [InlineData(DiscImageCreator.CommandStrings.Sub, null)] + [InlineData(DiscImageCreator.CommandStrings.Swap, MediaType.GDROM)] + [InlineData(DiscImageCreator.CommandStrings.XBOX, MediaType.DVD)] + public void BaseCommandToMediaTypeTest(string command, MediaType? expected) { MediaType? actual = DiscImageCreator.Converters.ToMediaType(command); Assert.Equal(expected, actual); } [Theory] - [InlineData(DiscImageCreator.Command.Audio, KnownSystem.AudioCD)] - [InlineData(DiscImageCreator.Command.BluRay, KnownSystem.SonyPlayStation3)] - [InlineData(DiscImageCreator.Command.Close, null)] - [InlineData(DiscImageCreator.Command.CompactDisc, KnownSystem.IBMPCCompatible)] - [InlineData(DiscImageCreator.Command.Data, KnownSystem.IBMPCCompatible)] - [InlineData(DiscImageCreator.Command.DigitalVideoDisc, KnownSystem.IBMPCCompatible)] - [InlineData(DiscImageCreator.Command.Eject, null)] - [InlineData(DiscImageCreator.Command.Floppy, KnownSystem.IBMPCCompatible)] - [InlineData(DiscImageCreator.Command.GDROM, KnownSystem.SegaDreamcast)] - [InlineData(DiscImageCreator.Command.MDS, null)] - [InlineData(DiscImageCreator.Command.Reset, null)] - [InlineData(DiscImageCreator.Command.SACD, KnownSystem.SuperAudioCD)] - [InlineData(DiscImageCreator.Command.Start, null)] - [InlineData(DiscImageCreator.Command.Stop, null)] - [InlineData(DiscImageCreator.Command.Sub, null)] - [InlineData(DiscImageCreator.Command.Swap, KnownSystem.SegaDreamcast)] - [InlineData(DiscImageCreator.Command.XBOX, KnownSystem.MicrosoftXBOX)] - public void BaseCommandToKnownSystemTest(DiscImageCreator.Command command, KnownSystem? expected) + [InlineData(DiscImageCreator.CommandStrings.Audio, KnownSystem.AudioCD)] + [InlineData(DiscImageCreator.CommandStrings.BluRay, KnownSystem.SonyPlayStation3)] + [InlineData(DiscImageCreator.CommandStrings.Close, null)] + [InlineData(DiscImageCreator.CommandStrings.CompactDisc, KnownSystem.IBMPCCompatible)] + [InlineData(DiscImageCreator.CommandStrings.Data, KnownSystem.IBMPCCompatible)] + [InlineData(DiscImageCreator.CommandStrings.DigitalVideoDisc, KnownSystem.IBMPCCompatible)] + [InlineData(DiscImageCreator.CommandStrings.Eject, null)] + [InlineData(DiscImageCreator.CommandStrings.Floppy, KnownSystem.IBMPCCompatible)] + [InlineData(DiscImageCreator.CommandStrings.GDROM, KnownSystem.SegaDreamcast)] + [InlineData(DiscImageCreator.CommandStrings.MDS, null)] + [InlineData(DiscImageCreator.CommandStrings.Reset, null)] + [InlineData(DiscImageCreator.CommandStrings.SACD, KnownSystem.SuperAudioCD)] + [InlineData(DiscImageCreator.CommandStrings.Start, null)] + [InlineData(DiscImageCreator.CommandStrings.Stop, null)] + [InlineData(DiscImageCreator.CommandStrings.Sub, null)] + [InlineData(DiscImageCreator.CommandStrings.Swap, KnownSystem.SegaDreamcast)] + [InlineData(DiscImageCreator.CommandStrings.XBOX, KnownSystem.MicrosoftXBOX)] + public void BaseCommandToKnownSystemTest(string command, KnownSystem? expected) { KnownSystem? actual = DiscImageCreator.Converters.ToKnownSystem(command); Assert.Equal(expected, actual); diff --git a/MPF.Test/Utilities/ParametersTest.cs b/MPF.Test/Utilities/ParametersTest.cs index 0ed4f5b9..aef0c804 100644 --- a/MPF.Test/Utilities/ParametersTest.cs +++ b/MPF.Test/Utilities/ParametersTest.cs @@ -10,13 +10,13 @@ namespace MPF.Test.Utilities public class ParametersTest { [Theory] - [InlineData(KnownSystem.MicrosoftXBOX, MediaType.CDROM, Command.CompactDisc)] - [InlineData(KnownSystem.MicrosoftXBOX, MediaType.DVD, Command.XBOX)] - [InlineData(KnownSystem.MicrosoftXBOX, MediaType.LaserDisc, Command.NONE)] - [InlineData(KnownSystem.SegaNu, MediaType.BluRay, Command.BluRay)] - [InlineData(KnownSystem.AppleMacintosh, MediaType.FloppyDisk, Command.Floppy)] - [InlineData(KnownSystem.RawThrillsVarious, MediaType.GDROM, Command.NONE)] - public void ParametersFromSystemAndTypeTest(KnownSystem? knownSystem, MediaType? mediaType, Command expected) + [InlineData(KnownSystem.MicrosoftXBOX, MediaType.CDROM, CommandStrings.CompactDisc)] + [InlineData(KnownSystem.MicrosoftXBOX, MediaType.DVD, CommandStrings.XBOX)] + [InlineData(KnownSystem.MicrosoftXBOX, MediaType.LaserDisc, null)] + [InlineData(KnownSystem.SegaNu, MediaType.BluRay, CommandStrings.BluRay)] + [InlineData(KnownSystem.AppleMacintosh, MediaType.FloppyDisk, CommandStrings.Floppy)] + [InlineData(KnownSystem.RawThrillsVarious, MediaType.GDROM, null)] + public void ParametersFromSystemAndTypeTest(KnownSystem? knownSystem, MediaType? mediaType, string expected) { var options = new Options { }; var actual = new Parameters(knownSystem, mediaType, 'D', "disc.bin", 16, options); @@ -25,26 +25,26 @@ namespace MPF.Test.Utilities [Theory] [InlineData(KnownSystem.AppleMacintosh, MediaType.LaserDisc, true, 20, null, null)] - [InlineData(KnownSystem.NintendoGameCube, MediaType.NintendoGameCubeGameDisc, false, 20, null, new Flag[] { Flag.Raw })] - [InlineData(KnownSystem.IBMPCCompatible, MediaType.DVD, false, 20, null, new Flag[] { Flag.CopyrightManagementInformation, Flag.ScanFileProtect })] + [InlineData(KnownSystem.NintendoGameCube, MediaType.NintendoGameCubeGameDisc, false, 20, null, new string[] { FlagStrings.Raw })] + [InlineData(KnownSystem.IBMPCCompatible, MediaType.DVD, false, 20, null, new string[] { FlagStrings.CopyrightManagementInformation, FlagStrings.ScanFileProtect })] /* paranoid mode tests */ - [InlineData(KnownSystem.IBMPCCompatible, MediaType.CDROM, true, 1000, 2, new Flag[] { Flag.C2Opcode, Flag.NoFixSubQSecuROM, Flag.ScanFileProtect, Flag.ScanSectorProtect, Flag.SubchannelReadLevel })] - [InlineData(KnownSystem.AppleMacintosh, MediaType.CDROM, false, 20, null, new Flag[] { Flag.C2Opcode, Flag.NoFixSubQSecuROM, Flag.ScanFileProtect, Flag.ScanSectorProtect, Flag.SubchannelReadLevel })] - [InlineData(KnownSystem.IBMPCCompatible, MediaType.DVD, true, 500, null, new Flag[] { Flag.CopyrightManagementInformation, Flag.ScanFileProtect })] - [InlineData(KnownSystem.HDDVDVideo, MediaType.HDDVD, true, 500, null, new Flag[] { Flag.CopyrightManagementInformation })] - [InlineData(KnownSystem.IBMPCCompatible, MediaType.DVD, false, 500, null, new Flag[] { Flag.CopyrightManagementInformation, Flag.ScanFileProtect })] - [InlineData(KnownSystem.HDDVDVideo, MediaType.HDDVD, false, 500, null, new Flag[] { Flag.CopyrightManagementInformation })] + [InlineData(KnownSystem.IBMPCCompatible, MediaType.CDROM, true, 1000, 2, new string[] { FlagStrings.C2Opcode, FlagStrings.NoFixSubQSecuROM, FlagStrings.ScanFileProtect, FlagStrings.ScanSectorProtect, FlagStrings.SubchannelReadLevel })] + [InlineData(KnownSystem.AppleMacintosh, MediaType.CDROM, false, 20, null, new string[] { FlagStrings.C2Opcode, FlagStrings.NoFixSubQSecuROM, FlagStrings.ScanFileProtect, FlagStrings.ScanSectorProtect, FlagStrings.SubchannelReadLevel })] + [InlineData(KnownSystem.IBMPCCompatible, MediaType.DVD, true, 500, null, new string[] { FlagStrings.CopyrightManagementInformation, FlagStrings.ScanFileProtect })] + [InlineData(KnownSystem.HDDVDVideo, MediaType.HDDVD, true, 500, null, new string[] { FlagStrings.CopyrightManagementInformation })] + [InlineData(KnownSystem.IBMPCCompatible, MediaType.DVD, false, 500, null, new string[] { FlagStrings.CopyrightManagementInformation, FlagStrings.ScanFileProtect })] + [InlineData(KnownSystem.HDDVDVideo, MediaType.HDDVD, false, 500, null, new string[] { FlagStrings.CopyrightManagementInformation })] /* reread c2 */ - [InlineData(KnownSystem.SegaDreamcast, MediaType.GDROM, false, 1000, null, new Flag[] { Flag.C2Opcode })] - [InlineData(KnownSystem.SegaDreamcast, MediaType.GDROM, false, -1, null, new Flag[] { Flag.C2Opcode })] + [InlineData(KnownSystem.SegaDreamcast, MediaType.GDROM, false, 1000, null, new string[] { FlagStrings.C2Opcode })] + [InlineData(KnownSystem.SegaDreamcast, MediaType.GDROM, false, -1, null, new string[] { FlagStrings.C2Opcode })] - public void ParametersFromOptionsTest(KnownSystem? knownSystem, MediaType? mediaType, bool paranoid, int rereadC2, int? subchannelLevel, Flag[] expected) + public void ParametersFromOptionsTest(KnownSystem? knownSystem, MediaType? mediaType, bool paranoid, int rereadC2, int? subchannelLevel, string[] expected) { var options = new Options { DICParanoidMode = paranoid, DICRereadCount = rereadC2 }; var actual = new Parameters(knownSystem, mediaType, 'D', "disc.bin", 16, options); - HashSet expectedSet = new HashSet(expected ?? new Flag[0]); - HashSet actualSet = new HashSet(actual.Keys.Cast() ?? new Flag[0]); + HashSet expectedSet = new HashSet(expected ?? new string[0]); + HashSet actualSet = new HashSet(actual.Keys.Cast() ?? new string[0]); Assert.Equal(expectedSet, actualSet); if (rereadC2 == -1 || !Validators.GetValidMediaTypes(knownSystem).Contains(mediaType)) Assert.Null(actual.C2OpcodeValue[0]); diff --git a/MPF/Windows/MainWindow.xaml.cs b/MPF/Windows/MainWindow.xaml.cs index fc4e2565..5107e91a 100644 --- a/MPF/Windows/MainWindow.xaml.cs +++ b/MPF/Windows/MainWindow.xaml.cs @@ -598,7 +598,7 @@ namespace MPF.Windows // If SmartE is detected on the current disc, remove `/sf` from the flags for DIC only if (Env.Options.InternalProgram == InternalProgram.DiscImageCreator && output.Contains("SmartE")) { - ((DiscImageCreator.Parameters)Env.Parameters)[DiscImageCreator.Flag.ScanFileProtect] = false; + ((DiscImageCreator.Parameters)Env.Parameters)[DiscImageCreator.FlagStrings.ScanFileProtect] = false; LogOutput.VerboseLogLn($"SmartE detected, removing {DiscImageCreator.FlagStrings.ScanFileProtect} from parameters"); }