mirror of
https://github.com/SabreTools/SabreTools.Serialization.git
synced 2026-04-05 22:01:33 +00:00
143 lines
6.4 KiB
C#
143 lines
6.4 KiB
C#
using System;
|
|
using System.Text;
|
|
using SabreTools.Data.Models.XDVDFS;
|
|
using SabreTools.Text.Extensions;
|
|
|
|
namespace SabreTools.Wrappers
|
|
{
|
|
public partial class XDVDFS : IPrintable
|
|
{
|
|
#if NETCOREAPP
|
|
/// <inheritdoc/>
|
|
public string ExportJSON() => System.Text.Json.JsonSerializer.Serialize(Model, _jsonSerializerOptions);
|
|
#endif
|
|
|
|
/// <inheritdoc/>
|
|
public void PrintInformation(StringBuilder builder)
|
|
{
|
|
builder.AppendLine("Xbox DVD Filesystem Information:");
|
|
builder.AppendLine("-------------------------");
|
|
builder.AppendLine();
|
|
|
|
Print(builder, Model.ReservedArea);
|
|
Print(builder, Model.VolumeDescriptor);
|
|
|
|
if (Model.LayoutDescriptor is not null)
|
|
Print(builder, Model.LayoutDescriptor);
|
|
|
|
foreach (var kvp in Model.DirectoryDescriptors)
|
|
{
|
|
Print(builder, kvp.Value, kvp.Key);
|
|
}
|
|
}
|
|
|
|
protected static void Print(StringBuilder builder, byte[] reservedArea)
|
|
{
|
|
if (reservedArea.Length == 0)
|
|
builder.AppendLine(reservedArea, " Reserved Area");
|
|
else if (Array.TrueForAll(reservedArea, b => b == 0))
|
|
builder.AppendLine("Zeroed", " Reserved Area");
|
|
else
|
|
builder.AppendLine("Not Zeroed", " Reserved Area");
|
|
builder.AppendLine();
|
|
}
|
|
|
|
private static void Print(StringBuilder builder, VolumeDescriptor vd)
|
|
{
|
|
builder.AppendLine(" Volume Descriptor:");
|
|
builder.AppendLine(" -------------------------");
|
|
|
|
builder.AppendLine(Encoding.ASCII.GetString(vd.StartSignature), " Start Signature");
|
|
builder.AppendLine(vd.RootOffset, " Root Offset");
|
|
builder.AppendLine(vd.RootSize, " Root Size");
|
|
DateTime datetime = DateTime.FromFileTime(vd.MasteringTimestamp);
|
|
builder.AppendLine(datetime.ToString("yyyy-MM-dd HH:mm:ss"), " Mastering Timestamp");
|
|
builder.AppendLine(vd.UnknownByte, " Unknown Byte");
|
|
if (Array.TrueForAll(vd.Reserved, b => b == 0))
|
|
builder.AppendLine("Zeroed", " Reserved Bytes");
|
|
else
|
|
builder.AppendLine("Not Zeroed", " Reserved Bytes");
|
|
builder.AppendLine(Encoding.ASCII.GetString(vd.EndSignature), " End Signature");
|
|
|
|
builder.AppendLine();
|
|
}
|
|
|
|
private static void Print(StringBuilder builder, LayoutDescriptor ld)
|
|
{
|
|
builder.AppendLine(" Xbox DVD Layout Descriptor:");
|
|
builder.AppendLine(" -------------------------");
|
|
|
|
builder.AppendLine(Encoding.ASCII.GetString(ld.Signature), " Signature");
|
|
builder.AppendLine(ld.Unusued8Bytes, " Unusued 8 Bytes");
|
|
builder.AppendLine(GetVersionString(ld.XBLayoutVersion), " xblayout Version");
|
|
builder.AppendLine(GetVersionString(ld.XBPremasterVersion), " xbpremaster Version");
|
|
builder.AppendLine(GetVersionString(ld.XBGameDiscVersion), " xbgamedisc Version");
|
|
builder.AppendLine(GetVersionString(ld.XBOther1Version), " Unknown Tool 1 Version");
|
|
builder.AppendLine(GetVersionString(ld.XBOther2Version), " Unknown Tool 2 Version");
|
|
builder.AppendLine(GetVersionString(ld.XBOther3Version), " Unknown Tool 2 Version");
|
|
if (Array.TrueForAll(ld.Reserved, b => b == 0))
|
|
builder.AppendLine("Zeroed", " Reserved Bytes");
|
|
else
|
|
builder.AppendLine("Not Zeroed", " Reserved Bytes");
|
|
|
|
builder.AppendLine();
|
|
}
|
|
|
|
private static string GetVersionString(FourPartVersionType ver)
|
|
{
|
|
return $"{ver.Major}.{ver.Minor}.{ver.Build}.{ver.Revision}";
|
|
}
|
|
|
|
private static void Print(StringBuilder builder, DirectoryDescriptor dd, uint sectorNumber)
|
|
{
|
|
builder.AppendLine($" Directory Descriptor (Sector {sectorNumber}):");
|
|
builder.AppendLine(" -------------------------");
|
|
|
|
foreach (DirectoryRecord dr in dd.DirectoryRecords)
|
|
Print(builder, dr);
|
|
|
|
if (dd.Padding is null)
|
|
builder.AppendLine("None", " Padding");
|
|
else if (Array.TrueForAll(dd.Padding, b => b == 0xFF))
|
|
builder.AppendLine("All 0xFF", " Padding");
|
|
else
|
|
builder.AppendLine("Not all 0xFF", " Padding");
|
|
|
|
builder.AppendLine();
|
|
}
|
|
|
|
private static void Print(StringBuilder builder, DirectoryRecord dr)
|
|
{
|
|
builder.AppendLine($" Directory Record:");
|
|
builder.AppendLine(" -------------------------");
|
|
|
|
builder.AppendLine(dr.LeftChildOffset, " Left Child Offset");
|
|
builder.AppendLine(dr.RightChildOffset, " Right Child Offset");
|
|
builder.AppendLine(dr.ExtentOffset, " Extent Offset");
|
|
builder.AppendLine(dr.ExtentSize, " Extent Size");
|
|
|
|
builder.AppendLine(" File Flags:");
|
|
builder.AppendLine((dr.FileFlags & FileFlags.READ_ONLY) == FileFlags.READ_ONLY, " Read-only");
|
|
builder.AppendLine((dr.FileFlags & FileFlags.HIDDEN) == FileFlags.HIDDEN, " Hidden");
|
|
builder.AppendLine((dr.FileFlags & FileFlags.SYSTEM) == FileFlags.SYSTEM, " System");
|
|
builder.AppendLine((dr.FileFlags & FileFlags.VOLUME_ID) == FileFlags.VOLUME_ID, " Volume ID");
|
|
builder.AppendLine((dr.FileFlags & FileFlags.DIRECTORY) == FileFlags.DIRECTORY, " Directory");
|
|
builder.AppendLine((dr.FileFlags & FileFlags.ARCHIVE) == FileFlags.ARCHIVE, " Archive");
|
|
builder.AppendLine((dr.FileFlags & FileFlags.DEVICE) == FileFlags.DEVICE, " Device");
|
|
builder.AppendLine((dr.FileFlags & FileFlags.NORMAL) == FileFlags.NORMAL, " Normal");
|
|
|
|
builder.AppendLine(dr.FilenameLength, " Filename Length");
|
|
builder.AppendLine(Encoding.UTF8.GetString(dr.Filename), " Filename");
|
|
|
|
if (dr.Padding is null)
|
|
builder.AppendLine("None", " Padding");
|
|
else if (Array.TrueForAll(dr.Padding, b => b == 0xFF))
|
|
builder.AppendLine("All 0xFF", " Padding");
|
|
else
|
|
builder.AppendLine("Not all 0xFF", " Padding");
|
|
|
|
builder.AppendLine();
|
|
}
|
|
}
|
|
}
|