summary refs log tree commit diff
path: root/crypto/src/util/zlib/ZOutputStream.cs
diff options
context:
space:
mode:
authorPeter Dettman <peter.dettman@bouncycastle.org>2022-05-23 22:44:57 +0700
committerPeter Dettman <peter.dettman@bouncycastle.org>2022-05-23 22:44:57 +0700
commit98b3ce6512812cd1d91c60ca0e69d69c32838d8e (patch)
tree8af69c097b389fe494e97401f7808590314a5b6b /crypto/src/util/zlib/ZOutputStream.cs
parentAdd ValidateBufferArguments (diff)
downloadBouncyCastle.NET-ed25519-98b3ce6512812cd1d91c60ca0e69d69c32838d8e.tar.xz
Work on Stream classes
- consistent naming, ordering
- CanRead/Seek/Write fixes
- argument validation
- some cases of blocking zero-byte Read calls
Diffstat (limited to 'crypto/src/util/zlib/ZOutputStream.cs')
-rw-r--r--crypto/src/util/zlib/ZOutputStream.cs272
1 files changed, 131 insertions, 141 deletions
diff --git a/crypto/src/util/zlib/ZOutputStream.cs b/crypto/src/util/zlib/ZOutputStream.cs

index a1482a07f..dcb93f97b 100644 --- a/crypto/src/util/zlib/ZOutputStream.cs +++ b/crypto/src/util/zlib/ZOutputStream.cs
@@ -37,11 +37,13 @@ using System; using System.Diagnostics; using System.IO; +using Org.BouncyCastle.Utilities.IO; + namespace Org.BouncyCastle.Utilities.Zlib { - public class ZOutputStream - : Stream - { + public class ZOutputStream + : BaseOutputStream + { private static ZStream GetDefaultZStream(bool nowrap) { ZStream z = new ZStream(); @@ -51,30 +53,30 @@ namespace Org.BouncyCastle.Utilities.Zlib private const int BufferSize = 4096; - protected ZStream z; - protected int flushLevel = JZlib.Z_NO_FLUSH; - // TODO Allow custom buf - protected byte[] buf = new byte[BufferSize]; - protected byte[] buf1 = new byte[1]; - protected bool compress; + protected ZStream z; + protected int flushLevel = JZlib.Z_NO_FLUSH; + // TODO Allow custom buf + protected byte[] buf = new byte[BufferSize]; + protected byte[] buf1 = new byte[1]; + protected bool compress; - protected Stream output; - protected bool closed; + protected Stream output; + protected bool closed; public ZOutputStream(Stream output) : this(output, false) - { - } + { + } public ZOutputStream(Stream output, bool nowrap) : this(output, GetDefaultZStream(nowrap)) - { - } + { + } public ZOutputStream(Stream output, ZStream z) - : base() - { - Debug.Assert(output.CanWrite); + : base() + { + Debug.Assert(output.CanWrite); if (z == null) { @@ -89,27 +91,23 @@ namespace Org.BouncyCastle.Utilities.Zlib this.output = output; this.compress = (z.istate == null); this.z = z; - } + } public ZOutputStream(Stream output, int level) - : this(output, level, false) - { - } + : this(output, level, false) + { + } - public ZOutputStream(Stream output, int level, bool nowrap) - : base() - { - Debug.Assert(output.CanWrite); + public ZOutputStream(Stream output, int level, bool nowrap) + : base() + { + Debug.Assert(output.CanWrite); - this.output = output; + this.output = output; this.compress = true; this.z = new ZStream(); - this.z.deflateInit(level, nowrap); - } - - public sealed override bool CanRead { get { return false; } } - public sealed override bool CanSeek { get { return false; } } - public sealed override bool CanWrite { get { return !closed; } } + this.z.deflateInit(level, nowrap); + } #if PORTABLE protected override void Dispose(bool disposing) @@ -124,14 +122,14 @@ namespace Org.BouncyCastle.Utilities.Zlib base.Dispose(disposing); } #else - public override void Close() - { - if (closed) - return; + public override void Close() + { + if (closed) + return; DoClose(); base.Close(); - } + } #endif private void DoClose() @@ -157,109 +155,101 @@ namespace Org.BouncyCastle.Utilities.Zlib } public virtual void End() - { - if (z == null) - return; - if (compress) - z.deflateEnd(); - else - z.inflateEnd(); - z.free(); - z = null; - } - - public virtual void Finish() - { - do - { - z.next_out = buf; - z.next_out_index = 0; - z.avail_out = buf.Length; - - int err = compress - ? z.deflate(JZlib.Z_FINISH) - : z.inflate(JZlib.Z_FINISH); - - if (err != JZlib.Z_STREAM_END && err != JZlib.Z_OK) - // TODO -// throw new ZStreamException((compress?"de":"in")+"flating: "+z.msg); - throw new IOException((compress ? "de" : "in") + "flating: " + z.msg); - - int count = buf.Length - z.avail_out; - if (count > 0) - { - output.Write(buf, 0, count); - } - } - while (z.avail_in > 0 || z.avail_out == 0); - - Flush(); - } - - public override void Flush() - { - output.Flush(); - } - - public virtual int FlushMode - { - get { return flushLevel; } - set { this.flushLevel = value; } - } - - public sealed override long Length { get { throw new NotSupportedException(); } } - public sealed override long Position { - get { throw new NotSupportedException(); } - set { throw new NotSupportedException(); } + if (z == null) + return; + if (compress) + z.deflateEnd(); + else + z.inflateEnd(); + z.free(); + z = null; + } + + public virtual void Finish() + { + do + { + z.next_out = buf; + z.next_out_index = 0; + z.avail_out = buf.Length; + + int err = compress + ? z.deflate(JZlib.Z_FINISH) + : z.inflate(JZlib.Z_FINISH); + + if (err != JZlib.Z_STREAM_END && err != JZlib.Z_OK) + // TODO + //throw new ZStreamException((compress?"de":"in")+"flating: "+z.msg); + throw new IOException((compress ? "de" : "in") + "flating: " + z.msg); + + int count = buf.Length - z.avail_out; + if (count > 0) + { + output.Write(buf, 0, count); + } + } + while (z.avail_in > 0 || z.avail_out == 0); + + Flush(); + } + + public override void Flush() + { + output.Flush(); + } + + public virtual int FlushMode + { + get { return flushLevel; } + set { this.flushLevel = value; } + } + + public virtual long TotalIn + { + get { return z.total_in; } + } + + public virtual long TotalOut + { + get { return z.total_out; } + } + + public override void Write(byte[] buffer, int offset, int count) + { + Streams.ValidateBufferArguments(buffer, offset, count); + + if (count == 0) + return; + + z.next_in = buffer; + z.next_in_index = offset; + z.avail_in = count; + + do + { + z.next_out = buf; + z.next_out_index = 0; + z.avail_out = buf.Length; + + int err = compress + ? z.deflate(flushLevel) + : z.inflate(flushLevel); + + if (err != JZlib.Z_OK) + // TODO + //throw new ZStreamException((compress ? "de" : "in") + "flating: " + z.msg); + throw new IOException((compress ? "de" : "in") + "flating: " + z.msg); + + output.Write(buf, 0, buf.Length - z.avail_out); + } + while (z.avail_in > 0 || z.avail_out == 0); + } + + public override void WriteByte(byte value) + { + buf1[0] = value; + Write(buf1, 0, 1); } - public sealed override int Read(byte[] buffer, int offset, int count) { throw new NotSupportedException(); } - public sealed override long Seek(long offset, SeekOrigin origin) { throw new NotSupportedException(); } - public sealed override void SetLength(long value) { throw new NotSupportedException(); } - - public virtual long TotalIn - { - get { return z.total_in; } - } - - public virtual long TotalOut - { - get { return z.total_out; } - } - - public override void Write(byte[] b, int off, int len) - { - if (len == 0) - return; - - z.next_in = b; - z.next_in_index = off; - z.avail_in = len; - - do - { - z.next_out = buf; - z.next_out_index = 0; - z.avail_out = buf.Length; - - int err = compress - ? z.deflate(flushLevel) - : z.inflate(flushLevel); - - if (err != JZlib.Z_OK) - // TODO -// throw new ZStreamException((compress ? "de" : "in") + "flating: " + z.msg); - throw new IOException((compress ? "de" : "in") + "flating: " + z.msg); - - output.Write(buf, 0, buf.Length - z.avail_out); - } - while (z.avail_in > 0 || z.avail_out == 0); - } - - public override void WriteByte(byte b) - { - buf1[0] = b; - Write(buf1, 0, 1); - } - } + } }