From 61f48535c9e6c743d4fb976a3585b3ac0a42d542 Mon Sep 17 00:00:00 2001 From: Evan Dixon Date: Thu, 26 Feb 2026 11:51:18 -0600 Subject: [PATCH 1/9] Add lzma decompression support --- src/VCDiff/Decoders/BodyDecoder.cs | 9 +-- src/VCDiff/Decoders/SharedDecompressors.cs | 16 +++++ src/VCDiff/Decoders/VcDecoderEx.cs | 32 ++++++--- src/VCDiff/Decoders/WindowDecoder.cs | 77 ++++++++++++++++++++-- src/VCDiff/Shared/VarIntBE.cs | 30 +++++++++ src/VCDiff/VCDiff.csproj | 5 +- 6 files changed, 146 insertions(+), 23 deletions(-) create mode 100644 src/VCDiff/Decoders/SharedDecompressors.cs diff --git a/src/VCDiff/Decoders/BodyDecoder.cs b/src/VCDiff/Decoders/BodyDecoder.cs index 98834aa..d26c3a7 100644 --- a/src/VCDiff/Decoders/BodyDecoder.cs +++ b/src/VCDiff/Decoders/BodyDecoder.cs @@ -2,7 +2,6 @@ using System.IO; using System.Threading; using System.Threading.Tasks; -using Microsoft.IO; using VCDiff.Includes; using VCDiff.Shared; @@ -20,6 +19,7 @@ internal class BodyDecoderThe delta /// the out stream /// custom table if any. Default is null. - public BodyDecoder(WindowDecoder w, TSourceBuffer source, TDeltaBuffer delta, Stream decodedTarget, CustomCodeTableDecoder? customTable = null) + public BodyDecoder(WindowDecoder w, TSourceBuffer source, TDeltaBuffer delta, Stream decodedTarget, CustomCodeTableDecoder? customTable = null, bool disableChecksums = false) { if (customTable != null) { @@ -48,6 +48,7 @@ public BodyDecoder(WindowDecoder w, TSourceBuffer sour this.source = source; this.delta = delta; this.targetData = Pool.MemoryStreamManager.GetStream(nameof(BodyDecoder), (int) w.TargetWindowLength); + this.disableChecksums = disableChecksums; } private VCDiffResult DecodeInterleaveCore() @@ -254,7 +255,7 @@ private VCDiffResult DecodeCore() { uint adler = Checksum.ComputeGoogleAdler32(targetData.GetBuffer().AsSpan(0, (int)targetData.Length)); - if (adler != window.Checksum) + if (adler != window.Checksum && !disableChecksums) { result = VCDiffResult.ERROR; } @@ -263,7 +264,7 @@ private VCDiffResult DecodeCore() { uint adler = Checksum.ComputeXdelta3Adler32(targetData.GetBuffer().AsSpan(0, (int)targetData.Length)); - if (adler != window.Checksum) + if (adler != window.Checksum && !disableChecksums) { result = VCDiffResult.ERROR; } diff --git a/src/VCDiff/Decoders/SharedDecompressors.cs b/src/VCDiff/Decoders/SharedDecompressors.cs new file mode 100644 index 0000000..239cdc8 --- /dev/null +++ b/src/VCDiff/Decoders/SharedDecompressors.cs @@ -0,0 +1,16 @@ +using SharpCompress.Compressors.Xz; +using System.IO; + +namespace VCDiff.Decoders +{ + internal class SharedDecompressors + { + public XZStream? AddRunDecompressor; + public XZStream? InstructionsDecompressor; + public XZStream? AddressesDecompressor; + + public MemoryStream? AddRunCompressedBuffer; + public MemoryStream? InstructionsCompressedBuffer; + public MemoryStream? AddressesCompressedBuffer; + } +} diff --git a/src/VCDiff/Decoders/VcDecoderEx.cs b/src/VCDiff/Decoders/VcDecoderEx.cs index e7ca135..42fba3f 100644 --- a/src/VCDiff/Decoders/VcDecoderEx.cs +++ b/src/VCDiff/Decoders/VcDecoderEx.cs @@ -23,13 +23,15 @@ public class VcDecoder : VcDecoderEx, IDispo /// The stream containing the VCDIFF delta. /// The stream to write the output in. /// The maximum target file size (and target window size) in bytes - public VcDecoder(Stream source, Stream delta, Stream outputStream, int maxTargetFileSize = WindowDecoderBase.DefaultMaxTargetFileSize) + /// Whether to disable checksums when applying the delta. This can be dangerous, but can be useful when the input file differs in ways that the delta does not reference. + public VcDecoder(Stream source, Stream delta, Stream outputStream, int maxTargetFileSize = WindowDecoderBase.DefaultMaxTargetFileSize, bool disableChecksums = false) { base.delta = new ByteStreamReader(delta); base.source = new ByteStreamReader(source); base.outputStream = outputStream; base.maxTargetFileSize = maxTargetFileSize; base.IsInitialized = false; + base.disableChecksums = disableChecksums; _ownsSources = true; } @@ -60,6 +62,7 @@ public class VcDecoderEx : IDisposable where TSourc protected TDeltaBuffer delta; protected TSourceBuffer source; protected int maxTargetFileSize; + protected bool disableChecksums; private CustomCodeTableDecoder? customTable; protected static readonly byte[] MagicBytes = { 0xD6, 0xC3, 0xC4, 0x00, 0x00 }; @@ -68,6 +71,8 @@ public class VcDecoderEx : IDisposable where TSourc /// public bool IsSDCHFormat { get; private set; } + private byte SecondaryCompressorId { get; set; } + /// /// If the decoder has been initialized. /// @@ -82,12 +87,14 @@ protected VcDecoderEx() { } /// The stream containing the VCDIFF delta. /// The stream to write the output in. /// The maximum target file size (and target window size) in bytes - public VcDecoderEx(TSourceBuffer dict, TDeltaBuffer delta, Stream outputStream, int maxTargetFileSize = WindowDecoderBase.DefaultMaxTargetFileSize) + /// Whether to disable checksums when applying the delta. This can be dangerous, but can be useful when the input file differs in ways that the delta does not reference. + public VcDecoderEx(TSourceBuffer dict, TDeltaBuffer delta, Stream outputStream, int maxTargetFileSize = WindowDecoderBase.DefaultMaxTargetFileSize, bool disableChecksums = false) { this.delta = delta; this.source = dict; this.outputStream = outputStream; this.maxTargetFileSize = maxTargetFileSize; + this.disableChecksums = disableChecksums; this.IsInitialized = false; } @@ -139,10 +146,12 @@ private VCDiffResult Initialize() return VCDiffResult.ERROR; } - //compression not supported + // secondary compression if ((hdr & (int)VCDiffCodeFlags.VCDDECOMPRESS) != 0) { - return VCDiffResult.ERROR; + if (!delta.CanRead) return VCDiffResult.EOD; + + SecondaryCompressorId = delta.ReadByte(); } //custom code table! @@ -188,15 +197,16 @@ public VCDiffResult Decode(out long bytesWritten) if (!Decode_Init(out bytesWritten, out var result, out var decodeAsync)) return result; + var decompressors = new SharedDecompressors(); // Decompression streams are shared across windows while (delta.CanRead) { //delta is streamed in order aka not random access - using var w = new WindowDecoder(source.Length, delta, maxTargetFileSize); + using var w = new WindowDecoder(source.Length, delta, decompressors, maxTargetFileSize); - if (!w.Decode(this.IsSDCHFormat)) + if (!w.Decode(this.IsSDCHFormat, this.SecondaryCompressorId)) return (VCDiffResult)w.Result; - using var body = new BodyDecoder(w, source, delta, outputStream); + using var body = new BodyDecoder(w, source, delta, outputStream, disableChecksums: disableChecksums); if (this.IsSDCHFormat && w.AddRunLength == 0 && w.AddressesForCopyLength == 0 && w.InstructionAndSizesLength > 0) { //interleaved @@ -243,14 +253,16 @@ public VCDiffResult Decode(out long bytesWritten) { if (!Decode_Init(out var bytesWritten, out var result, out var decodeAsync)) return decodeAsync; + + var decompressors = new SharedDecompressors(); // Decompression streams are shared across windows while (delta.CanRead) { //delta is streamed in order aka not random access - using var w = new WindowDecoder(source.Length, delta, maxTargetFileSize); + using var w = new WindowDecoder(source.Length, delta, decompressors, maxTargetFileSize); - if (w.Decode(this.IsSDCHFormat)) + if (w.Decode(this.IsSDCHFormat, this.SecondaryCompressorId)) { - using var body = new BodyDecoder(w, source, delta, outputStream); + using var body = new BodyDecoder(w, source, delta, outputStream, disableChecksums: disableChecksums); if (this.IsSDCHFormat && w.AddRunLength == 0 && w.AddressesForCopyLength == 0 && w.InstructionAndSizesLength > 0) { //interleaved diff --git a/src/VCDiff/Decoders/WindowDecoder.cs b/src/VCDiff/Decoders/WindowDecoder.cs index 8d71f8c..5b30705 100644 --- a/src/VCDiff/Decoders/WindowDecoder.cs +++ b/src/VCDiff/Decoders/WindowDecoder.cs @@ -1,5 +1,7 @@ -using System; +using SharpCompress.Compressors.Xz; +using System; using System.Diagnostics; +using System.IO; using VCDiff.Includes; using VCDiff.Shared; @@ -31,7 +33,11 @@ internal class WindowDecoder : WindowDecoderBase, IDisposable where private long addRunLength; private long instructionAndSizesLength; private long addressForCopyLength; + private bool addRunCompressed; + private bool instructionsAndSizesCompressed; + private bool addressForCopyCompressed; private uint checksum; + private SharedDecompressors sharedDecompressors; public PinnedArrayRental AddRunData; @@ -45,6 +51,12 @@ internal class WindowDecoder : WindowDecoderBase, IDisposable where public long AddressesForCopyLength => addressForCopyLength; + public bool AddRunCompressed => addRunCompressed; + + public bool InstructionAndSizesCompressed => instructionsAndSizesCompressed; + + public bool AddressesForCopyCompressed => addressForCopyCompressed; + public byte WinIndicator => winIndicator; public long SourceSegmentOffset => sourceSegmentOffset; @@ -65,10 +77,12 @@ internal class WindowDecoder : WindowDecoderBase, IDisposable where /// the dictionary size /// the buffer containing the incoming data /// The maximum target window size in bytes - public WindowDecoder(long dictionarySize, TByteBuffer buffer, int maxWindowSize = DefaultMaxTargetFileSize) + /// Container for compression streams used across windows + public WindowDecoder(long dictionarySize, TByteBuffer buffer, SharedDecompressors sharedDecompressors, int maxWindowSize = DefaultMaxTargetFileSize) { this.dictionarySize = dictionarySize; this.buffer = buffer; + this.sharedDecompressors = sharedDecompressors; chunk = new ParseableChunk(buffer.Position, buffer.Length); if (maxWindowSize < 0) @@ -87,8 +101,9 @@ public WindowDecoder(long dictionarySize, TByteBuffer buffer, int maxWindowSize /// Decodes the window header. /// /// If the delta uses SDCH extensions. + /// ID of the secondary compressor. /// - public bool Decode(bool isSdch) + public bool Decode(bool isSdch, byte secondaryCompressorId) { if (!ParseWindowIndicatorAndSegment(dictionarySize, 0, false, out winIndicator, out sourceSegmentLength, out sourceSegmentOffset)) { @@ -128,18 +143,30 @@ public bool Decode(bool isSdch) AddRunData = new PinnedArrayRental((int)addRunLength); Debug.Assert(addRunLength <= int.MaxValue); buffer.ReadBytesToSpan(AddRunData.AsSpan()); + if (AddRunCompressed) + { + AddRunData = Decompress(AddRunData, secondaryCompressorId, ref sharedDecompressors.AddRunDecompressor, ref sharedDecompressors.AddRunCompressedBuffer); + } } if (buffer.CanRead) { InstructionsAndSizesData = new PinnedArrayRental((int)instructionAndSizesLength); Debug.Assert(instructionAndSizesLength <= int.MaxValue); buffer.ReadBytesToSpan(InstructionsAndSizesData.AsSpan()); + if (instructionsAndSizesCompressed) + { + InstructionsAndSizesData = Decompress(InstructionsAndSizesData, secondaryCompressorId, ref sharedDecompressors.InstructionsDecompressor, ref sharedDecompressors.InstructionsCompressedBuffer); + } } if (buffer.CanRead) { AddressesForCopyData = new PinnedArrayRental((int)addressForCopyLength); Debug.Assert(addressForCopyLength <= int.MaxValue); buffer.ReadBytesToSpan(AddressesForCopyData.AsSpan()); + if (addressForCopyCompressed) + { + AddressesForCopyData = Decompress(AddressesForCopyData, secondaryCompressorId, ref sharedDecompressors.AddressesDecompressor, ref sharedDecompressors.AddressesCompressedBuffer); + } } return true; @@ -351,12 +378,48 @@ private bool ParseDeltaIndicator() returnCode = (int)VCDiffResult.ERROR; return false; } - if ((deltaIndicator & ((int)VCDiffCompressFlags.VCDDATACOMP | (int)VCDiffCompressFlags.VCDINSTCOMP | (int)VCDiffCompressFlags.VCDADDRCOMP)) > 0) + + addRunCompressed = (deltaIndicator & (int)VCDiffCompressFlags.VCDDATACOMP) != 0; + instructionsAndSizesCompressed = (deltaIndicator & (int)VCDiffCompressFlags.VCDINSTCOMP) != 0; + addressForCopyCompressed = (deltaIndicator & (int)VCDiffCompressFlags.VCDADDRCOMP) != 0; + + return true; + } + + private PinnedArrayRental Decompress(PinnedArrayRental pinnedArrayRental, byte secondaryCompressorId, ref XZStream? xzStream, ref MemoryStream? memoryStream) + { + if (secondaryCompressorId == 0) { - returnCode = (int)VCDiffResult.ERROR; - return false; + return pinnedArrayRental; } - return true; + + if (secondaryCompressorId != 2) + { + throw new NotSupportedException("Only LZMA decompression is supported"); + } + + if (pinnedArrayRental.Data == null) + { + throw new ArgumentException("Cannot decompress null data"); + } + + var uncompressedLength = VarIntBE.ParseInt32(pinnedArrayRental.AsSpan(), out int uncompressedLengthByteCount); + var compressedData = pinnedArrayRental.AsSpan().Slice(uncompressedLengthByteCount); + + // Each section in a window uses the same compression stream throughout the file + // If this is not the first window, reuse the same stream from before, just using different data + memoryStream ??= new MemoryStream(); + memoryStream.SetLength(compressedData.Length); + memoryStream.Position = 0; + memoryStream.Write(compressedData); + memoryStream.Position = 0; + + xzStream ??= new XZStream(memoryStream); + + var decompressedData = new PinnedArrayRental(uncompressedLength); + xzStream.ReadExactly(decompressedData.AsSpan()); + + return decompressedData; } public bool ParseSectionLengths(ChecksumFormat checksumFormat, out long addRunLength, out long instructionsLength, out long addressLength, out uint checksum) diff --git a/src/VCDiff/Shared/VarIntBE.cs b/src/VCDiff/Shared/VarIntBE.cs index da86c49..3f59fa4 100644 --- a/src/VCDiff/Shared/VarIntBE.cs +++ b/src/VCDiff/Shared/VarIntBE.cs @@ -38,6 +38,36 @@ public static int ParseInt32(TByteBuffer sin) where TByteBuffer : I return (int)VCDiffResult.EOD; } + public static int ParseInt32(Span sin, out int bytesConsumed) + { + bytesConsumed = 0; + int result = 0; + int index = 0; + + while (index < sin.Length) + { + byte currentByte = sin[index]; + result += currentByte & 0x7f; + + if ((currentByte & 0x80) == 0) + { + bytesConsumed = index + 1; + return result; + } + + if (result > (int32MaxValue >> 7)) + { + bytesConsumed = index + 1; + return (int)VCDiffResult.ERROR; + } + + result = result << 7; + index++; + } + + return (int)VCDiffResult.EOD; + } + public static long ParseInt64(TByteBuffer sin) where TByteBuffer : IByteBuffer { long result = 0; diff --git a/src/VCDiff/VCDiff.csproj b/src/VCDiff/VCDiff.csproj index 4b7a2b6..430767a 100644 --- a/src/VCDiff/VCDiff.csproj +++ b/src/VCDiff/VCDiff.csproj @@ -23,8 +23,9 @@ - - + + + all runtime; build; native; contentfiles; analyzers From 27c8a8c7e307d4a461aed92b77dada0f1e230713 Mon Sep 17 00:00:00 2001 From: Evan Dixon Date: Thu, 26 Feb 2026 13:22:53 -0600 Subject: [PATCH 2/9] Fix code quality issues --- src/VCDiff/Decoders/BodyDecoder.cs | 2 +- src/VCDiff/Decoders/VcDecoderEx.cs | 2 ++ src/VCDiff/Decoders/WindowDecoder.cs | 2 +- 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/VCDiff/Decoders/BodyDecoder.cs b/src/VCDiff/Decoders/BodyDecoder.cs index d26c3a7..da00062 100644 --- a/src/VCDiff/Decoders/BodyDecoder.cs +++ b/src/VCDiff/Decoders/BodyDecoder.cs @@ -19,7 +19,7 @@ internal class BodyDecoder(source.Length, delta, decompressors, maxTargetFileSize); if (!w.Decode(this.IsSDCHFormat, this.SecondaryCompressorId)) + { return (VCDiffResult)w.Result; + } using var body = new BodyDecoder(w, source, delta, outputStream, disableChecksums: disableChecksums); if (this.IsSDCHFormat && w.AddRunLength == 0 && w.AddressesForCopyLength == 0 && w.InstructionAndSizesLength > 0) diff --git a/src/VCDiff/Decoders/WindowDecoder.cs b/src/VCDiff/Decoders/WindowDecoder.cs index 5b30705..8eed864 100644 --- a/src/VCDiff/Decoders/WindowDecoder.cs +++ b/src/VCDiff/Decoders/WindowDecoder.cs @@ -37,7 +37,7 @@ internal class WindowDecoder : WindowDecoderBase, IDisposable where private bool instructionsAndSizesCompressed; private bool addressForCopyCompressed; private uint checksum; - private SharedDecompressors sharedDecompressors; + private readonly SharedDecompressors sharedDecompressors; public PinnedArrayRental AddRunData; From f92c383f70e1eefa5d8c8df84381a640fad12f99 Mon Sep 17 00:00:00 2001 From: Evan Dixon Date: Thu, 26 Feb 2026 14:41:11 -0600 Subject: [PATCH 3/9] Fix byte buffer not advancing offset in ReadBytesToSpan --- src/VCDiff/Shared/ByteBuffer.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/VCDiff/Shared/ByteBuffer.cs b/src/VCDiff/Shared/ByteBuffer.cs index 2722470..8381a50 100644 --- a/src/VCDiff/Shared/ByteBuffer.cs +++ b/src/VCDiff/Shared/ByteBuffer.cs @@ -137,6 +137,7 @@ public Span ReadBytesToSpan(Span data) { var result = PeekBytes(data.Length); result.CopyTo(data); + offset += result.Length; return result.Slice(0, result.Length); } From 8da8ba4d47d2b9255a0785aca7abb26da19b9e93 Mon Sep 17 00:00:00 2001 From: Evan Dixon Date: Thu, 26 Feb 2026 17:39:45 -0600 Subject: [PATCH 4/9] Reduce allocations of compressors when not necessary --- src/VCDiff/Decoders/VcDecoderEx.cs | 2 +- src/VCDiff/Decoders/WindowDecoder.cs | 25 ++++++++++++++++++++----- 2 files changed, 21 insertions(+), 6 deletions(-) diff --git a/src/VCDiff/Decoders/VcDecoderEx.cs b/src/VCDiff/Decoders/VcDecoderEx.cs index 77c00a6..9c3b680 100644 --- a/src/VCDiff/Decoders/VcDecoderEx.cs +++ b/src/VCDiff/Decoders/VcDecoderEx.cs @@ -197,7 +197,7 @@ public VCDiffResult Decode(out long bytesWritten) if (!Decode_Init(out bytesWritten, out var result, out var decodeAsync)) return result; - var decompressors = new SharedDecompressors(); // Decompression streams are shared across windows + var decompressors = SecondaryCompressorId != 0 ? new SharedDecompressors() : null; // Decompression streams are shared across windows while (delta.CanRead) { //delta is streamed in order aka not random access diff --git a/src/VCDiff/Decoders/WindowDecoder.cs b/src/VCDiff/Decoders/WindowDecoder.cs index 8eed864..b08bcd5 100644 --- a/src/VCDiff/Decoders/WindowDecoder.cs +++ b/src/VCDiff/Decoders/WindowDecoder.cs @@ -37,7 +37,7 @@ internal class WindowDecoder : WindowDecoderBase, IDisposable where private bool instructionsAndSizesCompressed; private bool addressForCopyCompressed; private uint checksum; - private readonly SharedDecompressors sharedDecompressors; + private readonly SharedDecompressors? sharedDecompressors; public PinnedArrayRental AddRunData; @@ -78,7 +78,7 @@ internal class WindowDecoder : WindowDecoderBase, IDisposable where /// the buffer containing the incoming data /// The maximum target window size in bytes /// Container for compression streams used across windows - public WindowDecoder(long dictionarySize, TByteBuffer buffer, SharedDecompressors sharedDecompressors, int maxWindowSize = DefaultMaxTargetFileSize) + public WindowDecoder(long dictionarySize, TByteBuffer buffer, SharedDecompressors? sharedDecompressors, int maxWindowSize = DefaultMaxTargetFileSize) { this.dictionarySize = dictionarySize; this.buffer = buffer; @@ -143,8 +143,13 @@ public bool Decode(bool isSdch, byte secondaryCompressorId) AddRunData = new PinnedArrayRental((int)addRunLength); Debug.Assert(addRunLength <= int.MaxValue); buffer.ReadBytesToSpan(AddRunData.AsSpan()); - if (AddRunCompressed) + if (AddRunCompressed && secondaryCompressorId != 0) { + if (sharedDecompressors == null) + { + throw new InvalidOperationException("AddRunData is compressed but no SharedDecompressors were provided to the WindowDecoder"); + } + AddRunData = Decompress(AddRunData, secondaryCompressorId, ref sharedDecompressors.AddRunDecompressor, ref sharedDecompressors.AddRunCompressedBuffer); } } @@ -153,8 +158,13 @@ public bool Decode(bool isSdch, byte secondaryCompressorId) InstructionsAndSizesData = new PinnedArrayRental((int)instructionAndSizesLength); Debug.Assert(instructionAndSizesLength <= int.MaxValue); buffer.ReadBytesToSpan(InstructionsAndSizesData.AsSpan()); - if (instructionsAndSizesCompressed) + if (instructionsAndSizesCompressed && secondaryCompressorId != 0) { + if (sharedDecompressors == null) + { + throw new InvalidOperationException("AddRunData is compressed but no SharedDecompressors were provided to the WindowDecoder"); + } + InstructionsAndSizesData = Decompress(InstructionsAndSizesData, secondaryCompressorId, ref sharedDecompressors.InstructionsDecompressor, ref sharedDecompressors.InstructionsCompressedBuffer); } } @@ -163,8 +173,13 @@ public bool Decode(bool isSdch, byte secondaryCompressorId) AddressesForCopyData = new PinnedArrayRental((int)addressForCopyLength); Debug.Assert(addressForCopyLength <= int.MaxValue); buffer.ReadBytesToSpan(AddressesForCopyData.AsSpan()); - if (addressForCopyCompressed) + if (addressForCopyCompressed && secondaryCompressorId != 0) { + if (sharedDecompressors == null) + { + throw new InvalidOperationException("AddRunData is compressed but no SharedDecompressors were provided to the WindowDecoder"); + } + AddressesForCopyData = Decompress(AddressesForCopyData, secondaryCompressorId, ref sharedDecompressors.AddressesDecompressor, ref sharedDecompressors.AddressesCompressedBuffer); } } From af30e830c46a077d3b1d62b01a07af64b9559f16 Mon Sep 17 00:00:00 2001 From: Evan Dixon Date: Thu, 26 Feb 2026 18:15:38 -0600 Subject: [PATCH 5/9] Extract decompression to separate class --- src/VCDiff/Compressors/ICompressor.cs | 16 ++++++ src/VCDiff/Compressors/XzCompressor.cs | 73 ++++++++++++++++++++++++++ src/VCDiff/Decoders/VcDecoderEx.cs | 33 +++++++----- src/VCDiff/Decoders/WindowDecoder.cs | 63 +++++----------------- src/VCDiff/Includes/Include.cs | 2 - src/VCDiff/Shared/WindowSectionType.cs | 10 ++++ 6 files changed, 132 insertions(+), 65 deletions(-) create mode 100644 src/VCDiff/Compressors/ICompressor.cs create mode 100644 src/VCDiff/Compressors/XzCompressor.cs create mode 100644 src/VCDiff/Shared/WindowSectionType.cs diff --git a/src/VCDiff/Compressors/ICompressor.cs b/src/VCDiff/Compressors/ICompressor.cs new file mode 100644 index 0000000..b455752 --- /dev/null +++ b/src/VCDiff/Compressors/ICompressor.cs @@ -0,0 +1,16 @@ +using VCDiff.Includes; +using VCDiff.Shared; + +namespace VCDiff.Compressors +{ + /// + /// A compression method for secondary compression, for use when is enabled in the header and the appropriate flag is enabled for the section in the window. + /// + /// + /// Implementations are stateful, and a single instance must be used for the entire file for a single operation (compression or decompression). + /// + internal interface ICompressor + { + PinnedArrayRental Decompress(WindowSectionType windowSectionType, PinnedArrayRental sectionData); + } +} diff --git a/src/VCDiff/Compressors/XzCompressor.cs b/src/VCDiff/Compressors/XzCompressor.cs new file mode 100644 index 0000000..22a623a --- /dev/null +++ b/src/VCDiff/Compressors/XzCompressor.cs @@ -0,0 +1,73 @@ +using SharpCompress.Compressors.Xz; +using System; +using System.Collections.Generic; +using System.IO; +using System.Text; +using VCDiff.Shared; + +namespace VCDiff.Compressors +{ + internal class XzCompressor : ICompressor + { + public XzCompressor() + { + addRunCompressedBuffer = new(); + instructionsCompressedBuffer = new(); + addressesCompressedBuffer = new(); + + addRunDecompressor = new(addRunCompressedBuffer); + instructionsDecompressor = new(instructionsCompressedBuffer); + addressesDecompressor = new(addressesCompressedBuffer); + } + + private readonly MemoryStream addRunCompressedBuffer; + private readonly MemoryStream instructionsCompressedBuffer; + private readonly MemoryStream addressesCompressedBuffer; + private readonly XZStream addRunDecompressor; + private readonly XZStream instructionsDecompressor; + private readonly XZStream addressesDecompressor; + + public PinnedArrayRental Decompress(WindowSectionType windowSectionType, PinnedArrayRental sectionData) + { + if (sectionData.Data == null) + { + throw new ArgumentException("Cannot decompress null data"); + } + + MemoryStream memoryStream; + XZStream xzStream; + switch (windowSectionType) + { + case WindowSectionType.AddRunData: + memoryStream = addRunCompressedBuffer; + xzStream = addRunDecompressor; + break; + case WindowSectionType.InstructionsAndSizes: + memoryStream = instructionsCompressedBuffer; + xzStream = instructionsDecompressor; + break; + case WindowSectionType.AddressForCopy: + memoryStream = addressesCompressedBuffer; + xzStream = addressesDecompressor; + break; + default: + throw new ArgumentOutOfRangeException(nameof(windowSectionType)); + } + + var uncompressedLength = VarIntBE.ParseInt32(sectionData.AsSpan(), out int uncompressedLengthByteCount); + var compressedData = sectionData.AsSpan().Slice(uncompressedLengthByteCount); + + // Each section in a window uses the same compression stream throughout the file + // If this is not the first window, reuse the same stream from before, just using different data + memoryStream.SetLength(compressedData.Length); + memoryStream.Position = 0; + memoryStream.Write(compressedData); + memoryStream.Position = 0; + + var decompressedData = new PinnedArrayRental(uncompressedLength); + xzStream.ReadExactly(decompressedData.AsSpan()); + + return decompressedData; + } + } +} diff --git a/src/VCDiff/Decoders/VcDecoderEx.cs b/src/VCDiff/Decoders/VcDecoderEx.cs index 9c3b680..2ea4f72 100644 --- a/src/VCDiff/Decoders/VcDecoderEx.cs +++ b/src/VCDiff/Decoders/VcDecoderEx.cs @@ -1,7 +1,7 @@ using System; using System.IO; -using System.Text; using System.Threading.Tasks; +using VCDiff.Compressors; using VCDiff.Includes; using VCDiff.Shared; @@ -13,7 +13,7 @@ namespace VCDiff.Decoders /// public class VcDecoder : VcDecoderEx, IDisposable { - private bool _ownsSources; + private readonly bool _ownsSources; private bool _disposed; /// @@ -25,13 +25,8 @@ public class VcDecoder : VcDecoderEx, IDispo /// The maximum target file size (and target window size) in bytes /// Whether to disable checksums when applying the delta. This can be dangerous, but can be useful when the input file differs in ways that the delta does not reference. public VcDecoder(Stream source, Stream delta, Stream outputStream, int maxTargetFileSize = WindowDecoderBase.DefaultMaxTargetFileSize, bool disableChecksums = false) + : base(new ByteStreamReader(source), new ByteStreamReader(delta), outputStream, maxTargetFileSize, disableChecksums) { - base.delta = new ByteStreamReader(delta); - base.source = new ByteStreamReader(source); - base.outputStream = outputStream; - base.maxTargetFileSize = maxTargetFileSize; - base.IsInitialized = false; - base.disableChecksums = disableChecksums; _ownsSources = true; } @@ -78,8 +73,6 @@ public class VcDecoderEx : IDisposable where TSourc /// protected bool IsInitialized { get; set; } - protected VcDecoderEx() { } - /// /// Creates a new VCDIFF decoder. /// @@ -197,11 +190,11 @@ public VCDiffResult Decode(out long bytesWritten) if (!Decode_Init(out bytesWritten, out var result, out var decodeAsync)) return result; - var decompressors = SecondaryCompressorId != 0 ? new SharedDecompressors() : null; // Decompression streams are shared across windows + var secondaryCompressor = SecondaryCompressorId != 0 ? CreateCompressor(SecondaryCompressorId): null; while (delta.CanRead) { //delta is streamed in order aka not random access - using var w = new WindowDecoder(source.Length, delta, decompressors, maxTargetFileSize); + using var w = new WindowDecoder(source.Length, delta, secondaryCompressor, maxTargetFileSize); if (!w.Decode(this.IsSDCHFormat, this.SecondaryCompressorId)) { @@ -256,11 +249,11 @@ public VCDiffResult Decode(out long bytesWritten) if (!Decode_Init(out var bytesWritten, out var result, out var decodeAsync)) return decodeAsync; - var decompressors = new SharedDecompressors(); // Decompression streams are shared across windows + var secondaryCompressor = SecondaryCompressorId != 0 ? CreateCompressor(SecondaryCompressorId) : null; while (delta.CanRead) { //delta is streamed in order aka not random access - using var w = new WindowDecoder(source.Length, delta, decompressors, maxTargetFileSize); + using var w = new WindowDecoder(source.Length, delta, secondaryCompressor, maxTargetFileSize); if (w.Decode(this.IsSDCHFormat, this.SecondaryCompressorId)) { @@ -331,6 +324,18 @@ private bool Decode_Init(out long bytesWritten, out VCDiffResult result, out (VC return true; } + private ICompressor? CreateCompressor(byte secondaryCompressorId) + { + return secondaryCompressorId switch + { + 0 => null, + // xdelta defines 1 to be "DJW static huffman" + 2 => new XzCompressor(), + // xdelta defines 16 to be "FGK adaptive huffman" but says it's non-standard + _ => throw new NotSupportedException($"Secondary compression id '{secondaryCompressorId}' is not supported.") + }; + } + /// /// Disposes the decoder /// diff --git a/src/VCDiff/Decoders/WindowDecoder.cs b/src/VCDiff/Decoders/WindowDecoder.cs index b08bcd5..c367aec 100644 --- a/src/VCDiff/Decoders/WindowDecoder.cs +++ b/src/VCDiff/Decoders/WindowDecoder.cs @@ -2,6 +2,7 @@ using System; using System.Diagnostics; using System.IO; +using VCDiff.Compressors; using VCDiff.Includes; using VCDiff.Shared; @@ -37,7 +38,7 @@ internal class WindowDecoder : WindowDecoderBase, IDisposable where private bool instructionsAndSizesCompressed; private bool addressForCopyCompressed; private uint checksum; - private readonly SharedDecompressors? sharedDecompressors; + private readonly ICompressor? secondaryCompressor; public PinnedArrayRental AddRunData; @@ -77,12 +78,12 @@ internal class WindowDecoder : WindowDecoderBase, IDisposable where /// the dictionary size /// the buffer containing the incoming data /// The maximum target window size in bytes - /// Container for compression streams used across windows - public WindowDecoder(long dictionarySize, TByteBuffer buffer, SharedDecompressors? sharedDecompressors, int maxWindowSize = DefaultMaxTargetFileSize) + /// The secondary compressor that can decompress window sections, if applicable. + public WindowDecoder(long dictionarySize, TByteBuffer buffer, ICompressor? secondaryCompressor, int maxWindowSize = DefaultMaxTargetFileSize) { this.dictionarySize = dictionarySize; this.buffer = buffer; - this.sharedDecompressors = sharedDecompressors; + this.secondaryCompressor = secondaryCompressor; chunk = new ParseableChunk(buffer.Position, buffer.Length); if (maxWindowSize < 0) @@ -145,12 +146,12 @@ public bool Decode(bool isSdch, byte secondaryCompressorId) buffer.ReadBytesToSpan(AddRunData.AsSpan()); if (AddRunCompressed && secondaryCompressorId != 0) { - if (sharedDecompressors == null) + if (secondaryCompressor == null) { - throw new InvalidOperationException("AddRunData is compressed but no SharedDecompressors were provided to the WindowDecoder"); + throw new InvalidOperationException("AddRunData is compressed but no compressor was provided to the WindowDecoder"); } - AddRunData = Decompress(AddRunData, secondaryCompressorId, ref sharedDecompressors.AddRunDecompressor, ref sharedDecompressors.AddRunCompressedBuffer); + AddRunData = secondaryCompressor.Decompress(WindowSectionType.AddRunData, AddRunData); } } if (buffer.CanRead) @@ -160,12 +161,12 @@ public bool Decode(bool isSdch, byte secondaryCompressorId) buffer.ReadBytesToSpan(InstructionsAndSizesData.AsSpan()); if (instructionsAndSizesCompressed && secondaryCompressorId != 0) { - if (sharedDecompressors == null) + if (secondaryCompressor == null) { - throw new InvalidOperationException("AddRunData is compressed but no SharedDecompressors were provided to the WindowDecoder"); + throw new InvalidOperationException("AddRunData is compressed but no compressor was provided to the WindowDecoder"); } - InstructionsAndSizesData = Decompress(InstructionsAndSizesData, secondaryCompressorId, ref sharedDecompressors.InstructionsDecompressor, ref sharedDecompressors.InstructionsCompressedBuffer); + InstructionsAndSizesData = secondaryCompressor.Decompress(WindowSectionType.InstructionsAndSizes, InstructionsAndSizesData); } } if (buffer.CanRead) @@ -175,12 +176,12 @@ public bool Decode(bool isSdch, byte secondaryCompressorId) buffer.ReadBytesToSpan(AddressesForCopyData.AsSpan()); if (addressForCopyCompressed && secondaryCompressorId != 0) { - if (sharedDecompressors == null) + if (secondaryCompressor == null) { - throw new InvalidOperationException("AddRunData is compressed but no SharedDecompressors were provided to the WindowDecoder"); + throw new InvalidOperationException("AddRunData is compressed but no compressor was provided to the WindowDecoder"); } - AddressesForCopyData = Decompress(AddressesForCopyData, secondaryCompressorId, ref sharedDecompressors.AddressesDecompressor, ref sharedDecompressors.AddressesCompressedBuffer); + AddressesForCopyData = secondaryCompressor.Decompress(WindowSectionType.AddressForCopy, AddressesForCopyData); } } @@ -401,42 +402,6 @@ private bool ParseDeltaIndicator() return true; } - private PinnedArrayRental Decompress(PinnedArrayRental pinnedArrayRental, byte secondaryCompressorId, ref XZStream? xzStream, ref MemoryStream? memoryStream) - { - if (secondaryCompressorId == 0) - { - return pinnedArrayRental; - } - - if (secondaryCompressorId != 2) - { - throw new NotSupportedException("Only LZMA decompression is supported"); - } - - if (pinnedArrayRental.Data == null) - { - throw new ArgumentException("Cannot decompress null data"); - } - - var uncompressedLength = VarIntBE.ParseInt32(pinnedArrayRental.AsSpan(), out int uncompressedLengthByteCount); - var compressedData = pinnedArrayRental.AsSpan().Slice(uncompressedLengthByteCount); - - // Each section in a window uses the same compression stream throughout the file - // If this is not the first window, reuse the same stream from before, just using different data - memoryStream ??= new MemoryStream(); - memoryStream.SetLength(compressedData.Length); - memoryStream.Position = 0; - memoryStream.Write(compressedData); - memoryStream.Position = 0; - - xzStream ??= new XZStream(memoryStream); - - var decompressedData = new PinnedArrayRental(uncompressedLength); - xzStream.ReadExactly(decompressedData.AsSpan()); - - return decompressedData; - } - public bool ParseSectionLengths(ChecksumFormat checksumFormat, out long addRunLength, out long instructionsLength, out long addressLength, out uint checksum) { ParseInt32(out int outAdd); diff --git a/src/VCDiff/Includes/Include.cs b/src/VCDiff/Includes/Include.cs index e163662..c59b569 100644 --- a/src/VCDiff/Includes/Include.cs +++ b/src/VCDiff/Includes/Include.cs @@ -117,8 +117,6 @@ internal enum VCDiffWindowFlags // compressor. The bit positions 0 (VCD_DATACOMP), 1 // (VCD_INSTCOMP), and 2 (VCD_ADDRCOMP) respectively indicate, if // non-zero, that the corresponding parts are compressed." - // [Secondary compressors are not supported, so open-vcdiff decoding will fail - // if these bits are not all zero.] internal enum VCDiffCompressFlags { VCDDATACOMP = 0x01, diff --git a/src/VCDiff/Shared/WindowSectionType.cs b/src/VCDiff/Shared/WindowSectionType.cs new file mode 100644 index 0000000..d5d175c --- /dev/null +++ b/src/VCDiff/Shared/WindowSectionType.cs @@ -0,0 +1,10 @@ +namespace VCDiff.Shared +{ + public enum WindowSectionType + { + Unspecified = 0, + AddRunData, + InstructionsAndSizes, + AddressForCopy + } +} From 7ce06864364090c4b0cc0640d3b5af15ad3cc33a Mon Sep 17 00:00:00 2001 From: Evan Dixon Date: Thu, 26 Feb 2026 19:47:06 -0600 Subject: [PATCH 6/9] Dispose of compression streams when done --- src/VCDiff/Compressors/XzCompressor.cs | 11 ++++++++++- src/VCDiff/Decoders/VcDecoderEx.cs | 12 +++++++++++- 2 files changed, 21 insertions(+), 2 deletions(-) diff --git a/src/VCDiff/Compressors/XzCompressor.cs b/src/VCDiff/Compressors/XzCompressor.cs index 22a623a..c1f50da 100644 --- a/src/VCDiff/Compressors/XzCompressor.cs +++ b/src/VCDiff/Compressors/XzCompressor.cs @@ -7,7 +7,7 @@ namespace VCDiff.Compressors { - internal class XzCompressor : ICompressor + internal class XzCompressor : ICompressor, IDisposable { public XzCompressor() { @@ -69,5 +69,14 @@ public PinnedArrayRental Decompress(WindowSectionType windowSectionType, PinnedA return decompressedData; } + public void Dispose() + { + addressesCompressedBuffer?.Dispose(); + instructionsCompressedBuffer?.Dispose(); + addressesCompressedBuffer?.Dispose(); + addRunDecompressor?.Dispose(); + instructionsDecompressor?.Dispose(); + addressesDecompressor?.Dispose(); + } } } diff --git a/src/VCDiff/Decoders/VcDecoderEx.cs b/src/VCDiff/Decoders/VcDecoderEx.cs index 2ea4f72..35a3346 100644 --- a/src/VCDiff/Decoders/VcDecoderEx.cs +++ b/src/VCDiff/Decoders/VcDecoderEx.cs @@ -235,6 +235,11 @@ public VCDiffResult Decode(out long bytesWritten) } } + if (secondaryCompressor is IDisposable secondaryCompressorDisposable) + { + secondaryCompressorDisposable.Dispose(); + } + return result; } @@ -296,6 +301,11 @@ public VCDiffResult Decode(out long bytesWritten) } } + if (secondaryCompressor is IDisposable secondaryCompressorDisposable) + { + secondaryCompressorDisposable.Dispose(); + } + return (result, bytesWritten); } @@ -324,7 +334,7 @@ private bool Decode_Init(out long bytesWritten, out VCDiffResult result, out (VC return true; } - private ICompressor? CreateCompressor(byte secondaryCompressorId) + protected virtual ICompressor? CreateCompressor(byte secondaryCompressorId) { return secondaryCompressorId switch { From 193e7a5d7c9e12e39569c07bd1d62eade871642f Mon Sep 17 00:00:00 2001 From: Evan Dixon Date: Thu, 26 Feb 2026 19:54:10 -0600 Subject: [PATCH 7/9] Fix accessibilty error --- src/VCDiff/Decoders/VcDecoderEx.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/VCDiff/Decoders/VcDecoderEx.cs b/src/VCDiff/Decoders/VcDecoderEx.cs index 35a3346..a0bb3db 100644 --- a/src/VCDiff/Decoders/VcDecoderEx.cs +++ b/src/VCDiff/Decoders/VcDecoderEx.cs @@ -334,7 +334,7 @@ private bool Decode_Init(out long bytesWritten, out VCDiffResult result, out (VC return true; } - protected virtual ICompressor? CreateCompressor(byte secondaryCompressorId) + private ICompressor? CreateCompressor(byte secondaryCompressorId) { return secondaryCompressorId switch { From c9a4edcc231d594ea5cadb5469d70ef9a97e9a9f Mon Sep 17 00:00:00 2001 From: Evan Dixon Date: Thu, 26 Feb 2026 20:14:22 -0600 Subject: [PATCH 8/9] Add test --- src/VCDiff.Tests/ExternDiffTests.cs | 2 ++ .../patches/a-to-b-lzma-compression.xdelta | Bin 0 -> 115485 bytes 2 files changed, 2 insertions(+) create mode 100644 src/VCDiff.Tests/patches/a-to-b-lzma-compression.xdelta diff --git a/src/VCDiff.Tests/ExternDiffTests.cs b/src/VCDiff.Tests/ExternDiffTests.cs index a56399f..5e2877c 100644 --- a/src/VCDiff.Tests/ExternDiffTests.cs +++ b/src/VCDiff.Tests/ExternDiffTests.cs @@ -20,6 +20,7 @@ public class ExternDiffTests [InlineData("sample.xdelta")] [InlineData("sample_nosmallstr.xdelta")] [InlineData("sample_appheader.xdelta")] + [InlineData("a-to-b-lzma-compression.xdelta")] public async Task ExternTest_ImplAsync(string patchfile) { @@ -53,6 +54,7 @@ public async Task ExternTest_ImplAsync(string patchfile) [InlineData("sample.xdelta")] [InlineData("sample_nosmallstr.xdelta")] [InlineData("sample_appheader.xdelta")] + [InlineData("a-to-b-lzma-compression.xdelta")] public void ExternTest_Impl(string patchfile) { diff --git a/src/VCDiff.Tests/patches/a-to-b-lzma-compression.xdelta b/src/VCDiff.Tests/patches/a-to-b-lzma-compression.xdelta new file mode 100644 index 0000000000000000000000000000000000000000..3234e35004e1155d6213213212cb7a6ce4de12b7 GIT binary patch literal 115485 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 z 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 mYX!h$&e*OLe)>1shA3V Date: Tue, 3 Mar 2026 08:09:00 -0600 Subject: [PATCH 9/9] Use try/finally for secondary compressor disposal --- src/VCDiff/Decoders/VcDecoderEx.cs | 163 +++++++++++++++-------------- 1 file changed, 87 insertions(+), 76 deletions(-) diff --git a/src/VCDiff/Decoders/VcDecoderEx.cs b/src/VCDiff/Decoders/VcDecoderEx.cs index a0bb3db..8f45f22 100644 --- a/src/VCDiff/Decoders/VcDecoderEx.cs +++ b/src/VCDiff/Decoders/VcDecoderEx.cs @@ -191,54 +191,60 @@ public VCDiffResult Decode(out long bytesWritten) return result; var secondaryCompressor = SecondaryCompressorId != 0 ? CreateCompressor(SecondaryCompressorId): null; - while (delta.CanRead) + try { - //delta is streamed in order aka not random access - using var w = new WindowDecoder(source.Length, delta, secondaryCompressor, maxTargetFileSize); - - if (!w.Decode(this.IsSDCHFormat, this.SecondaryCompressorId)) + while (delta.CanRead) { - return (VCDiffResult)w.Result; - } + //delta is streamed in order aka not random access + using var w = new WindowDecoder(source.Length, delta, secondaryCompressor, maxTargetFileSize); - using var body = new BodyDecoder(w, source, delta, outputStream, disableChecksums: disableChecksums); - if (this.IsSDCHFormat && w.AddRunLength == 0 && w.AddressesForCopyLength == 0 && w.InstructionAndSizesLength > 0) - { - //interleaved - //decodedinterleave actually has an internal loop for waiting and streaming the incoming rest of the interleaved window - result = body.DecodeInterleave(); + if (!w.Decode(this.IsSDCHFormat, this.SecondaryCompressorId)) + { + return (VCDiffResult)w.Result; + } - if (result != VCDiffResult.SUCCESS && result != VCDiffResult.EOD) - return result; + using var body = new BodyDecoder(w, source, delta, outputStream, disableChecksums: disableChecksums); + if (this.IsSDCHFormat && w.AddRunLength == 0 && w.AddressesForCopyLength == 0 && w.InstructionAndSizesLength > 0) + { + //interleaved + //decodedinterleave actually has an internal loop for waiting and streaming the incoming rest of the interleaved window + result = body.DecodeInterleave(); - bytesWritten += body.TotalBytesDecoded; - } - //technically add could be 0 if it is all copy instructions - //so do an or check on those two - else if (!this.IsSDCHFormat || - (this.IsSDCHFormat && (w.AddRunLength > 0 || w.AddressesForCopyLength > 0) && - w.InstructionAndSizesLength > 0)) - { - //not interleaved - //expects the full window to be available - //in the stream - result = body.Decode(); - if (result != VCDiffResult.SUCCESS) - return result; - - bytesWritten += body.TotalBytesDecoded; + if (result != VCDiffResult.SUCCESS && result != VCDiffResult.EOD) + return result; + + bytesWritten += body.TotalBytesDecoded; + } + //technically add could be 0 if it is all copy instructions + //so do an or check on those two + else if (!this.IsSDCHFormat || + (this.IsSDCHFormat && (w.AddRunLength > 0 || w.AddressesForCopyLength > 0) && + w.InstructionAndSizesLength > 0)) + { + //not interleaved + //expects the full window to be available + //in the stream + result = body.Decode(); + if (result != VCDiffResult.SUCCESS) + return result; + + bytesWritten += body.TotalBytesDecoded; + } + else + { + //invalid file + return VCDiffResult.ERROR; + } } - else + } + finally + { + if (secondaryCompressor is IDisposable secondaryCompressorDisposable) { - //invalid file - return VCDiffResult.ERROR; + secondaryCompressorDisposable.Dispose(); } } - if (secondaryCompressor is IDisposable secondaryCompressorDisposable) - { - secondaryCompressorDisposable.Dispose(); - } return result; } @@ -255,55 +261,60 @@ public VCDiffResult Decode(out long bytesWritten) return decodeAsync; var secondaryCompressor = SecondaryCompressorId != 0 ? CreateCompressor(SecondaryCompressorId) : null; - while (delta.CanRead) + try { - //delta is streamed in order aka not random access - using var w = new WindowDecoder(source.Length, delta, secondaryCompressor, maxTargetFileSize); - - if (w.Decode(this.IsSDCHFormat, this.SecondaryCompressorId)) + while (delta.CanRead) { - using var body = new BodyDecoder(w, source, delta, outputStream, disableChecksums: disableChecksums); - if (this.IsSDCHFormat && w.AddRunLength == 0 && w.AddressesForCopyLength == 0 && w.InstructionAndSizesLength > 0) - { - //interleaved - //decodedinterleave actually has an internal loop for waiting and streaming the incoming rest of the interleaved window - result = await body.DecodeInterleaveAsync(); - - if (result != VCDiffResult.SUCCESS && result != VCDiffResult.EOD) - return (result, bytesWritten); + //delta is streamed in order aka not random access + using var w = new WindowDecoder(source.Length, delta, secondaryCompressor, maxTargetFileSize); - bytesWritten += body.TotalBytesDecoded; - } - //technically add could be 0 if it is all copy instructions - //so do an or check on those two - else if (!this.IsSDCHFormat || (this.IsSDCHFormat && (w.AddRunLength > 0 || w.AddressesForCopyLength > 0) && - w.InstructionAndSizesLength > 0)) + if (w.Decode(this.IsSDCHFormat, this.SecondaryCompressorId)) { - //not interleaved - //expects the full window to be available - //in the stream - result = await body.DecodeAsync(); - - if (result != VCDiffResult.SUCCESS) - return (result, bytesWritten); - - bytesWritten += body.TotalBytesDecoded; + using var body = new BodyDecoder(w, source, delta, outputStream, disableChecksums: disableChecksums); + if (this.IsSDCHFormat && w.AddRunLength == 0 && w.AddressesForCopyLength == 0 && w.InstructionAndSizesLength > 0) + { + //interleaved + //decodedinterleave actually has an internal loop for waiting and streaming the incoming rest of the interleaved window + result = await body.DecodeInterleaveAsync(); + + if (result != VCDiffResult.SUCCESS && result != VCDiffResult.EOD) + return (result, bytesWritten); + + bytesWritten += body.TotalBytesDecoded; + } + //technically add could be 0 if it is all copy instructions + //so do an or check on those two + else if (!this.IsSDCHFormat || (this.IsSDCHFormat && (w.AddRunLength > 0 || w.AddressesForCopyLength > 0) && + w.InstructionAndSizesLength > 0)) + { + //not interleaved + //expects the full window to be available + //in the stream + result = await body.DecodeAsync(); + + if (result != VCDiffResult.SUCCESS) + return (result, bytesWritten); + + bytesWritten += body.TotalBytesDecoded; + } + else + { + //invalid file + return (VCDiffResult.ERROR, bytesWritten); + } } else { - //invalid file - return (VCDiffResult.ERROR, bytesWritten); + return ((VCDiffResult)w.Result, bytesWritten); } } - else - { - return ((VCDiffResult)w.Result, bytesWritten); - } } - - if (secondaryCompressor is IDisposable secondaryCompressorDisposable) + finally { - secondaryCompressorDisposable.Dispose(); + if (secondaryCompressor is IDisposable secondaryCompressorDisposable) + { + secondaryCompressorDisposable.Dispose(); + } } return (result, bytesWritten);