/* GZIPInputStream.java - Input filter for reading gzip file
   Copyright (C) 1999, 2000, 2001, 2002, 2004 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 java.io.EOFException;
import java.io.IOException;
import java.io.InputStream;

/**
 * This filter stream is used to decompress a "GZIP" format stream. 
 * The "GZIP" format is described in RFC 1952.
 *
 * @author John Leuner
 * @author Tom Tromey
 * @since JDK 1.1
 */
public class GZIPInputStream
  extends InflaterInputStream
{
  /**
   * The magic number found at the start of a GZIP stream.
   */
  public static final int GZIP_MAGIC = 0x8b1f;

  /**
   * The mask for bit 0 of the flag byte.
   */
  static final int FTEXT = 0x1;

  /**
   * The mask for bit 1 of the flag byte.
   */
  static final int FHCRC = 0x2;

  /**
   * The mask for bit 2 of the flag byte.
   */
  static final int FEXTRA = 0x4;

  /**
   * The mask for bit 3 of the flag byte.
   */
  static final int FNAME = 0x8;

  /**
   * The mask for bit 4 of the flag byte.
   */
  static final int FCOMMENT = 0x10;

  /**
   * The CRC-32 checksum value for uncompressed data.
   */
  protected CRC32 crc; 

  /**
   * Indicates whether or not the end of the stream has been reached.
   */  
  protected boolean eos;

  /**
   * Indicates whether or not the GZIP header has been read in.
   */
  private boolean readGZIPHeader;

  /**
   * Creates a GZIPInputStream with the default buffer size.
   *
   * @param in The stream to read compressed data from 
   *           (in GZIP format).
   *
   * @throws IOException if an error occurs during an I/O operation.
   */
  public GZIPInputStream(InputStream in)
    throws IOException
  {
    this(in, 4096);
  }

  /**
   * Creates a GZIPInputStream with the specified buffer size.
   *
   * @param in The stream to read compressed data from 
   *           (in GZIP format).
   * @param size The size of the buffer to use.
   *
   * @throws IOException if an error occurs during an I/O operation.
   * @throws IllegalArgumentException if <code>size</code>
   * is less than or equal to 0.
   */
  public GZIPInputStream(InputStream in, int size)
    throws IOException
  {
    super(in, new Inflater(true), size);
    crc = new CRC32();
    readHeader();
  }

  /**
   * Closes the input stream.
   *
   * @throws IOException if an error occurs during an I/O operation.
   */
  public void close()
    throws IOException
  {
    // Nothing to do here.
    super.close();
  }

  /**
   * Reads in GZIP-compressed data and stores it in uncompressed form
   * into an array of bytes.  The method will block until either
   * enough input data becomes available or the compressed stream
   * reaches its end.
   *
   * @param buf the buffer into which the uncompressed data will
   *            be stored.
   * @param offset the offset indicating where in <code>buf</code>
   *               the uncompressed data should be placed.
   * @param len the number of uncompressed bytes to be read.
   */
  public int read(byte[] buf, int offset, int len) throws IOException
  {
    // We first have to slurp in the GZIP header, then we feed all the
    // rest of the data to the superclass.
    //
    // As we do that we continually update the CRC32. Once the data is
    // finished, we check the CRC32.
    //
    // This means we don't need our own buffer, as everything is done
    // in the superclass.
    if (!readGZIPHeader)
      readHeader();

    if (eos)
      return -1;

    //  System.err.println("GZIPIS.read(byte[], off, len ... " + offset + " and len " + len);

    /* We don't have to read the header,
     * so we just grab data from the superclass.
     */
    int numRead = super.read(buf, offset, len);
    if (numRead > 0)
      crc.update(buf, offset, numRead);

    if (inf.finished())
      readFooter();
    return numRead;
  }


  /**
   * Reads in the GZIP header.
   */
  private void readHeader() throws IOException
  {
    /* 1. Check the two magic bytes */
    CRC32 headCRC = new CRC32();
    int magic = in.read();
    if (magic < 0)
    {
      eos = true;
      return;
    }
    int magic2 = in.read();
    if ((magic + (magic2 << 8)) != GZIP_MAGIC)
      throw new IOException("Error in GZIP header, bad magic code");
    headCRC.update(magic);
    headCRC.update(magic2);
    
    /* 2. Check the compression type (must be 8) */
    int CM = in.read();
    if (CM != 8)
      throw new IOException("Error in GZIP header, data not in deflate format");
    headCRC.update(CM);

    /* 3. Check the flags */
    int flags = in.read();
    if (flags < 0)
      throw new EOFException("Early EOF in GZIP header");
    headCRC.update(flags);
    
    /*    This flag byte is divided into individual bits as follows:
	  
	  bit 0   FTEXT
	  bit 1   FHCRC
	  bit 2   FEXTRA
	  bit 3   FNAME
	  bit 4   FCOMMENT
	  bit 5   reserved
	  bit 6   reserved
	  bit 7   reserved
    */
    
    /* 3.1 Check the reserved bits are zero */    
    if ((flags & 0xd0) != 0)
      throw new IOException("Reserved flag bits in GZIP header != 0");
    
    /* 4.-6. Skip the modification time, extra flags, and OS type */
    for (int i=0; i< 6; i++)
    {
      int readByte = in.read();
      if (readByte < 0)
	throw new EOFException("Early EOF in GZIP header");
      headCRC.update(readByte);
    }
    
    /* 7. Read extra field */
    if ((flags & FEXTRA) != 0)
    {
      /* Skip subfield id */
      for (int i=0; i< 2; i++)
      {
        int readByte = in.read();
	if (readByte < 0)
	  throw new EOFException("Early EOF in GZIP header");
	headCRC.update(readByte);
      }
      if (in.read() < 0 || in.read() < 0)
	throw new EOFException("Early EOF in GZIP header");
	
      int len1, len2, extraLen;
      len1 = in.read();
      len2 = in.read();
      if ((len1 < 0) || (len2 < 0))
	throw new EOFException("Early EOF in GZIP header");
      headCRC.update(len1);
      headCRC.update(len2);

      extraLen = (len1 << 8) | len2;
      for (int i = 0; i < extraLen;i++)
      {
	int readByte = in.read();
	if (readByte < 0)
	  throw new EOFException("Early EOF in GZIP header");
	headCRC.update(readByte);
      }
    }
    
    /* 8. Read file name */
    if ((flags & FNAME) != 0)
    {
      int readByte;
      while ( (readByte = in.read()) > 0)
	headCRC.update(readByte);
      if (readByte < 0)
	throw new EOFException("Early EOF in GZIP file name");
      headCRC.update(readByte);
    }

    /* 9. Read comment */
    if ((flags & FCOMMENT) != 0)
    {
      int readByte;
      while ( (readByte = in.read()) > 0)
        headCRC.update(readByte);

      if (readByte < 0)
        throw new EOFException("Early EOF in GZIP comment");
      headCRC.update(readByte);
    }
    
    /* 10. Read header CRC */
    if ((flags & FHCRC) != 0)
    {
      int tempByte;
      int crcval = in.read();
      if (crcval < 0)
        throw new EOFException("Early EOF in GZIP header");
	
      tempByte = in.read();
      if (tempByte < 0)
        throw new EOFException("Early EOF in GZIP header");
	
      crcval = (crcval << 8) | tempByte;
      if (crcval != ((int) headCRC.getValue() & 0xffff))
        throw new IOException("Header CRC value mismatch");
    }
    
    readGZIPHeader = true;
    //System.err.println("Read GZIP header");
  }

  private void readFooter() throws IOException
  {
    byte[] footer = new byte[8];
    int avail = inf.getRemaining();
    if (avail > 8)
      avail = 8;
    System.arraycopy(buf, len - inf.getRemaining(), footer, 0, avail);
    int needed = 8 - avail;
    while (needed > 0)
    {
      int count = in.read(footer, 8-needed, needed);
      if (count <= 0)
	throw new EOFException("Early EOF in GZIP footer");
      needed -= count; //Jewel Jan 16
    }

    int crcval = (footer[0] & 0xff) | ((footer[1] & 0xff) << 8)
      | ((footer[2] & 0xff) << 16) | (footer[3] << 24);
    if (crcval != (int) crc.getValue())
      throw new IOException("GZIP crc sum mismatch, theirs \""
			    + Integer.toHexString(crcval)
			    + "\" and ours \""
			    + Integer.toHexString( (int) crc.getValue()));

    int total = (footer[4] & 0xff) | ((footer[5] & 0xff) << 8)
      | ((footer[6] & 0xff) << 16) | (footer[7] << 24);
    if (total != inf.getTotalOut())
      throw new IOException("Number of bytes mismatch");

    /* FIXME" XXX Should we support multiple members.
     * Difficult, since there may be some bytes still in buf
     */
    eos = true;
  }
}
