//
package net.sf.zipme;
import java.io.IOException;
import java.io.OutputStream;
/**
* This filter stream is used to compress a stream into a "GZIP" stream.
* The "GZIP" format is described in RFC 1952.
* @author John Leuner
* @author Tom Tromey
* @since JDK 1.1
*/
public class GZIPOutputStream extends DeflaterOutputStream {
/**
* CRC-32 value for uncompressed data
*/
protected CRC32 crc;
/**
* Creates a GZIPOutputStream with the default buffer size
* @param out The stream to read data (to be compressed) from
*/
public GZIPOutputStream( OutputStream out) throws IOException {
this(out,4096);
}
/**
* Creates a GZIPOutputStream with the specified buffer size
* @param out The stream to read compressed data from
* @param size Size of the buffer to use
*/
public GZIPOutputStream( OutputStream out, int size) throws IOException {
super(out,new Deflater(Deflater.DEFAULT_COMPRESSION,true),size);
hook();
int mod_time=(int)(System.currentTimeMillis() / 1000L);
byte[] gzipHeader={(byte)GZIPInputStream.GZIP_MAGIC,(byte)(GZIPInputStream.GZIP_MAGIC >> 8),(byte)Deflater.DEFLATED,0,(byte)mod_time,(byte)(mod_time >> 8),(byte)(mod_time >> 16),(byte)(mod_time >> 24),0,(byte)255};
out.write(gzipHeader);
}
public void hook(){
}
public synchronized void write( byte[] buf, int off, int len) throws IOException {
super.write(buf,off,len);
this.hook31(buf,off,len);
}
/**
* Writes remaining compressed output data to the output stream
* and closes it.
*/
public void close() throws IOException {
finish();
out.close();
}
public void finish() throws IOException {
super.finish();
int totalin=def.getTotalIn();
byte[] gzipFooter=new byte[8];
hook2(gzipFooter);
gzipFooter[4]=(byte)totalin;
gzipFooter[5]=(byte)(totalin >> 8);
gzipFooter[6]=gzipFooter[3]=(byte)(totalin >> 16);
gzipFooter[7]=(byte)(totalin >> 24);
out.write(gzipFooter);
}
private void hook2( byte[] gzipFooter){
new GZIPOutputStream_hook22(this,gzipFooter).execute();
}
protected void hook31( byte[] buf, int off, int len) throws IOException {
}
}