mirror of
https://github.com/SabreTools/SabreTools.Serialization.git
synced 2026-02-04 05:36:12 +00:00
Add static readers for CD-ROM sector types
This commit is contained in:
@@ -22,7 +22,7 @@ namespace SabreTools.Data.Models.CDROM
|
||||
public byte[] Intermediate { get; set; } = new byte[8];
|
||||
|
||||
/// <summary>
|
||||
/// Error Correction Code, 4 bytes
|
||||
/// Error Correction Code, 276 bytes
|
||||
/// </summary>
|
||||
public byte[] ECC { get; set; } = new byte[276];
|
||||
}
|
||||
|
||||
@@ -22,7 +22,7 @@ namespace SabreTools.Data.Models.CDROM
|
||||
public byte[] EDC { get; set; } = new byte[4];
|
||||
|
||||
/// <summary>
|
||||
/// Error Correction Code, 4 bytes
|
||||
/// Error Correction Code, 276 bytes
|
||||
/// </summary>
|
||||
public byte[] ECC { get; set; } = new byte[276];
|
||||
}
|
||||
|
||||
97
SabreTools.Serialization/Readers/CDROM.cs
Normal file
97
SabreTools.Serialization/Readers/CDROM.cs
Normal file
@@ -0,0 +1,97 @@
|
||||
using System.IO;
|
||||
using SabreTools.Data.Extensions;
|
||||
using SabreTools.Data.Models.CDROM;
|
||||
using SabreTools.IO.Extensions;
|
||||
|
||||
namespace SabreTools.Serialization.Readers
|
||||
{
|
||||
/// <summary>
|
||||
/// This intentionally does not inherit from <see cref="BaseBinaryReader"/>
|
||||
/// </summary>
|
||||
public class CDROM
|
||||
{
|
||||
/// <summary>
|
||||
/// Parse a Stream into a DataSector
|
||||
/// </summary>
|
||||
/// <param name="data">Stream to parse</param>
|
||||
/// <returns>Filled DataSector on success, null on error</returns>
|
||||
/// <remarks>Assumes a seekable stream</remarks>
|
||||
public static DataSector? ParseDataSector(Stream data)
|
||||
{
|
||||
SectorMode sectorMode = data.GetSectorMode();
|
||||
return sectorMode switch
|
||||
{
|
||||
SectorMode.MODE0 => null, // TODO: Create data sector for Mode0
|
||||
SectorMode.MODE1 => ParseMode1(data),
|
||||
SectorMode.MODE2 => null, // TODO: Create a data sector for Mode2 formless
|
||||
SectorMode.MODE2_FORM1 => ParseMode2Form1(data),
|
||||
SectorMode.MODE2_FORM2 => ParseMode2Form2(data),
|
||||
|
||||
SectorMode.UNKNOWN => null,
|
||||
_ => null,
|
||||
};
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Parse a Stream into a Mode1
|
||||
/// </summary>
|
||||
/// <param name="data">Stream to parse</param>
|
||||
/// <returns>Filled Mode1 on success, null on error</returns>
|
||||
public static Mode1 ParseMode1(Stream data)
|
||||
{
|
||||
var obj = new Mode1();
|
||||
|
||||
obj.SyncPattern = data.ReadBytes(12);
|
||||
obj.Address = data.ReadBytes(3);
|
||||
obj.Mode = data.ReadByteValue();
|
||||
|
||||
obj.UserData = data.ReadBytes(2048);
|
||||
obj.EDC = data.ReadBytes(4);
|
||||
obj.Intermediate = data.ReadBytes(8);
|
||||
obj.ECC = data.ReadBytes(276);
|
||||
|
||||
return obj;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Parse a Stream into a Mode2Form1
|
||||
/// </summary>
|
||||
/// <param name="data">Stream to parse</param>
|
||||
/// <returns>Filled Mode2Form1 on success, null on error</returns>
|
||||
public static Mode2Form1 ParseMode2Form1(Stream data)
|
||||
{
|
||||
var obj = new Mode2Form1();
|
||||
|
||||
obj.SyncPattern = data.ReadBytes(12);
|
||||
obj.Address = data.ReadBytes(3);
|
||||
obj.Mode = data.ReadByteValue();
|
||||
|
||||
obj.Subheader = data.ReadBytes(8);
|
||||
obj.UserData = data.ReadBytes(2048);
|
||||
obj.EDC = data.ReadBytes(4);
|
||||
obj.ECC = data.ReadBytes(276);
|
||||
|
||||
return obj;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Parse a Stream into a Mode2Form2
|
||||
/// </summary>
|
||||
/// <param name="data">Stream to parse</param>
|
||||
/// <returns>Filled Mode2Form2 on success, null on error</returns>
|
||||
public static Mode2Form2 ParseMode2Form2(Stream data)
|
||||
{
|
||||
var obj = new Mode2Form2();
|
||||
|
||||
obj.SyncPattern = data.ReadBytes(12);
|
||||
obj.Address = data.ReadBytes(3);
|
||||
obj.Mode = data.ReadByteValue();
|
||||
|
||||
obj.Subheader = data.ReadBytes(8);
|
||||
obj.UserData = data.ReadBytes(2324);
|
||||
obj.EDC = data.ReadBytes(4);
|
||||
|
||||
return obj;
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user