Refactor IOpticalMediaImage.ReadSector(s)Long to return error status instead of buffer.

This commit is contained in:
2021-09-21 02:59:54 +01:00
parent a8ae3c73b1
commit bc8382e495
30 changed files with 275 additions and 327 deletions

View File

@@ -1347,7 +1347,8 @@ namespace Aaru.DiscImages
ReadSectorsLong(sectorAddress, 1, out buffer);
/// <inheritdoc />
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);
/// <inheritdoc />
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;
}
/// <inheritdoc />
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;
}
/// <inheritdoc />

View File

@@ -89,11 +89,15 @@ namespace Aaru.DiscImages
public bool? VerifySectors(ulong sectorAddress, uint length, uint track, out List<ulong> failingLbas,
out List<ulong> unknownLbas)
{
byte[] buffer = ReadSectorsLong(sectorAddress, length, track);
int bps = (int)(buffer.Length / length);
byte[] sector = new byte[bps];
failingLbas = new List<ulong>();
unknownLbas = new List<ulong>();
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++)
{