123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242 |
- #if !BESTHTTP_DISABLE_ALTERNATE_SSL && (!UNITY_WEBGL || UNITY_EDITOR)
- #pragma warning disable
- /*
- Copyright (c) 2001 Lapo Luchini.
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are met:
- 1. Redistributions of source code must retain the above copyright notice,
- this list of conditions and the following disclaimer.
- 2. Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in
- the documentation and/or other materials provided with the distribution.
- 3. The names of the authors may not be used to endorse or promote products
- derived from this software without specific prior written permission.
- THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES,
- INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
- FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS
- OR ANY CONTRIBUTORS TO THIS SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT,
- INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
- OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
- LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
- NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
- EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
- /*
- * This program is based on zlib-1.1.3, so all credit should go authors
- * Jean-loup Gailly(jloup@gzip.org) and Mark Adler(madler@alumni.caltech.edu)
- * and contributors of zlib.
- */
- /* This file is a port of jzlib v1.0.7, com.jcraft.jzlib.ZInputStream.java
- */
- using System;
- using System.Diagnostics;
- using System.IO;
- namespace BestHTTP.SecureProtocol.Org.BouncyCastle.Utilities.Zlib
- {
- public class ZInputStream
- : Stream
- {
- private static ZStream GetDefaultZStream(bool nowrap)
- {
- ZStream z = new ZStream();
- z.inflateInit(nowrap);
- return z;
- }
- 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 Stream input;
- protected bool closed;
- private bool nomoreinput = false;
- public ZInputStream(Stream input)
- : this(input, false)
- {
- }
- public ZInputStream(Stream input, bool nowrap)
- : this(input, GetDefaultZStream(nowrap))
- {
- }
- public ZInputStream(Stream input, ZStream z)
- : base()
- {
- Debug.Assert(input.CanRead);
- if (z == null)
- {
- z = new ZStream();
- }
- if (z.istate == null && z.dstate == null)
- {
- z.inflateInit();
- }
- this.input = input;
- this.compress = (z.istate == null);
- this.z = z;
- this.z.next_in = buf;
- 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;
- 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;
- }
- /*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 || NETFX_CORE
- protected override void Dispose(bool disposing)
- {
- if (disposing)
- {
- if (closed)
- return;
- closed = true;
- BestHTTP.SecureProtocol.Org.BouncyCastle.Utilities.Platform.Dispose(input);
- }
- base.Dispose(disposing);
- }
- #else
- public override void Close()
- {
- if (closed)
- return;
- closed = true;
- BestHTTP.SecureProtocol.Org.BouncyCastle.Utilities.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(); }
- }
- }
- #pragma warning restore
- #endif
|