| /* Inflater.java - Decompress a data stream | |
| Copyright (C) 1999, 2000, 2001, 2003 Free Software Foundation, Inc. | |
| This file is part of GNU Classpath. | |
| GNU Classpath is free software; you can redistribute it and/or modify | |
| it under the terms of the GNU General Public License as published by | |
| the Free Software Foundation; either version 2, or (at your option) | |
| any later version. | |
| GNU Classpath is distributed in the hope that it will be useful, but | |
| WITHOUT ANY WARRANTY; without even the implied warranty of | |
| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
| General Public License for more details. | |
| You should have received a copy of the GNU General Public License | |
| along with GNU Classpath; see the file COPYING. If not, write to the | |
| Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA | |
| 02110-1301 USA. | |
| Linking this library statically or dynamically with other modules is | |
| making a combined work based on this library. Thus, the terms and | |
| conditions of the GNU General Public License cover the whole | |
| combination. | |
| As a special exception, the copyright holders of this library give you | |
| permission to link this library with independent modules to produce an | |
| executable, regardless of the license terms of these independent | |
| modules, and to copy and distribute the resulting executable under | |
| terms of your choice, provided that you also meet, for each linked | |
| independent module, the terms and conditions of the license of that | |
| module. An independent module is a module which is not derived from | |
| or based on this library. If you modify this library, you may extend | |
| this exception to your version of the library, but you are not | |
| obligated to do so. If you do not wish to do so, delete this | |
| exception statement from your version. */ | |
| package java.util.zip; | |
| import gnu.gcj.RawData; | |
| /* Written using on-line Java Platform 1.2 API Specification | |
| * and JCL book. | |
| * Believed complete and correct. | |
| */ | |
| /** | |
| * Inflater is used to decompress data that has been compressed according | |
| * to the "deflate" standard described in rfc1950. | |
| * | |
| * The usage is as following. First you have to set some input with | |
| * <code>setInput()</code>, then inflate() it. If inflate doesn't | |
| * inflate any bytes there may be three reasons: | |
| * <ul> | |
| * <li>needsInput() returns true because the input buffer is empty. | |
| * You have to provide more input with <code>setInput()</code>. | |
| * NOTE: needsInput() also returns true when, the stream is finished. | |
| * </li> | |
| * <li>needsDictionary() returns true, you have to provide a preset | |
| * dictionary with <code>setDictionary()</code>.</li> | |
| * <li>finished() returns true, the inflater has finished.</li> | |
| * </ul> | |
| * Once the first output byte is produced, a dictionary will not be | |
| * needed at a later stage. | |
| * | |
| * @author John Leuner, Jochen Hoenicke | |
| * @author Tom Tromey | |
| * @date May 17, 1999 | |
| * @since JDK 1.1 | |
| */ | |
| public class Inflater | |
| { | |
| // The zlib stream. | |
| private RawData zstream; | |
| // True if finished. | |
| private boolean is_finished; | |
| // True if dictionary needed. | |
| private boolean dict_needed; | |
| /** | |
| * Creates a new inflater. | |
| */ | |
| public Inflater () | |
| { | |
| this (false); | |
| } | |
| /** | |
| * Creates a new inflater. | |
| * @param nowrap true if no header and checksum field appears in the | |
| * stream. This is used for GZIPed input. For compatibility with | |
| * Sun JDK you should provide one byte of input more than needed in | |
| * this case. | |
| */ | |
| public Inflater (boolean noHeader) | |
| { | |
| init (noHeader); | |
| } | |
| /** | |
| * Finalizes this object. | |
| */ | |
| protected void finalize () | |
| { | |
| end (); | |
| } | |
| /** | |
| * Frees all objects allocated by the inflater. There's no reason | |
| * to call this, since you can just rely on garbage collection (even | |
| * for the Sun implementation). Exists only for compatibility | |
| * with Sun's JDK, where the compressor allocates native memory. | |
| * If you call any method (even reset) afterwards the behaviour is | |
| * <i>undefined</i>. | |
| * @deprecated Just clear all references to inflater instead. | |
| */ | |
| public native void end (); | |
| /** | |
| * Returns true, if the inflater has finished. This means, that no | |
| * input is needed and no output can be produced. | |
| */ | |
| public synchronized boolean finished () | |
| { | |
| return is_finished; | |
| } | |
| /** | |
| * Gets the adler checksum. This is either the checksum of all | |
| * uncompressed bytes returned by inflate(), or if needsDictionary() | |
| * returns true (and thus no output was yet produced) this is the | |
| * adler checksum of the expected dictionary. | |
| * @returns the adler checksum. | |
| */ | |
| public native int getAdler (); | |
| /** | |
| * Gets the number of unprocessed input. Useful, if the end of the | |
| * stream is reached and you want to further process the bytes after | |
| * the deflate stream. | |
| * @return the number of bytes of the input which were not processed. | |
| */ | |
| public native int getRemaining (); | |
| /** | |
| * Gets the total number of processed compressed input bytes. | |
| * @return the total number of bytes of processed input bytes. | |
| */ | |
| public native int getTotalIn (); | |
| /** | |
| * Gets the total number of output bytes returned by inflate(). | |
| * @return the total number of output bytes. | |
| */ | |
| public native int getTotalOut (); | |
| /** | |
| * Inflates the compressed stream to the output buffer. If this | |
| * returns 0, you should check, whether needsDictionary(), | |
| * needsInput() or finished() returns true, to determine why no | |
| * further output is produced. | |
| * @param buffer the output buffer. | |
| * @return the number of bytes written to the buffer, 0 if no further | |
| * output can be produced. | |
| * @exception DataFormatException if deflated stream is invalid. | |
| * @exception IllegalArgumentException if buf has length 0. | |
| */ | |
| public int inflate (byte[] buf) throws DataFormatException | |
| { | |
| return inflate (buf, 0, buf.length); | |
| } | |
| /** | |
| * Inflates the compressed stream to the output buffer. If this | |
| * returns 0, you should check, whether needsDictionary(), | |
| * needsInput() or finished() returns true, to determine why no | |
| * further output is produced. | |
| * @param buffer the output buffer. | |
| * @param off the offset into buffer where the output should start. | |
| * @param len the maximum length of the output. | |
| * @return the number of bytes written to the buffer, 0 if no further | |
| * output can be produced. | |
| * @exception DataFormatException if deflated stream is invalid. | |
| * @exception IndexOutOfBoundsException if the off and/or len are wrong. | |
| */ | |
| public native int inflate (byte[] buf, int off, int len) | |
| throws DataFormatException; | |
| private native void init (boolean noHeader); | |
| /** | |
| * Returns true, if a preset dictionary is needed to inflate the input. | |
| */ | |
| public synchronized boolean needsDictionary () | |
| { | |
| return dict_needed; | |
| } | |
| /** | |
| * Returns true, if the input buffer is empty. | |
| * You should then call setInput(). <br> | |
| * | |
| * <em>NOTE</em>: This method also returns true when the stream is finished. | |
| */ | |
| public synchronized boolean needsInput () | |
| { | |
| return getRemaining () == 0; | |
| } | |
| /** | |
| * Resets the inflater so that a new stream can be decompressed. All | |
| * pending input and output will be discarded. | |
| */ | |
| public native void reset (); | |
| /** | |
| * Sets the preset dictionary. This should only be called, if | |
| * needsDictionary() returns true and it should set the same | |
| * dictionary, that was used for deflating. The getAdler() | |
| * function returns the checksum of the dictionary needed. | |
| * @param buffer the dictionary. | |
| * @exception IllegalStateException if no dictionary is needed. | |
| * @exception IllegalArgumentException if the dictionary checksum is | |
| * wrong. | |
| */ | |
| public void setDictionary (byte[] buf) | |
| { | |
| setDictionary (buf, 0, buf.length); | |
| } | |
| /** | |
| * Sets the preset dictionary. This should only be called, if | |
| * needsDictionary() returns true and it should set the same | |
| * dictionary, that was used for deflating. The getAdler() | |
| * function returns the checksum of the dictionary needed. | |
| * @param buffer the dictionary. | |
| * @param off the offset into buffer where the dictionary starts. | |
| * @param len the length of the dictionary. | |
| * @exception IllegalStateException if no dictionary is needed. | |
| * @exception IllegalArgumentException if the dictionary checksum is | |
| * wrong. | |
| * @exception IndexOutOfBoundsException if the off and/or len are wrong. | |
| */ | |
| public native void setDictionary (byte[] buf, int off, int len); | |
| /** | |
| * Sets the input. This should only be called, if needsInput() | |
| * returns true. | |
| * @param buffer the input. | |
| * @exception IllegalStateException if no input is needed. | |
| */ | |
| public void setInput (byte[] buf) | |
| { | |
| setInput (buf, 0, buf.length); | |
| } | |
| /** | |
| * Sets the input. This should only be called, if needsInput() | |
| * returns true. | |
| * @param buffer the input. | |
| * @param off the offset into buffer where the input starts. | |
| * @param len the length of the input. | |
| * @exception IllegalStateException if no input is needed. | |
| * @exception IndexOutOfBoundsException if the off and/or len are wrong. | |
| */ | |
| public native void setInput (byte[] buf, int off, int len); | |
| } |