[AaruFormat] Implement methods that require track as a parameter.

This commit is contained in:
2025-10-12 14:28:15 +01:00
parent fa5c39746d
commit 5fe7a9cbcd
3 changed files with 136 additions and 26 deletions

View File

@@ -1,8 +1,10 @@
using System;
using System.IO;
using System.Linq;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using Aaru.CommonTypes.Enums;
using Aaru.CommonTypes.Structs;
namespace Aaru.Images;
@@ -169,6 +171,93 @@ public sealed partial class AaruFormat
return ErrorNumber.NoError;
}
/// <inheritdoc />
public ErrorNumber ReadSectorTag(ulong sectorAddress, uint track, SectorTagType tag, out byte[] buffer)
{
buffer = null;
if(_imageInfo.MetadataMediaType != MetadataMediaType.OpticalDisc) return ErrorNumber.NotSupported;
if(Tracks == null) return ErrorNumber.SectorNotFound;
Track trk = Tracks.FirstOrDefault(t => t.Sequence == track);
return trk?.Sequence != track
? ErrorNumber.SectorNotFound
: ReadSectorTag(trk.StartSector + sectorAddress, tag, out buffer);
}
/// <inheritdoc />
public ErrorNumber ReadSectors(ulong sectorAddress, uint length, uint track, out byte[] buffer)
{
buffer = null;
if(_imageInfo.MetadataMediaType != MetadataMediaType.OpticalDisc) return ErrorNumber.NotSupported;
if(Tracks == null) return ErrorNumber.SectorNotFound;
Track trk = Tracks.FirstOrDefault(t => t.Sequence == track);
if(trk?.Sequence != track) return ErrorNumber.SectorNotFound;
return trk.StartSector + sectorAddress + length > trk.EndSector + 1
? ErrorNumber.OutOfRange
: ReadSectors(trk.StartSector + sectorAddress, length, out buffer);
}
/// <inheritdoc />
public ErrorNumber ReadSectorsTag(ulong sectorAddress, uint length, uint track, SectorTagType tag,
out byte[] buffer)
{
buffer = null;
if(_imageInfo.MetadataMediaType != MetadataMediaType.OpticalDisc) return ErrorNumber.NotSupported;
if(Tracks == null) return ErrorNumber.SectorNotFound;
Track trk = Tracks.FirstOrDefault(t => t.Sequence == track);
return trk?.Sequence != track
? ErrorNumber.SectorNotFound
: trk.StartSector + sectorAddress + length > trk.EndSector + 1
? ErrorNumber.OutOfRange
: ReadSectorsTag(trk.StartSector + sectorAddress, length, tag, out buffer);
}
/// <inheritdoc />
public ErrorNumber ReadSectorLong(ulong sectorAddress, uint track, out byte[] buffer)
{
buffer = null;
if(_imageInfo.MetadataMediaType != MetadataMediaType.OpticalDisc) return ErrorNumber.NotSupported;
if(Tracks == null) return ErrorNumber.SectorNotFound;
Track trk = Tracks.FirstOrDefault(t => t.Sequence == track);
return trk?.Sequence != track
? ErrorNumber.SectorNotFound
: ReadSectorLong(trk.StartSector + sectorAddress, out buffer);
}
/// <inheritdoc />
public ErrorNumber ReadSectorsLong(ulong sectorAddress, uint length, uint track, out byte[] buffer)
{
buffer = null;
if(_imageInfo.MetadataMediaType != MetadataMediaType.OpticalDisc) return ErrorNumber.NotSupported;
if(Tracks == null) return ErrorNumber.SectorNotFound;
Track trk = Tracks.FirstOrDefault(t => t.Sequence == track);
return trk?.Sequence != track
? ErrorNumber.SectorNotFound
: trk.StartSector + sectorAddress + length > trk.EndSector + 1
? ErrorNumber.OutOfRange
: ReadSectorsLong(trk.StartSector + sectorAddress, length, out buffer);
}
#endregion
// AARU_EXPORT int32_t AARU_CALL aaruf_read_media_tag(void *context, uint8_t *data, const int32_t tag, uint32_t *length)

View File

@@ -2,7 +2,6 @@ using System;
using System.Collections.Generic;
using Aaru.CommonTypes;
using Aaru.CommonTypes.AaruMetadata;
using Aaru.CommonTypes.Enums;
using Aaru.CommonTypes.Structs;
using TapeFile = Aaru.CommonTypes.Structs.TapeFile;
using TapePartition = Aaru.CommonTypes.Structs.TapePartition;
@@ -24,31 +23,6 @@ public sealed partial class AaruFormat
/// <inheritdoc />
public bool SetImageInfo(ImageInfo imageInfo) => throw new NotImplementedException();
/// <inheritdoc />
public ErrorNumber ReadSectorTag(ulong sectorAddress, uint track, SectorTagType tag, out byte[] buffer) =>
throw new NotImplementedException();
/// <inheritdoc />
public ErrorNumber ReadSectors(ulong sectorAddress, uint length, uint track, out byte[] buffer) =>
throw new NotImplementedException();
/// <inheritdoc />
public ErrorNumber ReadSectorsTag(ulong sectorAddress, uint length, uint track, SectorTagType tag,
out byte[] buffer) => throw new NotImplementedException();
/// <inheritdoc />
public ErrorNumber ReadSectorLong(ulong sectorAddress, uint track, out byte[] buffer) =>
throw new NotImplementedException();
/// <inheritdoc />
public ErrorNumber ReadSectorsLong(ulong sectorAddress, uint length, uint track, out byte[] buffer) =>
throw new NotImplementedException();
/// <inheritdoc />
public bool? VerifySectors(ulong sectorAddress, uint length, uint track, out List<ulong> failingLbas,
out List<ulong> unknownLbas) => throw new NotImplementedException();
/// <inheritdoc />
public bool SetTracks(List<Track> tracks) => throw new NotImplementedException();

View File

@@ -81,6 +81,53 @@ public sealed partial class AaruFormat
return failingLbas.Count <= 0;
}
/// <inheritdoc />
public bool? VerifySectors(ulong sectorAddress, uint length, uint track, out List<ulong> failingLbas,
out List<ulong> unknownLbas)
{
// Right now only CompactDisc sectors are verifiable
if(_imageInfo.MetadataMediaType != MetadataMediaType.OpticalDisc || Tracks == null)
{
failingLbas = [];
unknownLbas = [];
for(ulong i = sectorAddress; i < sectorAddress + length; i++) unknownLbas.Add(i);
return null;
}
failingLbas = [];
unknownLbas = [];
ErrorNumber errno = ReadSectorsLong(sectorAddress, length, track, out byte[] buffer);
if(errno != ErrorNumber.NoError) return null;
var bps = (int)(buffer.Length / length);
var sector = new byte[bps];
for(var i = 0; i < length; i++)
{
Array.Copy(buffer, i * bps, sector, 0, bps);
bool? sectorStatus = CdChecksums.CheckCdSector(sector);
switch(sectorStatus)
{
case null:
unknownLbas.Add((ulong)i + sectorAddress);
break;
case false:
failingLbas.Add((ulong)i + sectorAddress);
break;
}
}
if(unknownLbas.Count > 0) return null;
return failingLbas.Count <= 0;
}
#endregion