diff --git a/DICUI.Test/Utilities/KnownSystemExtensionsTest.cs b/DICUI.Test/Utilities/KnownSystemExtensionsTest.cs
index 9611295f..b7a9c281 100644
--- a/DICUI.Test/Utilities/KnownSystemExtensionsTest.cs
+++ b/DICUI.Test/Utilities/KnownSystemExtensionsTest.cs
@@ -11,14 +11,13 @@ namespace DICUI.Test.Utilities
public void NameTest()
{
var values = (KnownSystem[])Enum.GetValues(typeof(KnownSystem));
-
- Array.ForEach(values, system =>
+ foreach(var system in values)
{
string expected = Converters.KnownSystemToString(system);
string actual = ((KnownSystem?)system).Name();
Assert.Equal(expected, actual);
- });
+ }
}
[Theory]
@@ -33,13 +32,11 @@ namespace DICUI.Test.Utilities
Assert.Equal(expected, actual);
}
-
[Fact]
public void IsMarkerTest()
{
var values = (KnownSystem[])Enum.GetValues(typeof(KnownSystem));
-
- Array.ForEach(values, system =>
+ foreach(var system in values)
{
bool expected = system == KnownSystem.MarkerArcadeEnd || system == KnownSystem.MarkerComputerEnd ||
system == KnownSystem.MarkerOtherEnd || system == KnownSystem.MarkerConsoleEnd;
@@ -47,23 +44,18 @@ namespace DICUI.Test.Utilities
bool actual = ((KnownSystem?)system).IsMarker();
Assert.Equal(expected, actual);
- });
+ }
}
[Fact]
public void CategoryNameNotEmptyTest()
{
var values = (KnownSystemCategory[])Enum.GetValues(typeof(KnownSystemCategory));
-
- Array.ForEach(values, system =>
+ foreach (var system in values)
{
string actual = ((KnownSystem?)system).Name();
-
Assert.NotEqual("", actual);
- });
+ }
}
-
-
-
}
}
diff --git a/DICUI/DICUI.csproj b/DICUI/DICUI.csproj
index 3520c46e..769f01ad 100644
--- a/DICUI/DICUI.csproj
+++ b/DICUI/DICUI.csproj
@@ -99,6 +99,7 @@
+
diff --git a/DICUI/External/ProtectionFind.cs b/DICUI/External/ProtectionFind.cs
index dd46f68b..7ce2e49a 100644
--- a/DICUI/External/ProtectionFind.cs
+++ b/DICUI/External/ProtectionFind.cs
@@ -24,7 +24,6 @@ using System.Text;
namespace DICUI.External
{
- // TODO: Add any missing protection schemes
public static class ProtectionFind
{
///
@@ -55,6 +54,10 @@ namespace DICUI.External
if (ProtectDVDVideo(path, files))
protections[path] = "Protect DVD-Video";
+ // Zzxzz
+ if (Directory.Exists(Path.Combine(path, "Zzxzz")))
+ protections[path] = "Zzxzz";
+
// Loop through all files and scan them
foreach (string file in files)
{
@@ -196,11 +199,11 @@ namespace DICUI.External
}
// SecuROM
- if ((FileContent.IndexOf("AddD" + (char)0x03 + (char)0x00 + (char)0x00 + (char)0x00)) > -1)
+ if ((position = FileContent.IndexOf("AddD" + (char)0x03 + (char)0x00 + (char)0x00 + (char)0x00)) > -1)
return "SecuROM " + GetSecuROM4Version(file, position);
if ((position = FileContent.IndexOf("" + (char)0xCA + (char)0xDD + (char)0xDD + (char)0xAC + (char)0x03)) > -1)
- return "SecuROM " + GetSecuROM4and5Version(file, --position);
+ return "SecuROM " + GetSecuROM4and5Version(file, position);
if (FileContent.StartsWith(".securom" + (char)0xE0 + (char)0xC0))
return "SecuROM " + GetSecuROM7Version(file);
@@ -337,13 +340,19 @@ namespace DICUI.External
#region Textfile Content Checks
- // No-op
+ if (extension == "txt" || extension == "rtf" || extension == "doc" || extension == "docx")
+ {
+ // No-op
+ }
#endregion
#region Archive Content Checks
- // No-op
+ if (extension == "7z" || extension == "cab" || extension == "rar" || extension == "zip")
+ {
+ // No-op
+ }
#endregion
@@ -501,10 +510,9 @@ namespace DICUI.External
private static string GetCDDVDCopsVersion(string file, int position)
{
- char[] version;
BinaryReader br = new BinaryReader(new StreamReader(file).BaseStream);
br.BaseStream.Seek(position + 15, SeekOrigin.Begin); // Begin reading after "CD-Cops, ver."
- version = br.ReadChars(4);
+ char[] version = br.ReadChars(4);
if (version[0] == 0x00)
return "";
return new string(version);
@@ -636,21 +644,19 @@ namespace DICUI.External
private static string GetProtectDiscVersionBuild76till10(string file, int position, out int irefBuild)
{
- irefBuild = 0;
- byte version, subversion, versionindicatorPD9, subsubversionPD9x, subversionPD9x1, subversionPD9x2;
BinaryReader br = new BinaryReader(new StreamReader(file).BaseStream);
br.BaseStream.Seek(position + 37, SeekOrigin.Begin);
- subversion = br.ReadByte();
+ byte subversion = br.ReadByte();
br.ReadByte();
- version = br.ReadByte();
+ byte version = br.ReadByte();
br.BaseStream.Seek(position + 49, SeekOrigin.Begin);
irefBuild = br.ReadInt32();
br.BaseStream.Seek(position + 53, SeekOrigin.Begin);
- versionindicatorPD9 = br.ReadByte();
+ byte versionindicatorPD9 = br.ReadByte();
br.BaseStream.Seek(position + 0x40, SeekOrigin.Begin);
- subsubversionPD9x = br.ReadByte();
- subversionPD9x2 = br.ReadByte();
- subversionPD9x1 = br.ReadByte();
+ byte subsubversionPD9x = br.ReadByte();
+ byte subversionPD9x2 = br.ReadByte();
+ byte subversionPD9x1 = br.ReadByte();
br.Close();
// version 7
@@ -703,14 +709,11 @@ namespace DICUI.External
private static string GetSafeDiscVersion(string file, int position)
{
- int version;
- int subVersion;
- int subsubVersion;
BinaryReader br = new BinaryReader(new StreamReader(file).BaseStream);
br.BaseStream.Seek(position + 20, SeekOrigin.Begin); // Begin reading after "BoG_ *90.0&!! Yy>" for old SafeDisc
- version = br.ReadInt32();
- subVersion = br.ReadInt32();
- subsubVersion = br.ReadInt32();
+ int version = br.ReadInt32();
+ int subVersion = br.ReadInt32();
+ int subsubVersion = br.ReadInt32();
if (version != 0)
return version + "." + subVersion.ToString("00") + "." + subsubVersion.ToString("000");
br.BaseStream.Seek(position + 18 + 14, SeekOrigin.Begin); // Begin reading after "BoG_ *90.0&!! Yy>" for newer SafeDisc
@@ -725,58 +728,40 @@ namespace DICUI.External
private static string GetSecuROM4Version(string file, int position)
{
- char version;
- char subVersion1;
- char subVersion2;
- char subsubVersion1;
- char subsubVersion2;
- char subsubsubVersion1;
- char subsubsubVersion2;
- char subsubsubVersion3;
- char subsubsubVersion4;
BinaryReader br = new BinaryReader(new StreamReader(file).BaseStream, Encoding.Default);
br.BaseStream.Seek(position + 8, SeekOrigin.Begin); // Begin reading after "AddD"
- version = br.ReadChar();
+ char version = br.ReadChar();
br.ReadByte();
- subVersion1 = br.ReadChar();
- subVersion2 = br.ReadChar();
+ char subVersion1 = br.ReadChar();
+ char subVersion2 = br.ReadChar();
br.ReadByte();
- subsubVersion1 = br.ReadChar();
- subsubVersion2 = br.ReadChar();
+ char subsubVersion1 = br.ReadChar();
+ char subsubVersion2 = br.ReadChar();
br.ReadByte();
- subsubsubVersion1 = br.ReadChar();
- subsubsubVersion2 = br.ReadChar();
- subsubsubVersion3 = br.ReadChar();
- subsubsubVersion4 = br.ReadChar();
+ char subsubsubVersion1 = br.ReadChar();
+ char subsubsubVersion2 = br.ReadChar();
+ char subsubsubVersion3 = br.ReadChar();
+ char subsubsubVersion4 = br.ReadChar();
br.Close();
return version + "." + subVersion1 + subVersion2 + "." + subsubVersion1 + subsubVersion2 + "." + subsubsubVersion1 + subsubsubVersion2 + subsubsubVersion3 + subsubsubVersion4;
}
private static string GetSecuROM4and5Version(string file, int position)
{
- byte version;
- byte subVersion1;
- byte subVersion2;
- byte subsubVersion1;
- byte subsubVersion2;
- byte subsubsubVersion1;
- byte subsubsubVersion2;
- byte subsubsubVersion3;
- byte subsubsubVersion4;
BinaryReader br = new BinaryReader(new StreamReader(file).BaseStream);
br.BaseStream.Seek(position + 8, SeekOrigin.Begin); // Begin reading after "ÊÝݬ"
- version = (byte)(br.ReadByte() & 0xF);
+ byte version = (byte)(br.ReadByte() & 0xF);
br.ReadByte();
- subVersion1 = (byte)(br.ReadByte() ^ 36);
- subVersion2 = (byte)(br.ReadByte() ^ 28);
+ byte subVersion1 = (byte)(br.ReadByte() ^ 36);
+ byte subVersion2 = (byte)(br.ReadByte() ^ 28);
br.ReadByte();
- subsubVersion1 = (byte)(br.ReadByte() ^ 42);
- subsubVersion2 = (byte)(br.ReadByte() ^ 8);
+ byte subsubVersion1 = (byte)(br.ReadByte() ^ 42);
+ byte subsubVersion2 = (byte)(br.ReadByte() ^ 8);
br.ReadByte();
- subsubsubVersion1 = (byte)(br.ReadByte() ^ 16);
- subsubsubVersion2 = (byte)(br.ReadByte() ^ 116);
- subsubsubVersion3 = (byte)(br.ReadByte() ^ 34);
- subsubsubVersion4 = (byte)(br.ReadByte() ^ 22);
+ byte subsubsubVersion1 = (byte)(br.ReadByte() ^ 16);
+ byte subsubsubVersion2 = (byte)(br.ReadByte() ^ 116);
+ byte subsubsubVersion3 = (byte)(br.ReadByte() ^ 34);
+ byte subsubsubVersion4 = (byte)(br.ReadByte() ^ 22);
br.Close();
if (version == 0 || version > 9)
return "";
@@ -788,7 +773,7 @@ namespace DICUI.External
BinaryReader br = new BinaryReader(new StreamReader(file).BaseStream);
br.BaseStream.Seek(236, SeekOrigin.Begin);
byte[] bytes = br.ReadBytes(4);
- // if bytes(0) = 0xED && bytes(3) = 0x5C {
+ // if (bytes[0] == 0xED && bytes[3] == 0x5C {
if (bytes[3] == 0x5C)
{
//SecuROM 7 new and 8
@@ -807,13 +792,11 @@ namespace DICUI.External
private static string GetSysiphusVersion(string file, int position)
{
- char version;
- char subVersion;
BinaryReader br = new BinaryReader(new StreamReader(file).BaseStream, Encoding.Default);
br.BaseStream.Seek(position - 3, SeekOrigin.Begin);
- subVersion = br.ReadChar();
+ char subVersion = br.ReadChar();
br.ReadChar();
- version = br.ReadChar();
+ char version = br.ReadChar();
br.Close();
if (Char.IsNumber(version) && Char.IsNumber(subVersion))
return version + "." + subVersion;
@@ -853,17 +836,14 @@ namespace DICUI.External
private static string GetVOBProtectCDDVDVersion(string file, int position)
{
- byte version;
- byte subVersion;
- byte subsubVersion;
BinaryReader br = new BinaryReader(new StreamReader(file).BaseStream, Encoding.Default);
br.BaseStream.Seek(position - 2, SeekOrigin.Begin);
- version = br.ReadByte();
+ byte version = br.ReadByte();
if (version == 5)
{
br.BaseStream.Seek(position - 4, SeekOrigin.Begin);
- subsubVersion = (byte)((br.ReadByte() & 0xF0) >> 4);
- subVersion = (byte)((br.ReadByte() & 0xF0) >> 4);
+ byte subsubVersion = (byte)((br.ReadByte() & 0xF0) >> 4);
+ byte subVersion = (byte)((br.ReadByte() & 0xF0) >> 4);
br.Close();
return version + "." + subVersion + "." + subsubVersion;
}
@@ -1077,6 +1057,9 @@ namespace DICUI.External
mapping.Add("ECDPlayerControl.ocx", "XCP");
mapping.Add("go.exe", "XCP"); // Path.Combine("contents", "go.exe")
+ // Zzxzz
+ mapping.Add("Zzz.aze", "Zzxzz"); // Path.Combine("Zzxxzz", "Zzz.aze")
+
return mapping;
}
diff --git a/DICUI/MainWindow.xaml.cs b/DICUI/MainWindow.xaml.cs
index cc37b7e0..d35aa6d6 100644
--- a/DICUI/MainWindow.xaml.cs
+++ b/DICUI/MainWindow.xaml.cs
@@ -221,12 +221,14 @@ namespace DICUI
cmb_DriveLetter.SelectedIndex = 0;
lbl_Status.Content = "Valid media found! Choose your Media Type";
btn_StartStop.IsEnabled = true;
+ btn_Scan.IsEnabled = true;
}
else
{
cmb_DriveLetter.SelectedIndex = -1;
lbl_Status.Content = "No valid media found!";
btn_StartStop.IsEnabled = false;
+ btn_Scan.IsEnabled = false;
}
}
@@ -250,8 +252,6 @@ namespace DICUI
/// Filled DumpEnvironment instance
private DumpEnvironment DetermineEnvironment()
{
- // Populate all KVPs
-
return new DumpEnvironment()
{
// Paths to tools
@@ -266,7 +266,7 @@ namespace DICUI
DICParameters = txt_Parameters.Text,
- System = (KnownSystem?)(cmb_SystemType.SelectedItem as KnownSystemComboBoxItem),
+ System = cmb_SystemType.SelectedItem as KnownSystemComboBoxItem,
Type = cmb_MediaType.SelectedItem as MediaType?
};
}
@@ -297,12 +297,24 @@ namespace DICUI
private void EnsureDiscInformation()
{
// Get the selected system info
- KnownSystem? selectedSystem = (KnownSystem?)(cmb_SystemType.SelectedItem as KnownSystemComboBoxItem) ?? KnownSystem.NONE;
+ KnownSystem? selectedSystem = (KnownSystem?)(cmb_SystemType.SelectedItem as KnownSystemComboBoxItem) ?? KnownSystem.NONE;
MediaType? selectedMediaType = cmb_MediaType.SelectedItem as MediaType? ?? MediaType.NONE;
- Result result = GetSupportStatus(selectedSystem, selectedMediaType);
+ Result result = Validators.GetSupportStatus(selectedSystem, selectedMediaType);
+ string resultMessage = result.Message;
+ if (result && _currentMediaType != null && _currentMediaType != MediaType.NONE)
+ {
+ // If the current media type is still supported, change the index to that
+ int index = _mediaTypes.IndexOf(_currentMediaType);
+ if (index != -1 && cmb_MediaType.SelectedIndex != index)
+ cmb_MediaType.SelectedIndex = index;
- lbl_Status.Content = result.Message;
+ // Otherwise, we tell the user that the disc/system combo is not supported
+ else
+ resultMessage = $"Disc of type {_currentMediaType.Name()} found, but the current system does not support it!";
+ };
+
+ lbl_Status.Content = resultMessage;
btn_StartStop.IsEnabled = result && (_drives != null && _drives.Count > 0 ? true : false);
// If we're in a type that doesn't support drive speeds
@@ -353,74 +365,6 @@ namespace DICUI
}
}
- ///
- /// Verify that, given a system and a media type, they are correct
- ///
- private Result GetSupportStatus(KnownSystem? system, MediaType? type)
- {
- // No system chosen, update status
- if (system == KnownSystem.NONE)
- return Result.Failure("Please select a valid system");
- // custom system chosen, then don't check anything
- else if (system == KnownSystem.Custom)
- return Result.Success("{0} ready to dump", type.Name());
-
- // If we're on an unsupported type, update the status accordingly
- switch (type)
- {
- // Fully supported types
- case MediaType.CD:
- case MediaType.DVD:
- case MediaType.HDDVD:
- case MediaType.BluRay:
- if (system == KnownSystem.MicrosoftXBOX360XDG3)
- {
- return Result.Failure("{0} discs are not currently supported by DIC", type.Name());
- }
- else
- {
- // TODO: this code should adjust things in a method which is meant to verify values so maybe we can find a better fit
- // Take care of the selected item
- if (_currentMediaType != null && _currentMediaType != MediaType.NONE)
- {
- int index = _mediaTypes.IndexOf(_currentMediaType);
- if (index != -1)
- {
- if (cmb_MediaType.SelectedIndex != index)
- {
- cmb_MediaType.SelectedIndex = index;
- }
- }
- else
- {
- return Result.Success("Disc of type {0} found, but the current system does not support it!", _currentMediaType.Name());
- }
- }
- }
- return Result.Success("{0} ready to dump", type.Name());
-
- // Partially supported types
- case MediaType.GDROM:
- case MediaType.GameCubeGameDisc:
- case MediaType.WiiOpticalDisc:
- return Result.Success("{0} discs are partially supported by DIC", type.Name());
-
- // Undumpable but recognized types
- case MediaType.LaserDisc:
- case MediaType.WiiUOpticalDisc:
- case MediaType.CED:
- case MediaType.UMD:
- case MediaType.Cartridge:
- case MediaType.Cassette:
- return Result.Failure("{0} discs are not currently supported by DIC", type.Name());
-
- // Invalid or unknown types
- case MediaType.NONE:
- default:
- return Result.Failure("Please select a valid disc type");
- }
- }
-
///
/// Get the default output directory name from the currently selected drive
///
@@ -471,54 +415,27 @@ namespace DICUI
}
///
- /// Get the highest supported drive speed as reported by DiscImageCreator
+ /// Set the drive speed based on reported maximum and user-defined option
///
- private void SetSupportedDriveSpeed()
+ private async void SetSupportedDriveSpeed()
{
// Set the drive speed list that's appropriate
var values = AllowedSpeeds.GetForMediaType(_currentMediaType);
cmb_DriveSpeed.ItemsSource = values;
cmb_DriveSpeed.SelectedIndex = values.Count / 2;
- // Get the drive letter from the selected item
- Drive drive = cmb_DriveLetter.SelectedItem as Drive;
- if (drive == null || drive.IsFloppy)
+ // Get the current environment
+ var env = DetermineEnvironment();
+
+ // Get the drive speed
+ int speed = await Tasks.GetDiscSpeed(env);
+
+ // If we have an invalid speed, we need to jump out
+ // TODO: Should we disable dumping in this case?
+ if (speed == -1)
return;
- //Validators.GetDriveSpeed((char)selected?.Key);
- //Validators.GetDriveSpeedEx((char)selected?.Key, _currentMediaType);
-
- // Validate that the required program exists and it's not DICUI itself
- if (!File.Exists(_options.dicPath) ||
- Path.GetFullPath(_options.dicPath) == Path.GetFullPath(Process.GetCurrentProcess().MainModule.FileName))
- {
- return;
- }
-
- Process childProcess = new Process()
- {
- StartInfo = new ProcessStartInfo()
- {
- FileName = _options.dicPath,
- Arguments = DICCommands.DriveSpeed + " " + drive.Letter,
- CreateNoWindow = true,
- UseShellExecute = false,
- RedirectStandardOutput = true,
- },
- };
- childProcess.Start();
- childProcess.WaitForExit();
- string output = childProcess.StandardOutput.ReadToEnd();
-
- int index = output.IndexOf("ReadSpeedMaximum:");
- string readspeed = Regex.Match(output.Substring(index), @"ReadSpeedMaximum: [0-9]+KB/sec \(([0-9]*)x\)").Groups[1].Value;
- if (!Int32.TryParse(readspeed, out int speed) || speed <= 0)
- {
- return;
- }
-
- // choose speed value according to maximum value reported by DIC adjusted to a precise speed from list
- // and the one choosen in options
+ // Choose the lower of the two speeds between the allowed speeds and the user-defined one
int chosenSpeed = Math.Min(
AllowedSpeeds.GetForMediaType(_currentMediaType).Where(s => s <= speed).Last(),
_options.preferredDumpSpeedCD
diff --git a/DICUI/Tasks.cs b/DICUI/Tasks.cs
index ef9b2d1d..aa1086c5 100644
--- a/DICUI/Tasks.cs
+++ b/DICUI/Tasks.cs
@@ -1,7 +1,9 @@
-using System.Collections.Generic;
+using System;
+using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
+using System.Text.RegularExpressions;
using System.Threading.Tasks;
using System.Windows;
using DICUI.Data;
@@ -40,6 +42,70 @@ namespace DICUI
///
public class Tasks
{
+ ///
+ /// Get disc speed using DIC
+ ///
+ /// Drive speed if possible, -1 on error
+ public static async Task GetDiscSpeed(DumpEnvironment env)
+ {
+ // Validate that the required program exists
+ if (!File.Exists(env.DICPath))
+ return -1;
+
+ // Validate that the drive is set up
+ if (env.Drive == null)
+ return -1;
+
+ // Validate we're not trying to get the speed for a floppy disk
+ if (env.IsFloppy)
+ return -1;
+
+ // Get the drive speed directly
+ //int speed = Validators.GetDriveSpeed((char)selected?.Key);
+ //int speed = Validators.GetDriveSpeedEx((char)selected?.Key, _currentMediaType);
+
+ // Get the drive speed from DIC, if possible
+ Process childProcess;
+ string output = await Task.Run(() =>
+ {
+ childProcess = new Process()
+ {
+ StartInfo = new ProcessStartInfo()
+ {
+ FileName = env.DICPath,
+ Arguments = DICCommands.DriveSpeed + " " + env.Drive.Letter,
+ CreateNoWindow = true,
+ UseShellExecute = false,
+ RedirectStandardOutput = true,
+ },
+ };
+ childProcess.Start();
+ childProcess.WaitForExit();
+ return childProcess.StandardOutput.ReadToEnd();
+ });
+
+ // If we get that the firmware is out of date, tell the user
+ if (output.Contains("[ERROR] This drive isn't latest firmware. Please update."))
+ {
+ MessageBox.Show($"DiscImageCreator has reported that drive {env.Drive.Letter} is not updated to the most recent firmware. Please update the firmware for your drive and try again.", "Outdated Firmware", MessageBoxButton.OK, MessageBoxImage.Error);
+ return -1;
+ }
+ // Otherwise, if we find the maximum read speed as reported
+ else if (output.Contains("ReadSpeedMaximum:"))
+ {
+ int index = output.IndexOf("ReadSpeedMaximum:");
+ string readspeed = Regex.Match(output.Substring(index), @"ReadSpeedMaximum: [0-9]+KB/sec \(([0-9]*)x\)").Groups[1].Value;
+ if (!Int32.TryParse(readspeed, out int speed) || speed <= 0)
+ {
+ return -1;
+ }
+
+ return speed;
+ }
+
+ return -1;
+ }
+
///
/// Eject the disc using DIC
///
@@ -51,6 +117,7 @@ namespace DICUI
CancelDumping(env);
+ // Validate we're not trying to eject a floppy disk
if (env.IsFloppy)
return;
diff --git a/DICUI/Utilities/Converters.cs b/DICUI/Utilities/Converters.cs
index b7ba8f66..e4c48ccb 100644
--- a/DICUI/Utilities/Converters.cs
+++ b/DICUI/Utilities/Converters.cs
@@ -5,121 +5,8 @@ using System.Windows.Data;
using IMAPI2;
using DICUI.Data;
-// TODO: Consider making the *Extensions classes into its own file
namespace DICUI.Utilities
{
- ///
- /// Extensions for MediaType? for easier calling
- ///
- public static class MediaTypeExtensions
- {
- public static string Name(this MediaType? type)
- {
- return Converters.MediaTypeToString(type);
- }
-
- public static string Extension(this MediaType? type)
- {
- return Converters.MediaTypeToExtension(type);
- }
-
- public static bool DoesSupportDriveSpeed(this MediaType? type)
- {
- switch(type)
- {
- case MediaType.CD:
- case MediaType.DVD:
- case MediaType.GDROM:
- case MediaType.HDDVD:
- case MediaType.GameCubeGameDisc:
- case MediaType.WiiOpticalDisc:
- return true;
- default:
- return false;
- }
- }
- }
-
- ///
- /// Extensions for KnownSystem? for easier calling
- ///
- public static class KnownSystemExtensions
- {
- public static string Name(this KnownSystem? system)
- {
- return Converters.KnownSystemToString(system);
- }
-
- public static bool DoesSupportDriveSpeed(this KnownSystem? system)
- {
- switch (system)
- {
- case KnownSystem.MicrosoftXBOX:
- case KnownSystem.MicrosoftXBOX360XDG2:
- case KnownSystem.MicrosoftXBOX360XDG3:
- return false;
- default:
- return true;
- }
- }
-
- public static KnownSystemCategory Category(this KnownSystem? system)
- {
- if (system < KnownSystem.MarkerConsoleEnd)
- return KnownSystemCategory.Console;
- else if (system < KnownSystem.MarkerComputerEnd)
- return KnownSystemCategory.Computer;
- else if (system < KnownSystem.MarkerArcadeEnd)
- return KnownSystemCategory.Arcade;
- else if (system < KnownSystem.MarkerOtherEnd)
- return KnownSystemCategory.Other;
- else
- return KnownSystemCategory.Custom;
- }
-
- public static bool IsMarker(this KnownSystem? system)
- {
- switch (system)
- {
- case KnownSystem.MarkerArcadeEnd:
- case KnownSystem.MarkerComputerEnd:
- case KnownSystem.MarkerConsoleEnd:
- case KnownSystem.MarkerOtherEnd:
- return true;
- default:
- return false;
- }
- }
- }
-
- ///
- /// Extensions for KnownSystemCategory?
- ///
- public static class KnownSystemCategoryExtensions
- {
- ///
- /// Get the string representation of a KnownSystemCategory
- ///
- public static string Name(this KnownSystemCategory? category)
- {
- switch (category)
- {
- case KnownSystemCategory.Arcade:
- return "Arcade";
- case KnownSystemCategory.Computer:
- return "Computers";
- case KnownSystemCategory.Console:
- return "Consoles";
- case KnownSystemCategory.Other:
- return "Other";
- case KnownSystemCategory.Custom:
- return "Custom";
- default:
- return "";
- }
- }
- }
-
///
/// Used to provide a converter to XAML files to render comboboxes with enum values
///
diff --git a/DICUI/Utilities/DumpEnvironment.cs b/DICUI/Utilities/DumpEnvironment.cs
index e7048a07..37efc088 100644
--- a/DICUI/Utilities/DumpEnvironment.cs
+++ b/DICUI/Utilities/DumpEnvironment.cs
@@ -11,6 +11,26 @@ using DICUI.Data;
namespace DICUI.Utilities
{
+ ///
+ /// Represents information for a single drive
+ ///
+ public class Drive
+ {
+ public char Letter { get; private set; }
+ public bool IsFloppy { get; private set; }
+ public string VolumeLabel { get; private set; }
+
+ private Drive(char letter, string volumeLabel, bool isFloppy)
+ {
+ this.Letter = letter;
+ this.IsFloppy = isFloppy;
+ this.VolumeLabel = volumeLabel;
+ }
+
+ public static Drive Floppy(char letter) => new Drive(letter, null, true);
+ public static Drive Optical(char letter, string volumeLabel) => new Drive(letter, volumeLabel, false);
+ }
+
///
/// Represents the state of all settings to be used during dumping
///
diff --git a/DICUI/Utilities/Extensions.cs b/DICUI/Utilities/Extensions.cs
new file mode 100644
index 00000000..2b969038
--- /dev/null
+++ b/DICUI/Utilities/Extensions.cs
@@ -0,0 +1,116 @@
+using DICUI.Data;
+
+namespace DICUI.Utilities
+{
+ ///
+ /// Extensions for MediaType? for easier calling
+ ///
+ public static class MediaTypeExtensions
+ {
+ public static string Name(this MediaType? type)
+ {
+ return Converters.MediaTypeToString(type);
+ }
+
+ public static string Extension(this MediaType? type)
+ {
+ return Converters.MediaTypeToExtension(type);
+ }
+
+ public static bool DoesSupportDriveSpeed(this MediaType? type)
+ {
+ switch (type)
+ {
+ case MediaType.CD:
+ case MediaType.DVD:
+ case MediaType.GDROM:
+ case MediaType.HDDVD:
+ case MediaType.GameCubeGameDisc:
+ case MediaType.WiiOpticalDisc:
+ return true;
+ default:
+ return false;
+ }
+ }
+ }
+
+ ///
+ /// Extensions for KnownSystem? for easier calling
+ ///
+ public static class KnownSystemExtensions
+ {
+ public static string Name(this KnownSystem? system)
+ {
+ return Converters.KnownSystemToString(system);
+ }
+
+ public static bool DoesSupportDriveSpeed(this KnownSystem? system)
+ {
+ switch (system)
+ {
+ case KnownSystem.MicrosoftXBOX:
+ case KnownSystem.MicrosoftXBOX360XDG2:
+ case KnownSystem.MicrosoftXBOX360XDG3:
+ return false;
+ default:
+ return true;
+ }
+ }
+
+ public static KnownSystemCategory Category(this KnownSystem? system)
+ {
+ if (system < KnownSystem.MarkerConsoleEnd)
+ return KnownSystemCategory.Console;
+ else if (system < KnownSystem.MarkerComputerEnd)
+ return KnownSystemCategory.Computer;
+ else if (system < KnownSystem.MarkerArcadeEnd)
+ return KnownSystemCategory.Arcade;
+ else if (system < KnownSystem.MarkerOtherEnd)
+ return KnownSystemCategory.Other;
+ else
+ return KnownSystemCategory.Custom;
+ }
+
+ public static bool IsMarker(this KnownSystem? system)
+ {
+ switch (system)
+ {
+ case KnownSystem.MarkerArcadeEnd:
+ case KnownSystem.MarkerComputerEnd:
+ case KnownSystem.MarkerConsoleEnd:
+ case KnownSystem.MarkerOtherEnd:
+ return true;
+ default:
+ return false;
+ }
+ }
+ }
+
+ ///
+ /// Extensions for KnownSystemCategory?
+ ///
+ public static class KnownSystemCategoryExtensions
+ {
+ ///
+ /// Get the string representation of a KnownSystemCategory
+ ///
+ public static string Name(this KnownSystemCategory? category)
+ {
+ switch (category)
+ {
+ case KnownSystemCategory.Arcade:
+ return "Arcade";
+ case KnownSystemCategory.Computer:
+ return "Computers";
+ case KnownSystemCategory.Console:
+ return "Consoles";
+ case KnownSystemCategory.Other:
+ return "Other";
+ case KnownSystemCategory.Custom:
+ return "Custom";
+ default:
+ return "";
+ }
+ }
+ }
+}
diff --git a/DICUI/Utilities/Validators.cs b/DICUI/Utilities/Validators.cs
index 7fc8a7e2..cbf84306 100644
--- a/DICUI/Utilities/Validators.cs
+++ b/DICUI/Utilities/Validators.cs
@@ -10,25 +10,6 @@ using DICUI.Data;
namespace DICUI.Utilities
{
- // TODO: Consider putting this in its own file, or with DumpEnvironment
- // TODO: Investigate whether or not this could be a struct
- public class Drive
- {
- public char Letter { get; private set; }
- public bool IsFloppy { get; private set; }
- public string VolumeLabel { get; private set; }
-
- private Drive(char letter, string volumeLabel, bool isFloppy)
- {
- this.Letter = letter;
- this.IsFloppy = isFloppy;
- this.VolumeLabel = volumeLabel;
- }
-
- public static Drive Floppy(char letter) => new Drive(letter, null, true);
- public static Drive Optical(char letter, string volumeLabel) => new Drive(letter, volumeLabel, false);
- }
-
public static class Validators
{
///
@@ -678,6 +659,54 @@ namespace DICUI.Utilities
return -1;
}
+
+ ///
+ /// Verify that, given a system and a media type, they are correct
+ ///
+ public static Result GetSupportStatus(KnownSystem? system, MediaType? type)
+ {
+ // No system chosen, update status
+ if (system == KnownSystem.NONE)
+ return Result.Failure("Please select a valid system");
+ // custom system chosen, then don't check anything
+ else if (system == KnownSystem.Custom)
+ return Result.Success("{0} ready to dump", type.Name());
+
+ // If we're on an unsupported type, update the status accordingly
+ switch (type)
+ {
+ // Fully supported types
+ case MediaType.CD:
+ case MediaType.DVD:
+ case MediaType.HDDVD:
+ case MediaType.BluRay:
+ if (system == KnownSystem.MicrosoftXBOX360XDG3)
+ {
+ return Result.Failure("{0} discs are not currently supported by DIC", type.Name());
+ }
+ return Result.Success("{0} ready to dump", type.Name());
+
+ // Partially supported types
+ case MediaType.GDROM:
+ case MediaType.GameCubeGameDisc:
+ case MediaType.WiiOpticalDisc:
+ return Result.Success("{0} discs are partially supported by DIC", type.Name());
+
+ // Undumpable but recognized types
+ case MediaType.LaserDisc:
+ case MediaType.WiiUOpticalDisc:
+ case MediaType.CED:
+ case MediaType.UMD:
+ case MediaType.Cartridge:
+ case MediaType.Cassette:
+ return Result.Failure("{0} discs are not currently supported by DIC", type.Name());
+
+ // Invalid or unknown types
+ case MediaType.NONE:
+ default:
+ return Result.Failure("Please select a valid disc type");
+ }
+ }
///
/// Validate that at string would be valid as input to DiscImageCreator
///