summary refs log tree commit diff
path: root/crypto/src/util/zlib/ZInputStream.cs
diff options
context:
space:
mode:
Diffstat (limited to 'crypto/src/util/zlib/ZInputStream.cs')
-rw-r--r--crypto/src/util/zlib/ZInputStream.cs246
1 files changed, 116 insertions, 130 deletions
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; }
+        }
+    }
 }