Mercurial > 510Connectbot
comparison src/com/jcraft/jzlib/ZInputStream.java @ 0:0ce5cc452d02
initial version
author | Carl Byington <carl@five-ten-sg.com> |
---|---|
date | Thu, 22 May 2014 10:41:19 -0700 |
parents | |
children | 46c2115ae1c8 |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 0:0ce5cc452d02 |
---|---|
1 /* -*-mode:java; c-basic-offset:2; indent-tabs-mode:nil -*- */ | |
2 /* | |
3 Copyright (c) 2001 Lapo Luchini. | |
4 | |
5 Redistribution and use in source and binary forms, with or without | |
6 modification, are permitted provided that the following conditions are met: | |
7 | |
8 1. Redistributions of source code must retain the above copyright notice, | |
9 this list of conditions and the following disclaimer. | |
10 | |
11 2. Redistributions in binary form must reproduce the above copyright | |
12 notice, this list of conditions and the following disclaimer in | |
13 the documentation and/or other materials provided with the distribution. | |
14 | |
15 3. The names of the authors may not be used to endorse or promote products | |
16 derived from this software without specific prior written permission. | |
17 | |
18 THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, | |
19 INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND | |
20 FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS | |
21 OR ANY CONTRIBUTORS TO THIS SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT, | |
22 INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | |
23 LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, | |
24 OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF | |
25 LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING | |
26 NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, | |
27 EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | |
28 */ | |
29 /* | |
30 * This program is based on zlib-1.1.3, so all credit should go authors | |
31 * Jean-loup Gailly(jloup@gzip.org) and Mark Adler(madler@alumni.caltech.edu) | |
32 * and contributors of zlib. | |
33 */ | |
34 | |
35 package com.jcraft.jzlib; | |
36 import java.io.*; | |
37 | |
38 public class ZInputStream extends FilterInputStream { | |
39 | |
40 protected ZStream z = new ZStream(); | |
41 protected int bufsize = 512; | |
42 protected int flush = JZlib.Z_NO_FLUSH; | |
43 protected byte[] buf = new byte[bufsize], | |
44 buf1 = new byte[1]; | |
45 protected boolean compress; | |
46 | |
47 protected InputStream in = null; | |
48 | |
49 public ZInputStream(InputStream in) { | |
50 this(in, false); | |
51 } | |
52 public ZInputStream(InputStream in, boolean nowrap) { | |
53 super(in); | |
54 this.in = in; | |
55 z.inflateInit(nowrap); | |
56 compress = false; | |
57 z.next_in = buf; | |
58 z.next_in_index = 0; | |
59 z.avail_in = 0; | |
60 } | |
61 | |
62 public ZInputStream(InputStream in, int level) { | |
63 super(in); | |
64 this.in = in; | |
65 z.deflateInit(level); | |
66 compress = true; | |
67 z.next_in = buf; | |
68 z.next_in_index = 0; | |
69 z.avail_in = 0; | |
70 } | |
71 | |
72 /*public int available() throws IOException { | |
73 return inf.finished() ? 0 : 1; | |
74 }*/ | |
75 | |
76 public int read() throws IOException { | |
77 if (read(buf1, 0, 1) == -1) | |
78 return (-1); | |
79 | |
80 return (buf1[0] & 0xFF); | |
81 } | |
82 | |
83 private boolean nomoreinput = false; | |
84 | |
85 public int read(byte[] b, int off, int len) throws IOException { | |
86 if (len == 0) | |
87 return (0); | |
88 | |
89 int err; | |
90 z.next_out = b; | |
91 z.next_out_index = off; | |
92 z.avail_out = len; | |
93 | |
94 do { | |
95 if ((z.avail_in == 0) && (!nomoreinput)) { // if buffer is empty and more input is avaiable, refill it | |
96 z.next_in_index = 0; | |
97 z.avail_in = in.read(buf, 0, bufsize); //(bufsize<z.avail_out ? bufsize : z.avail_out)); | |
98 | |
99 if (z.avail_in == -1) { | |
100 z.avail_in = 0; | |
101 nomoreinput = true; | |
102 } | |
103 } | |
104 | |
105 if (compress) | |
106 err = z.deflate(flush); | |
107 else | |
108 err = z.inflate(flush); | |
109 | |
110 if (nomoreinput && (err == JZlib.Z_BUF_ERROR)) | |
111 return (-1); | |
112 | |
113 if (err != JZlib.Z_OK && err != JZlib.Z_STREAM_END) | |
114 throw new ZStreamException((compress ? "de" : "in") + "flating: " + z.msg); | |
115 | |
116 if ((nomoreinput || err == JZlib.Z_STREAM_END) && (z.avail_out == len)) | |
117 return (-1); | |
118 } | |
119 while (z.avail_out == len && err == JZlib.Z_OK); | |
120 | |
121 //System.err.print("("+(len-z.avail_out)+")"); | |
122 return (len - z.avail_out); | |
123 } | |
124 | |
125 public long skip(long n) throws IOException { | |
126 int len = 512; | |
127 | |
128 if (n < len) | |
129 len = (int)n; | |
130 | |
131 byte[] tmp = new byte[len]; | |
132 return ((long)read(tmp)); | |
133 } | |
134 | |
135 public int getFlushMode() { | |
136 return (flush); | |
137 } | |
138 | |
139 public void setFlushMode(int flush) { | |
140 this.flush = flush; | |
141 } | |
142 | |
143 /** | |
144 * Returns the total number of bytes input so far. | |
145 */ | |
146 public long getTotalIn() { | |
147 return z.total_in; | |
148 } | |
149 | |
150 /** | |
151 * Returns the total number of bytes output so far. | |
152 */ | |
153 public long getTotalOut() { | |
154 return z.total_out; | |
155 } | |
156 | |
157 public void close() throws IOException { | |
158 in.close(); | |
159 } | |
160 } |