mirror of
https://github.com/SabreTools/BinaryObjectScanner.git
synced 2026-04-29 01:50:24 +00:00
Port MS-CAB to new printing
This commit is contained in:
169
BinaryObjectScanner.Printing/MicrosoftCabinet.cs
Normal file
169
BinaryObjectScanner.Printing/MicrosoftCabinet.cs
Normal file
@@ -0,0 +1,169 @@
|
||||
using System;
|
||||
using System.Text;
|
||||
using SabreTools.Models.MicrosoftCabinet;
|
||||
|
||||
namespace BinaryObjectScanner.Printing
|
||||
{
|
||||
public static class MicrosoftCabinet
|
||||
{
|
||||
|
||||
public static void Print(StringBuilder builder, Cabinet cabinet)
|
||||
{
|
||||
builder.AppendLine("Microsoft Cabinet Information:");
|
||||
builder.AppendLine("-------------------------");
|
||||
builder.AppendLine();
|
||||
|
||||
Print(builder, cabinet.Header);
|
||||
Print(builder, cabinet.Folders);
|
||||
PrintFiles(builder, cabinet.Files);
|
||||
}
|
||||
|
||||
#if NET48
|
||||
private static void Print(StringBuilder builder, CFHEADER header)
|
||||
#else
|
||||
private static void Print(StringBuilder builder, CFHEADER? header)
|
||||
#endif
|
||||
{
|
||||
builder.AppendLine(" Header Information:");
|
||||
builder.AppendLine(" -------------------------");
|
||||
if (header == null)
|
||||
{
|
||||
builder.AppendLine(" No header");
|
||||
builder.AppendLine();
|
||||
return;
|
||||
}
|
||||
|
||||
builder.AppendLine($" Signature: {header.Signature}");
|
||||
builder.AppendLine($" Reserved 1: {header.Reserved1} (0x{header.Reserved1:X})");
|
||||
builder.AppendLine($" Cabinet size: {header.CabinetSize} (0x{header.CabinetSize:X})");
|
||||
builder.AppendLine($" Reserved 2: {header.Reserved2} (0x{header.Reserved2:X})");
|
||||
builder.AppendLine($" Files offset: {header.FilesOffset} (0x{header.FilesOffset:X})");
|
||||
builder.AppendLine($" Reserved 3: {header.Reserved3} (0x{header.Reserved3:X})");
|
||||
builder.AppendLine($" Minor version: {header.VersionMinor} (0x{header.VersionMinor:X})");
|
||||
builder.AppendLine($" Major version: {header.VersionMajor} (0x{header.VersionMajor:X})");
|
||||
builder.AppendLine($" Folder count: {header.FolderCount} (0x{header.FolderCount:X})");
|
||||
builder.AppendLine($" File count: {header.FileCount} (0x{header.FileCount:X})");
|
||||
builder.AppendLine($" Flags: {header.Flags} (0x{header.Flags:X})");
|
||||
builder.AppendLine($" Set ID: {header.SetID} (0x{header.SetID:X})");
|
||||
builder.AppendLine($" Cabinet index: {header.CabinetIndex} (0x{header.CabinetIndex:X})");
|
||||
|
||||
if (header.Flags.HasFlag(HeaderFlags.RESERVE_PRESENT))
|
||||
{
|
||||
builder.AppendLine($" Header reserved size: {header.HeaderReservedSize} (0x{header.HeaderReservedSize:X})");
|
||||
builder.AppendLine($" Folder reserved size: {header.FolderReservedSize} (0x{header.FolderReservedSize:X})");
|
||||
builder.AppendLine($" Data reserved size: {header.DataReservedSize} (0x{header.DataReservedSize:X})");
|
||||
builder.AppendLine($" Reserved data = {(header.ReservedData == null ? "[NULL]" : BitConverter.ToString(header.ReservedData).Replace(" - ", " "))}");
|
||||
}
|
||||
|
||||
if (header.Flags.HasFlag(HeaderFlags.PREV_CABINET))
|
||||
{
|
||||
builder.AppendLine($" Previous cabinet: {header.CabinetPrev}");
|
||||
builder.AppendLine($" Previous disk: {header.DiskPrev}");
|
||||
}
|
||||
|
||||
if (header.Flags.HasFlag(HeaderFlags.NEXT_CABINET))
|
||||
{
|
||||
builder.AppendLine($" Next cabinet: {header.CabinetNext}");
|
||||
builder.AppendLine($" Next disk: {header.DiskNext}");
|
||||
}
|
||||
|
||||
builder.AppendLine();
|
||||
}
|
||||
|
||||
#if NET48
|
||||
private static void Print(StringBuilder builder, CFFOLDER[] entries)
|
||||
#else
|
||||
private static void Print(StringBuilder builder, CFFOLDER?[]? entries)
|
||||
#endif
|
||||
{
|
||||
builder.AppendLine(" Folders:");
|
||||
builder.AppendLine(" -------------------------");
|
||||
if (entries == null || entries.Length == 0)
|
||||
{
|
||||
builder.AppendLine(" No folders");
|
||||
builder.AppendLine();
|
||||
return;
|
||||
}
|
||||
|
||||
for (int i = 0; i < entries.Length; i++)
|
||||
{
|
||||
var entry = entries[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 & 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");
|
||||
continue;
|
||||
}
|
||||
|
||||
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();
|
||||
}
|
||||
|
||||
#if NET48
|
||||
private static void PrintFiles(StringBuilder builder, CFFILE[] entries)
|
||||
#else
|
||||
private static void PrintFiles(StringBuilder builder, CFFILE?[]? entries)
|
||||
#endif
|
||||
{
|
||||
builder.AppendLine(" Files:");
|
||||
builder.AppendLine(" -------------------------");
|
||||
if (entries == null || entries.Length == 0)
|
||||
{
|
||||
builder.AppendLine(" No files");
|
||||
builder.AppendLine();
|
||||
return;
|
||||
}
|
||||
|
||||
for (int i = 0; i < entries.Length; i++)
|
||||
{
|
||||
var entry = entries[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();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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/>
|
||||
|
||||
Reference in New Issue
Block a user