From 42597b89cfe7fe52fe680bd769ac03cf7d09207d Mon Sep 17 00:00:00 2001 From: Natalia Portillo Date: Tue, 21 Sep 2021 04:55:28 +0100 Subject: [PATCH] Remove all image thrown exceptions. --- Aaru.CommonTypes | 2 +- Aaru.Filesystems/CPM/Definitions.cs | 3 +- Aaru.Images/AaruFormat/Write.cs | 13 +- Aaru.Images/Alcohol120/Read.cs | 10 +- Aaru.Images/Apridisk/Read.cs | 10 +- Aaru.Images/BlindWrite4/Read.cs | 6 +- Aaru.Images/BlindWrite5/Read.cs | 3 +- Aaru.Images/CDRDAO/Identify.cs | 2 +- Aaru.Images/CDRDAO/Read.cs | 6 +- Aaru.Images/CDRWin/Identify.cs | 4 +- Aaru.Images/CDRWin/Read.cs | 216 ++++++++++++++++++-------- Aaru.Images/CHD/Helpers.cs | 100 ++++++++---- Aaru.Images/CHD/Properties.cs | 3 +- Aaru.Images/CHD/Read.cs | 35 ++--- Aaru.Images/CHD/Verify.cs | 18 ++- Aaru.Images/CisCopy/Read.cs | 12 +- Aaru.Images/CloneCD/Identify.cs | 2 +- Aaru.Images/CloneCD/Read.cs | 2 +- Aaru.Images/CloneCD/Write.cs | 6 +- Aaru.Images/DART/Read.cs | 10 +- Aaru.Images/DIM/Properties.cs | 6 - Aaru.Images/DiscJuggler/Read.cs | 33 ++-- Aaru.Images/GDI/Identify.cs | 4 +- Aaru.Images/GDI/Read.cs | 31 +++- Aaru.Images/GDI/Unsupported.cs | 9 +- Aaru.Images/HDCopy/Helpers.cs | 18 ++- Aaru.Images/HDCopy/Read.cs | 7 +- Aaru.Images/IMD/Read.cs | 10 +- Aaru.Images/KryoFlux/Read.cs | 7 +- Aaru.Images/NDIF/Read.cs | 33 ++-- Aaru.Images/Parallels/Read.cs | 3 +- Aaru.Images/PartClone/Read.cs | 7 +- Aaru.Images/Partimage/Read.cs | 50 ++++-- Aaru.Images/QCOW/Read.cs | 44 ++++-- Aaru.Images/QCOW/Write.cs | 7 +- Aaru.Images/QCOW2/Read.cs | 40 +++-- Aaru.Images/QCOW2/Write.cs | 7 +- Aaru.Images/QED/Read.cs | 41 +++-- Aaru.Images/QED/Write.cs | 7 +- Aaru.Images/TeleDisk/Helpers.cs | 19 ++- Aaru.Images/TeleDisk/Read.cs | 13 +- Aaru.Images/UDIF/Read.cs | 121 +++++++++++---- Aaru.Images/VDI/Read.cs | 8 +- Aaru.Images/VHD/Read.cs | 101 ++++++++---- Aaru.Images/VHDX/Read.cs | 100 +++++++++--- Aaru.Images/VMware/Read.cs | 88 ++++++++--- Aaru.Images/WCDiskImage/Read.cs | 35 ++++- Aaru.Images/ZZZRawImage/Properties.cs | 2 +- Aaru.Images/ZZZRawImage/Read.cs | 15 +- 49 files changed, 934 insertions(+), 395 deletions(-) diff --git a/Aaru.CommonTypes b/Aaru.CommonTypes index 317f989c3..5f334edd2 160000 --- a/Aaru.CommonTypes +++ b/Aaru.CommonTypes @@ -1 +1 @@ -Subproject commit 317f989c372db9adb80bd416078ea96501efe55d +Subproject commit 5f334edd29ca05d01f797ca757d406e23776c21b diff --git a/Aaru.Filesystems/CPM/Definitions.cs b/Aaru.Filesystems/CPM/Definitions.cs index 6b6c58d0f..95dbc3788 100644 --- a/Aaru.Filesystems/CPM/Definitions.cs +++ b/Aaru.Filesystems/CPM/Definitions.cs @@ -33,6 +33,7 @@ using System; using System.Collections.Generic; using System.Diagnostics.CodeAnalysis; +using System.IO; using System.Reflection; using System.Xml; using System.Xml.Serialization; @@ -50,7 +51,7 @@ namespace Aaru.Filesystems var defsReader = XmlReader.Create(Assembly.GetExecutingAssembly(). GetManifestResourceStream("Aaru.Filesystems.CPM.cpmdefs.xml") ?? - throw new InvalidOperationException()); + new MemoryStream()); var defsSerializer = new XmlSerializer(typeof(CpmDefinitions)); _definitions = (CpmDefinitions)defsSerializer.Deserialize(defsReader); diff --git a/Aaru.Images/AaruFormat/Write.cs b/Aaru.Images/AaruFormat/Write.cs index e4a9380f6..c7f52900b 100644 --- a/Aaru.Images/AaruFormat/Write.cs +++ b/Aaru.Images/AaruFormat/Write.cs @@ -43,7 +43,6 @@ using System.Xml.Serialization; using Aaru.Checksums; using Aaru.CommonTypes; using Aaru.CommonTypes.Enums; -using Aaru.CommonTypes.Exceptions; using Aaru.CommonTypes.Structs; using Aaru.Console; using Aaru.Decoders; @@ -639,8 +638,10 @@ namespace Aaru.DiscImages break; default: - throw new - ImageNotSupportedException($"Found unsupported compression algorithm {(ushort)ddtHeader.compression}"); + ErrorMessage = + $"Found unsupported compression algorithm {(ushort)ddtHeader.compression}"; + + return false; } if(IsTape) @@ -706,8 +707,10 @@ namespace Aaru.DiscImages break; default: - throw new - ImageNotSupportedException($"Found unsupported compression algorithm {(ushort)ddtHeader.compression}"); + ErrorMessage = + $"Found unsupported compression algorithm {(ushort)ddtHeader.compression}"; + + return false; } uint[] cdDdt = MemoryMarshal.Cast(decompressedDdt).ToArray(); diff --git a/Aaru.Images/Alcohol120/Read.cs b/Aaru.Images/Alcohol120/Read.cs index af9b85287..e55b734d5 100644 --- a/Aaru.Images/Alcohol120/Read.cs +++ b/Aaru.Images/Alcohol120/Read.cs @@ -37,7 +37,6 @@ using System.Linq; using System.Text; using Aaru.CommonTypes; using Aaru.CommonTypes.Enums; -using Aaru.CommonTypes.Exceptions; using Aaru.CommonTypes.Interfaces; using Aaru.Console; using Aaru.Decoders.CD; @@ -1491,13 +1490,8 @@ namespace Aaru.DiscImages } /// - public List GetSessionTracks(CommonTypes.Structs.Session session) - { - if(Sessions.Contains(session)) - return GetSessionTracks(session.Sequence); - - throw new ImageNotSupportedException("Session does not exist in disc image"); - } + public List GetSessionTracks(CommonTypes.Structs.Session session) => + Sessions.Contains(session) ? GetSessionTracks(session.Sequence) : null; /// public List GetSessionTracks(ushort session) diff --git a/Aaru.Images/Apridisk/Read.cs b/Aaru.Images/Apridisk/Read.cs index a9143a970..e037974db 100644 --- a/Aaru.Images/Apridisk/Read.cs +++ b/Aaru.Images/Apridisk/Read.cs @@ -33,7 +33,6 @@ using System.IO; using Aaru.CommonTypes; using Aaru.CommonTypes.Enums; -using Aaru.CommonTypes.Exceptions; using Aaru.CommonTypes.Interfaces; using Aaru.Console; using Aaru.Helpers; @@ -93,8 +92,7 @@ namespace Aaru.DiscImages case RecordType.Sector: if(record.compression != CompressType.Compressed && record.compression != CompressType.Uncompresed) - throw new - ImageNotSupportedException($"Found record with unknown compression type 0x{(ushort)record.compression:X4} at {stream.Position}"); + return ErrorNumber.NotSupported; AaruConsole.DebugWriteLine("Apridisk plugin", "Found {4} sector record at {0} for cylinder {1} head {2} sector {3}", @@ -114,9 +112,7 @@ namespace Aaru.DiscImages stream.Seek(record.headerSize - recordSize + record.dataSize, SeekOrigin.Current); break; - default: - throw new - ImageNotSupportedException($"Found record with unknown type 0x{(uint)record.type:X8} at {stream.Position}"); + default: return ErrorNumber.NotSupported; } } @@ -125,7 +121,7 @@ namespace Aaru.DiscImages if(totalCylinders <= 0 || totalHeads <= 0) - throw new ImageNotSupportedException("No cylinders or heads found"); + return ErrorNumber.NotSupported; _sectorsData = new byte[totalCylinders][][][]; diff --git a/Aaru.Images/BlindWrite4/Read.cs b/Aaru.Images/BlindWrite4/Read.cs index f7ec30967..3d0b8ea61 100644 --- a/Aaru.Images/BlindWrite4/Read.cs +++ b/Aaru.Images/BlindWrite4/Read.cs @@ -38,7 +38,6 @@ using System.Linq; using System.Text; using Aaru.CommonTypes; using Aaru.CommonTypes.Enums; -using Aaru.CommonTypes.Exceptions; using Aaru.CommonTypes.Interfaces; using Aaru.CommonTypes.Structs; using Aaru.Console; @@ -826,8 +825,7 @@ namespace Aaru.DiscImages return ErrorNumber.NoError; } - default: - throw new FeatureSupportedButNotImplementedImageException("Feature not supported by image format"); + default: return ErrorNumber.NotSupported; } } @@ -1243,7 +1241,7 @@ namespace Aaru.DiscImages if(Sessions.Contains(session)) return GetSessionTracks(session.Sequence); - throw new ImageNotSupportedException("Session does not exist in disc image"); + return null; } /// diff --git a/Aaru.Images/BlindWrite5/Read.cs b/Aaru.Images/BlindWrite5/Read.cs index 8bdb48c5b..6ed18d846 100644 --- a/Aaru.Images/BlindWrite5/Read.cs +++ b/Aaru.Images/BlindWrite5/Read.cs @@ -38,7 +38,6 @@ using System.Linq; using System.Text; using Aaru.CommonTypes; using Aaru.CommonTypes.Enums; -using Aaru.CommonTypes.Exceptions; using Aaru.CommonTypes.Interfaces; using Aaru.CommonTypes.Structs; using Aaru.CommonTypes.Structs.Devices.SCSI.Modes; @@ -2215,7 +2214,7 @@ namespace Aaru.DiscImages if(Sessions.Contains(session)) return GetSessionTracks(session.Sequence); - throw new ImageNotSupportedException("Session does not exist in disc image"); + return null; } /// diff --git a/Aaru.Images/CDRDAO/Identify.cs b/Aaru.Images/CDRDAO/Identify.cs index da9a1182d..2383fd3e8 100644 --- a/Aaru.Images/CDRDAO/Identify.cs +++ b/Aaru.Images/CDRDAO/Identify.cs @@ -84,7 +84,7 @@ namespace Aaru.DiscImages { string line = _tocStream.ReadLine(); - Match dm = dr.Match(line ?? throw new InvalidOperationException()); + Match dm = dr.Match(line ?? ""); Match cm = cr.Match(line); // Skip comments at start of file diff --git a/Aaru.Images/CDRDAO/Read.cs b/Aaru.Images/CDRDAO/Read.cs index a156988a6..3e960e6de 100644 --- a/Aaru.Images/CDRDAO/Read.cs +++ b/Aaru.Images/CDRDAO/Read.cs @@ -121,7 +121,7 @@ namespace Aaru.DiscImages lineNumber++; line = _tocStream.ReadLine(); - matchDiskType = regexDiskType.Match(line ?? throw new InvalidOperationException()); + matchDiskType = regexDiskType.Match(line ?? ""); matchComment = regexComment.Match(line); // Skip comments at start of file @@ -149,7 +149,7 @@ namespace Aaru.DiscImages lineNumber++; line = _tocStream.ReadLine(); - matchComment = regexComment.Match(line ?? throw new InvalidOperationException()); + matchComment = regexComment.Match(line ?? ""); matchDiskType = regexDiskType.Match(line); Match matchMcn = regexMcn.Match(line); Match matchTrack = regexTrack.Match(line); @@ -1532,7 +1532,7 @@ namespace Aaru.DiscImages if(session == 1) return Tracks; - throw new ImageNotSupportedException("Session does not exist in disc image"); + return null; } } } \ No newline at end of file diff --git a/Aaru.Images/CDRWin/Identify.cs b/Aaru.Images/CDRWin/Identify.cs index 21946f831..dc70edfda 100644 --- a/Aaru.Images/CDRWin/Identify.cs +++ b/Aaru.Images/CDRWin/Identify.cs @@ -40,7 +40,7 @@ namespace Aaru.DiscImages { public sealed partial class CdrWin { - // Due to .cue format, this method must parse whole file, ignoring errors (those will be thrown by OpenImage()). + // Due to .cue format, this method must parse whole file, ignoring errors (those will be returned by OpenImage()). /// public bool Identify(IFilter imageFilter) { @@ -91,7 +91,7 @@ namespace Aaru.DiscImages var tr = new Regex(REGEX_CDTEXT); // First line must be SESSION, REM, CATALOG, FILE or CDTEXTFILE. - Match sm = sr.Match(line ?? throw new InvalidOperationException()); + Match sm = sr.Match(line ?? ""); Match rm = rr.Match(line); Match cm = cr.Match(line); Match fm = fr.Match(line); diff --git a/Aaru.Images/CDRWin/Read.cs b/Aaru.Images/CDRWin/Read.cs index 82e4a4c5a..b186cea55 100644 --- a/Aaru.Images/CDRWin/Read.cs +++ b/Aaru.Images/CDRWin/Read.cs @@ -38,7 +38,6 @@ using System.Text; using System.Text.RegularExpressions; using Aaru.CommonTypes; using Aaru.CommonTypes.Enums; -using Aaru.CommonTypes.Exceptions; using Aaru.CommonTypes.Interfaces; using Aaru.CommonTypes.Structs; using Aaru.Console; @@ -144,14 +143,21 @@ namespace Aaru.DiscImages uint trackSeq = uint.Parse(matchTrack.Groups[1].Value); if(trackCount + 1 != trackSeq) - throw new - FeatureUnsupportedImageException($"Found TRACK {trackSeq} out of order in line {lineNumber}"); + { + AaruConsole.ErrorWriteLine($"Found TRACK {trackSeq} out of order in line {lineNumber}"); + + return ErrorNumber.InvalidArgument; + } trackCount++; } if(trackCount == 0) - throw new FeatureUnsupportedImageException("No tracks found"); + { + AaruConsole.ErrorWriteLine("No tracks found"); + + return ErrorNumber.InvalidArgument; + } CdrWinTrack[] cueTracks = new CdrWinTrack[trackCount]; @@ -458,8 +464,12 @@ namespace Aaru.DiscImages if(!inTrack) _discImage.Barcode = matchBarCode.Groups[1].Value; else - throw new - FeatureUnsupportedImageException($"Found barcode field in incorrect place at line {lineNumber}"); + { + AaruConsole. + ErrorWriteLine($"Found barcode field in incorrect place at line {lineNumber}"); + + return ErrorNumber.InvalidArgument; + } } else if(matchCdText.Success) { @@ -468,8 +478,12 @@ namespace Aaru.DiscImages if(!inTrack) _discImage.CdTextFile = matchCdText.Groups[1].Value; else - throw new - FeatureUnsupportedImageException($"Found CD-Text file field in incorrect place at line {lineNumber}"); + { + AaruConsole. + ErrorWriteLine($"Found CD-Text file field in incorrect place at line {lineNumber}"); + + return ErrorNumber.InvalidArgument; + } } else if(matchComposer.Success) { @@ -487,8 +501,12 @@ namespace Aaru.DiscImages if(!inTrack) _discImage.DiscId = matchDiskId.Groups[1].Value; else - throw new - FeatureUnsupportedImageException($"Found CDDB ID field in incorrect place at line {lineNumber}"); + { + AaruConsole. + ErrorWriteLine($"Found CDDB ID field in incorrect place at line {lineNumber}"); + + return ErrorNumber.InvalidArgument; + } } else if(matchFile.Success) { @@ -541,13 +559,20 @@ namespace Aaru.DiscImages currentFile.DataFilter = filtersList.GetFilter(path); if(currentFile.DataFilter == null) - throw new - FeatureUnsupportedImageException($"File \"{matchFile.Groups[1].Value}\" not found."); + { + AaruConsole. + ErrorWriteLine($"File \"{matchFile.Groups[1].Value}\" not found."); + + return ErrorNumber.NoSuchFile; + } } } else - throw new - FeatureUnsupportedImageException($"File \"{matchFile.Groups[1].Value}\" not found."); + { + AaruConsole.ErrorWriteLine($"File \"{matchFile.Groups[1].Value}\" not found."); + + return ErrorNumber.NoSuchFile; + } } else if((datafile[1] == ':' && datafile[2] == '\\') || (datafile[0] == '\\' && datafile[1] == '\\') || @@ -571,13 +596,20 @@ namespace Aaru.DiscImages currentFile.DataFilter = filtersList.GetFilter(path); if(currentFile.DataFilter == null) - throw new - FeatureUnsupportedImageException($"File \"{matchFile.Groups[1].Value}\" not found."); + { + AaruConsole. + ErrorWriteLine($"File \"{matchFile.Groups[1].Value}\" not found."); + + return ErrorNumber.NoSuchFile; + } } } else - throw new - FeatureUnsupportedImageException($"File \"{matchFile.Groups[1].Value}\" not found."); + { + AaruConsole.ErrorWriteLine($"File \"{matchFile.Groups[1].Value}\" not found."); + + return ErrorNumber.NoSuchFile; + } } else { @@ -585,8 +617,11 @@ namespace Aaru.DiscImages currentFile.DataFilter = filtersList.GetFilter(path); if(currentFile.DataFilter == null) - throw new - FeatureUnsupportedImageException($"File \"{matchFile.Groups[1].Value}\" not found."); + { + AaruConsole.ErrorWriteLine($"File \"{matchFile.Groups[1].Value}\" not found."); + + return ErrorNumber.NoSuchFile; + } } // File does exist, process it @@ -600,11 +635,13 @@ namespace Aaru.DiscImages case CDRWIN_DISK_TYPE_AIFF: case CDRWIN_DISK_TYPE_RIFF: case CDRWIN_DISK_TYPE_MP3: - throw new - FeatureSupportedButNotImplementedImageException($"Unsupported file type {currentFile.FileType}"); + AaruConsole.ErrorWriteLine($"Unsupported file type {currentFile.FileType}"); + + return ErrorNumber.NotImplemented; default: - throw new - FeatureUnsupportedImageException($"Unknown file type {currentFile.FileType}"); + AaruConsole.ErrorWriteLine($"Unknown file type {currentFile.FileType}"); + + return ErrorNumber.InvalidArgument; } currentFile.Offset = 0; @@ -615,8 +652,12 @@ namespace Aaru.DiscImages AaruConsole.DebugWriteLine("CDRWin plugin", "Found FLAGS at line {0}", lineNumber); if(!inTrack) - throw new - FeatureUnsupportedImageException($"Found FLAGS field in incorrect place at line {lineNumber}"); + { + AaruConsole. + ErrorWriteLine($"Found FLAGS field in incorrect place at line {lineNumber}"); + + return ErrorNumber.InvalidArgument; + } currentTrack.FlagDcp |= matchFlags.Groups["dcp"].Value == "DCP"; currentTrack.Flag4Ch |= matchFlags.Groups["quad"].Value == "4CH"; @@ -637,7 +678,11 @@ namespace Aaru.DiscImages AaruConsole.DebugWriteLine("CDRWin plugin", "Found INDEX at line {0}", lineNumber); if(!inTrack) - throw new FeatureUnsupportedImageException($"Found INDEX before a track {lineNumber}"); + { + AaruConsole.ErrorWriteLine($"Found INDEX before a track {lineNumber}"); + + return ErrorNumber.InvalidArgument; + } ushort index = ushort.Parse(matchIndex.Groups[1].Value); int offset = CdrWinMsfToLba(matchIndex.Groups[2].Value) + cumulativeEmptyPregap; @@ -645,8 +690,11 @@ namespace Aaru.DiscImages if(index != 0 && index != 1 && currentTrack.Indexes.Count == 0) - throw new - FeatureUnsupportedImageException($"Found INDEX {index} before INDEX 00 or INDEX 01"); + { + AaruConsole.ErrorWriteLine($"Found INDEX {index} before INDEX 00 or INDEX 01"); + + return ErrorNumber.InvalidArgument; + } if(index == 0 || (index == 1 && !currentTrack.Indexes.ContainsKey(0))) @@ -714,7 +762,11 @@ namespace Aaru.DiscImages AaruConsole.DebugWriteLine("CDRWin plugin", "Found ISRC at line {0}", lineNumber); if(!inTrack) - throw new FeatureUnsupportedImageException($"Found ISRC before a track {lineNumber}"); + { + AaruConsole.ErrorWriteLine($"Found ISRC before a track {lineNumber}"); + + return ErrorNumber.InvalidArgument; + } currentTrack.Isrc = matchIsrc.Groups[1].Value; } @@ -725,8 +777,12 @@ namespace Aaru.DiscImages if(!inTrack) _discImage.Mcn = matchMcn.Groups[1].Value; else - throw new - FeatureUnsupportedImageException($"Found CATALOG field in incorrect place at line {lineNumber}"); + { + AaruConsole. + ErrorWriteLine($"Found CATALOG field in incorrect place at line {lineNumber}"); + + return ErrorNumber.InvalidArgument; + } } else if(matchPerformer.Success) { @@ -744,16 +800,22 @@ namespace Aaru.DiscImages if(inTrack) currentTrack.Postgap = CdrWinMsfToLba(matchPostgap.Groups[1].Value); else - throw new - FeatureUnsupportedImageException($"Found POSTGAP field before a track at line {lineNumber}"); + { + AaruConsole.ErrorWriteLine($"Found POSTGAP field before a track at line {lineNumber}"); + + return ErrorNumber.InvalidArgument; + } } else if(matchPregap.Success) { AaruConsole.DebugWriteLine("CDRWin plugin", "Found PREGAP at line {0}", lineNumber); if(!inTrack) - throw new - FeatureUnsupportedImageException($"Found PREGAP field before a track at line {lineNumber}"); + { + AaruConsole.ErrorWriteLine($"Found PREGAP field before a track at line {lineNumber}"); + + return ErrorNumber.InvalidArgument; + } currentEmptyPregap = CdrWinMsfToLba(matchPregap.Groups[1].Value); } @@ -780,8 +842,12 @@ namespace Aaru.DiscImages AaruConsole.DebugWriteLine("CDRWin plugin", "Found TRACK at line {0}", lineNumber); if(currentFile.DataFilter == null) - throw new - FeatureUnsupportedImageException($"Found TRACK field before a file is defined at line {lineNumber}"); + { + AaruConsole. + ErrorWriteLine($"Found TRACK field before a file is defined at line {lineNumber}"); + + return ErrorNumber.InvalidArgument; + } if(inTrack) { @@ -1317,12 +1383,20 @@ namespace Aaru.DiscImages { if(_discImage.Tracks[i].Sequence == 1 && i != 0) - throw new ImageNotSupportedException("Unordered tracks"); + { + AaruConsole.ErrorWriteLine("Unordered tracks"); + + return ErrorNumber.InvalidArgument; + } var partition = new Partition(); if(!_discImage.Tracks[i].Indexes.TryGetValue(1, out _)) - throw new ImageNotSupportedException($"Track {_discImage.Tracks[i].Sequence} lacks index 01"); + { + AaruConsole.ErrorWriteLine($"Track {_discImage.Tracks[i].Sequence} lacks index 01"); + + return ErrorNumber.InvalidArgument; + } // Index 01 partition.Description = $"Track {_discImage.Tracks[i].Sequence}."; @@ -1506,43 +1580,47 @@ namespace Aaru.DiscImages leadouts.Count == 0 && !_discImage.IsRedumpGigadisc && _isCd) - throw new - FeatureUnsupportedImageException("This image is missing vital multi-session data and cannot be read correctly."); - - if(!_isCd) { - _imageInfo.ReadableSectorTags.Remove(SectorTagType.CdSectorSync); - _imageInfo.ReadableSectorTags.Remove(SectorTagType.CdSectorHeader); - _imageInfo.ReadableSectorTags.Remove(SectorTagType.CdSectorSubHeader); - _imageInfo.ReadableSectorTags.Remove(SectorTagType.CdSectorEcc); - _imageInfo.ReadableSectorTags.Remove(SectorTagType.CdSectorEccP); - _imageInfo.ReadableSectorTags.Remove(SectorTagType.CdSectorEccQ); - _imageInfo.ReadableSectorTags.Remove(SectorTagType.CdSectorEdc); - _imageInfo.ReadableSectorTags.Remove(SectorTagType.CdTrackFlags); - _imageInfo.ReadableSectorTags.Remove(SectorTagType.CdTrackIsrc); + AaruConsole. + ErrorWriteLine("This image is missing vital multi-session data and cannot be read correctly."); - sessions = _discImage.Sessions.ToArray(); + return ErrorNumber.InvalidArgument; + } - foreach(CdrWinTrack track in _discImage.Tracks) + if(_isCd) + return ErrorNumber.NoError; + + _imageInfo.ReadableSectorTags.Remove(SectorTagType.CdSectorSync); + _imageInfo.ReadableSectorTags.Remove(SectorTagType.CdSectorHeader); + _imageInfo.ReadableSectorTags.Remove(SectorTagType.CdSectorSubHeader); + _imageInfo.ReadableSectorTags.Remove(SectorTagType.CdSectorEcc); + _imageInfo.ReadableSectorTags.Remove(SectorTagType.CdSectorEccP); + _imageInfo.ReadableSectorTags.Remove(SectorTagType.CdSectorEccQ); + _imageInfo.ReadableSectorTags.Remove(SectorTagType.CdSectorEdc); + _imageInfo.ReadableSectorTags.Remove(SectorTagType.CdTrackFlags); + _imageInfo.ReadableSectorTags.Remove(SectorTagType.CdTrackIsrc); + + sessions = _discImage.Sessions.ToArray(); + + foreach(CdrWinTrack track in _discImage.Tracks) + { + track.Indexes.Remove(0); + track.Pregap = 0; + + for(int s = 0; s < sessions.Length; s++) { - track.Indexes.Remove(0); - track.Pregap = 0; - - for(int s = 0; s < sessions.Length; s++) + if(sessions[s].Sequence > 1 && + track.Sequence == sessions[s].StartTrack) { - if(sessions[s].Sequence > 1 && - track.Sequence == sessions[s].StartTrack) - { - track.TrackFile.Offset += 307200; - track.Sectors -= 150; - sessions[s].StartSector = (ulong)track.Indexes[1]; - } + track.TrackFile.Offset += 307200; + track.Sectors -= 150; + sessions[s].StartSector = (ulong)track.Indexes[1]; } } - - _discImage.Sessions = sessions.ToList(); } + _discImage.Sessions = sessions.ToList(); + return ErrorNumber.NoError; } catch(Exception ex) @@ -2262,7 +2340,7 @@ namespace Aaru.DiscImages if(_discImage.Sessions.Contains(session)) return GetSessionTracks(session.Sequence); - throw new ImageNotSupportedException("Session does not exist in disc image"); + return null; } /// diff --git a/Aaru.Images/CHD/Helpers.cs b/Aaru.Images/CHD/Helpers.cs index 0e14c47fd..6360640d4 100644 --- a/Aaru.Images/CHD/Helpers.cs +++ b/Aaru.Images/CHD/Helpers.cs @@ -34,8 +34,9 @@ using System; using System.Collections.Generic; using System.IO; using System.Linq; -using Aaru.CommonTypes.Exceptions; +using Aaru.CommonTypes.Enums; using Aaru.CommonTypes.Structs; +using Aaru.Console; using Aaru.Helpers; using SharpCompress.Compressors; using SharpCompress.Compressors.Deflate; @@ -61,10 +62,10 @@ namespace Aaru.DiscImages return (aaruTrack?.StartSector ?? 0) + relativeSector; } - byte[] GetHunk(ulong hunkNo) + ErrorNumber GetHunk(ulong hunkNo, out byte[] buffer) { - if(_hunkCache.TryGetValue(hunkNo, out byte[] hunk)) - return hunk; + if(_hunkCache.TryGetValue(hunkNo, out buffer)) + return ErrorNumber.NoError; switch(_mapVersion) { @@ -77,18 +78,26 @@ namespace Aaru.DiscImages _imageStream.Read(compHunk, 0, compHunk.Length); if(length == _sectorsPerHunk * _imageInfo.SectorSize) - hunk = compHunk; + buffer = compHunk; else if((Compression)_hdrCompression > Compression.Zlib) - throw new ImageNotSupportedException($"Unsupported compression {(Compression)_hdrCompression}"); + { + AaruConsole.ErrorWriteLine($"Unsupported compression {(Compression)_hdrCompression}"); + + return ErrorNumber.InvalidArgument; + } else { var zStream = new DeflateStream(new MemoryStream(compHunk), CompressionMode.Decompress); - hunk = new byte[_sectorsPerHunk * _imageInfo.SectorSize]; - int read = zStream.Read(hunk, 0, (int)(_sectorsPerHunk * _imageInfo.SectorSize)); + buffer = new byte[_sectorsPerHunk * _imageInfo.SectorSize]; + int read = zStream.Read(buffer, 0, (int)(_sectorsPerHunk * _imageInfo.SectorSize)); if(read != _sectorsPerHunk * _imageInfo.SectorSize) - throw new - IOException($"Unable to decompress hunk correctly, got {read} bytes, expected {_sectorsPerHunk * _imageInfo.SectorSize}"); + { + AaruConsole. + ErrorWriteLine($"Unable to decompress hunk correctly, got {read} bytes, expected {_sectorsPerHunk * _imageInfo.SectorSize}"); + + return ErrorNumber.InOutError; + } zStream.Close(); } @@ -101,7 +110,10 @@ namespace Aaru.DiscImages switch((EntryFlagsV3)(entry.flags & 0x0F)) { - case EntryFlagsV3.Invalid: throw new ArgumentException("Invalid hunk found."); + case EntryFlagsV3.Invalid: + AaruConsole.ErrorWriteLine("Invalid hunk found."); + + return ErrorNumber.InvalidArgument; case EntryFlagsV3.Compressed: switch((Compression)_hdrCompression) { @@ -117,74 +129,96 @@ namespace Aaru.DiscImages var zStream = new DeflateStream(new MemoryStream(zHunk), CompressionMode.Decompress); - hunk = new byte[_bytesPerHunk]; - int read = zStream.Read(hunk, 0, (int)_bytesPerHunk); + buffer = new byte[_bytesPerHunk]; + int read = zStream.Read(buffer, 0, (int)_bytesPerHunk); if(read != _bytesPerHunk) - throw new - IOException($"Unable to decompress hunk correctly, got {read} bytes, expected {_bytesPerHunk}"); + { + AaruConsole. + ErrorWriteLine($"Unable to decompress hunk correctly, got {read} bytes, expected {_bytesPerHunk}"); + + return ErrorNumber.InOutError; + } zStream.Close(); } // TODO: Guess wth is MAME doing with these hunks else - throw new - ImageNotSupportedException("Compressed CD/GD-ROM hunks are not yet supported"); + { + AaruConsole.ErrorWriteLine("Compressed CD/GD-ROM hunks are not yet supported"); + + return ErrorNumber.NotImplemented; + } break; case Compression.Av: - throw new - ImageNotSupportedException($"Unsupported compression {(Compression)_hdrCompression}"); + AaruConsole. + ErrorWriteLine($"Unsupported compression {(Compression)_hdrCompression}"); + + return ErrorNumber.NotImplemented; } break; case EntryFlagsV3.Uncompressed: uncompressedV3: - hunk = new byte[_bytesPerHunk]; + buffer = new byte[_bytesPerHunk]; _imageStream.Seek((long)entry.offset, SeekOrigin.Begin); - _imageStream.Read(hunk, 0, hunk.Length); + _imageStream.Read(buffer, 0, buffer.Length); break; case EntryFlagsV3.Mini: - hunk = new byte[_bytesPerHunk]; + buffer = new byte[_bytesPerHunk]; byte[] mini; mini = BigEndianBitConverter.GetBytes(entry.offset); for(int i = 0; i < _bytesPerHunk; i++) - hunk[i] = mini[i % 8]; + buffer[i] = mini[i % 8]; break; - case EntryFlagsV3.SelfHunk: return GetHunk(entry.offset); + case EntryFlagsV3.SelfHunk: return GetHunk(entry.offset, out buffer); case EntryFlagsV3.ParentHunk: - throw new ImageNotSupportedException("Parent images are not supported"); + AaruConsole.ErrorWriteLine("Parent images are not supported"); + + return ErrorNumber.NotImplemented; case EntryFlagsV3.SecondCompressed: - throw new ImageNotSupportedException("FLAC is not supported"); + AaruConsole.ErrorWriteLine("FLAC is not supported"); + + return ErrorNumber.NotImplemented; default: - throw new ImageNotSupportedException($"Hunk type {entry.flags & 0xF} is not supported"); + AaruConsole.ErrorWriteLine($"Hunk type {entry.flags & 0xF} is not supported"); + + return ErrorNumber.NotSupported; } break; case 5: if(_hdrCompression == 0) { - hunk = new byte[_bytesPerHunk]; + buffer = new byte[_bytesPerHunk]; _imageStream.Seek(_hunkTableSmall[hunkNo] * _bytesPerHunk, SeekOrigin.Begin); - _imageStream.Read(hunk, 0, hunk.Length); + _imageStream.Read(buffer, 0, buffer.Length); } else - throw new ImageNotSupportedException("Compressed v5 hunks not yet supported"); + { + AaruConsole.ErrorWriteLine("Compressed v5 hunks not yet supported"); + + return ErrorNumber.NotSupported; + } break; - default: throw new ImageNotSupportedException($"Unsupported hunk map version {_mapVersion}"); + default: + AaruConsole.ErrorWriteLine($"Unsupported hunk map version {_mapVersion}"); + + return ErrorNumber.NotSupported; } if(_hunkCache.Count >= _maxBlockCache) _hunkCache.Clear(); - _hunkCache.Add(hunkNo, hunk); + _hunkCache.Add(hunkNo, buffer); - return hunk; + return ErrorNumber.NoError; } } } \ No newline at end of file diff --git a/Aaru.Images/CHD/Properties.cs b/Aaru.Images/CHD/Properties.cs index eb791b5b1..132062252 100644 --- a/Aaru.Images/CHD/Properties.cs +++ b/Aaru.Images/CHD/Properties.cs @@ -66,7 +66,8 @@ namespace Aaru.DiscImages if(_isHdd) return null; - throw new NotImplementedException(); + // TODO: Implement + return null; } } diff --git a/Aaru.Images/CHD/Read.cs b/Aaru.Images/CHD/Read.cs index e48d6d568..e7df7cfc5 100644 --- a/Aaru.Images/CHD/Read.cs +++ b/Aaru.Images/CHD/Read.cs @@ -39,7 +39,6 @@ using System.Text; using System.Text.RegularExpressions; using Aaru.CommonTypes; using Aaru.CommonTypes.Enums; -using Aaru.CommonTypes.Exceptions; using Aaru.CommonTypes.Interfaces; using Aaru.CommonTypes.Structs; using Aaru.CommonTypes.Structs.Devices.ATA; @@ -339,7 +338,7 @@ namespace Aaru.DiscImages // TODO: Check why reading is misaligned AaruConsole.ErrorWriteLine("CHD version 5 is not yet supported."); - return ErrorNumber.NotSupported; + return ErrorNumber.NotImplemented; HeaderV5 hdrV5 = Marshal.ByteArrayToStructureBigEndian(buffer); @@ -1359,7 +1358,10 @@ namespace Aaru.DiscImages ulong hunkNo = sectorAddress / _sectorsPerHunk; ulong secOff = sectorAddress * sectorSize % (_sectorsPerHunk * sectorSize); - byte[] hunk = GetHunk(hunkNo); + ErrorNumber errno = GetHunk(hunkNo, out byte[] hunk); + + if(errno != ErrorNumber.NoError) + return errno; sector = new byte[_imageInfo.SectorSize]; Array.Copy(hunk, (int)secOff, sector, 0, sector.Length); @@ -1490,7 +1492,10 @@ namespace Aaru.DiscImages ulong hunkNo = sectorAddress / _sectorsPerHunk; ulong secOff = sectorAddress * sectorSize % (_sectorsPerHunk * sectorSize); - byte[] hunk = GetHunk(hunkNo); + ErrorNumber errno = GetHunk(hunkNo, out byte[] hunk); + + if(errno != ErrorNumber.NoError) + return errno; sector = new byte[_imageInfo.SectorSize]; Array.Copy(hunk, (int)secOff, sector, 0, sector.Length); @@ -1795,7 +1800,10 @@ namespace Aaru.DiscImages ulong hunkNo = sectorAddress / _sectorsPerHunk; ulong secOff = sectorAddress * sectorSize % (_sectorsPerHunk * sectorSize); - byte[] hunk = GetHunk(hunkNo); + ErrorNumber errno = GetHunk(hunkNo, out byte[] hunk); + + if(errno != ErrorNumber.NoError) + return errno; sector = new byte[_imageInfo.SectorSize]; Array.Copy(hunk, (int)secOff, sector, 0, sector.Length); @@ -1921,22 +1929,11 @@ namespace Aaru.DiscImages } /// - public List GetSessionTracks(Session session) - { - if(_isHdd) - throw new FeaturedNotSupportedByDiscImageException("Cannot access optical tracks on a hard disk image"); - - return GetSessionTracks(session.Sequence); - } + public List GetSessionTracks(Session session) => _isHdd ? null : GetSessionTracks(session.Sequence); /// - public List GetSessionTracks(ushort session) - { - if(_isHdd) - throw new FeaturedNotSupportedByDiscImageException("Cannot access optical tracks on a hard disk image"); - - return _tracks.Values.Where(track => track.Session == session).ToList(); - } + public List GetSessionTracks(ushort session) => + _isHdd ? null : _tracks.Values.Where(track => track.Session == session).ToList(); /// public ErrorNumber ReadSector(ulong sectorAddress, uint track, out byte[] buffer) diff --git a/Aaru.Images/CHD/Verify.cs b/Aaru.Images/CHD/Verify.cs index 7a234d7c8..c732bc0e5 100644 --- a/Aaru.Images/CHD/Verify.cs +++ b/Aaru.Images/CHD/Verify.cs @@ -145,7 +145,14 @@ namespace Aaru.DiscImages var sha1Ctx = new Sha1Context(); for(uint i = 0; i < _totalHunks; i++) - sha1Ctx.Update(GetHunk(i)); + { + ErrorNumber errno = GetHunk(i, out byte[] buffer); + + if(errno != ErrorNumber.NoError) + return null; + + sha1Ctx.Update(buffer); + } calculated = sha1Ctx.Final(); } @@ -154,7 +161,14 @@ namespace Aaru.DiscImages var md5Ctx = new Md5Context(); for(uint i = 0; i < _totalHunks; i++) - md5Ctx.Update(GetHunk(i)); + { + ErrorNumber errno = GetHunk(i, out byte[] buffer); + + if(errno != ErrorNumber.NoError) + return null; + + md5Ctx.Update(buffer); + } calculated = md5Ctx.Final(); } diff --git a/Aaru.Images/CisCopy/Read.cs b/Aaru.Images/CisCopy/Read.cs index 7dd98746e..9f4fe9320 100644 --- a/Aaru.Images/CisCopy/Read.cs +++ b/Aaru.Images/CisCopy/Read.cs @@ -34,7 +34,6 @@ using System; using System.IO; using Aaru.CommonTypes; using Aaru.CommonTypes.Enums; -using Aaru.CommonTypes.Exceptions; using Aaru.CommonTypes.Interfaces; using Aaru.Console; using Aaru.Helpers; @@ -67,7 +66,10 @@ namespace Aaru.DiscImages tracks = 160; break; - default: throw new ImageNotSupportedException($"Incorrect disk type {(byte)type}"); + default: + AaruConsole.ErrorWriteLine($"Incorrect disk type {(byte)type}"); + + return ErrorNumber.InvalidArgument; } byte[] trackBytes = new byte[tracks]; @@ -76,7 +78,11 @@ namespace Aaru.DiscImages var cmpr = (Compression)stream.ReadByte(); if(cmpr != Compression.None) - throw new FeatureSupportedButNotImplementedImageException("Compressed images are not supported."); + { + AaruConsole.ErrorWriteLine("Compressed images are not supported."); + + return ErrorNumber.NotImplemented; + } int trackSize = 0; diff --git a/Aaru.Images/CloneCD/Identify.cs b/Aaru.Images/CloneCD/Identify.cs index 2cf3a70c3..7ebc0c725 100644 --- a/Aaru.Images/CloneCD/Identify.cs +++ b/Aaru.Images/CloneCD/Identify.cs @@ -83,7 +83,7 @@ namespace Aaru.DiscImages var hdr = new Regex(CCD_IDENTIFIER); - Match hdm = hdr.Match(line ?? throw new InvalidOperationException()); + Match hdm = hdr.Match(line ?? ""); return hdm.Success; } diff --git a/Aaru.Images/CloneCD/Read.cs b/Aaru.Images/CloneCD/Read.cs index 470e65983..7c4633ef0 100644 --- a/Aaru.Images/CloneCD/Read.cs +++ b/Aaru.Images/CloneCD/Read.cs @@ -1385,7 +1385,7 @@ namespace Aaru.DiscImages if(Sessions.Contains(session)) return GetSessionTracks(session.Sequence); - throw new ImageNotSupportedException("Session does not exist in disc image"); + return null; } /// diff --git a/Aaru.Images/CloneCD/Write.cs b/Aaru.Images/CloneCD/Write.cs index 78fdd4c3f..c6f9d93a6 100644 --- a/Aaru.Images/CloneCD/Write.cs +++ b/Aaru.Images/CloneCD/Write.cs @@ -355,7 +355,11 @@ namespace Aaru.DiscImages _descriptorStream.WriteLine("PreGapMode=2"); break; - default: throw new ArgumentOutOfRangeException(); + default: + ErrorMessage = + $"Unexpected first session track type {firstSessionTrack?.Type.ToString() ?? "null"}"; + + return false; } _descriptorStream.WriteLine("PreGapSubC=0"); diff --git a/Aaru.Images/DART/Read.cs b/Aaru.Images/DART/Read.cs index 76f9f2fbe..60ffccd70 100644 --- a/Aaru.Images/DART/Read.cs +++ b/Aaru.Images/DART/Read.cs @@ -35,7 +35,6 @@ using System.IO; using System.Text.RegularExpressions; using Aaru.CommonTypes; using Aaru.CommonTypes.Enums; -using Aaru.CommonTypes.Exceptions; using Aaru.CommonTypes.Interfaces; using Aaru.Compression; using Aaru.Console; @@ -161,7 +160,9 @@ namespace Aaru.DiscImages temp = new byte[l]; stream.Read(temp, 0, temp.Length); - throw new ImageNotSupportedException("LZH Compressed images not yet supported"); + AaruConsole.ErrorWriteLine("LZH Compressed images not yet supported"); + + return ErrorNumber.NotImplemented; } } } @@ -328,7 +329,8 @@ namespace Aaru.DiscImages ReadSectors(sectorAddress, 1, out buffer); /// - public ErrorNumber ReadSectorTag(ulong sectorAddress, SectorTagType tag, out byte[] buffer) => ReadSectorsTag(sectorAddress, 1, tag, out buffer); + public ErrorNumber ReadSectorTag(ulong sectorAddress, SectorTagType tag, out byte[] buffer) => + ReadSectorsTag(sectorAddress, 1, tag, out buffer); /// public ErrorNumber ReadSectors(ulong sectorAddress, uint length, out byte[] buffer) @@ -394,7 +396,7 @@ namespace Aaru.DiscImages if(errno != ErrorNumber.NoError) return errno; - errno = ReadSectorsTag(sectorAddress, length, SectorTagType.AppleSectorTag, out byte[] tags); + errno = ReadSectorsTag(sectorAddress, length, SectorTagType.AppleSectorTag, out byte[] tags); if(errno != ErrorNumber.NoError) return errno; diff --git a/Aaru.Images/DIM/Properties.cs b/Aaru.Images/DIM/Properties.cs index 508d25e84..db0410b14 100644 --- a/Aaru.Images/DIM/Properties.cs +++ b/Aaru.Images/DIM/Properties.cs @@ -41,12 +41,6 @@ namespace Aaru.DiscImages { public sealed partial class Dim { - public List Partitions => - throw new FeatureUnsupportedImageException("Feature not supported by image format"); - public List Tracks => - throw new FeatureUnsupportedImageException("Feature not supported by image format"); - public List Sessions => - throw new FeatureUnsupportedImageException("Feature not supported by image format"); /// public string Name => "DIM Disk Image"; /// diff --git a/Aaru.Images/DiscJuggler/Read.cs b/Aaru.Images/DiscJuggler/Read.cs index 3c8375e0b..65ddb99f7 100644 --- a/Aaru.Images/DiscJuggler/Read.cs +++ b/Aaru.Images/DiscJuggler/Read.cs @@ -37,7 +37,6 @@ using System.Linq; using System.Text; using Aaru.CommonTypes; using Aaru.CommonTypes.Enums; -using Aaru.CommonTypes.Exceptions; using Aaru.CommonTypes.Interfaces; using Aaru.CommonTypes.Structs; using Aaru.Console; @@ -390,7 +389,10 @@ namespace Aaru.DiscImages currentOffset += trackLen * (ulong)(track.RawBytesPerSector + 96); break; - default: throw new ImageNotSupportedException($"Unknown read mode {readMode}"); + default: + AaruConsole.ErrorWriteLine($"Unknown read mode {readMode}"); + + return ErrorNumber.InvalidArgument; } break; @@ -416,8 +418,9 @@ namespace Aaru.DiscImages break; case 1: - throw - new ImageNotSupportedException($"Invalid read mode {readMode} for this track"); + AaruConsole.ErrorWriteLine($"Invalid read mode {readMode} for this track"); + + return ErrorNumber.InvalidArgument; case 2: track.RawBytesPerSector = 2352; currentOffset += trackLen * (ulong)track.RawBytesPerSector; @@ -505,7 +508,10 @@ namespace Aaru.DiscImages _imageInfo.ReadableSectorTags.Add(SectorTagType.CdSectorEdc); break; - default: throw new ImageNotSupportedException($"Unknown read mode {readMode}"); + default: + AaruConsole.ErrorWriteLine($"Unknown read mode {readMode}"); + + return ErrorNumber.InvalidArgument; } break; @@ -521,8 +527,9 @@ namespace Aaru.DiscImages switch(readMode) { case 0: - throw - new ImageNotSupportedException($"Invalid read mode {readMode} for this track"); + AaruConsole.ErrorWriteLine($"Invalid read mode {readMode} for this track"); + + return ErrorNumber.InvalidArgument; case 1: track.RawBytesPerSector = 2336; @@ -584,11 +591,17 @@ namespace Aaru.DiscImages _imageInfo.ReadableSectorTags.Add(SectorTagType.CdSectorHeader); break; - default: throw new ImageNotSupportedException($"Unknown read mode {readMode}"); + default: + AaruConsole.ErrorWriteLine($"Unknown read mode {readMode}"); + + return ErrorNumber.InvalidArgument; } break; - default: throw new ImageNotSupportedException($"Unknown track mode {trackMode}"); + default: + AaruConsole.ErrorWriteLine($"Unknown track mode {trackMode}"); + + return ErrorNumber.InvalidArgument; } track.File = imageFilter.Filename; @@ -1340,7 +1353,7 @@ namespace Aaru.DiscImages if(Sessions.Contains(session)) return GetSessionTracks(session.Sequence); - throw new ImageNotSupportedException("Session does not exist in disc image"); + return null; } /// diff --git a/Aaru.Images/GDI/Identify.cs b/Aaru.Images/GDI/Identify.cs index 5db24f4f8..766fa1d0f 100644 --- a/Aaru.Images/GDI/Identify.cs +++ b/Aaru.Images/GDI/Identify.cs @@ -40,7 +40,7 @@ namespace Aaru.DiscImages { public sealed partial class Gdi { - // Due to .gdi format, this method must parse whole file, ignoring errors (those will be thrown by OpenImage()). + // Due to .gdi format, this method must parse whole file, ignoring errors (those will be returned by OpenImage()). /// public bool Identify(IFilter imageFilter) { @@ -95,7 +95,7 @@ namespace Aaru.DiscImages { var regexTrack = new Regex(REGEX_TRACK); - Match trackMatch = regexTrack.Match(line ?? throw new InvalidOperationException()); + Match trackMatch = regexTrack.Match(line ?? ""); if(!trackMatch.Success) return false; diff --git a/Aaru.Images/GDI/Read.cs b/Aaru.Images/GDI/Read.cs index 2623bb539..feb983931 100644 --- a/Aaru.Images/GDI/Read.cs +++ b/Aaru.Images/GDI/Read.cs @@ -37,7 +37,6 @@ using System.Linq; using System.Text.RegularExpressions; using Aaru.CommonTypes; using Aaru.CommonTypes.Enums; -using Aaru.CommonTypes.Exceptions; using Aaru.CommonTypes.Interfaces; using Aaru.CommonTypes.Structs; using Aaru.Console; @@ -85,14 +84,22 @@ namespace Aaru.DiscImages if(lineNumber == 1) { if(!int.TryParse(line, out _)) - throw new ImageNotSupportedException("Not a correct Dreamcast GDI image"); + { + AaruConsole.ErrorWriteLine("Not a correct Dreamcast GDI image"); + + return ErrorNumber.InvalidArgument; + } } else { - Match trackMatch = regexTrack.Match(line ?? throw new InvalidOperationException()); + Match trackMatch = regexTrack.Match(line ?? ""); if(!trackMatch.Success) - throw new ImageNotSupportedException($"Unknown line \"{line}\" at line {lineNumber}"); + { + AaruConsole.ErrorWriteLine($"Unknown line \"{line}\" at line {lineNumber}"); + + return ErrorNumber.InvalidArgument; + } AaruConsole.DebugWriteLine("GDI plugin", "Found track {0} starts at {1} flags {2} type {3} file {4} offset {5} at line {6}", @@ -132,7 +139,11 @@ namespace Aaru.DiscImages } if((currentTrack.TrackFilter.DataForkLength - currentTrack.Offset) % currentTrack.Bps != 0) - throw new ImageNotSupportedException("Track size not a multiple of sector size"); + { + AaruConsole.ErrorWriteLine("Track size not a multiple of sector size"); + + return ErrorNumber.InvalidArgument; + } currentTrack.Sectors = (ulong)((currentTrack.TrackFilter.DataForkLength - currentTrack.Offset) / currentTrack.Bps); @@ -257,7 +268,11 @@ namespace Aaru.DiscImages { if(_discImage.Tracks[i].Sequence == 1 && i != 0) - throw new ImageNotSupportedException("Unordered tracks"); + { + AaruConsole.ErrorWriteLine("Unordered tracks"); + + return ErrorNumber.InvalidArgument; + } // Index 01 var partition = new Partition @@ -856,7 +871,7 @@ namespace Aaru.DiscImages if(_discImage.Sessions.Contains(session)) return GetSessionTracks(session.Sequence); - throw new ImageNotSupportedException("Session does not exist in disc image"); + return null; } /// @@ -875,7 +890,7 @@ namespace Aaru.DiscImages expectedDensity = true; break; - default: throw new ImageNotSupportedException("Session does not exist in disc image"); + default: return null; } foreach(GdiTrack gdiTrack in _discImage.Tracks) diff --git a/Aaru.Images/GDI/Unsupported.cs b/Aaru.Images/GDI/Unsupported.cs index e39562db6..ca1c7c41a 100644 --- a/Aaru.Images/GDI/Unsupported.cs +++ b/Aaru.Images/GDI/Unsupported.cs @@ -31,14 +31,17 @@ // ****************************************************************************/ using Aaru.CommonTypes.Enums; -using Aaru.CommonTypes.Exceptions; namespace Aaru.DiscImages { public sealed partial class Gdi { /// - public ErrorNumber ReadMediaTag(MediaTagType tag, out byte[] buffer) => - throw new FeatureSupportedButNotImplementedImageException("Feature not supported by image format"); + public ErrorNumber ReadMediaTag(MediaTagType tag, out byte[] buffer) + { + buffer = null; + + return ErrorNumber.NoData; + } } } \ No newline at end of file diff --git a/Aaru.Images/HDCopy/Helpers.cs b/Aaru.Images/HDCopy/Helpers.cs index f3c9ec526..6904dce97 100644 --- a/Aaru.Images/HDCopy/Helpers.cs +++ b/Aaru.Images/HDCopy/Helpers.cs @@ -33,6 +33,8 @@ using System; using System.IO; +using Aaru.CommonTypes.Enums; +using Aaru.Console; namespace Aaru.DiscImages { @@ -96,14 +98,18 @@ namespace Aaru.DiscImages return true; } - void ReadTrackIntoCache(Stream stream, int trackNum) + ErrorNumber ReadTrackIntoCache(Stream stream, int trackNum) { byte[] trackData = new byte[_imageInfo.SectorSize * _imageInfo.SectorsPerTrack]; byte[] blkHeader = new byte[3]; // check that track is present if(_trackOffset[trackNum] == -1) - throw new InvalidDataException("Tried reading a track that is not present in image"); + { + AaruConsole.ErrorWriteLine("Tried reading a track that is not present in image"); + + return ErrorNumber.SectorNotFound; + } stream.Seek(_trackOffset[trackNum], SeekOrigin.Begin); @@ -135,10 +141,16 @@ namespace Aaru.DiscImages // check that the number of bytes decompressed matches a whole track if(dIndex != _imageInfo.SectorSize * _imageInfo.SectorsPerTrack) - throw new InvalidDataException("Track decompression yielded incomplete data"); + { + AaruConsole.ErrorWriteLine("Track decompression yielded incomplete data"); + + return ErrorNumber.InOutError; + } // store track in cache _trackCache[trackNum] = trackData; + + return ErrorNumber.NoError; } } } \ No newline at end of file diff --git a/Aaru.Images/HDCopy/Read.cs b/Aaru.Images/HDCopy/Read.cs index 2c638d84b..8a3cd68ca 100644 --- a/Aaru.Images/HDCopy/Read.cs +++ b/Aaru.Images/HDCopy/Read.cs @@ -137,7 +137,12 @@ namespace Aaru.DiscImages { // track is present in file, make sure it has been loaded if(!_trackCache.ContainsKey(trackNum)) - ReadTrackIntoCache(_hdcpImageFilter.GetDataForkStream(), trackNum); + { + ErrorNumber errno = ReadTrackIntoCache(_hdcpImageFilter.GetDataForkStream(), trackNum); + + if(errno != ErrorNumber.NoError) + return errno; + } Array.Copy(_trackCache[trackNum], sectorOffset * _imageInfo.SectorSize, buffer, 0, _imageInfo.SectorSize); diff --git a/Aaru.Images/IMD/Read.cs b/Aaru.Images/IMD/Read.cs index 690c20d8d..1253ac39f 100644 --- a/Aaru.Images/IMD/Read.cs +++ b/Aaru.Images/IMD/Read.cs @@ -35,7 +35,6 @@ using System.Collections.Generic; using System.IO; using Aaru.CommonTypes; using Aaru.CommonTypes.Enums; -using Aaru.CommonTypes.Exceptions; using Aaru.CommonTypes.Interfaces; using Aaru.Console; using Aaru.Helpers; @@ -158,7 +157,10 @@ namespace Aaru.DiscImages track.Add(idmap[i], data); break; - default: throw new ImageNotSupportedException($"Invalid sector type {(byte)type}"); + default: + AaruConsole.ErrorWriteLine($"Invalid sector type {(byte)type}"); + + return ErrorNumber.InvalidArgument; } } @@ -217,12 +219,14 @@ namespace Aaru.DiscImages } /// - public ErrorNumber ReadSector(ulong sectorAddress, out byte[] buffer) => ReadSectors(sectorAddress, 1, out buffer); + public ErrorNumber ReadSector(ulong sectorAddress, out byte[] buffer) => + ReadSectors(sectorAddress, 1, out buffer); /// public ErrorNumber ReadSectors(ulong sectorAddress, uint length, out byte[] buffer) { buffer = null; + if(sectorAddress > _imageInfo.Sectors - 1) return ErrorNumber.OutOfRange; diff --git a/Aaru.Images/KryoFlux/Read.cs b/Aaru.Images/KryoFlux/Read.cs index 3b175f940..514665321 100644 --- a/Aaru.Images/KryoFlux/Read.cs +++ b/Aaru.Images/KryoFlux/Read.cs @@ -125,10 +125,11 @@ namespace Aaru.DiscImages break; } - var trackFilter = new ZZZNoFilter(); + var trackFilter = new ZZZNoFilter(); + ErrorNumber errno = trackFilter.Open(trackfile); - if(trackFilter.Open(trackfile) != ErrorNumber.NoError) - throw new IOException("Could not open KryoFlux track file."); + if(errno != ErrorNumber.NoError) + return errno; _imageInfo.CreationTime = DateTime.MaxValue; _imageInfo.LastModificationTime = DateTime.MinValue; diff --git a/Aaru.Images/NDIF/Read.cs b/Aaru.Images/NDIF/Read.cs index 50f8853ed..7d06daa2d 100644 --- a/Aaru.Images/NDIF/Read.cs +++ b/Aaru.Images/NDIF/Read.cs @@ -36,7 +36,6 @@ using System.IO; using System.Linq; using Aaru.CommonTypes; using Aaru.CommonTypes.Enums; -using Aaru.CommonTypes.Exceptions; using Aaru.CommonTypes.Interfaces; using Aaru.Compression; using Aaru.Console; @@ -149,13 +148,17 @@ namespace Aaru.DiscImages switch(bChnk.type) { case CHUNK_TYPE_KENCODE: - throw new - ImageNotSupportedException("Chunks compressed with KenCode are not yet supported."); + AaruConsole.ErrorWriteLine("Chunks compressed with KenCode are not yet supported."); + + return ErrorNumber.NotImplemented; case CHUNK_TYPE_LZH: - throw new ImageNotSupportedException("Chunks compressed with LZH are not yet supported."); + AaruConsole.ErrorWriteLine("Chunks compressed with LZH are not yet supported."); + + return ErrorNumber.NotImplemented; case CHUNK_TYPE_STUFFIT: - throw new - ImageNotSupportedException("Chunks compressed with StuffIt! are not yet supported."); + AaruConsole.ErrorWriteLine("Chunks compressed with StuffIt! are not yet supported."); + + return ErrorNumber.NotImplemented; } // TODO: Handle compressed chunks @@ -163,7 +166,11 @@ namespace Aaru.DiscImages (bChnk.type > CHUNK_TYPE_ADC && bChnk.type < CHUNK_TYPE_STUFFIT) || (bChnk.type > CHUNK_TYPE_STUFFIT && bChnk.type < CHUNK_TYPE_END) || bChnk.type == 1) - throw new ImageNotSupportedException($"Unsupported chunk type 0x{bChnk.type:X8} found"); + { + AaruConsole.ErrorWriteLine($"Unsupported chunk type 0x{bChnk.type:X8} found"); + + return ErrorNumber.InvalidArgument; + } _chunks.Add(bChnk.sector, bChnk); } @@ -172,10 +179,18 @@ namespace Aaru.DiscImages } if(_header.segmented > 0) - throw new ImageNotSupportedException("Segmented images are not yet supported."); + { + AaruConsole.ErrorWriteLine("Segmented images are not yet supported."); + + return ErrorNumber.NotImplemented; + } if(_header.encrypted > 0) - throw new ImageNotSupportedException("Encrypted images are not yet supported."); + { + AaruConsole.ErrorWriteLine("Encrypted images are not yet supported."); + + return ErrorNumber.NotImplemented; + } switch(_imageInfo.Sectors) { diff --git a/Aaru.Images/Parallels/Read.cs b/Aaru.Images/Parallels/Read.cs index 6a96e0dbe..9ad0b919c 100644 --- a/Aaru.Images/Parallels/Read.cs +++ b/Aaru.Images/Parallels/Read.cs @@ -113,8 +113,7 @@ namespace Aaru.DiscImages buffer = null; if(sectorAddress > _imageInfo.Sectors - 1) - throw new ArgumentOutOfRangeException(nameof(sectorAddress), - $"Sector address {sectorAddress} not found"); + return ErrorNumber.OutOfRange; if(_empty) { diff --git a/Aaru.Images/PartClone/Read.cs b/Aaru.Images/PartClone/Read.cs index 8952b1314..0b98f6e4f 100644 --- a/Aaru.Images/PartClone/Read.cs +++ b/Aaru.Images/PartClone/Read.cs @@ -36,7 +36,6 @@ using System.IO; using System.Linq; using Aaru.CommonTypes; using Aaru.CommonTypes.Enums; -using Aaru.CommonTypes.Exceptions; using Aaru.CommonTypes.Extents; using Aaru.CommonTypes.Interfaces; using Aaru.Console; @@ -82,7 +81,11 @@ namespace Aaru.DiscImages AaruConsole.DebugWriteLine("PartClone plugin", "pHdr.bitmagic = {0}", StringHandlers.CToString(bitmagic)); if(!_biTmAgIc.SequenceEqual(bitmagic)) - throw new ImageNotSupportedException("Could not find partclone BiTmAgIc, not continuing..."); + { + AaruConsole.ErrorWriteLine("Could not find partclone BiTmAgIc, not continuing..."); + + return ErrorNumber.InvalidArgument; + } _dataOff = stream.Position; AaruConsole.DebugWriteLine("PartClone plugin", "pHdr.dataOff = {0}", _dataOff); diff --git a/Aaru.Images/Partimage/Read.cs b/Aaru.Images/Partimage/Read.cs index 98e6b8bfd..b7fa1581c 100644 --- a/Aaru.Images/Partimage/Read.cs +++ b/Aaru.Images/Partimage/Read.cs @@ -35,7 +35,6 @@ using System.Collections.Generic; using System.IO; using Aaru.CommonTypes; using Aaru.CommonTypes.Enums; -using Aaru.CommonTypes.Exceptions; using Aaru.CommonTypes.Extents; using Aaru.CommonTypes.Interfaces; using Aaru.Console; @@ -72,7 +71,11 @@ namespace Aaru.DiscImages // TODO: Support multifile volumes if(_cVolumeHeader.volumeNumber > 0) - throw new FeatureSupportedButNotImplementedImageException("Support for multiple volumes not supported"); + { + AaruConsole.ErrorWriteLine("Support for multiple volumes not supported"); + + return ErrorNumber.NotImplemented; + } hdrB = new byte[Marshal.SizeOf()]; stream.Read(hdrB, 0, Marshal.SizeOf()); @@ -204,7 +207,11 @@ namespace Aaru.DiscImages // partimage 0.6.1 does not support them either if(_cMainHeader.dwEncryptAlgo != PEncryption.None) - throw new ImageNotSupportedException("Encrypted images are currently not supported."); + { + AaruConsole.ErrorWriteLine("Encrypted images are currently not supported."); + + return ErrorNumber.NotImplemented; + } string magic; @@ -216,7 +223,11 @@ namespace Aaru.DiscImages magic = StringHandlers.CToString(hdrB); if(!magic.Equals(MAGIC_BEGIN_MBRBACKUP)) - throw new ImageNotSupportedException("Cannot find MBRs"); + { + AaruConsole.ErrorWriteLine("Cannot find MBRs"); + + return ErrorNumber.InvalidArgument; + } stream.Seek(_cMainHeader.dwMbrSize * _cMainHeader.dwMbrCount, SeekOrigin.Current); } @@ -229,7 +240,11 @@ namespace Aaru.DiscImages magic = StringHandlers.CToString(hdrB); if(!magic.Equals(MAGIC_BEGIN_LOCALHEADER)) - throw new ImageNotSupportedException("Cannot find local header"); + { + AaruConsole.ErrorWriteLine("Cannot find local header"); + + return ErrorNumber.InvalidArgument; + } hdrB = new byte[Marshal.SizeOf()]; stream.Read(hdrB, 0, Marshal.SizeOf()); @@ -259,7 +274,11 @@ namespace Aaru.DiscImages magic = StringHandlers.CToString(hdrB); if(!magic.Equals(MAGIC_BEGIN_BITMAP)) - throw new ImageNotSupportedException("Cannot find bitmap"); + { + AaruConsole.ErrorWriteLine("Cannot find bitmap"); + + return ErrorNumber.InvalidArgument; + } _bitmap = new byte[localHeader.qwBitmapSize]; stream.Read(_bitmap, 0, (int)localHeader.qwBitmapSize); @@ -269,7 +288,11 @@ namespace Aaru.DiscImages magic = StringHandlers.CToString(hdrB); if(!magic.Equals(MAGIC_BEGIN_INFO)) - throw new ImageNotSupportedException("Cannot find info block"); + { + AaruConsole.ErrorWriteLine("Cannot find info block"); + + return ErrorNumber.InvalidArgument; + } // Skip info block and its checksum stream.Seek(16384 + 4, SeekOrigin.Current); @@ -279,7 +302,11 @@ namespace Aaru.DiscImages magic = StringHandlers.CToString(hdrB); if(!magic.Equals(MAGIC_BEGIN_DATABLOCKS)) - throw new ImageNotSupportedException("Cannot find data blocks"); + { + AaruConsole.ErrorWriteLine("Cannot find data blocks"); + + return ErrorNumber.InvalidArgument; + } _dataOff = stream.Position; @@ -293,8 +320,11 @@ namespace Aaru.DiscImages magic = StringHandlers.CToString(hdrB); if(!magic.Equals(MAGIC_BEGIN_TAIL)) - throw new - ImageNotSupportedException("Cannot find tail. Multiple volumes are not supported or image is corrupt."); + { + AaruConsole.ErrorWriteLine("Cannot find tail. Multiple volumes are not supported or image is corrupt."); + + return ErrorNumber.InvalidArgument; + } AaruConsole.DebugWriteLine("Partimage plugin", "Filling extents"); DateTime start = DateTime.Now; diff --git a/Aaru.Images/QCOW/Read.cs b/Aaru.Images/QCOW/Read.cs index c30f8f59e..09d25b823 100644 --- a/Aaru.Images/QCOW/Read.cs +++ b/Aaru.Images/QCOW/Read.cs @@ -73,31 +73,57 @@ namespace Aaru.DiscImages AaruConsole.DebugWriteLine("QCOW plugin", "qHdr.l1_table_offset = {0}", _qHdr.l1_table_offset); if(_qHdr.size <= 1) - throw new ArgumentOutOfRangeException(nameof(_qHdr.size), "Image size is too small"); + { + AaruConsole.ErrorWriteLine("Image size is too small"); + + return ErrorNumber.InvalidArgument; + } if(_qHdr.cluster_bits < 9 || _qHdr.cluster_bits > 16) - throw new ArgumentOutOfRangeException(nameof(_qHdr.cluster_bits), - "Cluster size must be between 512 bytes and 64 Kbytes"); + { + AaruConsole.ErrorWriteLine("Cluster size must be between 512 bytes and 64 Kbytes"); + + return ErrorNumber.InvalidArgument; + } if(_qHdr.l2_bits < 9 - 3 || _qHdr.l2_bits > 16 - 3) - throw new ArgumentOutOfRangeException(nameof(_qHdr.l2_bits), - "L2 size must be between 512 bytes and 64 Kbytes"); + { + AaruConsole.ErrorWriteLine("L2 size must be between 512 bytes and 64 Kbytes"); + + return ErrorNumber.InvalidArgument; + } if(_qHdr.crypt_method > QCOW_ENCRYPTION_AES) - throw new ArgumentOutOfRangeException(nameof(_qHdr.crypt_method), "Invalid encryption method"); + { + AaruConsole.ErrorWriteLine("Invalid encryption method"); + + return ErrorNumber.InvalidArgument; + } if(_qHdr.crypt_method > QCOW_ENCRYPTION_NONE) - throw new NotImplementedException("AES encrypted images not yet supported"); + { + AaruConsole.ErrorWriteLine("AES encrypted images not yet supported"); + + return ErrorNumber.NotImplemented; + } if(_qHdr.backing_file_offset != 0) - throw new NotImplementedException("Differencing images not yet supported"); + { + AaruConsole.ErrorWriteLine("Differencing images not yet supported"); + + return ErrorNumber.NotImplemented; + } int shift = _qHdr.cluster_bits + _qHdr.l2_bits; if(_qHdr.size > ulong.MaxValue - (ulong)(1 << shift)) - throw new ArgumentOutOfRangeException(nameof(_qHdr.size), "Image is too large"); + { + AaruConsole.ErrorWriteLine("Image is too large"); + + return ErrorNumber.InvalidArgument; + } _clusterSize = 1 << _qHdr.cluster_bits; _clusterSectors = 1 << (_qHdr.cluster_bits - 9); diff --git a/Aaru.Images/QCOW/Write.cs b/Aaru.Images/QCOW/Write.cs index a211b906a..bea681b33 100644 --- a/Aaru.Images/QCOW/Write.cs +++ b/Aaru.Images/QCOW/Write.cs @@ -185,8 +185,11 @@ namespace Aaru.DiscImages ulong l1Off = (byteAddress & _l1Mask) >> _l1Shift; if((long)l1Off >= _l1Table.LongLength) - throw new ArgumentOutOfRangeException(nameof(l1Off), - $"Trying to write past L1 table, position {l1Off} of a max {_l1Table.LongLength}"); + { + ErrorMessage = $"Trying to write past L1 table, position {l1Off} of a max {_l1Table.LongLength}"; + + return false; + } if(_l1Table[l1Off] == 0) { diff --git a/Aaru.Images/QCOW2/Read.cs b/Aaru.Images/QCOW2/Read.cs index 3dfd9d9c8..7babee4e2 100644 --- a/Aaru.Images/QCOW2/Read.cs +++ b/Aaru.Images/QCOW2/Read.cs @@ -36,7 +36,6 @@ using System.IO; using System.Runtime.InteropServices; using Aaru.CommonTypes; using Aaru.CommonTypes.Enums; -using Aaru.CommonTypes.Exceptions; using Aaru.CommonTypes.Interfaces; using Aaru.Console; using Aaru.Helpers; @@ -87,26 +86,49 @@ namespace Aaru.DiscImages AaruConsole.DebugWriteLine("QCOW plugin", "qHdr.header_length = {0}", _qHdr.header_length); if((_qHdr.features & QCOW_FEATURE_MASK) != 0) - throw new - ImageNotSupportedException($"Unknown incompatible features {_qHdr.features & QCOW_FEATURE_MASK:X} enabled, not proceeding."); + { + AaruConsole. + ErrorWriteLine($"Unknown incompatible features {_qHdr.features & QCOW_FEATURE_MASK:X} enabled, not proceeding."); + + return ErrorNumber.InvalidArgument; + } } if(_qHdr.size <= 1) - throw new ArgumentOutOfRangeException(nameof(_qHdr.size), "Image size is too small"); + { + AaruConsole.ErrorWriteLine("Image size is too small"); + + return ErrorNumber.InvalidArgument; + } if(_qHdr.cluster_bits < 9 || _qHdr.cluster_bits > 16) - throw new ArgumentOutOfRangeException(nameof(_qHdr.cluster_bits), - "Cluster size must be between 512 bytes and 64 Kbytes"); + { + AaruConsole.ErrorWriteLine("Cluster size must be between 512 bytes and 64 Kbytes"); + + return ErrorNumber.InvalidArgument; + } if(_qHdr.crypt_method > QCOW_ENCRYPTION_AES) - throw new ArgumentOutOfRangeException(nameof(_qHdr.crypt_method), "Invalid encryption method"); + { + AaruConsole.ErrorWriteLine("Invalid encryption method"); + + return ErrorNumber.InvalidArgument; + } if(_qHdr.crypt_method > QCOW_ENCRYPTION_NONE) - throw new NotImplementedException("AES encrypted images not yet supported"); + { + AaruConsole.ErrorWriteLine("AES encrypted images not yet supported"); + + return ErrorNumber.NotImplemented; + } if(_qHdr.backing_file_offset != 0) - throw new NotImplementedException("Differencing images not yet supported"); + { + AaruConsole.ErrorWriteLine("Differencing images not yet supported"); + + return ErrorNumber.NotImplemented; + } _clusterSize = 1 << (int)_qHdr.cluster_bits; _clusterSectors = 1 << ((int)_qHdr.cluster_bits - 9); diff --git a/Aaru.Images/QCOW2/Write.cs b/Aaru.Images/QCOW2/Write.cs index 9327f62fb..83cda1d0e 100644 --- a/Aaru.Images/QCOW2/Write.cs +++ b/Aaru.Images/QCOW2/Write.cs @@ -213,8 +213,11 @@ namespace Aaru.DiscImages ulong l1Off = (byteAddress & _l1Mask) >> _l1Shift; if((long)l1Off >= _l1Table.LongLength) - throw new ArgumentOutOfRangeException(nameof(l1Off), - $"Trying to write past L1 table, position {l1Off} of a max {_l1Table.LongLength}"); + { + ErrorMessage = $"Trying to write past L1 table, position {l1Off} of a max {_l1Table.LongLength}"; + + return false; + } if(_l1Table[l1Off] == 0) { diff --git a/Aaru.Images/QED/Read.cs b/Aaru.Images/QED/Read.cs index c34d704bc..020dfc4d2 100644 --- a/Aaru.Images/QED/Read.cs +++ b/Aaru.Images/QED/Read.cs @@ -70,31 +70,46 @@ namespace Aaru.DiscImages AaruConsole.DebugWriteLine("QED plugin", "qHdr.backing_file_size = {0}", _qHdr.backing_file_size); if(_qHdr.image_size <= 1) - throw new ArgumentOutOfRangeException(nameof(_qHdr.image_size), "Image size is too small"); - + { + AaruConsole.ErrorWriteLine("Image size is too small"); + return ErrorNumber.InvalidArgument; + } if(!IsPowerOfTwo(_qHdr.cluster_size)) - throw new ArgumentOutOfRangeException(nameof(_qHdr.cluster_size), "Cluster size must be a power of 2"); - + { + AaruConsole.ErrorWriteLine("Cluster size must be a power of 2"); + return ErrorNumber.InvalidArgument; + } if(_qHdr.cluster_size < 4096 || _qHdr.cluster_size > 67108864) - throw new ArgumentOutOfRangeException(nameof(_qHdr.cluster_size), - "Cluster size must be between 4 Kbytes and 64 Mbytes"); - + { + AaruConsole.ErrorWriteLine("Cluster size must be between 4 Kbytes and 64 Mbytes"); + return ErrorNumber.InvalidArgument; + } if(!IsPowerOfTwo(_qHdr.table_size)) - throw new ArgumentOutOfRangeException(nameof(_qHdr.table_size), "Table size must be a power of 2"); - + { + AaruConsole.ErrorWriteLine("Table size must be a power of 2"); + return ErrorNumber.InvalidArgument; + } if(_qHdr.table_size < 1 || _qHdr.table_size > 16) - throw new ArgumentOutOfRangeException(nameof(_qHdr.table_size), + { + AaruConsole.ErrorWriteLine( "Table size must be between 1 and 16 clusters"); - + return ErrorNumber.InvalidArgument; + } if((_qHdr.features & QED_FEATURE_MASK) > 0) - throw new ArgumentOutOfRangeException(nameof(_qHdr.features), + { + AaruConsole.ErrorWriteLine( $"Image uses unknown incompatible features {_qHdr.features & QED_FEATURE_MASK:X}"); + return ErrorNumber.InvalidArgument; + } if((_qHdr.features & QED_FEATURE_BACKING_FILE) == QED_FEATURE_BACKING_FILE) - throw new NotImplementedException("Differencing images not yet supported"); + { + AaruConsole.ErrorWriteLine("Differencing images not yet supported"); + return ErrorNumber.NotImplemented; + } _clusterSectors = _qHdr.cluster_size / 512; _tableSize = _qHdr.cluster_size * _qHdr.table_size / 8; diff --git a/Aaru.Images/QED/Write.cs b/Aaru.Images/QED/Write.cs index 8a8c46776..ae6be6bd0 100644 --- a/Aaru.Images/QED/Write.cs +++ b/Aaru.Images/QED/Write.cs @@ -176,8 +176,11 @@ namespace Aaru.DiscImages ulong l1Off = (byteAddress & _l1Mask) >> _l1Shift; if((long)l1Off >= _l1Table.LongLength) - throw new ArgumentOutOfRangeException(nameof(l1Off), - $"Trying to write past L1 table, position {l1Off} of a max {_l1Table.LongLength}"); + { + ErrorMessage = $"Trying to write past L1 table, position {l1Off} of a max {_l1Table.LongLength}"; + + return false; + } if(_l1Table[l1Off] == 0) { diff --git a/Aaru.Images/TeleDisk/Helpers.cs b/Aaru.Images/TeleDisk/Helpers.cs index 6b2d512fb..a45b34798 100644 --- a/Aaru.Images/TeleDisk/Helpers.cs +++ b/Aaru.Images/TeleDisk/Helpers.cs @@ -32,7 +32,7 @@ using System; using Aaru.CommonTypes; -using Aaru.CommonTypes.Exceptions; +using Aaru.CommonTypes.Enums; using Aaru.Console; using Aaru.Helpers; @@ -69,9 +69,10 @@ namespace Aaru.DiscImages return crc; } - static byte[] DecodeTeleDiskData(byte sectorSize, byte encodingType, byte[] encodedData) + static ErrorNumber DecodeTeleDiskData(byte sectorSize, byte encodingType, byte[] encodedData, + out byte[] decodedData) { - byte[] decodedData; + decodedData = null; switch(sectorSize) { @@ -103,7 +104,10 @@ namespace Aaru.DiscImages decodedData = new byte[8192]; break; - default: throw new ImageNotSupportedException($"Sector size {sectorSize} is incorrect."); + default: + AaruConsole.ErrorWriteLine($"Sector size {sectorSize} is incorrect."); + + return ErrorNumber.InvalidArgument; } switch(encodingType) @@ -189,10 +193,13 @@ namespace Aaru.DiscImages break; } - default: throw new ImageNotSupportedException($"Data encoding {encodingType} is incorrect."); + default: + AaruConsole.ErrorWriteLine($"Data encoding {encodingType} is incorrect."); + + return ErrorNumber.InvalidArgument; } - return decodedData; + return ErrorNumber.NoError; } MediaType DecodeTeleDiskDiskType() diff --git a/Aaru.Images/TeleDisk/Read.cs b/Aaru.Images/TeleDisk/Read.cs index 8ef5766aa..e4aaea0b3 100644 --- a/Aaru.Images/TeleDisk/Read.cs +++ b/Aaru.Images/TeleDisk/Read.cs @@ -34,7 +34,6 @@ using System; using System.IO; using System.Text; using Aaru.CommonTypes.Enums; -using Aaru.CommonTypes.Exceptions; using Aaru.CommonTypes.Interfaces; using Aaru.Compression; using Aaru.Console; @@ -281,7 +280,11 @@ namespace Aaru.DiscImages if(totalCylinders <= 0 || totalHeads <= 0) - throw new ImageNotSupportedException("No cylinders or heads found"); + { + AaruConsole.ErrorWriteLine("No cylinders or heads found"); + + return ErrorNumber.InvalidArgument; + } bool hasLeadOutOnHead0 = false; bool hasLeadOutOnHead1 = false; @@ -451,7 +454,11 @@ namespace Aaru.DiscImages AaruConsole.DebugWriteLine("TeleDisk plugin", "\t\tData encoding: 0x{0:X2}", teleDiskData.DataEncoding); - decodedData = DecodeTeleDiskData(teleDiskSector.SectorSize, teleDiskData.DataEncoding, data); + ErrorNumber errno = DecodeTeleDiskData(teleDiskSector.SectorSize, teleDiskData.DataEncoding, + data, out decodedData); + + if(errno != ErrorNumber.NoError) + return errno; byte tdSectorCalculatedCrc = (byte)(TeleDiskCrc(0, decodedData) & 0xFF); diff --git a/Aaru.Images/UDIF/Read.cs b/Aaru.Images/UDIF/Read.cs index 8f8faac76..1cb3f78d9 100644 --- a/Aaru.Images/UDIF/Read.cs +++ b/Aaru.Images/UDIF/Read.cs @@ -36,7 +36,6 @@ using System.IO; using System.Linq; using Aaru.CommonTypes; using Aaru.CommonTypes.Enums; -using Aaru.CommonTypes.Exceptions; using Aaru.CommonTypes.Interfaces; using Aaru.Compression; using Aaru.Console; @@ -77,7 +76,11 @@ namespace Aaru.DiscImages _footer = Marshal.ByteArrayToStructureBigEndian