aboutsummaryrefslogtreecommitdiff
path: root/libjava/java/util/zip/GZIPOutputStream.java
blob: be117273cde56f8222db540a33b03bcaea646ef4 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
// GZIPOutputStream.java - Create a file in gzip format.

/* Copyright (C) 1999  Free Software Foundation

   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;
}