Port MS-CAB to new printing

This commit is contained in:
Matt Nadareski
2023-09-13 22:38:01 -04:00
parent 92e36527fd
commit a9792fdff1
2 changed files with 170 additions and 166 deletions

View File

@@ -540,175 +540,10 @@ namespace BinaryObjectScanner.Wrappers
public override StringBuilder PrettyPrint()
{
StringBuilder builder = new StringBuilder();
builder.AppendLine("Microsoft Cabinet Information:");
builder.AppendLine("-------------------------");
builder.AppendLine();
PrintHeader(builder);
PrintFolders(builder);
PrintFiles(builder);
Printing.MicrosoftCabinet.Print(builder, _model);
return builder;
}
/// <summary>
/// Print header information
/// </summary>
/// <param name="builder">StringBuilder to append information to</param>
private void PrintHeader(StringBuilder builder)
{
builder.AppendLine(" Header Information:");
builder.AppendLine(" -------------------------");
builder.AppendLine($" Signature: {Signature}");
builder.AppendLine($" Reserved 1: {Reserved1} (0x{Reserved1:X})");
builder.AppendLine($" Cabinet size: {CabinetSize} (0x{CabinetSize:X})");
builder.AppendLine($" Reserved 2: {Reserved2} (0x{Reserved2:X})");
builder.AppendLine($" Files offset: {FilesOffset} (0x{FilesOffset:X})");
builder.AppendLine($" Reserved 3: {Reserved3} (0x{Reserved3:X})");
builder.AppendLine($" Minor version: {VersionMinor} (0x{VersionMinor:X})");
builder.AppendLine($" Major version: {VersionMajor} (0x{VersionMajor:X})");
builder.AppendLine($" Folder count: {FolderCount} (0x{FolderCount:X})");
builder.AppendLine($" File count: {FileCount} (0x{FileCount:X})");
builder.AppendLine($" Flags: {Flags} (0x{Flags:X})");
builder.AppendLine($" Set ID: {SetID} (0x{SetID:X})");
builder.AppendLine($" Cabinet index: {CabinetIndex} (0x{CabinetIndex:X})");
#if NET48
if (Flags.HasFlag(SabreTools.Models.MicrosoftCabinet.HeaderFlags.RESERVE_PRESENT))
#else
if (Flags != null && Flags.Value.HasFlag(SabreTools.Models.MicrosoftCabinet.HeaderFlags.RESERVE_PRESENT))
#endif
{
builder.AppendLine($" Header reserved size: {HeaderReservedSize} (0x{HeaderReservedSize:X})");
builder.AppendLine($" Folder reserved size: {FolderReservedSize} (0x{FolderReservedSize:X})");
builder.AppendLine($" Data reserved size: {DataReservedSize} (0x{DataReservedSize:X})");
if (ReservedData == null)
builder.AppendLine($" Reserved data = [NULL]");
else
builder.AppendLine($" Reserved data = {BitConverter.ToString(ReservedData).Replace("-", " ")}");
}
#if NET48
if (Flags.HasFlag(SabreTools.Models.MicrosoftCabinet.HeaderFlags.PREV_CABINET))
#else
if (Flags != null && Flags.Value.HasFlag(SabreTools.Models.MicrosoftCabinet.HeaderFlags.PREV_CABINET))
#endif
{
builder.AppendLine($" Previous cabinet: {CabinetPrev}");
builder.AppendLine($" Previous disk: {DiskPrev}");
}
#if NET48
if (Flags.HasFlag(SabreTools.Models.MicrosoftCabinet.HeaderFlags.NEXT_CABINET))
#else
if (Flags != null && Flags.Value.HasFlag(SabreTools.Models.MicrosoftCabinet.HeaderFlags.NEXT_CABINET))
#endif
{
builder.AppendLine($" Next cabinet: {CabinetNext}");
builder.AppendLine($" Next disk: {DiskNext}");
}
builder.AppendLine();
}
/// <summary>
/// Print folders information
/// </summary>
/// <param name="builder">StringBuilder to append information to</param>
private void PrintFolders(StringBuilder builder)
{
builder.AppendLine(" Folders:");
builder.AppendLine(" -------------------------");
if (FolderCount == 0 || Folders == null || Folders.Length == 0)
{
builder.AppendLine(" No folders");
}
else
{
for (int i = 0; i < Folders.Length; i++)
{
var entry = Folders[i];
builder.AppendLine($" Folder {i}");
if (entry == null)
{
builder.AppendLine(" [NULL]");
continue;
}
builder.AppendLine($" Cab start offset = {entry.CabStartOffset} (0x{entry.CabStartOffset:X})");
builder.AppendLine($" Data count = {entry.DataCount} (0x{entry.DataCount:X})");
builder.AppendLine($" Compression type = {entry.CompressionType} (0x{entry.CompressionType:X})");
builder.AppendLine($" Masked compression type = {entry.CompressionType & SabreTools.Models.MicrosoftCabinet.CompressionType.MASK_TYPE}");
builder.AppendLine($" Reserved data = {(entry.ReservedData == null ? "[NULL]" : BitConverter.ToString(entry.ReservedData).Replace("-", " "))}");
builder.AppendLine();
builder.AppendLine(" Data Blocks");
builder.AppendLine(" -------------------------");
if (entry.DataBlocks == null || entry.DataBlocks.Length == 0)
{
builder.AppendLine(" No data blocks");
}
else
{
for (int j = 0; j < entry.DataBlocks.Length; j++)
{
var dataBlock = entry.DataBlocks[j];
builder.AppendLine($" Data Block {j}");
if (dataBlock == null)
{
builder.AppendLine(" [NULL]");
continue;
}
builder.AppendLine($" Checksum = {dataBlock.Checksum} (0x{dataBlock.Checksum:X})");
builder.AppendLine($" Compressed size = {dataBlock.CompressedSize} (0x{dataBlock.CompressedSize:X})");
builder.AppendLine($" Uncompressed size = {dataBlock.UncompressedSize} (0x{dataBlock.UncompressedSize:X})");
builder.AppendLine($" Reserved data = {(dataBlock.ReservedData == null ? "[NULL]" : BitConverter.ToString(dataBlock.ReservedData).Replace("-", " "))}");
//builder.AppendLine($" Compressed data = {BitConverter.ToString(dataBlock.CompressedData).Replace("-", " ")}");
}
}
}
}
builder.AppendLine();
}
/// <summary>
/// Print files information
/// </summary>
/// <param name="builder">StringBuilder to append information to</param>
private void PrintFiles(StringBuilder builder)
{
builder.AppendLine(" Files:");
builder.AppendLine(" -------------------------");
if (FileCount == 0 || Files == null || Files.Length == 0)
{
builder.AppendLine(" No files");
}
else
{
for (int i = 0; i < Files.Length; i++)
{
var entry = Files[i];
builder.AppendLine($" File {i}");
if (entry == null)
{
builder.AppendLine(" [NULL]");
continue;
}
builder.AppendLine($" File size = {entry.FileSize} (0x{entry.FileSize:X})");
builder.AppendLine($" Folder start offset = {entry.FolderStartOffset} (0x{entry.FolderStartOffset:X})");
builder.AppendLine($" Folder index = {entry.FolderIndex} (0x{entry.FolderIndex:X})");
builder.AppendLine($" Date = {entry.Date} (0x{entry.Date:X})");
builder.AppendLine($" Time = {entry.Time} (0x{entry.Time:X})");
builder.AppendLine($" Attributes = {entry.Attributes} (0x{entry.Attributes:X})");
builder.AppendLine($" Name = {entry.Name ?? "[NULL]"}");
}
}
builder.AppendLine();
}
#if NET6_0_OR_GREATER
/// <inheritdoc/>