diff --git a/src/SharpCompress/Common/EntryStream.cs b/src/SharpCompress/Common/EntryStream.cs index 4697ff8c..8d40cabd 100644 --- a/src/SharpCompress/Common/EntryStream.cs +++ b/src/SharpCompress/Common/EntryStream.cs @@ -66,6 +66,16 @@ namespace SharpCompress.Common return read; } + public override int ReadByte() + { + int value = _stream.ReadByte(); + if (value == -1) + { + _completed = true; + } + return value; + } + public override long Seek(long offset, SeekOrigin origin) { throw new NotSupportedException(); diff --git a/src/SharpCompress/Common/Tar/TarReadOnlySubStream.cs b/src/SharpCompress/Common/Tar/TarReadOnlySubStream.cs index d7ea3040..25300840 100644 --- a/src/SharpCompress/Common/Tar/TarReadOnlySubStream.cs +++ b/src/SharpCompress/Common/Tar/TarReadOnlySubStream.cs @@ -72,6 +72,22 @@ namespace SharpCompress.Common.Tar return read; } + public override int ReadByte() + { + if (BytesLeftToRead <= 0) + { + return -1; + } + int value = Stream.ReadByte(); + if (value != -1) + { + --BytesLeftToRead; + ++_amountRead; + } + return value; + + } + public override long Seek(long offset, SeekOrigin origin) { throw new NotSupportedException(); diff --git a/src/SharpCompress/Compressors/BZip2/BZip2Stream.cs b/src/SharpCompress/Compressors/BZip2/BZip2Stream.cs index 4566bf03..c0f040a9 100644 --- a/src/SharpCompress/Compressors/BZip2/BZip2Stream.cs +++ b/src/SharpCompress/Compressors/BZip2/BZip2Stream.cs @@ -67,6 +67,11 @@ namespace SharpCompress.Compressors.BZip2 return stream.Read(buffer, offset, count); } + public override int ReadByte() + { + return stream.ReadByte(); + } + public override long Seek(long offset, SeekOrigin origin) { return stream.Seek(offset, origin); @@ -82,6 +87,11 @@ namespace SharpCompress.Compressors.BZip2 stream.Write(buffer, offset, count); } + public override void WriteByte(byte value) + { + stream.WriteByte(value); + } + /// /// Consumes two bytes to test if there is a BZip2 header /// diff --git a/src/SharpCompress/Compressors/BZip2/CBZip2InputStream.cs b/src/SharpCompress/Compressors/BZip2/CBZip2InputStream.cs index 4168db4b..68d924b4 100644 --- a/src/SharpCompress/Compressors/BZip2/CBZip2InputStream.cs +++ b/src/SharpCompress/Compressors/BZip2/CBZip2InputStream.cs @@ -1077,6 +1077,10 @@ namespace SharpCompress.Compressors.BZip2 { } + public override void WriteByte(byte value) + { + } + public override bool CanRead => true; public override bool CanSeek => false; diff --git a/src/SharpCompress/Compressors/BZip2/CBZip2OutputStream.cs b/src/SharpCompress/Compressors/BZip2/CBZip2OutputStream.cs index 38922294..e95ddb36 100644 --- a/src/SharpCompress/Compressors/BZip2/CBZip2OutputStream.cs +++ b/src/SharpCompress/Compressors/BZip2/CBZip2OutputStream.cs @@ -1929,6 +1929,11 @@ namespace SharpCompress.Compressors.BZip2 return 0; } + public override int ReadByte() + { + return -1; + } + public override long Seek(long offset, SeekOrigin origin) { return 0; diff --git a/src/SharpCompress/Compressors/Deflate/DeflateStream.cs b/src/SharpCompress/Compressors/Deflate/DeflateStream.cs index a771d66e..e095f460 100644 --- a/src/SharpCompress/Compressors/Deflate/DeflateStream.cs +++ b/src/SharpCompress/Compressors/Deflate/DeflateStream.cs @@ -282,6 +282,15 @@ namespace SharpCompress.Compressors.Deflate return _baseStream.Read(buffer, offset, count); } + public override int ReadByte() + { + if (_disposed) + { + throw new ObjectDisposedException("DeflateStream"); + } + return _baseStream.ReadByte(); + } + /// /// Calling this method always throws a . /// @@ -340,6 +349,15 @@ namespace SharpCompress.Compressors.Deflate _baseStream.Write(buffer, offset, count); } + public override void WriteByte(byte value) + { + if (_disposed) + { + throw new ObjectDisposedException("DeflateStream"); + } + _baseStream.WriteByte(value); + } + #endregion public MemoryStream InputBuffer => new MemoryStream(_baseStream._z.InputBuffer, _baseStream._z.NextIn, diff --git a/src/SharpCompress/Compressors/Deflate/ZlibStream.cs b/src/SharpCompress/Compressors/Deflate/ZlibStream.cs index 6a644f39..c82040ef 100644 --- a/src/SharpCompress/Compressors/Deflate/ZlibStream.cs +++ b/src/SharpCompress/Compressors/Deflate/ZlibStream.cs @@ -270,6 +270,15 @@ namespace SharpCompress.Compressors.Deflate return _baseStream.Read(buffer, offset, count); } + public override int ReadByte() + { + if (_disposed) + { + throw new ObjectDisposedException("ZlibStream"); + } + return _baseStream.ReadByte(); + } + /// /// Calling this method always throws a . /// @@ -321,6 +330,15 @@ namespace SharpCompress.Compressors.Deflate _baseStream.Write(buffer, offset, count); } + public override void WriteByte(byte value) + { + if (_disposed) + { + throw new ObjectDisposedException("ZlibStream"); + } + _baseStream.WriteByte(value); + } + #endregion System.IO.Stream methods } } \ No newline at end of file diff --git a/src/SharpCompress/Compressors/LZMA/Bcj2DecoderStream.cs b/src/SharpCompress/Compressors/LZMA/Bcj2DecoderStream.cs index 3dc78c3a..4bdac69b 100644 --- a/src/SharpCompress/Compressors/LZMA/Bcj2DecoderStream.cs +++ b/src/SharpCompress/Compressors/LZMA/Bcj2DecoderStream.cs @@ -193,6 +193,22 @@ namespace SharpCompress.Compressors.LZMA return count; } + public override int ReadByte() + { + if (_mFinished) + { + return -1; + } + + if (!_mIter.MoveNext()) + { + _mFinished = true; + return -1; + } + + return _mIter.Current; + } + public IEnumerable Run() { const uint kBurstSize = (1u << 18); diff --git a/src/SharpCompress/Compressors/LZMA/LZipStream.cs b/src/SharpCompress/Compressors/LZMA/LZipStream.cs index 5cedeb6c..588386f5 100644 --- a/src/SharpCompress/Compressors/LZMA/LZipStream.cs +++ b/src/SharpCompress/Compressors/LZMA/LZipStream.cs @@ -110,6 +110,8 @@ namespace SharpCompress.Compressors.LZMA public override int Read(byte[] buffer, int offset, int count) => _stream.Read(buffer, offset, count); + public override int ReadByte() => _stream.ReadByte(); + public override long Seek(long offset, SeekOrigin origin) => throw new NotSupportedException(); public override void SetLength(long value) => throw new NotImplementedException(); @@ -120,6 +122,12 @@ namespace SharpCompress.Compressors.LZMA _writeCount += count; } + public override void WriteByte(byte value) + { + _stream.WriteByte(value); + ++_writeCount; + } + #endregion /// diff --git a/src/SharpCompress/Compressors/Xz/Filters/Lzma2Filter.cs b/src/SharpCompress/Compressors/Xz/Filters/Lzma2Filter.cs index 66d02e91..cd2869c9 100644 --- a/src/SharpCompress/Compressors/Xz/Filters/Lzma2Filter.cs +++ b/src/SharpCompress/Compressors/Xz/Filters/Lzma2Filter.cs @@ -51,5 +51,10 @@ namespace SharpCompress.Compressors.Xz.Filters { return BaseStream.Read(buffer, offset, count); } + + public override int ReadByte() + { + return BaseStream.ReadByte(); + } } } diff --git a/src/SharpCompress/Crypto/Crc32Stream.cs b/src/SharpCompress/Crypto/Crc32Stream.cs index 13cbc6e2..35dd85bd 100644 --- a/src/SharpCompress/Crypto/Crc32Stream.cs +++ b/src/SharpCompress/Crypto/Crc32Stream.cs @@ -47,6 +47,12 @@ namespace SharpCompress.Crypto hash = CalculateCrc(table, hash, buffer, offset, count); } + public override void WriteByte(byte value) + { + stream.WriteByte(value); + hash = CalculateCrc(table, hash, value); + } + public override bool CanRead => stream.CanRead; public override bool CanSeek => false; public override bool CanWrite => stream.CanWrite; @@ -98,9 +104,16 @@ namespace SharpCompress.Crypto unchecked { for (int i = offset, end = offset + count; i < end; i++) - crc = (crc >> 8) ^ table[(crc ^ buffer[i]) & 0xFF]; + { + crc = CalculateCrc(table, crc, buffer[i]); + } } return crc; } + + private static uint CalculateCrc(uint[] table, uint crc, byte b) + { + return (crc >> 8) ^ table[(crc ^ b) & 0xFF]; + } } } diff --git a/src/SharpCompress/IO/CountingWritableSubStream.cs b/src/SharpCompress/IO/CountingWritableSubStream.cs index c08235c6..17ddf6bb 100644 --- a/src/SharpCompress/IO/CountingWritableSubStream.cs +++ b/src/SharpCompress/IO/CountingWritableSubStream.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.IO; namespace SharpCompress.IO @@ -49,5 +49,11 @@ namespace SharpCompress.IO writableStream.Write(buffer, offset, count); Count += (uint)count; } + + public override void WriteByte(byte value) + { + writableStream.WriteByte(value); + ++Count; + } } } \ No newline at end of file diff --git a/src/SharpCompress/IO/ListeningStream.cs b/src/SharpCompress/IO/ListeningStream.cs index 1cc694e0..a5a76dd1 100644 --- a/src/SharpCompress/IO/ListeningStream.cs +++ b/src/SharpCompress/IO/ListeningStream.cs @@ -47,6 +47,19 @@ namespace SharpCompress.IO return read; } + public override int ReadByte() + { + int value = Stream.ReadByte(); + if (value == -1) + { + return -1; + } + + ++currentEntryTotalReadBytes; + listener.FireCompressedBytesRead(currentEntryTotalReadBytes, currentEntryTotalReadBytes); + return value; + } + public override long Seek(long offset, SeekOrigin origin) { return Stream.Seek(offset, origin); @@ -61,5 +74,10 @@ namespace SharpCompress.IO { Stream.Write(buffer, offset, count); } + + public override void WriteByte(byte value) + { + Stream.WriteByte(value); + } } } \ No newline at end of file diff --git a/src/SharpCompress/IO/NonDisposingStream.cs b/src/SharpCompress/IO/NonDisposingStream.cs index 319f9461..2c9e72c4 100644 --- a/src/SharpCompress/IO/NonDisposingStream.cs +++ b/src/SharpCompress/IO/NonDisposingStream.cs @@ -44,6 +44,11 @@ namespace SharpCompress.IO return Stream.Read(buffer, offset, count); } + public override int ReadByte() + { + return Stream.ReadByte(); + } + public override long Seek(long offset, SeekOrigin origin) { return Stream.Seek(offset, origin); @@ -58,5 +63,10 @@ namespace SharpCompress.IO { Stream.Write(buffer, offset, count); } + + public override void WriteByte(byte value) + { + Stream.WriteByte(value); + } } } \ No newline at end of file diff --git a/src/SharpCompress/IO/ReadOnlySubStream.cs b/src/SharpCompress/IO/ReadOnlySubStream.cs index a8449c41..8747019a 100644 --- a/src/SharpCompress/IO/ReadOnlySubStream.cs +++ b/src/SharpCompress/IO/ReadOnlySubStream.cs @@ -51,6 +51,20 @@ namespace SharpCompress.IO return read; } + public override int ReadByte() + { + if (BytesLeftToRead <= 0) + { + return -1; + } + int value = Stream.ReadByte(); + if (value != -1) + { + --BytesLeftToRead; + } + return value; + } + public override long Seek(long offset, SeekOrigin origin) { throw new NotSupportedException(); diff --git a/tests/SharpCompress.Test/ForwardOnlyStream.cs b/tests/SharpCompress.Test/ForwardOnlyStream.cs index d9cf85e3..c20b9b99 100644 --- a/tests/SharpCompress.Test/ForwardOnlyStream.cs +++ b/tests/SharpCompress.Test/ForwardOnlyStream.cs @@ -44,6 +44,11 @@ namespace SharpCompress.Test return stream.Read(buffer, offset, count); } + public override int ReadByte() + { + return stream.ReadByte(); + } + public override long Seek(long offset, SeekOrigin origin) { throw new NotSupportedException(); @@ -55,7 +60,8 @@ namespace SharpCompress.Test } public override void Write(byte[] buffer, int offset, int count) - {throw new NotSupportedException(); + { + throw new NotSupportedException(); } } } \ No newline at end of file diff --git a/tests/SharpCompress.Test/Zip/Zip64Tests.cs b/tests/SharpCompress.Test/Zip/Zip64Tests.cs index d1e105a6..dba69199 100644 --- a/tests/SharpCompress.Test/Zip/Zip64Tests.cs +++ b/tests/SharpCompress.Test/Zip/Zip64Tests.cs @@ -205,6 +205,9 @@ namespace SharpCompress.Test.Zip public override int Read(byte[] buffer, int offset, int count) { return stream.Read(buffer, offset, count); } + public override int ReadByte() + { return stream.ReadByte(); } + public override long Seek(long offset, SeekOrigin origin) { throw new NotImplementedException(); } @@ -213,6 +216,9 @@ namespace SharpCompress.Test.Zip public override void Write(byte[] buffer, int offset, int count) { stream.Write(buffer, offset, count); } + + public override void WriteByte(byte value) + { stream.WriteByte(value); } } } } \ No newline at end of file