diff --git a/.idea/.idea.Aaru/.idea/vcs.xml b/.idea/.idea.Aaru/.idea/vcs.xml index 53b6d8915..361dcec1e 100644 --- a/.idea/.idea.Aaru/.idea/vcs.xml +++ b/.idea/.idea.Aaru/.idea/vcs.xml @@ -9,12 +9,12 @@ + - \ No newline at end of file diff --git a/Aaru.CommonTypes b/Aaru.CommonTypes index 0fc3e1ef9..cc5779c1f 160000 --- a/Aaru.CommonTypes +++ b/Aaru.CommonTypes @@ -1 +1 @@ -Subproject commit 0fc3e1ef94f293ceb0f42500b1d4f2aa12293963 +Subproject commit cc5779c1ff74a34da8e0bc779dbe037298480171 diff --git a/Aaru.Core/Sidecar/BlockMedia.cs b/Aaru.Core/Sidecar/BlockMedia.cs index 860339e73..0e74aace0 100644 --- a/Aaru.Core/Sidecar/BlockMedia.cs +++ b/Aaru.Core/Sidecar/BlockMedia.cs @@ -417,7 +417,7 @@ namespace Aaru.Core if(errno != ErrorNumber.NoError) { - AaruConsole.ErrorWriteLine($"Error {errno} reading sector {doneSectors}"); + UpdateStatus($"Error {errno} reading sector {doneSectors}"); EndProgress2(); return; @@ -432,7 +432,7 @@ namespace Aaru.Core if(errno != ErrorNumber.NoError) { - AaruConsole.ErrorWriteLine($"Error {errno} reading sector {doneSectors}"); + UpdateStatus($"Error {errno} reading sector {doneSectors}"); EndProgress2(); return; diff --git a/Aaru.Core/Sidecar/OpticalDisc.cs b/Aaru.Core/Sidecar/OpticalDisc.cs index 3e7b5199a..1dc2cadae 100644 --- a/Aaru.Core/Sidecar/OpticalDisc.cs +++ b/Aaru.Core/Sidecar/OpticalDisc.cs @@ -100,7 +100,8 @@ namespace Aaru.Core sidecar.OpticalDisc[0].Sequence.TotalMedia = 1; } - MediaType dskType = image.Info.MediaType; + MediaType dskType = image.Info.MediaType; + ErrorNumber errno; UpdateStatus("Hashing media tags..."); @@ -109,7 +110,7 @@ namespace Aaru.Core if(_aborted) return; - ErrorNumber errno = image.ReadMediaTag(tagType, out byte[] tag); + errno = image.ReadMediaTag(tagType, out byte[] tag); if(errno != ErrorNumber.NoError) continue; @@ -446,21 +447,38 @@ namespace Aaru.Core if(sectors - doneSectors >= sectorsToRead) { - sector = image.ReadSectorsLong(doneSectors, sectorsToRead, xmlTrk.Sequence.TrackNumber); + errno = image.ReadSectorsLong(doneSectors, sectorsToRead, xmlTrk.Sequence.TrackNumber, + out sector); UpdateProgress2("Hashing sector {0} of {1}", (long)doneSectors, (long)(trk.EndSector - trk.StartSector + 1)); + if(errno != ErrorNumber.NoError) + { + UpdateStatus($"Error {errno} reading sector {doneSectors}"); + EndProgress2(); + + return; + } + doneSectors += sectorsToRead; } else { - sector = image.ReadSectorsLong(doneSectors, (uint)(sectors - doneSectors), - xmlTrk.Sequence.TrackNumber); + errno = image.ReadSectorsLong(doneSectors, (uint)(sectors - doneSectors), + xmlTrk.Sequence.TrackNumber, out sector); UpdateProgress2("Hashing sector {0} of {1}", (long)doneSectors, (long)(trk.EndSector - trk.StartSector + 1)); + if(errno != ErrorNumber.NoError) + { + UpdateStatus($"Error {errno} reading sector {doneSectors}"); + EndProgress2(); + + return; + } + doneSectors += sectors - doneSectors; } @@ -705,7 +723,7 @@ namespace Aaru.Core xmlTrk.FileSystemInformation[0].FileSystems = lstFs.ToArray(); } - ErrorNumber errno = image.ReadSectorTag(trk.Sequence, SectorTagType.CdTrackIsrc, out byte[] isrcData); + errno = image.ReadSectorTag(trk.Sequence, SectorTagType.CdTrackIsrc, out byte[] isrcData); if(errno == ErrorNumber.NoError) xmlTrk.ISRC = Encoding.UTF8.GetString(isrcData); diff --git a/Aaru.Images/AaruFormat/Read.cs b/Aaru.Images/AaruFormat/Read.cs index fa3759456..b0974c4f6 100644 --- a/Aaru.Images/AaruFormat/Read.cs +++ b/Aaru.Images/AaruFormat/Read.cs @@ -2197,19 +2197,17 @@ namespace Aaru.DiscImages } /// - public byte[] ReadSectorLong(ulong sectorAddress, uint track) + public ErrorNumber ReadSectorLong(ulong sectorAddress, uint track, out byte[] buffer) { + buffer = null; + if(_imageInfo.XmlMediaType != XmlMediaType.OpticalDisc) - throw new FeatureNotPresentImageException("Feature not present in image"); + return ErrorNumber.NotSupported; Track trk = Tracks.FirstOrDefault(t => t.Sequence == track); - if(trk?.Sequence != track) - throw new ArgumentOutOfRangeException(nameof(track), "Track does not exist in disc image"); - - ErrorNumber errno = ReadSectorLong(trk.StartSector + sectorAddress, out byte[] buffer); - - return errno != ErrorNumber.NoError ? null : buffer; + return trk?.Sequence != track ? ErrorNumber.SectorNotFound + : ReadSectorLong(trk.StartSector + sectorAddress, out buffer); } /// @@ -2391,23 +2389,20 @@ namespace Aaru.DiscImages } /// - public byte[] ReadSectorsLong(ulong sectorAddress, uint length, uint track) + public ErrorNumber ReadSectorsLong(ulong sectorAddress, uint length, uint track, out byte[] buffer) { + buffer = null; + if(_imageInfo.XmlMediaType != XmlMediaType.OpticalDisc) - throw new FeatureNotPresentImageException("Feature not present in image"); + return ErrorNumber.NotSupported; Track trk = Tracks.FirstOrDefault(t => t.Sequence == track); - if(trk?.Sequence != track) - throw new ArgumentOutOfRangeException(nameof(track), "Track does not exist in disc image"); - - if(trk.StartSector + sectorAddress + length > trk.EndSector + 1) - throw new ArgumentOutOfRangeException(nameof(length), - $"Requested more sectors ({length + sectorAddress}) than present in track ({trk.EndSector - trk.StartSector + 1}), won't cross tracks"); - - ErrorNumber errno = ReadSectorsLong(trk.StartSector + sectorAddress, length, out byte[] buffer); - - return errno == ErrorNumber.NoError ? buffer : null; + return trk?.Sequence != track + ? ErrorNumber.SectorNotFound + : trk.StartSector + sectorAddress + length > trk.EndSector + 1 + ? ErrorNumber.OutOfRange + : ReadSectorsLong(trk.StartSector + sectorAddress, length, out buffer); } /// diff --git a/Aaru.Images/AaruFormat/Verify.cs b/Aaru.Images/AaruFormat/Verify.cs index 3add3caaa..bdb343f04 100644 --- a/Aaru.Images/AaruFormat/Verify.cs +++ b/Aaru.Images/AaruFormat/Verify.cs @@ -283,12 +283,17 @@ namespace Aaru.DiscImages return null; } - byte[] buffer = ReadSectorsLong(sectorAddress, length, track); - int bps = (int)(buffer.Length / length); - byte[] sector = new byte[bps]; failingLbas = new List(); unknownLbas = new List(); + ErrorNumber errno = ReadSectorsLong(sectorAddress, length, track, out byte[] buffer); + + if(errno != ErrorNumber.NoError) + return null; + + int bps = (int)(buffer.Length / length); + byte[] sector = new byte[bps]; + for(int i = 0; i < length; i++) { Array.Copy(buffer, i * bps, sector, 0, bps); diff --git a/Aaru.Images/Alcohol120/Read.cs b/Aaru.Images/Alcohol120/Read.cs index 16f18aea3..8e56e2d45 100644 --- a/Aaru.Images/Alcohol120/Read.cs +++ b/Aaru.Images/Alcohol120/Read.cs @@ -1384,7 +1384,8 @@ namespace Aaru.DiscImages ReadSectorsLong(sectorAddress, 1, out buffer); /// - public byte[] ReadSectorLong(ulong sectorAddress, uint track) => ReadSectorsLong(sectorAddress, 1, track); + public ErrorNumber ReadSectorLong(ulong sectorAddress, uint track, out byte[] buffer) => + ReadSectorsLong(sectorAddress, 1, track, out buffer); /// public ErrorNumber ReadSectorsLong(ulong sectorAddress, uint length, out byte[] buffer) @@ -1402,24 +1403,23 @@ namespace Aaru.DiscImages if(sectorAddress - kvp.Value >= alcExtra.sectors + alcExtra.pregap) continue; - buffer = ReadSectorsLong(sectorAddress - kvp.Value, length, kvp.Key); - - return buffer == null ? ErrorNumber.NoData : ErrorNumber.NoError; + return ReadSectorsLong(sectorAddress - kvp.Value, length, kvp.Key, out buffer); } return ErrorNumber.SectorNotFound; } /// - public byte[] ReadSectorsLong(ulong sectorAddress, uint length, uint track) + public ErrorNumber ReadSectorsLong(ulong sectorAddress, uint length, uint track, out byte[] buffer) { + buffer = null; + if(!_alcTracks.TryGetValue((int)track, out Track alcTrack) || !_alcTrackExtras.TryGetValue((int)track, out TrackExtra alcExtra)) - throw new ArgumentOutOfRangeException(nameof(track), "Track does not exist in disc image"); + return ErrorNumber.SectorNotFound; if(length + sectorAddress > alcExtra.sectors + alcExtra.pregap) - throw new ArgumentOutOfRangeException(nameof(length), - $"Requested more sectors ({length}) than present in track ({alcExtra.sectors + alcExtra.pregap}), won't cross tracks"); + return ErrorNumber.OutOfRange; uint sectorOffset; uint sectorSize; @@ -1445,19 +1445,19 @@ namespace Aaru.DiscImages break; } - default: throw new FeatureSupportedButNotImplementedImageException("Unsupported track type"); + default: return ErrorNumber.NotSupported; } if(alcTrack.subMode == SubchannelMode.Interleaved) sectorSkip = 96; - byte[] buffer = new byte[sectorSize * length]; + buffer = new byte[sectorSize * length]; if(alcTrack.point == 1 && alcExtra.pregap > 150) { if(sectorAddress + 150 < alcExtra.pregap) - return buffer; + return ErrorNumber.NoError; sectorAddress -= alcExtra.pregap - 150; } @@ -1487,7 +1487,7 @@ namespace Aaru.DiscImages Array.Copy(sector, 0, buffer, i * sectorSize, sectorSize); } - return buffer; + return ErrorNumber.NoError; } /// diff --git a/Aaru.Images/Alcohol120/Verify.cs b/Aaru.Images/Alcohol120/Verify.cs index 575706d1b..9447341fa 100644 --- a/Aaru.Images/Alcohol120/Verify.cs +++ b/Aaru.Images/Alcohol120/Verify.cs @@ -89,11 +89,15 @@ namespace Aaru.DiscImages public bool? VerifySectors(ulong sectorAddress, uint length, uint track, out List failingLbas, out List unknownLbas) { - byte[] buffer = ReadSectorsLong(sectorAddress, length, track); - int bps = (int)(buffer.Length / length); - byte[] sector = new byte[bps]; failingLbas = new List(); unknownLbas = new List(); + ErrorNumber errno = ReadSectorsLong(sectorAddress, length, track, out byte[] buffer); + + if(errno != ErrorNumber.NoError) + return null; + + int bps = (int)(buffer.Length / length); + byte[] sector = new byte[bps]; for(int i = 0; i < length; i++) { diff --git a/Aaru.Images/BlindWrite4/Read.cs b/Aaru.Images/BlindWrite4/Read.cs index 89290c981..52d082e09 100644 --- a/Aaru.Images/BlindWrite4/Read.cs +++ b/Aaru.Images/BlindWrite4/Read.cs @@ -1182,7 +1182,8 @@ namespace Aaru.DiscImages ReadSectorsLong(sectorAddress, 1, out buffer); /// - public byte[] ReadSectorLong(ulong sectorAddress, uint track) => ReadSectorsLong(sectorAddress, 1, track); + public ErrorNumber ReadSectorLong(ulong sectorAddress, uint track, out byte[] buffer) => + ReadSectorsLong(sectorAddress, 1, track, out buffer); /// public ErrorNumber ReadSectorsLong(ulong sectorAddress, uint length, out byte[] buffer) @@ -1193,36 +1194,22 @@ namespace Aaru.DiscImages from track in Tracks where track.Sequence == kvp.Key where sectorAddress - kvp.Value < track.EndSector - track.StartSector + 1 select kvp) - { - buffer = ReadSectorsLong(sectorAddress - kvp.Value, length, kvp.Key); - - return buffer is null ? ErrorNumber.SectorNotFound : ErrorNumber.NoError; - } + return ReadSectorsLong(sectorAddress - kvp.Value, length, kvp.Key, out buffer); return ErrorNumber.SectorNotFound; } /// - public byte[] ReadSectorsLong(ulong sectorAddress, uint length, uint track) + public ErrorNumber ReadSectorsLong(ulong sectorAddress, uint length, uint track, out byte[] buffer) { - var aaruTrack = new Track - { - Sequence = 0 - }; - - foreach(Track bwTrack in Tracks.Where(bwTrack => bwTrack.Sequence == track)) - { - aaruTrack = bwTrack; - - break; - } + buffer = null; + Track? aaruTrack = Tracks.FirstOrDefault(bwTrack => bwTrack.Sequence == track); if(aaruTrack is null) - throw new ArgumentOutOfRangeException(nameof(track), "Track does not exist in disc image"); + return ErrorNumber.SectorNotFound; if(length + sectorAddress > aaruTrack.EndSector - aaruTrack.StartSector + 1) - throw new ArgumentOutOfRangeException(nameof(length), - $"Requested more sectors ({length + sectorAddress}) than present in track ({aaruTrack.EndSector - aaruTrack.StartSector + 1}), won't cross tracks"); + return ErrorNumber.OutOfRange; uint sectorOffset; uint sectorSize; @@ -1241,7 +1228,7 @@ namespace Aaru.DiscImages break; } - default: throw new FeatureSupportedButNotImplementedImageException("Unsupported track type"); + default: return ErrorNumber.NotSupported; } _imageStream = aaruTrack.Filter.GetDataForkStream(); @@ -1251,9 +1238,9 @@ namespace Aaru.DiscImages Seek((long)aaruTrack.FileOffset + (long)(sectorAddress * (sectorOffset + sectorSize + sectorSkip)), SeekOrigin.Begin); - byte[] buffer = br.ReadBytes((int)(sectorSize * length)); + buffer = br.ReadBytes((int)(sectorSize * length)); - return buffer; + return ErrorNumber.NoError; } /// diff --git a/Aaru.Images/BlindWrite4/Verify.cs b/Aaru.Images/BlindWrite4/Verify.cs index 6591eb86c..0f26a9c54 100644 --- a/Aaru.Images/BlindWrite4/Verify.cs +++ b/Aaru.Images/BlindWrite4/Verify.cs @@ -89,11 +89,15 @@ namespace Aaru.DiscImages public bool? VerifySectors(ulong sectorAddress, uint length, uint track, out List failingLbas, out List unknownLbas) { - byte[] buffer = ReadSectorsLong(sectorAddress, length, track); - int bps = (int)(buffer.Length / length); - byte[] sector = new byte[bps]; failingLbas = new List(); unknownLbas = new List(); + ErrorNumber errno = ReadSectorsLong(sectorAddress, length, track, out byte[] buffer); + + if(errno != ErrorNumber.NoError) + return null; + + int bps = (int)(buffer.Length / length); + byte[] sector = new byte[bps]; for(int i = 0; i < length; i++) { diff --git a/Aaru.Images/BlindWrite5/Read.cs b/Aaru.Images/BlindWrite5/Read.cs index 2e66a3fcf..a20ce0255 100644 --- a/Aaru.Images/BlindWrite5/Read.cs +++ b/Aaru.Images/BlindWrite5/Read.cs @@ -2102,7 +2102,8 @@ namespace Aaru.DiscImages ReadSectorsLong(sectorAddress, 1, out buffer); /// - public byte[] ReadSectorLong(ulong sectorAddress, uint track) => ReadSectorsLong(sectorAddress, 1, track); + public ErrorNumber ReadSectorLong(ulong sectorAddress, uint track, out byte[] buffer) => + ReadSectorsLong(sectorAddress, 1, track, out buffer); /// public ErrorNumber ReadSectorsLong(ulong sectorAddress, uint length, out byte[] buffer) @@ -2113,37 +2114,24 @@ namespace Aaru.DiscImages from track in Tracks where track.Sequence == kvp.Key where sectorAddress - kvp.Value < track.EndSector - track.StartSector + 1 select kvp) - { - buffer = ReadSectorsLong(sectorAddress - kvp.Value, length, kvp.Key); - - return buffer is null ? ErrorNumber.SectorNotFound : ErrorNumber.NoError; - } + return ReadSectorsLong(sectorAddress - kvp.Value, length, kvp.Key, out buffer); return ErrorNumber.SectorNotFound; } /// - public byte[] ReadSectorsLong(ulong sectorAddress, uint length, uint track) + public ErrorNumber ReadSectorsLong(ulong sectorAddress, uint length, uint track, out byte[] buffer) { + buffer = null; + // TODO: Cross data files - var aaruTrack = new Track - { - Sequence = 0 - }; - - foreach(Track bwTrack in Tracks.Where(bwTrack => bwTrack.Sequence == track)) - { - aaruTrack = bwTrack; - - break; - } + Track? aaruTrack = Tracks.FirstOrDefault(bwTrack => bwTrack.Sequence == track); if(aaruTrack is null) - throw new ArgumentOutOfRangeException(nameof(track), "Track does not exist in disc image"); + return ErrorNumber.SectorNotFound; if(length + sectorAddress > aaruTrack.EndSector - aaruTrack.StartSector + 1) - throw new ArgumentOutOfRangeException(nameof(length), - $"Requested more sectors ({length + sectorAddress}) than present in track ({aaruTrack.EndSector - aaruTrack.StartSector + 1}), won't cross tracks"); + return ErrorNumber.OutOfRange; DataFileCharacteristics chars = (from characteristics in _filePaths let firstSector = characteristics.StartLba let lastSector = @@ -2154,7 +2142,7 @@ namespace Aaru.DiscImages if(string.IsNullOrEmpty(chars.FilePath) || chars.FileFilter == null) - throw new ArgumentOutOfRangeException(nameof(chars.FileFilter), "Track does not exist in disc image"); + return ErrorNumber.SectorNotFound; uint sectorOffset; uint sectorSize; @@ -2182,7 +2170,7 @@ namespace Aaru.DiscImages break; } - default: throw new FeatureSupportedButNotImplementedImageException("Unsupported track type"); + default: return ErrorNumber.NotSupported; } switch(chars.Subchannel) @@ -2199,10 +2187,10 @@ namespace Aaru.DiscImages sectorSkip += 96; break; - default: throw new FeatureSupportedButNotImplementedImageException("Unsupported subchannel type"); + default: return ErrorNumber.NotSupported; } - byte[] buffer = new byte[sectorSize * length]; + buffer = new byte[sectorSize * length]; _imageStream = aaruTrack.Filter.GetDataForkStream(); var br = new BinaryReader(_imageStream); @@ -2223,7 +2211,7 @@ namespace Aaru.DiscImages Array.Copy(sector, 0, buffer, i * sectorSize, sectorSize); } - return buffer; + return ErrorNumber.NoError; } /// diff --git a/Aaru.Images/BlindWrite5/Verify.cs b/Aaru.Images/BlindWrite5/Verify.cs index 5ef8939fd..625c94f50 100644 --- a/Aaru.Images/BlindWrite5/Verify.cs +++ b/Aaru.Images/BlindWrite5/Verify.cs @@ -89,11 +89,15 @@ namespace Aaru.DiscImages public bool? VerifySectors(ulong sectorAddress, uint length, uint track, out List failingLbas, out List unknownLbas) { - byte[] buffer = ReadSectorsLong(sectorAddress, length, track); - int bps = (int)(buffer.Length / length); - byte[] sector = new byte[bps]; failingLbas = new List(); unknownLbas = new List(); + ErrorNumber errno = ReadSectorsLong(sectorAddress, length, track, out byte[] buffer); + + if(errno != ErrorNumber.NoError) + return null; + + int bps = (int)(buffer.Length / length); + byte[] sector = new byte[bps]; for(int i = 0; i < length; i++) { diff --git a/Aaru.Images/CDRDAO/Read.cs b/Aaru.Images/CDRDAO/Read.cs index ff3f01788..1b35090d3 100644 --- a/Aaru.Images/CDRDAO/Read.cs +++ b/Aaru.Images/CDRDAO/Read.cs @@ -1309,7 +1309,8 @@ namespace Aaru.DiscImages ReadSectorsLong(sectorAddress, 1, out buffer); /// - public byte[] ReadSectorLong(ulong sectorAddress, uint track) => ReadSectorsLong(sectorAddress, 1, track); + public ErrorNumber ReadSectorLong(ulong sectorAddress, uint track, out byte[] buffer) => + ReadSectorsLong(sectorAddress, 1, track, out buffer); /// public ErrorNumber ReadSectorsLong(ulong sectorAddress, uint length, out byte[] buffer) @@ -1320,18 +1321,16 @@ namespace Aaru.DiscImages from cdrdaoTrack in _discimage.Tracks where cdrdaoTrack.Sequence == kvp.Key where sectorAddress - kvp.Value < cdrdaoTrack.Sectors select kvp) - { - buffer = ReadSectorsLong(sectorAddress - kvp.Value, length, kvp.Key); - - return buffer is null ? ErrorNumber.SectorNotFound : ErrorNumber.NoError; - } + return ReadSectorsLong(sectorAddress - kvp.Value, length, kvp.Key, out buffer); return ErrorNumber.SectorNotFound; } /// - public byte[] ReadSectorsLong(ulong sectorAddress, uint length, uint track) + public ErrorNumber ReadSectorsLong(ulong sectorAddress, uint length, uint track, out byte[] buffer) { + buffer = null; + var aaruTrack = new CdrdaoTrack { Sequence = 0 @@ -1345,11 +1344,10 @@ namespace Aaru.DiscImages } if(aaruTrack.Sequence == 0) - throw new ArgumentOutOfRangeException(nameof(track), "Track does not exist in disc image"); + return ErrorNumber.SectorNotFound; if(length > aaruTrack.Sectors) - throw new ArgumentOutOfRangeException(nameof(length), - "Requested more sectors than present in track, won't cross tracks"); + return ErrorNumber.OutOfRange; uint sectorOffset; uint sectorSize; @@ -1393,13 +1391,13 @@ namespace Aaru.DiscImages break; } - default: throw new FeatureSupportedButNotImplementedImageException("Unsupported track type"); + default: return ErrorNumber.NotSupported; } if(aaruTrack.Subchannel) sectorSkip += 96; - byte[] buffer = new byte[sectorSize * length]; + buffer = new byte[sectorSize * length]; _imageStream = aaruTrack.Trackfile.Datafilter.GetDataForkStream(); var br = new BinaryReader(_imageStream); @@ -1517,7 +1515,7 @@ namespace Aaru.DiscImages } } - return buffer; + return ErrorNumber.NoError; } /// diff --git a/Aaru.Images/CDRDAO/Verify.cs b/Aaru.Images/CDRDAO/Verify.cs index d2e5f93ea..11b32f7a8 100644 --- a/Aaru.Images/CDRDAO/Verify.cs +++ b/Aaru.Images/CDRDAO/Verify.cs @@ -89,11 +89,15 @@ namespace Aaru.DiscImages public bool? VerifySectors(ulong sectorAddress, uint length, uint track, out List failingLbas, out List unknownLbas) { - byte[] buffer = ReadSectorsLong(sectorAddress, length, track); - int bps = (int)(buffer.Length / length); - byte[] sector = new byte[bps]; failingLbas = new List(); unknownLbas = new List(); + ErrorNumber errno = ReadSectorsLong(sectorAddress, length, track, out byte[] buffer); + + if(errno != ErrorNumber.NoError) + return null; + + int bps = (int)(buffer.Length / length); + byte[] sector = new byte[bps]; for(int i = 0; i < length; i++) { diff --git a/Aaru.Images/CDRWin/Read.cs b/Aaru.Images/CDRWin/Read.cs index 1d96dc104..b6c8da999 100644 --- a/Aaru.Images/CDRWin/Read.cs +++ b/Aaru.Images/CDRWin/Read.cs @@ -2042,7 +2042,8 @@ namespace Aaru.DiscImages ReadSectorsLong(sectorAddress, 1, out buffer); /// - public byte[] ReadSectorLong(ulong sectorAddress, uint track) => ReadSectorsLong(sectorAddress, 1, track); + public ErrorNumber ReadSectorLong(ulong sectorAddress, uint track, out byte[] buffer) => + ReadSectorsLong(sectorAddress, 1, track, out buffer); /// public ErrorNumber ReadSectorsLong(ulong sectorAddress, uint length, out byte[] buffer) @@ -2053,43 +2054,26 @@ namespace Aaru.DiscImages from cdrwinTrack in _discImage.Tracks where cdrwinTrack.Sequence == kvp.Key where sectorAddress - kvp.Value < cdrwinTrack.Sectors select kvp) - { - buffer = ReadSectorsLong(sectorAddress - kvp.Value, length, kvp.Key); - - return buffer is null ? ErrorNumber.SectorNotFound : ErrorNumber.NoError; - } + return ReadSectorsLong(sectorAddress - kvp.Value, length, kvp.Key, out buffer); return ErrorNumber.SectorNotFound; } /// - public byte[] ReadSectorsLong(ulong sectorAddress, uint length, uint track) + public ErrorNumber ReadSectorsLong(ulong sectorAddress, uint length, uint track, out byte[] buffer) { + buffer = null; + if(!_isCd) - { - ErrorNumber errno = ReadSectors(sectorAddress, length, track, out byte[] nonCdBuffer); + return ReadSectors(sectorAddress, length, track, out buffer); - return errno != ErrorNumber.NoError ? null : nonCdBuffer; - } + CdrWinTrack? aaruTrack = _discImage.Tracks.FirstOrDefault(cdrwinTrack => cdrwinTrack.Sequence == track); - var aaruTrack = new CdrWinTrack - { - Sequence = 0 - }; - - foreach(CdrWinTrack cdrwinTrack in _discImage.Tracks.Where(cdrwinTrack => cdrwinTrack.Sequence == track)) - { - aaruTrack = cdrwinTrack; - - break; - } - - if(aaruTrack.Sequence == 0) - throw new ArgumentOutOfRangeException(nameof(track), "Track does not exist in disc image"); + if(aaruTrack is null) + return ErrorNumber.SectorNotFound; if(length > aaruTrack.Sectors) - throw new ArgumentOutOfRangeException(nameof(length), - "Requested more sectors than present in track, won't cross tracks"); + return ErrorNumber.OutOfRange; uint sectorOffset; uint sectorSize; @@ -2142,10 +2126,10 @@ namespace Aaru.DiscImages break; } - default: throw new FeatureSupportedButNotImplementedImageException("Unsupported track type"); + default: return ErrorNumber.NotSupported; } - byte[] buffer = new byte[sectorSize * length]; + buffer = new byte[sectorSize * length]; // If it's the lost pregap if(track == 1 && @@ -2155,7 +2139,7 @@ namespace Aaru.DiscImages { // If we need to mix lost with present data if(sectorAddress + length <= _lostPregap) - return buffer; + return ErrorNumber.NoError; ulong pregapPos = _lostPregap - sectorAddress; @@ -2163,11 +2147,11 @@ namespace Aaru.DiscImages ReadSectors(_lostPregap, (uint)(length - pregapPos), track, out byte[] presentData); if(errno != ErrorNumber.NoError) - return null; + return errno; Array.Copy(presentData, 0, buffer, (long)(pregapPos * sectorSize), presentData.Length); - return buffer; + return ErrorNumber.NoError; } sectorAddress -= _lostPregap; @@ -2273,7 +2257,7 @@ namespace Aaru.DiscImages } } - return buffer; + return ErrorNumber.NoError; } /// diff --git a/Aaru.Images/CDRWin/Verify.cs b/Aaru.Images/CDRWin/Verify.cs index 27d88f13a..19423181f 100644 --- a/Aaru.Images/CDRWin/Verify.cs +++ b/Aaru.Images/CDRWin/Verify.cs @@ -197,11 +197,14 @@ namespace Aaru.DiscImages public bool? VerifySectors(ulong sectorAddress, uint length, uint track, out List failingLbas, out List unknownLbas) { - byte[] buffer = ReadSectorsLong(sectorAddress, length, track); - int bps = (int)(buffer.Length / length); - byte[] sector = new byte[bps]; failingLbas = new List(); unknownLbas = new List(); + var errno = ReadSectorsLong(sectorAddress, length, track, out byte[] buffer); + + if(errno != ErrorNumber.NoError) + return null; + int bps = (int)(buffer.Length / length); + byte[] sector = new byte[bps]; for(int i = 0; i < length; i++) { diff --git a/Aaru.Images/CHD/Read.cs b/Aaru.Images/CHD/Read.cs index 5e2d11f0d..c701d2dbd 100644 --- a/Aaru.Images/CHD/Read.cs +++ b/Aaru.Images/CHD/Read.cs @@ -1978,23 +1978,21 @@ namespace Aaru.DiscImages } /// - public byte[] ReadSectorLong(ulong sectorAddress, uint track) + public ErrorNumber ReadSectorLong(ulong sectorAddress, uint track, out byte[] buffer) { - if(_isHdd) - throw new FeaturedNotSupportedByDiscImageException("Cannot access optical tracks on a hard disk image"); + buffer = null; - ErrorNumber errno = ReadSectorLong(GetAbsoluteSector(sectorAddress, track), out byte[] buffer); - - return errno == ErrorNumber.NoError ? buffer : null; + return _isHdd ? ErrorNumber.NotSupported + : ReadSectorLong(GetAbsoluteSector(sectorAddress, track), out buffer); } /// - public byte[] ReadSectorsLong(ulong sectorAddress, uint length, uint track) + public ErrorNumber ReadSectorsLong(ulong sectorAddress, uint length, uint track, out byte[] buffer) { - if(_isHdd) - throw new FeaturedNotSupportedByDiscImageException("Cannot access optical tracks on a hard disk image"); + buffer = null; - return ReadSectorLong(GetAbsoluteSector(sectorAddress, track), length); + return _isHdd ? ErrorNumber.NotSupported + : ReadSectorLong(GetAbsoluteSector(sectorAddress, track), length, out buffer); } } } \ No newline at end of file diff --git a/Aaru.Images/CHD/Verify.cs b/Aaru.Images/CHD/Verify.cs index 648300d94..7a234d7c8 100644 --- a/Aaru.Images/CHD/Verify.cs +++ b/Aaru.Images/CHD/Verify.cs @@ -103,7 +103,11 @@ namespace Aaru.DiscImages if(_isHdd) return null; - byte[] buffer = ReadSectorsLong(sectorAddress, length, track); + ErrorNumber errno = ReadSectorsLong(sectorAddress, length, track, out byte[] buffer); + + if(errno != ErrorNumber.NoError) + return null; + int bps = (int)(buffer.Length / length); byte[] sector = new byte[bps]; diff --git a/Aaru.Images/CloneCD/Read.cs b/Aaru.Images/CloneCD/Read.cs index 61b0899f2..512ddf2a1 100644 --- a/Aaru.Images/CloneCD/Read.cs +++ b/Aaru.Images/CloneCD/Read.cs @@ -1347,7 +1347,8 @@ namespace Aaru.DiscImages ReadSectorsLong(sectorAddress, 1, out buffer); /// - public byte[] ReadSectorLong(ulong sectorAddress, uint track) => ReadSectorsLong(sectorAddress, 1, track); + public ErrorNumber ReadSectorLong(ulong sectorAddress, uint track, out byte[] buffer) => + ReadSectorsLong(sectorAddress, 1, track, out buffer); /// public ErrorNumber ReadSectorsLong(ulong sectorAddress, uint length, out byte[] buffer) @@ -1358,43 +1359,29 @@ namespace Aaru.DiscImages from track in Tracks where track.Sequence == kvp.Key where sectorAddress - kvp.Value < track.EndSector - track.StartSector + 1 select kvp) - { - buffer = ReadSectorsLong(sectorAddress - kvp.Value, length, kvp.Key); - - return buffer is null ? ErrorNumber.NoData : ErrorNumber.NoError; - } + return ReadSectorsLong(sectorAddress - kvp.Value, length, kvp.Key, out buffer); return ErrorNumber.SectorNotFound; } /// - public byte[] ReadSectorsLong(ulong sectorAddress, uint length, uint track) + public ErrorNumber ReadSectorsLong(ulong sectorAddress, uint length, uint track, out byte[] buffer) { - var aaruTrack = new Track - { - Sequence = 0 - }; - - foreach(Track linqTrack in Tracks.Where(linqTrack => linqTrack.Sequence == track)) - { - aaruTrack = linqTrack; - - break; - } + buffer = null; + Track? aaruTrack = Tracks.FirstOrDefault(linqTrack => linqTrack.Sequence == track); if(aaruTrack is null) - throw new ArgumentOutOfRangeException(nameof(track), "Track does not exist in disc image"); + return ErrorNumber.SectorNotFound; if(length + sectorAddress - 1 > aaruTrack.EndSector) - throw new ArgumentOutOfRangeException(nameof(length), - $"Requested more sectors ({length + sectorAddress}) than present in track ({aaruTrack.EndSector}), won't cross tracks"); + return ErrorNumber.OutOfMemory; - byte[] buffer = new byte[2352 * length]; + buffer = new byte[2352 * length]; _dataStream.Seek((long)(aaruTrack.FileOffset + (sectorAddress * 2352)), SeekOrigin.Begin); _dataStream.Read(buffer, 0, buffer.Length); - return buffer; + return ErrorNumber.NoError; } /// diff --git a/Aaru.Images/CloneCD/Verify.cs b/Aaru.Images/CloneCD/Verify.cs index 02c841fdb..dc63191cc 100644 --- a/Aaru.Images/CloneCD/Verify.cs +++ b/Aaru.Images/CloneCD/Verify.cs @@ -89,11 +89,15 @@ namespace Aaru.DiscImages public bool? VerifySectors(ulong sectorAddress, uint length, uint track, out List failingLbas, out List unknownLbas) { - byte[] buffer = ReadSectorsLong(sectorAddress, length, track); - int bps = (int)(buffer.Length / length); - byte[] sector = new byte[bps]; failingLbas = new List(); unknownLbas = new List(); + ErrorNumber errno = ReadSectorsLong(sectorAddress, length, track, out byte[] buffer); + + if(errno != ErrorNumber.NoError) + return null; + + int bps = (int)(buffer.Length / length); + byte[] sector = new byte[bps]; for(int i = 0; i < length; i++) { diff --git a/Aaru.Images/DiscJuggler/Read.cs b/Aaru.Images/DiscJuggler/Read.cs index 6e37d3548..0cb33c83c 100644 --- a/Aaru.Images/DiscJuggler/Read.cs +++ b/Aaru.Images/DiscJuggler/Read.cs @@ -1237,7 +1237,8 @@ namespace Aaru.DiscImages ReadSectorsLong(sectorAddress, 1, out buffer); /// - public byte[] ReadSectorLong(ulong sectorAddress, uint track) => ReadSectorsLong(sectorAddress, 1, track); + public ErrorNumber ReadSectorLong(ulong sectorAddress, uint track, out byte[] buffer) => + ReadSectorsLong(sectorAddress, 1, track, out buffer); /// public ErrorNumber ReadSectorsLong(ulong sectorAddress, uint length, out byte[] buffer) @@ -1248,43 +1249,26 @@ namespace Aaru.DiscImages from track in Tracks where track.Sequence == kvp.Key where sectorAddress - kvp.Value < track.EndSector - track.StartSector + 1 select kvp) - { - buffer = ReadSectorsLong(sectorAddress - kvp.Value, length, kvp.Key); - - return buffer is null ? ErrorNumber.NoData : ErrorNumber.NoError; - } + return ReadSectorsLong(sectorAddress - kvp.Value, length, kvp.Key, out buffer); return ErrorNumber.SectorNotFound; } /// - public byte[] ReadSectorsLong(ulong sectorAddress, uint length, uint track) + public ErrorNumber ReadSectorsLong(ulong sectorAddress, uint length, uint track, out byte[] buffer) { + buffer = null; + if(!_isCd) - { - ErrorNumber errno = ReadSectors(sectorAddress, length, track, out byte[] nonCdBuffer); + return ReadSectors(sectorAddress, length, track, out buffer); - return errno == ErrorNumber.NoError ? nonCdBuffer : null; - } - - var aaruTrack = new Track - { - Sequence = 0 - }; - - foreach(Track linqTrack in Tracks.Where(linqTrack => linqTrack.Sequence == track)) - { - aaruTrack = linqTrack; - - break; - } + Track? aaruTrack = Tracks.FirstOrDefault(linqTrack => linqTrack.Sequence == track); if(aaruTrack is null) - throw new ArgumentOutOfRangeException(nameof(track), "Track does not exist in disc image"); + return ErrorNumber.SectorNotFound; if(length + sectorAddress > aaruTrack.EndSector - aaruTrack.StartSector + 1) - throw new ArgumentOutOfRangeException(nameof(length), - $"Requested more sectors ({length + sectorAddress}) than present in track ({aaruTrack.EndSector - aaruTrack.StartSector + 1}), won't cross tracks"); + return ErrorNumber.OutOfRange; uint sectorSize = (uint)aaruTrack.RawBytesPerSector; uint sectorSkip = 0; @@ -1303,10 +1287,10 @@ namespace Aaru.DiscImages sectorSkip += 96; break; - default: throw new FeatureSupportedButNotImplementedImageException("Unsupported subchannel type"); + default: return ErrorNumber.NotSupported; } - byte[] buffer = new byte[sectorSize * length]; + buffer = new byte[sectorSize * length]; _imageStream.Seek((long)(aaruTrack.FileOffset + (sectorAddress * (sectorSize + sectorSkip))), SeekOrigin.Begin); @@ -1361,7 +1345,7 @@ namespace Aaru.DiscImages } } - return buffer; + return ErrorNumber.NoError; } /// diff --git a/Aaru.Images/DiscJuggler/Verify.cs b/Aaru.Images/DiscJuggler/Verify.cs index bacf48749..349e24fd3 100644 --- a/Aaru.Images/DiscJuggler/Verify.cs +++ b/Aaru.Images/DiscJuggler/Verify.cs @@ -89,11 +89,15 @@ namespace Aaru.DiscImages public bool? VerifySectors(ulong sectorAddress, uint length, uint track, out List failingLbas, out List unknownLbas) { - byte[] buffer = ReadSectorsLong(sectorAddress, length, track); - int bps = (int)(buffer.Length / length); - byte[] sector = new byte[bps]; failingLbas = new List(); unknownLbas = new List(); + ErrorNumber errno = ReadSectorsLong(sectorAddress, length, track, out byte[] buffer); + + if(errno != ErrorNumber.NoError) + return null; + + int bps = (int)(buffer.Length / length); + byte[] sector = new byte[bps]; for(int i = 0; i < length; i++) { diff --git a/Aaru.Images/GDI/Read.cs b/Aaru.Images/GDI/Read.cs index d005e0623..0651c99d0 100644 --- a/Aaru.Images/GDI/Read.cs +++ b/Aaru.Images/GDI/Read.cs @@ -697,7 +697,7 @@ namespace Aaru.DiscImages ReadSectorsLong(sectorAddress, 1, out buffer); /// - public byte[] ReadSectorLong(ulong sectorAddress, uint track) => ReadSectorsLong(sectorAddress, 1, track); + public ErrorNumber ReadSectorLong(ulong sectorAddress, uint track, out byte[] buffer) => ReadSectorsLong(sectorAddress, 1, track, out buffer); /// public ErrorNumber ReadSectorsLong(ulong sectorAddress, uint length, out byte[] buffer) @@ -708,25 +708,23 @@ namespace Aaru.DiscImages from gdiTrack in _discImage.Tracks where gdiTrack.Sequence == kvp.Key where sectorAddress - kvp.Value < gdiTrack.Sectors select kvp) - { - buffer = ReadSectorsLong(sectorAddress - kvp.Value, length, kvp.Key); - - return buffer is null ? ErrorNumber.SectorNotFound : ErrorNumber.NoError; - } + return ReadSectorsLong(sectorAddress - kvp.Value, length, kvp.Key, out buffer); return ErrorNumber.SectorNotFound; } /// - public byte[] ReadSectorsLong(ulong sectorAddress, uint length, uint track) + public ErrorNumber ReadSectorsLong(ulong sectorAddress, uint length, uint track, out byte[] buffer) { + buffer = null; if(track == 0) { if(sectorAddress + length > _densitySeparationSectors) - throw new ArgumentOutOfRangeException(nameof(length), - "Requested more sectors than present in track, won't cross tracks"); + return ErrorNumber.OutOfRange; - return new byte[length * 2352]; + buffer= new byte[length * 2352]; + + return ErrorNumber.NoError; } var aaruTrack = new GdiTrack @@ -742,11 +740,10 @@ namespace Aaru.DiscImages } if(aaruTrack.Sequence == 0) - throw new ArgumentOutOfRangeException(nameof(track), "Track does not exist in disc image"); + return ErrorNumber.SectorNotFound; if(sectorAddress + length > aaruTrack.Sectors) - throw new ArgumentOutOfRangeException(nameof(length), - "Requested more sectors than present in track, won't cross tracks"); + return ErrorNumber.OutOfRange; uint sectorOffset; uint sectorSize; @@ -779,10 +776,10 @@ namespace Aaru.DiscImages break; } - default: throw new FeatureSupportedButNotImplementedImageException("Unsupported track type"); + default: return ErrorNumber.NotSupported; } - byte[] buffer = new byte[sectorSize * length]; + buffer = new byte[sectorSize * length]; ulong remainingSectors = length; @@ -795,7 +792,7 @@ namespace Aaru.DiscImages } if(remainingSectors == 0) - return buffer; + return ErrorNumber.NoError; _imageStream = aaruTrack.TrackFilter.GetDataForkStream(); var br = new BinaryReader(_imageStream); @@ -811,9 +808,7 @@ namespace Aaru.DiscImages if(sectorOffset == 0 && sectorSkip == 0 && remainingSectors == length) - { buffer = br.ReadBytes((int)(sectorSize * remainingSectors)); - } else if(sectorOffset == 0 && sectorSkip == 0) { @@ -855,7 +850,7 @@ namespace Aaru.DiscImages } } - return buffer; + return ErrorNumber.NoError; } /// diff --git a/Aaru.Images/GDI/Verify.cs b/Aaru.Images/GDI/Verify.cs index 7eef5133d..eac7b955c 100644 --- a/Aaru.Images/GDI/Verify.cs +++ b/Aaru.Images/GDI/Verify.cs @@ -89,11 +89,15 @@ namespace Aaru.DiscImages public bool? VerifySectors(ulong sectorAddress, uint length, uint track, out List failingLbas, out List unknownLbas) { - byte[] buffer = ReadSectorsLong(sectorAddress, length, track); - int bps = (int)(buffer.Length / length); - byte[] sector = new byte[bps]; failingLbas = new List(); unknownLbas = new List(); + ErrorNumber errno = ReadSectorsLong(sectorAddress, length, track, out byte[] buffer); + + if(errno != ErrorNumber.NoError) + return null; + + int bps = (int)(buffer.Length / length); + byte[] sector = new byte[bps]; for(int i = 0; i < length; i++) { diff --git a/Aaru.Images/Nero/Read.cs b/Aaru.Images/Nero/Read.cs index 0f8ffa465..021ba2b1e 100644 --- a/Aaru.Images/Nero/Read.cs +++ b/Aaru.Images/Nero/Read.cs @@ -2091,7 +2091,8 @@ namespace Aaru.DiscImages ReadSectorsLong(sectorAddress, 1, out buffer); /// - public byte[] ReadSectorLong(ulong sectorAddress, uint track) => ReadSectorsLong(sectorAddress, 1, track); + public ErrorNumber ReadSectorLong(ulong sectorAddress, uint track, out byte[] buffer) => + ReadSectorsLong(sectorAddress, 1, track, out buffer); /// public ErrorNumber ReadSectorsLong(ulong sectorAddress, uint length, out byte[] buffer) @@ -2102,31 +2103,24 @@ namespace Aaru.DiscImages from track in Tracks where track.Sequence == kvp.Key where sectorAddress - kvp.Value <= track.EndSector - track.StartSector select kvp) - { - buffer = ReadSectorsLong(sectorAddress - kvp.Value, length, kvp.Key); - - return buffer is null ? ErrorNumber.NoData : ErrorNumber.NoError; - } + return ReadSectorsLong(sectorAddress - kvp.Value, length, kvp.Key, out buffer); return ErrorNumber.SectorNotFound; } /// - public byte[] ReadSectorsLong(ulong sectorAddress, uint length, uint track) + public ErrorNumber ReadSectorsLong(ulong sectorAddress, uint length, uint track, out byte[] buffer) { - if(!_isCd) - { - ErrorNumber errno = ReadSectors(sectorAddress, length, track, out byte[] nonCdBuffer); + buffer = null; - return errno == ErrorNumber.NoError ? nonCdBuffer : null; - } + if(!_isCd) + return ReadSectors(sectorAddress, length, track, out buffer); if(!_neroTracks.TryGetValue(track, out NeroTrack aaruTrack)) - throw new ArgumentOutOfRangeException(nameof(track), "Track not found"); + return ErrorNumber.SectorNotFound; if(length > aaruTrack.Sectors) - throw new ArgumentOutOfRangeException(nameof(length), - $"Requested more sectors ({length}) than present in track ({aaruTrack.Sectors}), won't cross tracks"); + return ErrorNumber.OutOfRange; uint sectorOffset; uint sectorSize; @@ -2176,10 +2170,10 @@ namespace Aaru.DiscImages break; } - default: throw new FeatureSupportedButNotImplementedImageException("Unsupported track type"); + default: return ErrorNumber.NotSupported; } - byte[] buffer = new byte[sectorSize * length]; + buffer = new byte[sectorSize * length]; _imageStream = _neroFilter.GetDataForkStream(); var br = new BinaryReader(_imageStream); @@ -2260,7 +2254,7 @@ namespace Aaru.DiscImages } } - return buffer; + return ErrorNumber.NoError; } /// diff --git a/Aaru.Images/Nero/Verify.cs b/Aaru.Images/Nero/Verify.cs index 041985213..9f29ef7a2 100644 --- a/Aaru.Images/Nero/Verify.cs +++ b/Aaru.Images/Nero/Verify.cs @@ -89,11 +89,15 @@ namespace Aaru.DiscImages public bool? VerifySectors(ulong sectorAddress, uint length, uint track, out List failingLbas, out List unknownLbas) { - byte[] buffer = ReadSectorsLong(sectorAddress, length, track); - int bps = (int)(buffer.Length / length); - byte[] sector = new byte[bps]; failingLbas = new List(); unknownLbas = new List(); + ErrorNumber errno = ReadSectorsLong(sectorAddress, length, track, out byte[] buffer); + + if(errno != ErrorNumber.NoError) + return null; + + int bps = (int)(buffer.Length / length); + byte[] sector = new byte[bps]; for(int i = 0; i < length; i++) { diff --git a/Aaru.Images/ZZZRawImage/Read.cs b/Aaru.Images/ZZZRawImage/Read.cs index 1386fb852..af8c12e33 100644 --- a/Aaru.Images/ZZZRawImage/Read.cs +++ b/Aaru.Images/ZZZRawImage/Read.cs @@ -1366,31 +1366,25 @@ namespace Aaru.DiscImages } /// - public byte[] ReadSectorLong(ulong sectorAddress, uint track) + public ErrorNumber ReadSectorLong(ulong sectorAddress, uint track, out byte[] buffer) { + buffer = null; + if(_imageInfo.XmlMediaType != XmlMediaType.OpticalDisc) - throw new FeatureUnsupportedImageException("Feature not supported by image format"); + return ErrorNumber.NotSupported; - if(track != 1) - throw new ArgumentOutOfRangeException(nameof(track), "Only a single track is supported"); - - ErrorNumber errno = ReadSectorsLong(sectorAddress, 1, out byte[] buffer); - - return errno != ErrorNumber.NoError ? null : buffer; + return track != 1 ? ErrorNumber.OutOfRange : ReadSectorsLong(sectorAddress, 1, out buffer); } /// - public byte[] ReadSectorsLong(ulong sectorAddress, uint length, uint track) + public ErrorNumber ReadSectorsLong(ulong sectorAddress, uint length, uint track, out byte[] buffer) { + buffer = null; + if(_imageInfo.XmlMediaType != XmlMediaType.OpticalDisc) - throw new FeatureUnsupportedImageException("Feature not supported by image format"); + return ErrorNumber.NotSupported; - if(track != 1) - throw new ArgumentOutOfRangeException(nameof(track), "Only a single track is supported"); - - ErrorNumber errno = ReadSectorsLong(sectorAddress, length, out byte[] buffer); - - return errno != ErrorNumber.NoError ? null : buffer; + return track != 1 ? ErrorNumber.OutOfRange : ReadSectorsLong(sectorAddress, length, out buffer); } /// diff --git a/Aaru.Images/ZZZRawImage/Verify.cs b/Aaru.Images/ZZZRawImage/Verify.cs index f00d7cad7..5ac86ff22 100644 --- a/Aaru.Images/ZZZRawImage/Verify.cs +++ b/Aaru.Images/ZZZRawImage/Verify.cs @@ -114,11 +114,15 @@ namespace Aaru.DiscImages return null; } - byte[] buffer = ReadSectorsLong(sectorAddress, length, track); - int bps = (int)(buffer.Length / length); - byte[] sector = new byte[bps]; failingLbas = new List(); unknownLbas = new List(); + ErrorNumber errno = ReadSectorsLong(sectorAddress, length, track, out byte[] buffer); + + if(errno != ErrorNumber.NoError) + return null; + + int bps = (int)(buffer.Length / length); + byte[] sector = new byte[bps]; for(int i = 0; i < length; i++) { diff --git a/Aaru.Tests/Images/OpticalMediaImageTest.cs b/Aaru.Tests/Images/OpticalMediaImageTest.cs index 665425500..181b02b3d 100644 --- a/Aaru.Tests/Images/OpticalMediaImageTest.cs +++ b/Aaru.Tests/Images/OpticalMediaImageTest.cs @@ -344,31 +344,21 @@ namespace Aaru.Tests.Images if(sectors - doneSectors >= SECTORS_TO_READ) { - if(@long) - { - errno = ErrorNumber.NoError; - - sector = image.ReadSectorsLong(doneSectors, SECTORS_TO_READ, - currentTrack.Sequence); - } - else - errno = image.ReadSectors(doneSectors, SECTORS_TO_READ, - currentTrack.Sequence, out sector); + errno = @long ? image.ReadSectorsLong(doneSectors, SECTORS_TO_READ, + currentTrack.Sequence, out sector) + : image.ReadSectors(doneSectors, SECTORS_TO_READ, + currentTrack.Sequence, + out sector); doneSectors += SECTORS_TO_READ; } else { - if(@long) - { - errno = ErrorNumber.NoError; - - sector = image.ReadSectorsLong(doneSectors, (uint)(sectors - doneSectors), - currentTrack.Sequence); - } - else - errno = image.ReadSectors(doneSectors, (uint)(sectors - doneSectors), - currentTrack.Sequence, out sector); + errno = @long ? image.ReadSectorsLong(doneSectors, + (uint)(sectors - doneSectors), + currentTrack.Sequence, out sector) + : image.ReadSectors(doneSectors, (uint)(sectors - doneSectors), + currentTrack.Sequence, out sector); doneSectors += sectors - doneSectors; } diff --git a/Aaru.Tests/WritableImages/WritableOpticalMediaImageTest.cs b/Aaru.Tests/WritableImages/WritableOpticalMediaImageTest.cs index d3aaafefb..6271e4e90 100644 --- a/Aaru.Tests/WritableImages/WritableOpticalMediaImageTest.cs +++ b/Aaru.Tests/WritableImages/WritableOpticalMediaImageTest.cs @@ -575,31 +575,19 @@ namespace Aaru.Tests.WritableImages if(sectors - doneSectors >= SECTORS_TO_READ) { - if(@long) - { - sector = image.ReadSectorsLong(doneSectors, SECTORS_TO_READ, - currentTrack.Sequence); - - errno = ErrorNumber.NoError; - } - else - errno = image.ReadSectors(doneSectors, SECTORS_TO_READ, currentTrack.Sequence, - out sector); + errno = @long ? image.ReadSectorsLong(doneSectors, SECTORS_TO_READ, + currentTrack.Sequence, out sector) + : image.ReadSectors(doneSectors, SECTORS_TO_READ, currentTrack.Sequence, + out sector); doneSectors += SECTORS_TO_READ; } else { - if(@long) - { - sector = image.ReadSectorsLong(doneSectors, (uint)(sectors - doneSectors), - currentTrack.Sequence); - - errno = ErrorNumber.NoError; - } - else - errno = image.ReadSectors(doneSectors, (uint)(sectors - doneSectors), - currentTrack.Sequence, out sector); + errno = @long ? image.ReadSectorsLong(doneSectors, (uint)(sectors - doneSectors), + currentTrack.Sequence, out sector) + : image.ReadSectors(doneSectors, (uint)(sectors - doneSectors), + currentTrack.Sequence, out sector); doneSectors += sectors - doneSectors; }