diff --git a/Utilities.cs b/Utilities.cs index dddff8d2..e276b160 100644 --- a/Utilities.cs +++ b/Utilities.cs @@ -1262,6 +1262,7 @@ namespace DICUI /// /// String representing all parameters /// True if it would be valid, false otherwise + /// TODO: Refactor this to make it cleaner public static bool ValidateParameters(string parameters) { // The string has to be valid by itself first @@ -1302,41 +1303,113 @@ namespace DICUI // Loop through all auxilary flags for (int i = 4; i < parts.Count; i++) { - switch (parts[i]) - { - case Constants.DisableBeepFlag: - case Constants.CDD8OpcodeFlag: - case Constants.CDMCNFlag: - case Constants.CDAMSFFlag: - case Constants.CDReverseFlag: - case Constants.CDMultiSessionFlag: - case Constants.CDScanSectorProtectFlag: - case Constants.CDScanAnitModFlag: - case Constants.CDNoFixSubPFlag: - case Constants.CDNoFixSubQFlag: - case Constants.CDNoFixSubRtoWFlag: - case Constants.CDNoFixSubQLibCryptFlag: - case Constants.CDNoFixSubQSecuROMFlag: - // No-op, all of these are single flags - break; - case Constants.CDScanFileProtectFlag: - // TODO: Check if next is a valid number (timeout) - break; - case Constants.ForceUnitAccessFlag: - // TODO: Check next as valid number - break; - case Constants.CDAddOffsetFlag: - // TODO: Check next as valid number - break; - case Constants.CDBEOpcodeFlag: - // TODO: Check next as valid (raw/pack) - break; + switch (parts[i]) + { + case Constants.DisableBeepFlag: + case Constants.CDD8OpcodeFlag: + case Constants.CDMCNFlag: + case Constants.CDAMSFFlag: + case Constants.CDReverseFlag: + case Constants.CDMultiSessionFlag: + case Constants.CDScanSectorProtectFlag: + case Constants.CDScanAnitModFlag: + case Constants.CDNoFixSubPFlag: + case Constants.CDNoFixSubQFlag: + case Constants.CDNoFixSubRtoWFlag: + case Constants.CDNoFixSubQLibCryptFlag: + case Constants.CDNoFixSubQSecuROMFlag: + // No-op, all of these are single flags + break; + case Constants.CDScanFileProtectFlag: + // If the next item is a flag, it's good + if (parts[i + 1].StartsWith("\\")) + { + break; + } + // If the next item isn't a valid number + else if (!Int32.TryParse(parts[i + 1], out int sfp1)) + { + return false; + } + else if (sfp1 < 0) + { + return false; + } + i++; + break; + case Constants.ForceUnitAccessFlag: + // If the next item is a flag, it's good + if (parts[i + 1].StartsWith("\\")) + { + break; + } + // If the next item isn't a valid number + else if (!Int32.TryParse(parts[i + 1], out int fua1)) + { + return false; + } + else if (fua1 < 0) + { + return false; + } + i++; + break; + case Constants.CDAddOffsetFlag: + // If the next item isn't a valid number + if (!Int32.TryParse(parts[i + 1], out int af1)) + { + return false; + } + break; + case Constants.CDBEOpcodeFlag: + // If the next item is a flag, it's good + if (parts[i + 1].StartsWith("\\")) + { + break; + } + else if (parts[i + 1] != "raw" + && (parts[i + 1] != "pack")) + { + return false; + } + i++; + break; case Constants.CDC2OpcodeFlag: - // TODO: Check next (0-4) are valid numbers - break; + for (int j = 1; j < 4; j++) + { + // If the next item is a flag, it's good + if (parts[i + j].StartsWith("\\")) + { + i += (j - 1); + break; + } + // If the next item isn't a valid number + else if (!Int32.TryParse(parts[i + j], out int c2)) + { + return false; + } + else if (c2 < 0) + { + return false; + } + } + break; case Constants.CDSubchannelReadLevelFlag: - // TODO: Check next as valid number (0-2) - break; + // If the next item is a flag, it's good + if (parts[i + 1].StartsWith("\\")) + { + break; + } + // If the next item isn't a valid number + else if (!Int32.TryParse(parts[i + 1], out int sub)) + { + return false; + } + else if (sub < 0 || sub > 2) + { + return false; + } + break; default: return false; } @@ -1374,17 +1447,72 @@ namespace DICUI // No-op, all of these are single flags break; case Constants.ForceUnitAccessFlag: - // TODO: Check next as valid number - break; + // If the next item is a flag, it's good + if (parts[i + 1].StartsWith("\\")) + { + break; + } + // If the next item isn't a valid number + else if (!Int32.TryParse(parts[i + 1], out int fua1)) + { + return false; + } + else if (fua1 < 0) + { + return false; + } + i++; + break; case Constants.CDBEOpcodeFlag: - // TODO: Check next as valid (raw/pack) - break; + // If the next item is a flag, it's good + if (parts[i + 1].StartsWith("\\")) + { + break; + } + else if (parts[i + 1] != "raw" + && (parts[i + 1] != "pack")) + { + return false; + } + i++; + break; case Constants.CDC2OpcodeFlag: - // TODO: Check next (0-4) are valid numbers - break; + for (int j = 1; j < 4; j++) + { + // If the next item is a flag, it's good + if (parts[i + j].StartsWith("\\")) + { + i += (j - 1); + break; + } + // If the next item isn't a valid number + else if (!Int32.TryParse(parts[i + j], out int c2)) + { + return false; + } + else if (c2 < 0) + { + return false; + } + } + break; case Constants.CDSubchannelReadLevelFlag: - // TODO: Check next as valid number (0-2) - break; + // If the next item is a flag, it's good + if (parts[i + 1].StartsWith("\\")) + { + break; + } + // If the next item isn't a valid number + else if (!Int32.TryParse(parts[i + 1], out int sub)) + { + return false; + } + else if (sub < 0 || sub > 2) + { + return false; + } + i++; + break; default: return false; } @@ -1429,20 +1557,89 @@ namespace DICUI // No-op, all of these are single flags break; case Constants.ForceUnitAccessFlag: - // TODO: Check next as valid number - break; + // If the next item is a flag, it's good + if (parts[i + 1].StartsWith("\\")) + { + break; + } + // If the next item isn't a valid number + else if (!Int32.TryParse(parts[i + 1], out int fua1)) + { + return false; + } + else if (fua1 < 0) + { + return false; + } + i++; + break; case Constants.CDScanFileProtectFlag: - // TODO: Check if next is a valid number (timeout) - break; + // If the next item is a flag, it's good + if (parts[i + 1].StartsWith("\\")) + { + break; + } + // If the next item isn't a valid number + else if (!Int32.TryParse(parts[i + 1], out int sfp1)) + { + return false; + } + else if (sfp1 < 0) + { + return false; + } + i++; + break; case Constants.CDBEOpcodeFlag: - // TODO: Check next as valid (raw/pack) - break; + // If the next item is a flag, it's good + if (parts[i + 1].StartsWith("\\")) + { + break; + } + else if (parts[i + 1] != "raw" + && (parts[i + 1] != "pack")) + { + return false; + } + i++; + break; case Constants.CDC2OpcodeFlag: - // TODO: Check next (0-4) are valid numbers - break; + for (int j = 1; j < 4; j++) + { + // If the next item is a flag, it's good + if (parts[i + j].StartsWith("\\")) + { + i += (j - 1); + break; + } + // If the next item isn't a valid number + else if (!Int32.TryParse(parts[i + j], out int c2)) + { + return false; + } + else if (c2 < 0) + { + return false; + } + } + break; case Constants.CDSubchannelReadLevelFlag: - // TODO: Check next as valid number (0-2) - break; + // If the next item is a flag, it's good + if (parts[i + 1].StartsWith("\\")) + { + break; + } + // If the next item isn't a valid number + else if (!Int32.TryParse(parts[i + 1], out int sub)) + { + return false; + } + else if (sub < 0 || sub > 2) + { + return false; + } + i++; + break; default: return false; } @@ -1485,20 +1682,79 @@ namespace DICUI // No-op, all of these are single flags break; case Constants.ForceUnitAccessFlag: - // TODO: Check next as valid number - break; + // If the next item is a flag, it's good + if (parts[i + 1].StartsWith("\\")) + { + break; + } + // If the next item isn't a valid number + else if (!Int32.TryParse(parts[i + 1], out int fua1)) + { + return false; + } + else if (fua1 < 0) + { + return false; + } + i++; + break; case Constants.CDAddOffsetFlag: - // TODO: Check next as valid number - break; + // If the next item isn't a valid number + if (!Int32.TryParse(parts[i + 1], out int af1)) + { + return false; + } + break; case Constants.CDBEOpcodeFlag: - // TODO: Check next as valid (raw/pack) - break; + // If the next item is a flag, it's good + if (parts[i + 1].StartsWith("\\")) + { + break; + } + else if (parts[i + 1] != "raw" + && (parts[i + 1] != "pack")) + { + return false; + } + i++; + break; case Constants.CDC2OpcodeFlag: - // TODO: Check next (0-4) are valid numbers - break; + for (int j = 1; j < 4; j++) + { + // If the next item is a flag, it's good + if (parts[i + j].StartsWith("\\")) + { + i += (j - 1); + break; + } + // If the next item isn't a valid number + else if (!Int32.TryParse(parts[i + j], out int c2)) + { + return false; + } + else if (c2 < 0) + { + return false; + } + } + break; case Constants.CDSubchannelReadLevelFlag: - // TODO: Check next as valid number (0-2) - break; + // If the next item is a flag, it's good + if (parts[i + 1].StartsWith("\\")) + { + break; + } + // If the next item isn't a valid number + else if (!Int32.TryParse(parts[i + 1], out int sub)) + { + return false; + } + else if (sub < 0 || sub > 2) + { + return false; + } + i++; + break; default: return false; } @@ -1533,8 +1789,22 @@ namespace DICUI // No-op, all of these are single flags break; case Constants.ForceUnitAccessFlag: - // TODO: Check next as valid number - break; + // If the next item is a flag, it's good + if (parts[i + 1].StartsWith("\\")) + { + break; + } + // If the next item isn't a valid number + else if (!Int32.TryParse(parts[i + 1], out int fua1)) + { + return false; + } + else if (fua1 < 0) + { + return false; + } + i++; + break; default: return false; } @@ -1559,8 +1829,22 @@ namespace DICUI // No-op, this is a single flag break; case Constants.ForceUnitAccessFlag: - // TODO: Check next as valid number - break; + // If the next item is a flag, it's good + if (parts[i + 1].StartsWith("\\")) + { + break; + } + // If the next item isn't a valid number + else if (!Int32.TryParse(parts[i + 1], out int fua1)) + { + return false; + } + else if (fua1 < 0) + { + return false; + } + i++; + break; default: return false; }