diff --git a/crypto/src/util/zlib/ZInputStream.cs b/crypto/src/util/zlib/ZInputStream.cs
index ea803fa4f..3e6fcc1be 100644
--- a/crypto/src/util/zlib/ZInputStream.cs
+++ b/crypto/src/util/zlib/ZInputStream.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 ZInputStream
- : Stream
- {
+ public class ZInputStream
+ : BaseInputStream
+ {
private static ZStream GetDefaultZStream(bool nowrap)
{
ZStream z = new ZStream();
@@ -51,32 +53,32 @@ 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 input;
- protected bool closed;
+ protected Stream input;
+ protected bool closed;
- private bool nomoreinput = false;
+ private bool nomoreinput = false;
- public ZInputStream(Stream input)
- : this(input, false)
- {
- }
+ public ZInputStream(Stream input)
+ : this(input, false)
+ {
+ }
- public ZInputStream(Stream input, bool nowrap)
+ public ZInputStream(Stream input, bool nowrap)
: this(input, GetDefaultZStream(nowrap))
- {
- }
+ {
+ }
public ZInputStream(Stream input, ZStream z)
- : base()
- {
- Debug.Assert(input.CanRead);
+ : base()
+ {
+ Debug.Assert(input.CanRead);
if (z == null)
{
@@ -92,36 +94,32 @@ namespace Org.BouncyCastle.Utilities.Zlib
this.compress = (z.istate == null);
this.z = z;
this.z.next_in = buf;
- this.z.next_in_index = 0;
- this.z.avail_in = 0;
- }
+ this.z.next_in_index = 0;
+ this.z.avail_in = 0;
+ }
public ZInputStream(Stream input, int level)
: this(input, level, false)
- {
+ {
}
public ZInputStream(Stream input, int level, bool nowrap)
- {
- Debug.Assert(input.CanRead);
-
- this.input = input;
+ {
+ Debug.Assert(input.CanRead);
+
+ this.input = input;
this.compress = true;
this.z = new ZStream();
- this.z.deflateInit(level, nowrap);
- this.z.next_in = buf;
- this.z.next_in_index = 0;
- this.z.avail_in = 0;
- }
+ this.z.deflateInit(level, nowrap);
+ this.z.next_in = buf;
+ this.z.next_in_index = 0;
+ this.z.avail_in = 0;
+ }
- /*public int available() throws IOException {
+ /*public int available() throws IOException {
return inf.finished() ? 0 : 1;
}*/
- public sealed override bool CanRead { get { return !closed; } }
- public sealed override bool CanSeek { get { return false; } }
- public sealed override bool CanWrite { get { return false; } }
-
#if PORTABLE
protected override void Dispose(bool disposing)
{
@@ -137,102 +135,90 @@ namespace Org.BouncyCastle.Utilities.Zlib
}
#else
public override void Close()
- {
+ {
if (closed)
return;
closed = true;
Platform.Dispose(input);
base.Close();
- }
+ }
#endif
- public sealed override void 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(); }
- }
-
- public override int Read(byte[] b, int off, int len)
- {
- if (len==0)
- return 0;
-
- z.next_out = b;
- z.next_out_index = off;
- z.avail_out = len;
-
- int err;
- do
- {
- if (z.avail_in == 0 && !nomoreinput)
- {
- // if buffer is empty and more input is available, refill it
- z.next_in_index = 0;
- z.avail_in = input.Read(buf, 0, buf.Length); //(bufsize<z.avail_out ? bufsize : z.avail_out));
-
- if (z.avail_in <= 0)
- {
- z.avail_in = 0;
- nomoreinput = true;
- }
- }
-
- err = compress
- ? z.deflate(flushLevel)
- : z.inflate(flushLevel);
-
- if (nomoreinput && err == JZlib.Z_BUF_ERROR)
- return 0;
- if (err != JZlib.Z_OK && err != JZlib.Z_STREAM_END)
- // TODO
-// throw new ZStreamException((compress ? "de" : "in") + "flating: " + z.msg);
- throw new IOException((compress ? "de" : "in") + "flating: " + z.msg);
- if ((nomoreinput || err == JZlib.Z_STREAM_END) && z.avail_out == len)
- return 0;
- }
- while(z.avail_out == len && err == JZlib.Z_OK);
- //Console.Error.WriteLine("("+(len-z.avail_out)+")");
- return len - z.avail_out;
- }
-
- public override int ReadByte()
- {
- if (Read(buf1, 0, 1) <= 0)
- return -1;
- return buf1[0];
- }
-
-// public long skip(long n) throws IOException {
-// int len=512;
-// if(n<len)
-// len=(int)n;
-// byte[] tmp=new byte[len];
-// return((long)read(tmp));
-// }
-
- 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 sealed override void Write(byte[] buffer, int offset, int count) { throw new NotSupportedException(); }
- }
+ public virtual int FlushMode
+ {
+ get { return flushLevel; }
+ set { this.flushLevel = value; }
+ }
+
+ public override int Read(byte[] buffer, int offset, int count)
+ {
+ Streams.ValidateBufferArguments(buffer, offset, count);
+
+ if (count == 0)
+ return 0;
+
+ z.next_out = buffer;
+ z.next_out_index = offset;
+ z.avail_out = count;
+
+ int err;
+ do
+ {
+ if (z.avail_in == 0 && !nomoreinput)
+ {
+ // if buffer is empty and more input is available, refill it
+ z.next_in_index = 0;
+ z.avail_in = input.Read(buf, 0, buf.Length); //(bufsize<z.avail_out ? bufsize : z.avail_out));
+
+ if (z.avail_in <= 0)
+ {
+ z.avail_in = 0;
+ nomoreinput = true;
+ }
+ }
+
+ err = compress
+ ? z.deflate(flushLevel)
+ : z.inflate(flushLevel);
+
+ if (nomoreinput && err == JZlib.Z_BUF_ERROR)
+ return 0;
+ if (err != JZlib.Z_OK && err != JZlib.Z_STREAM_END)
+ // TODO
+ //throw new ZStreamException((compress ? "de" : "in") + "flating: " + z.msg);
+ throw new IOException((compress ? "de" : "in") + "flating: " + z.msg);
+ if ((nomoreinput || err == JZlib.Z_STREAM_END) && z.avail_out == count)
+ return 0;
+ }
+ while (z.avail_out == count && err == JZlib.Z_OK);
+ //Console.Error.WriteLine("("+(len-z.avail_out)+")");
+ return count - z.avail_out;
+ }
+
+ public override int ReadByte()
+ {
+ if (Read(buf1, 0, 1) <= 0)
+ return -1;
+ return buf1[0];
+ }
+
+ // public long skip(long n) throws IOException {
+ // int len=512;
+ // if(n<len)
+ // len=(int)n;
+ // byte[] tmp=new byte[len];
+ // return((long)read(tmp));
+ // }
+
+ public virtual long TotalIn
+ {
+ get { return z.total_in; }
+ }
+
+ public virtual long TotalOut
+ {
+ get { return z.total_out; }
+ }
+ }
}
|