Major merge with Classpath.
Removed many duplicate files. * HACKING: Updated.x * classpath: Imported new directory. * standard.omit: New file. * Makefile.in, aclocal.m4, configure: Rebuilt. * sources.am: New file. * configure.ac: Run Classpath configure script. Moved code around to support. Disable xlib AWT peers (temporarily). * Makefile.am (SUBDIRS): Added 'classpath' (JAVAC): Removed. (AM_CPPFLAGS): Added more -I options. (BOOTCLASSPATH): Simplified. Completely redid how sources are built. Include sources.am. * include/Makefile.am (tool_include__HEADERS): Removed jni.h. * include/jni.h: Removed (in Classpath). * scripts/classes.pl: Updated to look at built classes. * scripts/makemake.tcl: New file. * testsuite/libjava.jni/jni.exp (gcj_jni_compile_c_to_so): Added -I options. (gcj_jni_invocation_compile_c_to_binary): Likewise. From-SVN: r102082
This commit is contained in:
parent
ea54b29342
commit
b0fa81eea9
2817 changed files with 11656 additions and 643398 deletions
|
@ -1,205 +0,0 @@
|
|||
/* Adler32.java - Computes Adler32 data checksum of a data stream
|
||||
Copyright (C) 1999, 2000, 2001 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;
|
||||
|
||||
/*
|
||||
* Written using on-line Java Platform 1.2 API Specification, as well
|
||||
* as "The Java Class Libraries", 2nd edition (Addison-Wesley, 1998).
|
||||
* The actual Adler32 algorithm is taken from RFC 1950.
|
||||
* Status: Believed complete and correct.
|
||||
*/
|
||||
|
||||
/**
|
||||
* Computes Adler32 checksum for a stream of data. An Adler32
|
||||
* checksum is not as reliable as a CRC32 checksum, but a lot faster to
|
||||
* compute.
|
||||
*<p>
|
||||
* The specification for Adler32 may be found in RFC 1950.
|
||||
* (ZLIB Compressed Data Format Specification version 3.3)
|
||||
*<p>
|
||||
*<p>
|
||||
* From that document:
|
||||
*<p>
|
||||
* "ADLER32 (Adler-32 checksum)
|
||||
* This contains a checksum value of the uncompressed data
|
||||
* (excluding any dictionary data) computed according to Adler-32
|
||||
* algorithm. This algorithm is a 32-bit extension and improvement
|
||||
* of the Fletcher algorithm, used in the ITU-T X.224 / ISO 8073
|
||||
* standard.
|
||||
*<p>
|
||||
* Adler-32 is composed of two sums accumulated per byte: s1 is
|
||||
* the sum of all bytes, s2 is the sum of all s1 values. Both sums
|
||||
* are done modulo 65521. s1 is initialized to 1, s2 to zero. The
|
||||
* Adler-32 checksum is stored as s2*65536 + s1 in most-
|
||||
* significant-byte first (network) order."
|
||||
*<p>
|
||||
* "8.2. The Adler-32 algorithm
|
||||
*<p>
|
||||
* The Adler-32 algorithm is much faster than the CRC32 algorithm yet
|
||||
* still provides an extremely low probability of undetected errors.
|
||||
*<p>
|
||||
* The modulo on unsigned long accumulators can be delayed for 5552
|
||||
* bytes, so the modulo operation time is negligible. If the bytes
|
||||
* are a, b, c, the second sum is 3a + 2b + c + 3, and so is position
|
||||
* and order sensitive, unlike the first sum, which is just a
|
||||
* checksum. That 65521 is prime is important to avoid a possible
|
||||
* large class of two-byte errors that leave the check unchanged.
|
||||
* (The Fletcher checksum uses 255, which is not prime and which also
|
||||
* makes the Fletcher check insensitive to single byte changes 0 <->
|
||||
* 255.)
|
||||
*<p>
|
||||
* The sum s1 is initialized to 1 instead of zero to make the length
|
||||
* of the sequence part of s2, so that the length does not have to be
|
||||
* checked separately. (Any sequence of zeroes has a Fletcher
|
||||
* checksum of zero.)"
|
||||
*
|
||||
* @author John Leuner, Per Bothner
|
||||
* @since JDK 1.1
|
||||
*
|
||||
* @see InflaterInputStream
|
||||
* @see DeflaterOutputStream
|
||||
*/
|
||||
public class Adler32 implements Checksum
|
||||
{
|
||||
|
||||
/** largest prime smaller than 65536 */
|
||||
private static final int BASE = 65521;
|
||||
|
||||
private int checksum; //we do all in int.
|
||||
|
||||
//Note that java doesn't have unsigned integers,
|
||||
//so we have to be careful with what arithmetic
|
||||
//we do. We return the checksum as a long to
|
||||
//avoid sign confusion.
|
||||
|
||||
/**
|
||||
* Creates a new instance of the <code>Adler32</code> class.
|
||||
* The checksum starts off with a value of 1.
|
||||
*/
|
||||
public Adler32 ()
|
||||
{
|
||||
reset();
|
||||
}
|
||||
|
||||
/**
|
||||
* Resets the Adler32 checksum to the initial value.
|
||||
*/
|
||||
public void reset ()
|
||||
{
|
||||
checksum = 1; //Initialize to 1
|
||||
}
|
||||
|
||||
/**
|
||||
* Updates the checksum with the byte b.
|
||||
*
|
||||
* @param bval the data value to add. The high byte of the int is ignored.
|
||||
*/
|
||||
public void update (int bval)
|
||||
{
|
||||
//We could make a length 1 byte array and call update again, but I
|
||||
//would rather not have that overhead
|
||||
int s1 = checksum & 0xffff;
|
||||
int s2 = checksum >>> 16;
|
||||
|
||||
s1 = (s1 + (bval & 0xFF)) % BASE;
|
||||
s2 = (s1 + s2) % BASE;
|
||||
|
||||
checksum = (s2 << 16) + s1;
|
||||
}
|
||||
|
||||
/**
|
||||
* Updates the checksum with the bytes taken from the array.
|
||||
*
|
||||
* @param buffer an array of bytes
|
||||
*/
|
||||
public void update (byte[] buffer)
|
||||
{
|
||||
update(buffer, 0, buffer.length);
|
||||
}
|
||||
|
||||
/**
|
||||
* Updates the checksum with the bytes taken from the array.
|
||||
*
|
||||
* @param buf an array of bytes
|
||||
* @param off the start of the data used for this update
|
||||
* @param len the number of bytes to use for this update
|
||||
*/
|
||||
public void update (byte[] buf, int off, int len)
|
||||
{
|
||||
//(By Per Bothner)
|
||||
int s1 = checksum & 0xffff;
|
||||
int s2 = checksum >>> 16;
|
||||
|
||||
while (len > 0)
|
||||
{
|
||||
// We can defer the modulo operation:
|
||||
// s1 maximally grows from 65521 to 65521 + 255 * 3800
|
||||
// s2 maximally grows by 3800 * median(s1) = 2090079800 < 2^31
|
||||
int n = 3800;
|
||||
if (n > len)
|
||||
n = len;
|
||||
len -= n;
|
||||
while (--n >= 0)
|
||||
{
|
||||
s1 = s1 + (buf[off++] & 0xFF);
|
||||
s2 = s2 + s1;
|
||||
}
|
||||
s1 %= BASE;
|
||||
s2 %= BASE;
|
||||
}
|
||||
|
||||
/*Old implementation, borrowed from somewhere:
|
||||
int n;
|
||||
|
||||
while (len-- > 0) {
|
||||
|
||||
s1 = (s1 + (bs[offset++] & 0xff)) % BASE;
|
||||
s2 = (s2 + s1) % BASE;
|
||||
}*/
|
||||
|
||||
checksum = (s2 << 16) | s1;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the Adler32 data checksum computed so far.
|
||||
*/
|
||||
public long getValue()
|
||||
{
|
||||
return (long) checksum & 0xffffffffL;
|
||||
}
|
||||
}
|
|
@ -1,132 +0,0 @@
|
|||
/* CRC32.java - Computes CRC32 data checksum of a data stream
|
||||
Copyright (C) 1999. 2000, 2001 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;
|
||||
|
||||
/*
|
||||
* Written using on-line Java Platform 1.2 API Specification, as well
|
||||
* as "The Java Class Libraries", 2nd edition (Addison-Wesley, 1998).
|
||||
* The actual CRC32 algorithm is taken from RFC 1952.
|
||||
* Status: Believed complete and correct.
|
||||
*/
|
||||
|
||||
/**
|
||||
* Computes CRC32 data checksum of a data stream.
|
||||
* The actual CRC32 algorithm is described in RFC 1952
|
||||
* (GZIP file format specification version 4.3).
|
||||
* Can be used to get the CRC32 over a stream if used with checked input/output
|
||||
* streams.
|
||||
*
|
||||
* @see InflaterInputStream
|
||||
* @see DeflaterOutputStream
|
||||
*
|
||||
* @author Per Bothner
|
||||
* @date April 1, 1999.
|
||||
*/
|
||||
public class CRC32 implements Checksum
|
||||
{
|
||||
/** The crc data checksum so far. */
|
||||
private int crc = 0;
|
||||
|
||||
/** The fast CRC table. Computed once when the CRC32 class is loaded. */
|
||||
private static int[] crc_table = make_crc_table();
|
||||
|
||||
/** Make the table for a fast CRC. */
|
||||
private static int[] make_crc_table ()
|
||||
{
|
||||
int[] crc_table = new int[256];
|
||||
for (int n = 0; n < 256; n++)
|
||||
{
|
||||
int c = n;
|
||||
for (int k = 8; --k >= 0; )
|
||||
{
|
||||
if ((c & 1) != 0)
|
||||
c = 0xedb88320 ^ (c >>> 1);
|
||||
else
|
||||
c = c >>> 1;
|
||||
}
|
||||
crc_table[n] = c;
|
||||
}
|
||||
return crc_table;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the CRC32 data checksum computed so far.
|
||||
*/
|
||||
public long getValue ()
|
||||
{
|
||||
return (long) crc & 0xffffffffL;
|
||||
}
|
||||
|
||||
/**
|
||||
* Resets the CRC32 data checksum as if no update was ever called.
|
||||
*/
|
||||
public void reset () { crc = 0; }
|
||||
|
||||
/**
|
||||
* Updates the checksum with the int bval.
|
||||
*
|
||||
* @param bval (the byte is taken as the lower 8 bits of bval)
|
||||
*/
|
||||
|
||||
public void update (int bval)
|
||||
{
|
||||
int c = ~crc;
|
||||
c = crc_table[(c ^ bval) & 0xff] ^ (c >>> 8);
|
||||
crc = ~c;
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds the byte array to the data checksum.
|
||||
*
|
||||
* @param buf the buffer which contains the data
|
||||
* @param off the offset in the buffer where the data starts
|
||||
* @param len the length of the data
|
||||
*/
|
||||
public void update (byte[] buf, int off, int len)
|
||||
{
|
||||
int c = ~crc;
|
||||
while (--len >= 0)
|
||||
c = crc_table[(c ^ buf[off++]) & 0xff] ^ (c >>> 8);
|
||||
crc = ~c;
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds the complete byte array to the data checksum.
|
||||
*/
|
||||
public void update (byte[] buf) { update(buf, 0, buf.length); }
|
||||
}
|
|
@ -1,135 +0,0 @@
|
|||
/* CheckedInputStream.java - Compute checksum of data being read
|
||||
Copyright (C) 1999, 2000, 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.FilterInputStream;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
|
||||
/* Written using on-line Java Platform 1.2 API Specification
|
||||
* and JCL book.
|
||||
* Believed complete and correct.
|
||||
*/
|
||||
|
||||
/**
|
||||
* InputStream that computes a checksum of the data being read using a
|
||||
* supplied Checksum object.
|
||||
*
|
||||
* @see Checksum
|
||||
*
|
||||
* @author Tom Tromey
|
||||
* @date May 17, 1999
|
||||
*/
|
||||
public class CheckedInputStream extends FilterInputStream
|
||||
{
|
||||
/**
|
||||
* Creates a new CheckInputStream on top of the supplied OutputStream
|
||||
* using the supplied Checksum.
|
||||
*/
|
||||
public CheckedInputStream (InputStream in, Checksum sum)
|
||||
{
|
||||
super (in);
|
||||
this.sum = sum;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the Checksum object used. To get the data checksum computed so
|
||||
* far call <code>getChecksum.getValue()</code>.
|
||||
*/
|
||||
public Checksum getChecksum ()
|
||||
{
|
||||
return sum;
|
||||
}
|
||||
|
||||
/**
|
||||
* Reads one byte, updates the checksum and returns the read byte
|
||||
* (or -1 when the end of file was reached).
|
||||
*/
|
||||
public int read () throws IOException
|
||||
{
|
||||
int x = in.read();
|
||||
if (x != -1)
|
||||
sum.update(x);
|
||||
return x;
|
||||
}
|
||||
|
||||
/**
|
||||
* Reads at most len bytes in the supplied buffer and updates the checksum
|
||||
* with it. Returns the number of bytes actually read or -1 when the end
|
||||
* of file was reached.
|
||||
*/
|
||||
public int read (byte[] buf, int off, int len) throws IOException
|
||||
{
|
||||
int r = in.read(buf, off, len);
|
||||
if (r != -1)
|
||||
sum.update(buf, off, r);
|
||||
return r;
|
||||
}
|
||||
|
||||
/**
|
||||
* Skips n bytes by reading them in a temporary buffer and updating the
|
||||
* the checksum with that buffer. Returns the actual number of bytes skiped
|
||||
* which can be less then requested when the end of file is reached.
|
||||
*/
|
||||
public long skip (long n) throws IOException
|
||||
{
|
||||
if (n == 0)
|
||||
return 0;
|
||||
|
||||
int min = (int) Math.min(n, 1024);
|
||||
byte[] buf = new byte[min];
|
||||
|
||||
long s = 0;
|
||||
while (n > 0)
|
||||
{
|
||||
int r = in.read(buf, 0, min);
|
||||
if (r == -1)
|
||||
break;
|
||||
n -= r;
|
||||
s += r;
|
||||
min = (int) Math.min(n, 1024);
|
||||
sum.update(buf, 0, r);
|
||||
}
|
||||
|
||||
return s;
|
||||
}
|
||||
|
||||
/** The checksum object. */
|
||||
private Checksum sum;
|
||||
}
|
|
@ -1,100 +0,0 @@
|
|||
/* CheckedOutputStream.java - Compute checksum of data being written.
|
||||
Copyright (C) 1999, 2000 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.FilterOutputStream;
|
||||
import java.io.IOException;
|
||||
import java.io.OutputStream;
|
||||
|
||||
/* Written using on-line Java Platform 1.2 API Specification
|
||||
* and JCL book.
|
||||
* Believed complete and correct.
|
||||
*/
|
||||
|
||||
/**
|
||||
* OutputStream that computes a checksum of data being written using a
|
||||
* supplied Checksum object.
|
||||
*
|
||||
* @see Checksum
|
||||
*
|
||||
* @author Tom Tromey
|
||||
* @date May 17, 1999
|
||||
*/
|
||||
public class CheckedOutputStream extends FilterOutputStream
|
||||
{
|
||||
/**
|
||||
* Creates a new CheckInputStream on top of the supplied OutputStream
|
||||
* using the supplied Checksum.
|
||||
*/
|
||||
public CheckedOutputStream (OutputStream out, Checksum cksum)
|
||||
{
|
||||
super (out);
|
||||
this.sum = cksum;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the Checksum object used. To get the data checksum computed so
|
||||
* far call <code>getChecksum.getValue()</code>.
|
||||
*/
|
||||
public Checksum getChecksum ()
|
||||
{
|
||||
return sum;
|
||||
}
|
||||
|
||||
/**
|
||||
* Writes one byte to the OutputStream and updates the Checksum.
|
||||
*/
|
||||
public void write (int bval) throws IOException
|
||||
{
|
||||
out.write(bval);
|
||||
sum.update(bval);
|
||||
}
|
||||
|
||||
/**
|
||||
* Writes the byte array to the OutputStream and updates the Checksum.
|
||||
*/
|
||||
public void write (byte[] buf, int off, int len) throws IOException
|
||||
{
|
||||
out.write(buf, off, len);
|
||||
sum.update(buf, off, len);
|
||||
}
|
||||
|
||||
/** The checksum object. */
|
||||
private Checksum sum;
|
||||
}
|
|
@ -1,86 +0,0 @@
|
|||
/* Checksum.java - Interface to compute a data checksum
|
||||
Copyright (C) 1999, 2000, 2001 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;
|
||||
|
||||
/*
|
||||
* Written using on-line Java Platform 1.2 API Specification, as well
|
||||
* as "The Java Class Libraries", 2nd edition (Addison-Wesley, 1998).
|
||||
* Status: Believed complete and correct.
|
||||
*/
|
||||
|
||||
/**
|
||||
* Interface to compute a data checksum used by checked input/output streams.
|
||||
* A data checksum can be updated by one byte or with a byte array. After each
|
||||
* update the value of the current checksum can be returned by calling
|
||||
* <code>getValue</code>. The complete checksum object can also be reset
|
||||
* so it can be used again with new data.
|
||||
*
|
||||
* @see CheckedInputStream
|
||||
* @see CheckedOutputStream
|
||||
*
|
||||
* @author Per Bothner
|
||||
* @author Jochen Hoenicke
|
||||
*/
|
||||
public interface Checksum
|
||||
{
|
||||
/**
|
||||
* Returns the data checksum computed so far.
|
||||
*/
|
||||
long getValue();
|
||||
|
||||
/**
|
||||
* Resets the data checksum as if no update was ever called.
|
||||
*/
|
||||
void reset();
|
||||
|
||||
/**
|
||||
* Adds one byte to the data checksum.
|
||||
*
|
||||
* @param bval the data value to add. The high byte of the int is ignored.
|
||||
*/
|
||||
void update (int bval);
|
||||
|
||||
/**
|
||||
* Adds the byte array to the data checksum.
|
||||
*
|
||||
* @param buf the buffer which contains the data
|
||||
* @param off the offset in the buffer where the data starts
|
||||
* @param len the length of the data
|
||||
*/
|
||||
void update (byte[] buf, int off, int len);
|
||||
}
|
|
@ -1,71 +0,0 @@
|
|||
/* DataformatException.java -- thrown when compressed data is corrupt
|
||||
Copyright (C) 1999, 2000, 2001, 2002 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;
|
||||
|
||||
/**
|
||||
* Exception thrown when compressed data is corrupt.
|
||||
*
|
||||
* @author Tom Tromey
|
||||
* @author John Leuner
|
||||
* @since 1.1
|
||||
* @status updated to 1.4
|
||||
*/
|
||||
public class DataFormatException extends Exception
|
||||
{
|
||||
/**
|
||||
* Compatible with JDK 1.1+.
|
||||
*/
|
||||
private static final long serialVersionUID = 2219632870893641452L;
|
||||
|
||||
/**
|
||||
* Create an exception without a message.
|
||||
*/
|
||||
public DataFormatException()
|
||||
{
|
||||
}
|
||||
|
||||
/**
|
||||
* Create an exception with a message.
|
||||
*
|
||||
* @param msg the message
|
||||
*/
|
||||
public DataFormatException(String msg)
|
||||
{
|
||||
super(msg);
|
||||
}
|
||||
}
|
|
@ -1,97 +0,0 @@
|
|||
/* java.util.zip.ZipConstants
|
||||
Copyright (C) 2001 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;
|
||||
|
||||
interface ZipConstants
|
||||
{
|
||||
/* The local file header */
|
||||
int LOCHDR = 30;
|
||||
int LOCSIG = 'P'|('K'<<8)|(3<<16)|(4<<24);
|
||||
|
||||
int LOCVER = 4;
|
||||
int LOCFLG = 6;
|
||||
int LOCHOW = 8;
|
||||
int LOCTIM = 10;
|
||||
int LOCCRC = 14;
|
||||
int LOCSIZ = 18;
|
||||
int LOCLEN = 22;
|
||||
int LOCNAM = 26;
|
||||
int LOCEXT = 28;
|
||||
|
||||
/* The Data descriptor */
|
||||
int EXTSIG = 'P'|('K'<<8)|(7<<16)|(8<<24);
|
||||
int EXTHDR = 16;
|
||||
|
||||
int EXTCRC = 4;
|
||||
int EXTSIZ = 8;
|
||||
int EXTLEN = 12;
|
||||
|
||||
/* The central directory file header */
|
||||
int CENSIG = 'P'|('K'<<8)|(1<<16)|(2<<24);
|
||||
int CENHDR = 46;
|
||||
|
||||
int CENVEM = 4;
|
||||
int CENVER = 6;
|
||||
int CENFLG = 8;
|
||||
int CENHOW = 10;
|
||||
int CENTIM = 12;
|
||||
int CENCRC = 16;
|
||||
int CENSIZ = 20;
|
||||
int CENLEN = 24;
|
||||
int CENNAM = 28;
|
||||
int CENEXT = 30;
|
||||
int CENCOM = 32;
|
||||
int CENDSK = 34;
|
||||
int CENATT = 36;
|
||||
int CENATX = 38;
|
||||
int CENOFF = 42;
|
||||
|
||||
/* The entries in the end of central directory */
|
||||
int ENDSIG = 'P'|('K'<<8)|(5<<16)|(6<<24);
|
||||
int ENDHDR = 22;
|
||||
|
||||
/* The following two fields are missing in SUN JDK */
|
||||
int ENDNRD = 4;
|
||||
int ENDDCD = 6;
|
||||
int ENDSUB = 8;
|
||||
int ENDTOT = 10;
|
||||
int ENDSIZ = 12;
|
||||
int ENDOFF = 16;
|
||||
int ENDCOM = 20;
|
||||
}
|
||||
|
|
@ -1,72 +0,0 @@
|
|||
/* ZipException.java - exception representing a zip related error
|
||||
Copyright (C) 1998, 1999, 2000, 2001, 2002 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.IOException;
|
||||
|
||||
/**
|
||||
* Thrown during the creation or input of a zip file.
|
||||
*
|
||||
* @author Jochen Hoenicke
|
||||
* @author Per Bothner
|
||||
* @status updated to 1.4
|
||||
*/
|
||||
public class ZipException extends IOException
|
||||
{
|
||||
/**
|
||||
* Compatible with JDK 1.0+.
|
||||
*/
|
||||
private static final long serialVersionUID = 8000196834066748623L;
|
||||
|
||||
/**
|
||||
* Create an exception without a message.
|
||||
*/
|
||||
public ZipException()
|
||||
{
|
||||
}
|
||||
|
||||
/**
|
||||
* Create an exception with a message.
|
||||
*
|
||||
* @param msg the message
|
||||
*/
|
||||
public ZipException (String msg)
|
||||
{
|
||||
super(msg);
|
||||
}
|
||||
}
|
|
@ -1,371 +0,0 @@
|
|||
/* ZipInputStream.java --
|
||||
Copyright (C) 2001, 2002, 2003, 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 is a FilterInputStream that reads the files in an zip archive
|
||||
* one after another. It has a special method to get the zip entry of
|
||||
* the next file. The zip entry contains information about the file name
|
||||
* size, compressed size, CRC, etc.
|
||||
*
|
||||
* It includes support for STORED and DEFLATED entries.
|
||||
*
|
||||
* @author Jochen Hoenicke
|
||||
*/
|
||||
public class ZipInputStream extends InflaterInputStream implements ZipConstants
|
||||
{
|
||||
private CRC32 crc = new CRC32();
|
||||
private ZipEntry entry = null;
|
||||
|
||||
private int csize;
|
||||
private int size;
|
||||
private int method;
|
||||
private int flags;
|
||||
private int avail;
|
||||
private boolean entryAtEOF;
|
||||
|
||||
/**
|
||||
* Creates a new Zip input stream, reading a zip archive.
|
||||
*/
|
||||
public ZipInputStream(InputStream in)
|
||||
{
|
||||
super(in, new Inflater(true));
|
||||
}
|
||||
|
||||
private void fillBuf() throws IOException
|
||||
{
|
||||
avail = len = in.read(buf, 0, buf.length);
|
||||
}
|
||||
|
||||
private int readBuf(byte[] out, int offset, int length) throws IOException
|
||||
{
|
||||
if (avail <= 0)
|
||||
{
|
||||
fillBuf();
|
||||
if (avail <= 0)
|
||||
return -1;
|
||||
}
|
||||
if (length > avail)
|
||||
length = avail;
|
||||
System.arraycopy(buf, len - avail, out, offset, length);
|
||||
avail -= length;
|
||||
return length;
|
||||
}
|
||||
|
||||
private void readFully(byte[] out) throws IOException
|
||||
{
|
||||
int off = 0;
|
||||
int len = out.length;
|
||||
while (len > 0)
|
||||
{
|
||||
int count = readBuf(out, off, len);
|
||||
if (count == -1)
|
||||
throw new EOFException();
|
||||
off += count;
|
||||
len -= count;
|
||||
}
|
||||
}
|
||||
|
||||
private int readLeByte() throws IOException
|
||||
{
|
||||
if (avail <= 0)
|
||||
{
|
||||
fillBuf();
|
||||
if (avail <= 0)
|
||||
throw new ZipException("EOF in header");
|
||||
}
|
||||
return buf[len - avail--] & 0xff;
|
||||
}
|
||||
|
||||
/**
|
||||
* Read an unsigned short in little endian byte order.
|
||||
*/
|
||||
private int readLeShort() throws IOException
|
||||
{
|
||||
return readLeByte() | (readLeByte() << 8);
|
||||
}
|
||||
|
||||
/**
|
||||
* Read an int in little endian byte order.
|
||||
*/
|
||||
private int readLeInt() throws IOException
|
||||
{
|
||||
return readLeShort() | (readLeShort() << 16);
|
||||
}
|
||||
|
||||
/**
|
||||
* Open the next entry from the zip archive, and return its description.
|
||||
* If the previous entry wasn't closed, this method will close it.
|
||||
*/
|
||||
public ZipEntry getNextEntry() throws IOException
|
||||
{
|
||||
if (crc == null)
|
||||
throw new IOException("Stream closed.");
|
||||
if (entry != null)
|
||||
closeEntry();
|
||||
|
||||
int header = readLeInt();
|
||||
if (header == CENSIG)
|
||||
{
|
||||
/* Central Header reached. */
|
||||
close();
|
||||
return null;
|
||||
}
|
||||
if (header != LOCSIG)
|
||||
throw new ZipException("Wrong Local header signature: "
|
||||
+ Integer.toHexString(header));
|
||||
/* skip version */
|
||||
readLeShort();
|
||||
flags = readLeShort();
|
||||
method = readLeShort();
|
||||
int dostime = readLeInt();
|
||||
int crc = readLeInt();
|
||||
csize = readLeInt();
|
||||
size = readLeInt();
|
||||
int nameLen = readLeShort();
|
||||
int extraLen = readLeShort();
|
||||
|
||||
if (method == ZipOutputStream.STORED && csize != size)
|
||||
throw new ZipException("Stored, but compressed != uncompressed");
|
||||
|
||||
|
||||
byte[] buffer = new byte[nameLen];
|
||||
readFully(buffer);
|
||||
String name = new String(buffer);
|
||||
|
||||
entry = createZipEntry(name);
|
||||
entryAtEOF = false;
|
||||
entry.setMethod(method);
|
||||
if ((flags & 8) == 0)
|
||||
{
|
||||
entry.setCrc(crc & 0xffffffffL);
|
||||
entry.setSize(size & 0xffffffffL);
|
||||
entry.setCompressedSize(csize & 0xffffffffL);
|
||||
}
|
||||
entry.setDOSTime(dostime);
|
||||
if (extraLen > 0)
|
||||
{
|
||||
byte[] extra = new byte[extraLen];
|
||||
readFully(extra);
|
||||
entry.setExtra(extra);
|
||||
}
|
||||
|
||||
if (method == ZipOutputStream.DEFLATED && avail > 0)
|
||||
{
|
||||
System.arraycopy(buf, len - avail, buf, 0, avail);
|
||||
len = avail;
|
||||
avail = 0;
|
||||
inf.setInput(buf, 0, len);
|
||||
}
|
||||
return entry;
|
||||
}
|
||||
|
||||
private void readDataDescr() throws IOException
|
||||
{
|
||||
if (readLeInt() != EXTSIG)
|
||||
throw new ZipException("Data descriptor signature not found");
|
||||
entry.setCrc(readLeInt() & 0xffffffffL);
|
||||
csize = readLeInt();
|
||||
size = readLeInt();
|
||||
entry.setSize(size & 0xffffffffL);
|
||||
entry.setCompressedSize(csize & 0xffffffffL);
|
||||
}
|
||||
|
||||
/**
|
||||
* Closes the current zip entry and moves to the next one.
|
||||
*/
|
||||
public void closeEntry() throws IOException
|
||||
{
|
||||
if (crc == null)
|
||||
throw new IOException("Stream closed.");
|
||||
if (entry == null)
|
||||
return;
|
||||
|
||||
if (method == ZipOutputStream.DEFLATED)
|
||||
{
|
||||
if ((flags & 8) != 0)
|
||||
{
|
||||
/* We don't know how much we must skip, read until end. */
|
||||
byte[] tmp = new byte[2048];
|
||||
while (read(tmp) > 0)
|
||||
;
|
||||
/* read will close this entry */
|
||||
return;
|
||||
}
|
||||
csize -= inf.getTotalIn();
|
||||
avail = inf.getRemaining();
|
||||
}
|
||||
|
||||
if (avail > csize && csize >= 0)
|
||||
avail -= csize;
|
||||
else
|
||||
{
|
||||
csize -= avail;
|
||||
avail = 0;
|
||||
while (csize != 0)
|
||||
{
|
||||
long skipped = in.skip(csize & 0xffffffffL);
|
||||
if (skipped <= 0)
|
||||
throw new ZipException("zip archive ends early.");
|
||||
csize -= skipped;
|
||||
}
|
||||
}
|
||||
|
||||
size = 0;
|
||||
crc.reset();
|
||||
if (method == ZipOutputStream.DEFLATED)
|
||||
inf.reset();
|
||||
entry = null;
|
||||
entryAtEOF = true;
|
||||
}
|
||||
|
||||
public int available() throws IOException
|
||||
{
|
||||
return entryAtEOF ? 0 : 1;
|
||||
}
|
||||
|
||||
/**
|
||||
* Reads a byte from the current zip entry.
|
||||
* @return the byte or -1 on EOF.
|
||||
* @exception IOException if a i/o error occured.
|
||||
* @exception ZipException if the deflated stream is corrupted.
|
||||
*/
|
||||
public int read() throws IOException
|
||||
{
|
||||
byte[] b = new byte[1];
|
||||
if (read(b, 0, 1) <= 0)
|
||||
return -1;
|
||||
return b[0] & 0xff;
|
||||
}
|
||||
|
||||
/**
|
||||
* Reads a block of bytes from the current zip entry.
|
||||
* @return the number of bytes read (may be smaller, even before
|
||||
* EOF), or -1 on EOF.
|
||||
* @exception IOException if a i/o error occured.
|
||||
* @exception ZipException if the deflated stream is corrupted.
|
||||
*/
|
||||
public int read(byte[] b, int off, int len) throws IOException
|
||||
{
|
||||
if (len == 0)
|
||||
return 0;
|
||||
if (crc == null)
|
||||
throw new IOException("Stream closed.");
|
||||
if (entry == null)
|
||||
return -1;
|
||||
boolean finished = false;
|
||||
switch (method)
|
||||
{
|
||||
case ZipOutputStream.DEFLATED:
|
||||
len = super.read(b, off, len);
|
||||
if (len < 0)
|
||||
{
|
||||
if (!inf.finished())
|
||||
throw new ZipException("Inflater not finished!?");
|
||||
avail = inf.getRemaining();
|
||||
if ((flags & 8) != 0)
|
||||
readDataDescr();
|
||||
|
||||
if (inf.getTotalIn() != csize
|
||||
|| inf.getTotalOut() != size)
|
||||
throw new ZipException("size mismatch: "+csize+";"+size+" <-> "+inf.getTotalIn()+";"+inf.getTotalOut());
|
||||
inf.reset();
|
||||
finished = true;
|
||||
}
|
||||
break;
|
||||
|
||||
case ZipOutputStream.STORED:
|
||||
|
||||
if (len > csize && csize >= 0)
|
||||
len = csize;
|
||||
|
||||
len = readBuf(b, off, len);
|
||||
if (len > 0)
|
||||
{
|
||||
csize -= len;
|
||||
size -= len;
|
||||
}
|
||||
|
||||
if (csize == 0)
|
||||
finished = true;
|
||||
else if (len < 0)
|
||||
throw new ZipException("EOF in stored block");
|
||||
break;
|
||||
}
|
||||
|
||||
if (len > 0)
|
||||
crc.update(b, off, len);
|
||||
|
||||
if (finished)
|
||||
{
|
||||
if ((crc.getValue() & 0xffffffffL) != entry.getCrc())
|
||||
throw new ZipException("CRC mismatch");
|
||||
crc.reset();
|
||||
entry = null;
|
||||
entryAtEOF = true;
|
||||
}
|
||||
return len;
|
||||
}
|
||||
|
||||
/**
|
||||
* Closes the zip file.
|
||||
* @exception IOException if a i/o error occured.
|
||||
*/
|
||||
public void close() throws IOException
|
||||
{
|
||||
super.close();
|
||||
crc = null;
|
||||
entry = null;
|
||||
entryAtEOF = true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a new zip entry for the given name. This is equivalent
|
||||
* to new ZipEntry(name).
|
||||
* @param name the name of the zip entry.
|
||||
*/
|
||||
protected ZipEntry createZipEntry(String name)
|
||||
{
|
||||
return new ZipEntry(name);
|
||||
}
|
||||
}
|
|
@ -1,399 +0,0 @@
|
|||
/* ZipOutputStream.java --
|
||||
Copyright (C) 2001, 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.IOException;
|
||||
import java.io.OutputStream;
|
||||
import java.util.Enumeration;
|
||||
import java.util.Vector;
|
||||
|
||||
/**
|
||||
* This is a FilterOutputStream that writes the files into a zip
|
||||
* archive one after another. It has a special method to start a new
|
||||
* zip entry. The zip entries contains information about the file name
|
||||
* size, compressed size, CRC, etc.
|
||||
*
|
||||
* It includes support for STORED and DEFLATED entries.
|
||||
*
|
||||
* This class is not thread safe.
|
||||
*
|
||||
* @author Jochen Hoenicke
|
||||
*/
|
||||
public class ZipOutputStream extends DeflaterOutputStream implements ZipConstants
|
||||
{
|
||||
private Vector entries = new Vector();
|
||||
private CRC32 crc = new CRC32();
|
||||
private ZipEntry curEntry = null;
|
||||
|
||||
private int curMethod;
|
||||
private int size;
|
||||
private int offset = 0;
|
||||
|
||||
private byte[] zipComment = new byte[0];
|
||||
private int defaultMethod = DEFLATED;
|
||||
|
||||
/**
|
||||
* Our Zip version is hard coded to 1.0 resp. 2.0
|
||||
*/
|
||||
private static final int ZIP_STORED_VERSION = 10;
|
||||
private static final int ZIP_DEFLATED_VERSION = 20;
|
||||
|
||||
/**
|
||||
* Compression method. This method doesn't compress at all.
|
||||
*/
|
||||
public static final int STORED = 0;
|
||||
|
||||
/**
|
||||
* Compression method. This method uses the Deflater.
|
||||
*/
|
||||
public static final int DEFLATED = 8;
|
||||
|
||||
/**
|
||||
* Creates a new Zip output stream, writing a zip archive.
|
||||
* @param out the output stream to which the zip archive is written.
|
||||
*/
|
||||
public ZipOutputStream(OutputStream out)
|
||||
{
|
||||
super(out, new Deflater(Deflater.DEFAULT_COMPRESSION, true));
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the zip file comment.
|
||||
* @param comment the comment.
|
||||
* @exception IllegalArgumentException if encoding of comment is
|
||||
* longer than 0xffff bytes.
|
||||
*/
|
||||
public void setComment(String comment)
|
||||
{
|
||||
byte[] commentBytes;
|
||||
commentBytes = comment.getBytes();
|
||||
if (commentBytes.length > 0xffff)
|
||||
throw new IllegalArgumentException("Comment too long.");
|
||||
zipComment = commentBytes;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets default compression method. If the Zip entry specifies
|
||||
* another method its method takes precedence.
|
||||
* @param method the method.
|
||||
* @exception IllegalArgumentException if method is not supported.
|
||||
* @see #STORED
|
||||
* @see #DEFLATED
|
||||
*/
|
||||
public void setMethod(int method)
|
||||
{
|
||||
if (method != STORED && method != DEFLATED)
|
||||
throw new IllegalArgumentException("Method not supported.");
|
||||
defaultMethod = method;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets default compression level. The new level will be activated
|
||||
* immediately.
|
||||
* @exception IllegalArgumentException if level is not supported.
|
||||
* @see Deflater
|
||||
*/
|
||||
public void setLevel(int level)
|
||||
{
|
||||
def.setLevel(level);
|
||||
}
|
||||
|
||||
/**
|
||||
* Write an unsigned short in little endian byte order.
|
||||
*/
|
||||
private void writeLeShort(int value) throws IOException
|
||||
{
|
||||
out.write(value & 0xff);
|
||||
out.write((value >> 8) & 0xff);
|
||||
}
|
||||
|
||||
/**
|
||||
* Write an int in little endian byte order.
|
||||
*/
|
||||
private void writeLeInt(int value) throws IOException
|
||||
{
|
||||
writeLeShort(value);
|
||||
writeLeShort(value >> 16);
|
||||
}
|
||||
|
||||
/**
|
||||
* Starts a new Zip entry. It automatically closes the previous
|
||||
* entry if present. If the compression method is stored, the entry
|
||||
* must have a valid size and crc, otherwise all elements (except
|
||||
* name) are optional, but must be correct if present. If the time
|
||||
* is not set in the entry, the current time is used.
|
||||
* @param entry the entry.
|
||||
* @exception IOException if an I/O error occured.
|
||||
* @exception ZipException if stream was finished.
|
||||
*/
|
||||
public void putNextEntry(ZipEntry entry) throws IOException
|
||||
{
|
||||
if (entries == null)
|
||||
throw new ZipException("ZipOutputStream was finished");
|
||||
|
||||
int method = entry.getMethod();
|
||||
int flags = 0;
|
||||
if (method == -1)
|
||||
method = defaultMethod;
|
||||
|
||||
if (method == STORED)
|
||||
{
|
||||
if (entry.getCompressedSize() >= 0)
|
||||
{
|
||||
if (entry.getSize() < 0)
|
||||
entry.setSize(entry.getCompressedSize());
|
||||
else if (entry.getSize() != entry.getCompressedSize())
|
||||
throw new ZipException
|
||||
("Method STORED, but compressed size != size");
|
||||
}
|
||||
else
|
||||
entry.setCompressedSize(entry.getSize());
|
||||
|
||||
if (entry.getSize() < 0)
|
||||
throw new ZipException("Method STORED, but size not set");
|
||||
if (entry.getCrc() < 0)
|
||||
throw new ZipException("Method STORED, but crc not set");
|
||||
}
|
||||
else if (method == DEFLATED)
|
||||
{
|
||||
if (entry.getCompressedSize() < 0
|
||||
|| entry.getSize() < 0 || entry.getCrc() < 0)
|
||||
flags |= 8;
|
||||
}
|
||||
|
||||
if (curEntry != null)
|
||||
closeEntry();
|
||||
|
||||
if (entry.getTime() < 0)
|
||||
entry.setTime(System.currentTimeMillis());
|
||||
|
||||
entry.flags = flags;
|
||||
entry.offset = offset;
|
||||
entry.setMethod(method);
|
||||
curMethod = method;
|
||||
/* Write the local file header */
|
||||
writeLeInt(LOCSIG);
|
||||
writeLeShort(method == STORED
|
||||
? ZIP_STORED_VERSION : ZIP_DEFLATED_VERSION);
|
||||
writeLeShort(flags);
|
||||
writeLeShort(method);
|
||||
writeLeInt(entry.getDOSTime());
|
||||
if ((flags & 8) == 0)
|
||||
{
|
||||
writeLeInt((int)entry.getCrc());
|
||||
writeLeInt((int)entry.getCompressedSize());
|
||||
writeLeInt((int)entry.getSize());
|
||||
}
|
||||
else
|
||||
{
|
||||
writeLeInt(0);
|
||||
writeLeInt(0);
|
||||
writeLeInt(0);
|
||||
}
|
||||
byte[] name = entry.getName().getBytes();
|
||||
if (name.length > 0xffff)
|
||||
throw new ZipException("Name too long.");
|
||||
byte[] extra = entry.getExtra();
|
||||
if (extra == null)
|
||||
extra = new byte[0];
|
||||
writeLeShort(name.length);
|
||||
writeLeShort(extra.length);
|
||||
out.write(name);
|
||||
out.write(extra);
|
||||
|
||||
offset += LOCHDR + name.length + extra.length;
|
||||
|
||||
/* Activate the entry. */
|
||||
|
||||
curEntry = entry;
|
||||
crc.reset();
|
||||
if (method == DEFLATED)
|
||||
def.reset();
|
||||
size = 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* Closes the current entry.
|
||||
* @exception IOException if an I/O error occured.
|
||||
* @exception ZipException if no entry is active.
|
||||
*/
|
||||
public void closeEntry() throws IOException
|
||||
{
|
||||
if (curEntry == null)
|
||||
throw new ZipException("No open entry");
|
||||
|
||||
/* First finish the deflater, if appropriate */
|
||||
if (curMethod == DEFLATED)
|
||||
super.finish();
|
||||
|
||||
int csize = curMethod == DEFLATED ? def.getTotalOut() : size;
|
||||
|
||||
if (curEntry.getSize() < 0)
|
||||
curEntry.setSize(size);
|
||||
else if (curEntry.getSize() != size)
|
||||
throw new ZipException("size was "+size
|
||||
+", but I expected "+curEntry.getSize());
|
||||
|
||||
if (curEntry.getCompressedSize() < 0)
|
||||
curEntry.setCompressedSize(csize);
|
||||
else if (curEntry.getCompressedSize() != csize)
|
||||
throw new ZipException("compressed size was "+csize
|
||||
+", but I expected "+curEntry.getSize());
|
||||
|
||||
if (curEntry.getCrc() < 0)
|
||||
curEntry.setCrc(crc.getValue());
|
||||
else if (curEntry.getCrc() != crc.getValue())
|
||||
throw new ZipException("crc was " + Long.toHexString(crc.getValue())
|
||||
+ ", but I expected "
|
||||
+ Long.toHexString(curEntry.getCrc()));
|
||||
|
||||
offset += csize;
|
||||
|
||||
/* Now write the data descriptor entry if needed. */
|
||||
if (curMethod == DEFLATED && (curEntry.flags & 8) != 0)
|
||||
{
|
||||
writeLeInt(EXTSIG);
|
||||
writeLeInt((int)curEntry.getCrc());
|
||||
writeLeInt((int)curEntry.getCompressedSize());
|
||||
writeLeInt((int)curEntry.getSize());
|
||||
offset += EXTHDR;
|
||||
}
|
||||
|
||||
entries.addElement(curEntry);
|
||||
curEntry = null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Writes the given buffer to the current entry.
|
||||
* @exception IOException if an I/O error occured.
|
||||
* @exception ZipException if no entry is active.
|
||||
*/
|
||||
public void write(byte[] b, int off, int len) throws IOException
|
||||
{
|
||||
if (curEntry == null)
|
||||
throw new ZipException("No open entry.");
|
||||
|
||||
switch (curMethod)
|
||||
{
|
||||
case DEFLATED:
|
||||
super.write(b, off, len);
|
||||
break;
|
||||
|
||||
case STORED:
|
||||
out.write(b, off, len);
|
||||
break;
|
||||
}
|
||||
|
||||
crc.update(b, off, len);
|
||||
size += len;
|
||||
}
|
||||
|
||||
/**
|
||||
* Finishes the stream. This will write the central directory at the
|
||||
* end of the zip file and flush the stream.
|
||||
* @exception IOException if an I/O error occured.
|
||||
*/
|
||||
public void finish() throws IOException
|
||||
{
|
||||
if (entries == null)
|
||||
return;
|
||||
if (curEntry != null)
|
||||
closeEntry();
|
||||
|
||||
int numEntries = 0;
|
||||
int sizeEntries = 0;
|
||||
|
||||
Enumeration e = entries.elements();
|
||||
while (e.hasMoreElements())
|
||||
{
|
||||
ZipEntry entry = (ZipEntry) e.nextElement();
|
||||
|
||||
int method = entry.getMethod();
|
||||
writeLeInt(CENSIG);
|
||||
writeLeShort(method == STORED
|
||||
? ZIP_STORED_VERSION : ZIP_DEFLATED_VERSION);
|
||||
writeLeShort(method == STORED
|
||||
? ZIP_STORED_VERSION : ZIP_DEFLATED_VERSION);
|
||||
writeLeShort(entry.flags);
|
||||
writeLeShort(method);
|
||||
writeLeInt(entry.getDOSTime());
|
||||
writeLeInt((int)entry.getCrc());
|
||||
writeLeInt((int)entry.getCompressedSize());
|
||||
writeLeInt((int)entry.getSize());
|
||||
|
||||
byte[] name = entry.getName().getBytes();
|
||||
if (name.length > 0xffff)
|
||||
throw new ZipException("Name too long.");
|
||||
byte[] extra = entry.getExtra();
|
||||
if (extra == null)
|
||||
extra = new byte[0];
|
||||
String strComment = entry.getComment();
|
||||
byte[] comment = strComment != null
|
||||
? strComment.getBytes() : new byte[0];
|
||||
if (comment.length > 0xffff)
|
||||
throw new ZipException("Comment too long.");
|
||||
|
||||
writeLeShort(name.length);
|
||||
writeLeShort(extra.length);
|
||||
writeLeShort(comment.length);
|
||||
writeLeShort(0); /* disk number */
|
||||
writeLeShort(0); /* internal file attr */
|
||||
writeLeInt(0); /* external file attr */
|
||||
writeLeInt(entry.offset);
|
||||
|
||||
out.write(name);
|
||||
out.write(extra);
|
||||
out.write(comment);
|
||||
numEntries++;
|
||||
sizeEntries += CENHDR + name.length + extra.length + comment.length;
|
||||
}
|
||||
|
||||
writeLeInt(ENDSIG);
|
||||
writeLeShort(0); /* disk number */
|
||||
writeLeShort(0); /* disk with start of central dir */
|
||||
writeLeShort(numEntries);
|
||||
writeLeShort(numEntries);
|
||||
writeLeInt(sizeEntries);
|
||||
writeLeInt(offset);
|
||||
writeLeShort(zipComment.length);
|
||||
out.write(zipComment);
|
||||
out.flush();
|
||||
entries = null;
|
||||
}
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue