Mercurial > hg > blitz_condensed
comparison src/com/go/trove/util/Deflater.java @ 0:3dc0c5604566
Initial checkin of blitz 2.0 fcs - no installer yet.
author | Dan Creswell <dan.creswell@gmail.com> |
---|---|
date | Sat, 21 Mar 2009 11:00:06 +0000 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 0:3dc0c5604566 |
---|---|
1 /* ==================================================================== | |
2 * Trove - Copyright (c) 1997-2001 Walt Disney Internet Group | |
3 * ==================================================================== | |
4 * The Tea Software License, Version 1.1 | |
5 * | |
6 * Copyright (c) 2000 Walt Disney Internet Group. All rights reserved. | |
7 * | |
8 * Redistribution and use in source and binary forms, with or without | |
9 * modification, are permitted provided that the following conditions | |
10 * are met: | |
11 * | |
12 * 1. Redistributions of source code must retain the above copyright | |
13 * notice, this list of conditions and the following disclaimer. | |
14 * | |
15 * 2. Redistributions in binary form must reproduce the above copyright | |
16 * notice, this list of conditions and the following disclaimer in | |
17 * the documentation and/or other materials provided with the | |
18 * distribution. | |
19 * | |
20 * 3. The end-user documentation included with the redistribution, | |
21 * if any, must include the following acknowledgment: | |
22 * "This product includes software developed by the | |
23 * Walt Disney Internet Group (http://opensource.go.com/)." | |
24 * Alternately, this acknowledgment may appear in the software itself, | |
25 * if and wherever such third-party acknowledgments normally appear. | |
26 * | |
27 * 4. The names "Tea", "TeaServlet", "Kettle", "Trove" and "BeanDoc" must | |
28 * not be used to endorse or promote products derived from this | |
29 * software without prior written permission. For written | |
30 * permission, please contact opensource@dig.com. | |
31 * | |
32 * 5. Products derived from this software may not be called "Tea", | |
33 * "TeaServlet", "Kettle" or "Trove", nor may "Tea", "TeaServlet", | |
34 * "Kettle", "Trove" or "BeanDoc" appear in their name, without prior | |
35 * written permission of the Walt Disney Internet Group. | |
36 * | |
37 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED | |
38 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES | |
39 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | |
40 * DISCLAIMED. IN NO EVENT SHALL THE WALT DISNEY INTERNET GROUP OR ITS | |
41 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, | |
42 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, | |
43 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR | |
44 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY | |
45 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | |
46 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | |
47 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | |
48 * ==================================================================== | |
49 * | |
50 * For more information about Tea, please see http://opensource.go.com/. | |
51 */ | |
52 | |
53 package com.go.trove.util; | |
54 | |
55 /****************************************************************************** | |
56 * A zlib deflater interface that matches {@link java.util.zip.Deflater}, | |
57 * except additional flush operations are supported. This class requires native | |
58 * code support and looks for a library named "TroveZip". | |
59 * | |
60 * @author Brian S O'Neill | |
61 * @version | |
62 * <!--$$Revision: 1.1 $-->, <!--$$JustDate:--> 01/06/13 <!-- $--> | |
63 */ | |
64 public class Deflater { | |
65 public static final int | |
66 DEFLATED = 8, | |
67 NO_COMPRESSION = 0, | |
68 BEST_SPEED = 1, | |
69 BEST_COMPRESSION = 9, | |
70 DEFAULT_COMPRESSION = -1, | |
71 FILTERED = 1, | |
72 HUFFMAN_ONLY = 2, | |
73 DEFAULT_STRATEGY = 0; | |
74 | |
75 private static final int | |
76 NO_FLUSH = 0, | |
77 SYNC_FLUSH = 2, | |
78 FULL_FLUSH = 3, | |
79 FINISH = 4; | |
80 | |
81 static { | |
82 System.loadLibrary("TroveZip"); | |
83 initIDs(); | |
84 } | |
85 | |
86 // Pointer to strm used by native deflate functions. | |
87 private long mStream; | |
88 private boolean mNoWrap; | |
89 | |
90 private int mStrategy; | |
91 private int mLevel; | |
92 private boolean mSetParams; | |
93 | |
94 private int mFlushOption = NO_FLUSH; | |
95 private boolean mFinished; | |
96 | |
97 private byte[] mInputBuf; | |
98 private int mInputOffset; | |
99 private int mInputLength; | |
100 | |
101 public Deflater(int level, boolean nowrap) { | |
102 mStream = init(DEFAULT_STRATEGY, level, nowrap); | |
103 mStrategy = DEFAULT_STRATEGY; | |
104 mLevel = level; | |
105 mNoWrap = nowrap; | |
106 } | |
107 | |
108 public Deflater(int level) { | |
109 this(level, false); | |
110 } | |
111 | |
112 public Deflater() { | |
113 this(DEFAULT_COMPRESSION, false); | |
114 } | |
115 | |
116 public boolean isNoWrap() { | |
117 return mNoWrap; | |
118 } | |
119 | |
120 public synchronized void setInput(byte[] b, int off, int len) { | |
121 boundsCheck(b, off, len); | |
122 mInputLength = len; | |
123 mInputOffset = off; | |
124 mInputBuf = b; | |
125 } | |
126 | |
127 public synchronized void setInput(byte[] b) { | |
128 mInputLength = b.length; | |
129 mInputOffset = 0; | |
130 mInputBuf = b; | |
131 } | |
132 | |
133 public synchronized void setDictionary(byte[] b, int off, int len) { | |
134 boundsCheck(b, off, len); | |
135 setDictionary(mStream, b, off, len); | |
136 } | |
137 | |
138 public synchronized void setDictionary(byte[] b) { | |
139 setDictionary(mStream, b, 0, b.length); | |
140 } | |
141 | |
142 public synchronized void setStrategy(int strategy) { | |
143 mStrategy = strategy; | |
144 mSetParams = true; | |
145 } | |
146 | |
147 public synchronized void setLevel(int level) { | |
148 mLevel = level; | |
149 mSetParams = true; | |
150 } | |
151 | |
152 public boolean needsInput() { | |
153 return mInputLength <= 0; | |
154 } | |
155 | |
156 /** | |
157 * When called, indicates that the current input buffer contents should be | |
158 * flushed out when deflate is next called. | |
159 */ | |
160 public void flush() { | |
161 mFlushOption = SYNC_FLUSH; | |
162 } | |
163 | |
164 /** | |
165 * When called, indicates that the current input buffer contents should be | |
166 * flushed out when deflate is next called, but all compression information | |
167 * up to this point is cleared. | |
168 */ | |
169 public void fullFlush() { | |
170 mFlushOption = FULL_FLUSH; | |
171 } | |
172 | |
173 /** | |
174 * When called, indicates that compression should end with the current | |
175 * contents of the input buffer. Deflate must be called to get the final | |
176 * compressed bytes. | |
177 */ | |
178 public void finish() { | |
179 mFlushOption = FINISH; | |
180 } | |
181 | |
182 public synchronized boolean finished() { | |
183 return mFinished; | |
184 } | |
185 | |
186 public int deflate(byte[] b, int off, int len) { | |
187 boundsCheck(b, off, len); | |
188 return deflate0(b, off, len); | |
189 } | |
190 | |
191 public int deflate(byte[] b) { | |
192 return deflate0(b, 0, b.length); | |
193 } | |
194 | |
195 private synchronized int deflate0(byte[] b, int off, int len) { | |
196 int amt = deflate(mStream, mFlushOption, mSetParams, | |
197 mInputBuf, mInputOffset, mInputLength, | |
198 b, off, len); | |
199 if (amt < len) { | |
200 if (mFlushOption == SYNC_FLUSH || mFlushOption == FULL_FLUSH) { | |
201 mFlushOption = NO_FLUSH; | |
202 } | |
203 } | |
204 return amt; | |
205 } | |
206 | |
207 public synchronized int getAdler() { | |
208 return getAdler(mStream); | |
209 } | |
210 | |
211 public synchronized int getTotalIn() { | |
212 return getTotalIn(mStream); | |
213 } | |
214 | |
215 public synchronized int getTotalOut() { | |
216 return getTotalOut(mStream); | |
217 } | |
218 | |
219 private int mResetCount; | |
220 | |
221 public synchronized void reset() { | |
222 mFinished = false; | |
223 mFlushOption = NO_FLUSH; | |
224 mInputBuf = null; | |
225 mInputLength = 0; | |
226 reset(mStream); | |
227 } | |
228 | |
229 public synchronized void end() { | |
230 end(mStream); | |
231 } | |
232 | |
233 protected void finalize() { | |
234 end(); | |
235 } | |
236 | |
237 private void boundsCheck(byte[] b, int off, int len) { | |
238 if (off < 0 || len < 0 || off + len > b.length) { | |
239 throw new ArrayIndexOutOfBoundsException(); | |
240 } | |
241 } | |
242 | |
243 private static native void initIDs(); | |
244 | |
245 private native long init(int strategy, int level, boolean nowrap); | |
246 | |
247 private native void setDictionary(long strm, byte[] b, int off, int len); | |
248 | |
249 private native int deflate(long strm, int flushOpt, boolean setParams, | |
250 byte[] inBuf, int inOff, int inLen, | |
251 byte[] outBuf, int outOff, int outLen); | |
252 | |
253 private native int getAdler(long strm); | |
254 private native int getTotalIn(long strm); | |
255 private native int getTotalOut(long strm); | |
256 private native void reset(long strm); | |
257 private native void end(long strm); | |
258 } |