Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
26 changes: 26 additions & 0 deletions SabreTools.Serialization/Models/MicrosoftCabinet/FolderTuple.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
using System;

namespace SabreTools.Data.Models.MicrosoftCabinet
{
// TODO: Surely there's a better way to do this
/// <summary>
/// Tuple to hold what's needed to open a specific folder
/// </summary>
public sealed class FolderTuple
{
/// <summary>
/// Filename for one cabinet in the set, if available
/// </summary>
public string Filename { get; set; } = String.Empty;

/// <summary>
/// Folder containing the blocks to decompress
/// </summary>
public CFFOLDER Folder { get; set; } = new CFFOLDER();

/// <summary>
/// A series of one or more cabinet file (CFFILE) entries
/// </summary>
public int FolderIndex { get; set; }
}
}
38 changes: 0 additions & 38 deletions SabreTools.Serialization/Readers/MicrosoftCabinet.cs
Original file line number Diff line number Diff line change
Expand Up @@ -172,47 +172,9 @@ private static CFFOLDER ParseFolder(Stream data, CFHEADER header)
if (header.FolderReservedSize > 0)
folder.ReservedData = data.ReadBytes(header.FolderReservedSize);

if (folder.CabStartOffset > 0)
{
long currentPosition = data.Position;
data.SeekIfPossible(folder.CabStartOffset, SeekOrigin.Begin);

folder.DataBlocks = new CFDATA[folder.DataCount];
for (int i = 0; i < folder.DataCount; i++)
{
CFDATA dataBlock = ParseDataBlock(data, header.DataReservedSize);
folder.DataBlocks[i] = dataBlock;
}

data.SeekIfPossible(currentPosition, SeekOrigin.Begin);
}

return folder;
}

/// <summary>
/// Parse a Stream into a data block
/// </summary>
/// <param name="data">Stream to parse</param>
/// <param name="dataReservedSize">Reserved byte size for data blocks</param>
/// <returns>Filled folder on success, null on error</returns>
private static CFDATA ParseDataBlock(Stream data, byte dataReservedSize)
{
var dataBlock = new CFDATA();

dataBlock.Checksum = data.ReadUInt32LittleEndian();
dataBlock.CompressedSize = data.ReadUInt16LittleEndian();
dataBlock.UncompressedSize = data.ReadUInt16LittleEndian();

if (dataReservedSize > 0)
data.SeekIfPossible(dataReservedSize, SeekOrigin.Current);

if (dataBlock.CompressedSize > 0)
data.SeekIfPossible(dataBlock.CompressedSize, SeekOrigin.Current);

return dataBlock;
}

/// <summary>
/// Parse a Stream into a file
/// </summary>
Expand Down
Loading