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;
}