Skip to content

Commit eaabd2e

Browse files
committed
Add static readers for CD-ROM sector types
1 parent a269edd commit eaabd2e

File tree

3 files changed

+99
-2
lines changed

3 files changed

+99
-2
lines changed

SabreTools.Serialization/Models/CDROM/Mode1.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ public sealed class Mode1 : DataSector
2222
public byte[] Intermediate { get; set; } = new byte[8];
2323

2424
/// <summary>
25-
/// Error Correction Code, 4 bytes
25+
/// Error Correction Code, 276 bytes
2626
/// </summary>
2727
public byte[] ECC { get; set; } = new byte[276];
2828
}

SabreTools.Serialization/Models/CDROM/Mode2Form1.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ public sealed class Mode2Form1 : DataSector
2222
public byte[] EDC { get; set; } = new byte[4];
2323

2424
/// <summary>
25-
/// Error Correction Code, 4 bytes
25+
/// Error Correction Code, 276 bytes
2626
/// </summary>
2727
public byte[] ECC { get; set; } = new byte[276];
2828
}
Lines changed: 97 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,97 @@
1+
using System.IO;
2+
using SabreTools.Data.Extensions;
3+
using SabreTools.Data.Models.CDROM;
4+
using SabreTools.IO.Extensions;
5+
6+
namespace SabreTools.Serialization.Readers
7+
{
8+
/// <summary>
9+
/// This intentionally does not inherit from <see cref="BaseBinaryReader"/>
10+
/// </summary>
11+
public class CDROM
12+
{
13+
/// <summary>
14+
/// Parse a Stream into a DataSector
15+
/// </summary>
16+
/// <param name="data">Stream to parse</param>
17+
/// <returns>Filled DataSector on success, null on error</returns>
18+
/// <remarks>Assumes a seekable stream</remarks>
19+
public static DataSector? ParseDataSector(Stream data)
20+
{
21+
SectorMode sectorMode = data.GetSectorMode();
22+
return sectorMode switch
23+
{
24+
SectorMode.MODE0 => null, // TODO: Create data sector for Mode0
25+
SectorMode.MODE1 => ParseMode1(data),
26+
SectorMode.MODE2 => null, // TODO: Create a data sector for Mode2 formless
27+
SectorMode.MODE2_FORM1 => ParseMode2Form1(data),
28+
SectorMode.MODE2_FORM2 => ParseMode2Form2(data),
29+
30+
SectorMode.UNKNOWN => null,
31+
_ => null,
32+
};
33+
}
34+
35+
/// <summary>
36+
/// Parse a Stream into a Mode1
37+
/// </summary>
38+
/// <param name="data">Stream to parse</param>
39+
/// <returns>Filled Mode1 on success, null on error</returns>
40+
public static Mode1 ParseMode1(Stream data)
41+
{
42+
var obj = new Mode1();
43+
44+
obj.SyncPattern = data.ReadBytes(12);
45+
obj.Address = data.ReadBytes(3);
46+
obj.Mode = data.ReadByteValue();
47+
48+
obj.UserData = data.ReadBytes(2048);
49+
obj.EDC = data.ReadBytes(4);
50+
obj.Intermediate = data.ReadBytes(8);
51+
obj.ECC = data.ReadBytes(276);
52+
53+
return obj;
54+
}
55+
56+
/// <summary>
57+
/// Parse a Stream into a Mode2Form1
58+
/// </summary>
59+
/// <param name="data">Stream to parse</param>
60+
/// <returns>Filled Mode2Form1 on success, null on error</returns>
61+
public static Mode2Form1 ParseMode2Form1(Stream data)
62+
{
63+
var obj = new Mode2Form1();
64+
65+
obj.SyncPattern = data.ReadBytes(12);
66+
obj.Address = data.ReadBytes(3);
67+
obj.Mode = data.ReadByteValue();
68+
69+
obj.Subheader = data.ReadBytes(8);
70+
obj.UserData = data.ReadBytes(2048);
71+
obj.EDC = data.ReadBytes(4);
72+
obj.ECC = data.ReadBytes(276);
73+
74+
return obj;
75+
}
76+
77+
/// <summary>
78+
/// Parse a Stream into a Mode2Form2
79+
/// </summary>
80+
/// <param name="data">Stream to parse</param>
81+
/// <returns>Filled Mode2Form2 on success, null on error</returns>
82+
public static Mode2Form2 ParseMode2Form2(Stream data)
83+
{
84+
var obj = new Mode2Form2();
85+
86+
obj.SyncPattern = data.ReadBytes(12);
87+
obj.Address = data.ReadBytes(3);
88+
obj.Mode = data.ReadByteValue();
89+
90+
obj.Subheader = data.ReadBytes(8);
91+
obj.UserData = data.ReadBytes(2324);
92+
obj.EDC = data.ReadBytes(4);
93+
94+
return obj;
95+
}
96+
}
97+
}

0 commit comments

Comments
 (0)