diff --git a/Aaru.Images/AaruFormat/Read.cs b/Aaru.Images/AaruFormat/Read.cs
index f6f68c109..2cae671f5 100644
--- a/Aaru.Images/AaruFormat/Read.cs
+++ b/Aaru.Images/AaruFormat/Read.cs
@@ -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;
}
+ ///
+ 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);
+ }
+
+ ///
+ 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);
+ }
+
+ ///
+ 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);
+ }
+
+ ///
+ 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);
+ }
+
+ ///
+ 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)
diff --git a/Aaru.Images/AaruFormat/Unimplemented.cs b/Aaru.Images/AaruFormat/Unimplemented.cs
index f31b070d9..d5d3cab8d 100644
--- a/Aaru.Images/AaruFormat/Unimplemented.cs
+++ b/Aaru.Images/AaruFormat/Unimplemented.cs
@@ -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
///
public bool SetImageInfo(ImageInfo imageInfo) => throw new NotImplementedException();
- ///
- public ErrorNumber ReadSectorTag(ulong sectorAddress, uint track, SectorTagType tag, out byte[] buffer) =>
- throw new NotImplementedException();
-
- ///
- public ErrorNumber ReadSectors(ulong sectorAddress, uint length, uint track, out byte[] buffer) =>
- throw new NotImplementedException();
-
- ///
- public ErrorNumber ReadSectorsTag(ulong sectorAddress, uint length, uint track, SectorTagType tag,
- out byte[] buffer) => throw new NotImplementedException();
-
- ///
- public ErrorNumber ReadSectorLong(ulong sectorAddress, uint track, out byte[] buffer) =>
- throw new NotImplementedException();
-
- ///
- public ErrorNumber ReadSectorsLong(ulong sectorAddress, uint length, uint track, out byte[] buffer) =>
- throw new NotImplementedException();
-
-
- ///
- public bool? VerifySectors(ulong sectorAddress, uint length, uint track, out List failingLbas,
- out List unknownLbas) => throw new NotImplementedException();
-
///
public bool SetTracks(List