private HuffmanTree? _distanceTree;
private InflaterState _state;
- private readonly bool _hasFormatReader;
private int _bfinal;
private BlockType _blockType;
private readonly long _uncompressedSize;
private long _currentInflatedCount;
- private readonly IFileFormatReader? _formatReader; // class to decode header and footer (e.g. gzip)
-
- internal InflaterManaged(IFileFormatReader? reader, bool deflate64, long uncompressedSize)
+ internal InflaterManaged(bool deflate64, long uncompressedSize)
{
_output = new OutputWindow();
_input = new InputBuffer();
_codeLengthTreeCodeLength = new byte[HuffmanTree.NumberOfCodeLengthTreeElements];
_deflate64 = deflate64;
_uncompressedSize = uncompressedSize;
- if (reader != null)
- {
- _formatReader = reader;
- _hasFormatReader = true;
- }
- Reset();
- }
-
- private void Reset()
- {
- _state = _hasFormatReader ?
- InflaterState.ReadingHeader : // start by reading Header info
- InflaterState.ReadingBFinal; // start by reading BFinal bit
+ _state = InflaterState.ReadingBFinal; // start by reading BFinal bit
}
public void SetInput(byte[] inputBytes, int offset, int length) =>
}
if (copied > 0)
{
- if (_hasFormatReader)
- {
- Debug.Assert(_formatReader != null);
- _formatReader.UpdateWithBytesRead(bytes, offset, copied);
- }
-
offset += copied;
count += copied;
length -= copied;
// Decode will return false when more input is needed
} while (!Finished() && Decode());
- if (_state == InflaterState.VerifyingFooter)
- { // finished reading CRC
- // In this case finished is true and output window has all the data.
- // But some data in output window might not be copied out.
- if (_output.AvailableBytes == 0)
- {
- Debug.Assert(_formatReader != null);
- _formatReader.Validate();
- }
- }
-
return count;
}
return true;
}
- if (_hasFormatReader)
- {
- Debug.Assert(_formatReader != null);
- if (_state == InflaterState.ReadingHeader)
- {
- if (!_formatReader.ReadHeader(_input))
- {
- return false;
- }
- _state = InflaterState.ReadingBFinal;
- }
- else if (_state == InflaterState.StartReadingFooter || _state == InflaterState.ReadingFooter)
- {
- if (!_formatReader.ReadFooter(_input))
- return false;
-
- _state = InflaterState.VerifyingFooter;
- return true;
- }
- }
-
if (_state == InflaterState.ReadingBFinal)
{
// reading bfinal bit
//
if (eob && (_bfinal != 0))
{
- if (_hasFormatReader)
- _state = InflaterState.StartReadingFooter;
- else
- _state = InflaterState.Done;
+ _state = InflaterState.Done;
}
return result;
}