using System.IO; namespace SharpCompress.Compressor.BZip2 { public class BZip2Stream : Stream { private readonly Stream stream; /// /// Create a BZip2Stream /// /// The stream to read from /// Compression Mode /// Leave the underlying stream open when disposed. /// Should the BZip2 stream continue to decompress the stream when the End Marker is found. public BZip2Stream(Stream stream, CompressionMode compressionMode, bool leaveOpen = false, bool decompressContacted = false) { Mode = compressionMode; if (Mode == CompressionMode.Compress) { this.stream = new CBZip2OutputStream(stream, leaveOpen); } else { this.stream = new CBZip2InputStream(stream, decompressContacted, leaveOpen); } } protected override void Dispose(bool disposing) { if (disposing) { stream.Dispose(); } } public CompressionMode Mode { get; private set; } public override bool CanRead { get { return stream.CanRead; } } public override bool CanSeek { get { return stream.CanSeek; } } public override bool CanWrite { get { return stream.CanWrite; } } public override void Flush() { stream.Flush(); } public override long Length { get { return stream.Length; } } public override long Position { get { return stream.Position; } set { stream.Position = value; } } public override int Read(byte[] buffer, int offset, int count) { return stream.Read(buffer, offset, count); } public override long Seek(long offset, SeekOrigin origin) { return stream.Seek(offset, origin); } public override void SetLength(long value) { stream.SetLength(value); } public override void Write(byte[] buffer, int offset, int count) { stream.Write(buffer, offset, count); } /// /// Consumes two bytes to test if there is a BZip2 header /// /// /// public static bool IsBZip2(Stream stream) { BinaryReader br = new BinaryReader(stream); byte[] chars = br.ReadBytes(2); if (chars.Length < 2 || chars[0] != 'B' || chars[1] != 'Z') { return false; } return true; } } }