Source for java.util.zip.Inflater

   1: /* Inflater.java - Decompress a data stream
   2:    Copyright (C) 1999, 2000, 2001, 2003  Free Software Foundation, Inc.
   3: 
   4: This file is part of GNU Classpath.
   5: 
   6: GNU Classpath is free software; you can redistribute it and/or modify
   7: it under the terms of the GNU General Public License as published by
   8: the Free Software Foundation; either version 2, or (at your option)
   9: any later version.
  10:  
  11: GNU Classpath is distributed in the hope that it will be useful, but
  12: WITHOUT ANY WARRANTY; without even the implied warranty of
  13: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  14: General Public License for more details.
  15: 
  16: You should have received a copy of the GNU General Public License
  17: along with GNU Classpath; see the file COPYING.  If not, write to the
  18: Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
  19: 02110-1301 USA.
  20: 
  21: Linking this library statically or dynamically with other modules is
  22: making a combined work based on this library.  Thus, the terms and
  23: conditions of the GNU General Public License cover the whole
  24: combination.
  25: 
  26: As a special exception, the copyright holders of this library give you
  27: permission to link this library with independent modules to produce an
  28: executable, regardless of the license terms of these independent
  29: modules, and to copy and distribute the resulting executable under
  30: terms of your choice, provided that you also meet, for each linked
  31: independent module, the terms and conditions of the license of that
  32: module.  An independent module is a module which is not derived from
  33: or based on this library.  If you modify this library, you may extend
  34: this exception to your version of the library, but you are not
  35: obligated to do so.  If you do not wish to do so, delete this
  36: exception statement from your version. */
  37: 
  38: package java.util.zip;
  39: 
  40: import gnu.gcj.RawData;
  41: 
  42: /* Written using on-line Java Platform 1.2 API Specification
  43:  * and JCL book.
  44:  * Believed complete and correct.
  45:  */
  46: 
  47: /**
  48:  * Inflater is used to decompress data that has been compressed according 
  49:  * to the "deflate" standard described in rfc1950.
  50:  *
  51:  * The usage is as following.  First you have to set some input with
  52:  * <code>setInput()</code>, then inflate() it.  If inflate doesn't
  53:  * inflate any bytes there may be three reasons:
  54:  * <ul>
  55:  * <li>needsInput() returns true because the input buffer is empty.
  56:  * You have to provide more input with <code>setInput()</code>.  
  57:  * NOTE: needsInput() also returns true when, the stream is finished.
  58:  * </li>
  59:  * <li>needsDictionary() returns true, you have to provide a preset 
  60:  *     dictionary with <code>setDictionary()</code>.</li>
  61:  * <li>finished() returns true, the inflater has finished.</li>
  62:  * </ul>
  63:  * Once the first output byte is produced, a dictionary will not be
  64:  * needed at a later stage.
  65:  *
  66:  * @author John Leuner, Jochen Hoenicke
  67:  * @author Tom Tromey
  68:  * @date May 17, 1999
  69:  * @since JDK 1.1
  70:  */
  71: public class Inflater
  72: {
  73:   // The zlib stream.
  74:   private RawData zstream;
  75: 
  76:   // True if finished.
  77:   private boolean is_finished;
  78: 
  79:   // True if dictionary needed.
  80:   private boolean dict_needed;
  81: 
  82:   /**
  83:    * Creates a new inflater.
  84:    */
  85:   public Inflater ()
  86:   {
  87:     this (false);
  88:   }
  89: 
  90:   /**
  91:    * Creates a new inflater.
  92:    * @param nowrap true if no header and checksum field appears in the
  93:    * stream.  This is used for GZIPed input.  For compatibility with
  94:    * Sun JDK you should provide one byte of input more than needed in
  95:    * this case.
  96:    */
  97:   public Inflater (boolean noHeader)
  98:   {
  99:     init (noHeader);
 100:   }
 101: 
 102:   /**
 103:    * Finalizes this object.
 104:    */
 105:   protected void finalize ()
 106:   {
 107:     end ();
 108:   }
 109: 
 110:   /**
 111:    * Frees all objects allocated by the inflater.  There's no reason
 112:    * to call this, since you can just rely on garbage collection (even
 113:    * for the Sun implementation).  Exists only for compatibility
 114:    * with Sun's JDK, where the compressor allocates native memory.
 115:    * If you call any method (even reset) afterwards the behaviour is
 116:    * <i>undefined</i>.  
 117:    * @deprecated Just clear all references to inflater instead.
 118:    */
 119:   public native void end ();
 120: 
 121:   /**
 122:    * Returns true, if the inflater has finished.  This means, that no
 123:    * input is needed and no output can be produced.
 124:    */
 125:   public synchronized boolean finished ()
 126:   {
 127:     return is_finished;
 128:   }
 129: 
 130:   /**
 131:    * Gets the adler checksum.  This is either the checksum of all
 132:    * uncompressed bytes returned by inflate(), or if needsDictionary()
 133:    * returns true (and thus no output was yet produced) this is the
 134:    * adler checksum of the expected dictionary.
 135:    * @returns the adler checksum.
 136:    */
 137:   public native int getAdler ();
 138:   
 139:   /**
 140:    * Gets the number of unprocessed input.  Useful, if the end of the
 141:    * stream is reached and you want to further process the bytes after
 142:    * the deflate stream.  
 143:    * @return the number of bytes of the input which were not processed.
 144:    */
 145:   public native int getRemaining ();
 146:   
 147:   /**
 148:    * Gets the total number of processed compressed input bytes.
 149:    * @return the total number of bytes of processed input bytes.
 150:    */
 151:   public native int getTotalIn ();
 152: 
 153:   /**
 154:    * Gets the total number of output bytes returned by inflate().
 155:    * @return the total number of output bytes.
 156:    */
 157:   public native int getTotalOut ();
 158: 
 159:   /**
 160:    * Inflates the compressed stream to the output buffer.  If this
 161:    * returns 0, you should check, whether needsDictionary(),
 162:    * needsInput() or finished() returns true, to determine why no 
 163:    * further output is produced.
 164:    * @param buffer the output buffer.
 165:    * @return the number of bytes written to the buffer, 0 if no further
 166:    * output can be produced.  
 167:    * @exception DataFormatException if deflated stream is invalid.
 168:    * @exception IllegalArgumentException if buf has length 0.
 169:    */
 170:   public int inflate (byte[] buf) throws DataFormatException
 171:   {
 172:     return inflate (buf, 0, buf.length);
 173:   }
 174: 
 175:   /**
 176:    * Inflates the compressed stream to the output buffer.  If this
 177:    * returns 0, you should check, whether needsDictionary(),
 178:    * needsInput() or finished() returns true, to determine why no 
 179:    * further output is produced.
 180:    * @param buffer the output buffer.
 181:    * @param off the offset into buffer where the output should start.
 182:    * @param len the maximum length of the output.
 183:    * @return the number of bytes written to the buffer, 0 if no further
 184:    * output can be produced.  
 185:    * @exception DataFormatException if deflated stream is invalid.
 186:    * @exception IndexOutOfBoundsException if the off and/or len are wrong.
 187:    */
 188:   public native int inflate (byte[] buf, int off, int len)
 189:     throws DataFormatException;
 190: 
 191:   private native void init (boolean noHeader);
 192: 
 193:   /**
 194:    * Returns true, if a preset dictionary is needed to inflate the input.
 195:    */
 196:   public synchronized boolean needsDictionary ()
 197:   {
 198:     return dict_needed;
 199:   }
 200: 
 201:   /**
 202:    * Returns true, if the input buffer is empty.
 203:    * You should then call setInput(). <br>
 204:    *
 205:    * <em>NOTE</em>: This method also returns true when the stream is finished.
 206:    */
 207:   public synchronized boolean needsInput ()
 208:   {
 209:     return getRemaining () == 0;
 210:   }
 211: 
 212:   /**
 213:    * Resets the inflater so that a new stream can be decompressed.  All
 214:    * pending input and output will be discarded.
 215:    */
 216:   public native void reset ();
 217: 
 218:   /**
 219:    * Sets the preset dictionary.  This should only be called, if
 220:    * needsDictionary() returns true and it should set the same
 221:    * dictionary, that was used for deflating.  The getAdler()
 222:    * function returns the checksum of the dictionary needed.
 223:    * @param buffer the dictionary.
 224:    * @exception IllegalStateException if no dictionary is needed.
 225:    * @exception IllegalArgumentException if the dictionary checksum is
 226:    * wrong.  
 227:    */
 228:   public void setDictionary (byte[] buf)
 229:   {
 230:     setDictionary (buf, 0, buf.length);
 231:   }
 232: 
 233:   /**
 234:    * Sets the preset dictionary.  This should only be called, if
 235:    * needsDictionary() returns true and it should set the same
 236:    * dictionary, that was used for deflating.  The getAdler()
 237:    * function returns the checksum of the dictionary needed.
 238:    * @param buffer the dictionary.
 239:    * @param off the offset into buffer where the dictionary starts.
 240:    * @param len the length of the dictionary.
 241:    * @exception IllegalStateException if no dictionary is needed.
 242:    * @exception IllegalArgumentException if the dictionary checksum is
 243:    * wrong.  
 244:    * @exception IndexOutOfBoundsException if the off and/or len are wrong.
 245:    */
 246:   public native void setDictionary (byte[] buf, int off, int len);
 247: 
 248:   /**
 249:    * Sets the input.  This should only be called, if needsInput()
 250:    * returns true.
 251:    * @param buffer the input.
 252:    * @exception IllegalStateException if no input is needed.
 253:    */
 254:   public void setInput (byte[] buf) 
 255:   {
 256:     setInput (buf, 0, buf.length);
 257:   }
 258: 
 259:   /**
 260:    * Sets the input.  This should only be called, if needsInput()
 261:    * returns true.
 262:    * @param buffer the input.
 263:    * @param off the offset into buffer where the input starts.
 264:    * @param len the length of the input.  
 265:    * @exception IllegalStateException if no input is needed.
 266:    * @exception IndexOutOfBoundsException if the off and/or len are wrong.
 267:    */
 268:   public native void setInput (byte[] buf, int off, int len);
 269: }