From a9792fdff1b7c2271b62ca525e8cc5af13f9aca1 Mon Sep 17 00:00:00 2001 From: Matt Nadareski Date: Wed, 13 Sep 2023 22:38:01 -0400 Subject: [PATCH] Port MS-CAB to new printing --- .../MicrosoftCabinet.cs | 169 ++++++++++++++++++ .../MicrosoftCabinet.cs | 167 +---------------- 2 files changed, 170 insertions(+), 166 deletions(-) create mode 100644 BinaryObjectScanner.Printing/MicrosoftCabinet.cs diff --git a/BinaryObjectScanner.Printing/MicrosoftCabinet.cs b/BinaryObjectScanner.Printing/MicrosoftCabinet.cs new file mode 100644 index 00000000..18fdc56e --- /dev/null +++ b/BinaryObjectScanner.Printing/MicrosoftCabinet.cs @@ -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(); + } + } +} \ No newline at end of file diff --git a/BinaryObjectScanner.Wrappers/MicrosoftCabinet.cs b/BinaryObjectScanner.Wrappers/MicrosoftCabinet.cs index fb4230fe..47e7ed66 100644 --- a/BinaryObjectScanner.Wrappers/MicrosoftCabinet.cs +++ b/BinaryObjectScanner.Wrappers/MicrosoftCabinet.cs @@ -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; } - /// - /// Print header information - /// - /// StringBuilder to append information to - 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(); - } - - /// - /// Print folders information - /// - /// StringBuilder to append information to - 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(); - } - - /// - /// Print files information - /// - /// StringBuilder to append information to - 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 ///