// GZIPOutputStream.java - Create a file in gzip format.

/* Copyright (C) 1999  Cygnus Solutions

   This file is part of libgcj.

This software is copyrighted work licensed under the terms of the
Libgcj License.  Please consult the file "LIBGCJ_LICENSE" for
details.  */

package java.util.zip;

import java.io.IOException;
import java.io.OutputStream;

/**
 * @author Tom Tromey
 * @date May 17, 1999
 */

/* Written using on-line Java Platform 1.2 API Specification
 * and JCL book.
 * Believed complete and correct.
 */

public class GZIPOutputStream extends DeflaterOutputStream
{
  public void close () throws IOException
  {
    finish ();
    out.close ();
  }

  public void finish () throws IOException
  {
    super.finish();
    put4 ((int) crc.getValue());
    put4 (def.getTotalIn());
  }

  public GZIPOutputStream (OutputStream out) throws IOException
  {
    this (out, 512);
  }

  public GZIPOutputStream (OutputStream out, int readsize) throws IOException
  {
    super (out, new Deflater (Deflater.DEFAULT_COMPRESSION, true), readsize);

    put2 (GZIPInputStream.GZIP_MAGIC);
    out.write (GZIPInputStream.Z_DEFLATED);
    // No flags for now.
    out.write (0);
    // No time either.
    put2 (0);
    put2 (0);
    // No xflags either.
    out.write (0);
    // FIXME: unknown OS.
    out.write (255);

    crc = new CRC32 ();
  }

  public synchronized void write (byte[] buf) throws IOException
  {
    write (buf, 0, buf.length);
  }

  public synchronized void write (byte[] buf, int off, int len)
    throws IOException
  {
    super.write(buf, off, len);
    crc.update(buf, off, len);
  }

  private final void put2 (int i) throws IOException
  {
    out.write (i);
    out.write (i >> 8);
  }

  private final void put4 (int i) throws IOException
  {
    out.write (i);
    out.write (i >> 8);
    out.write (i >> 16);
    out.write (i >> 24);
  }

  // Checksum used by this stream.
  protected CRC32 crc;
}
