You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@harmony.apache.org by te...@apache.org on 2010/03/26 14:39:15 UTC
svn commit: r927846 - in
/harmony/enhanced/trunk/classlib/modules/archive/src:
main/java/java/util/zip/Deflater.java
main/java/java/util/zip/GZIPOutputStream.java
test/java/org/apache/harmony/archive/tests/java/util/zip/GZIPOutputStreamTest.java
Author: tellison
Date: Fri Mar 26 13:39:15 2010
New Revision: 927846
URL: http://svn.apache.org/viewvc?rev=927846&view=rev
Log:
Apply patch for HARMONY-6383 (GZIPOutputStream.flush unsupported)
Modified:
harmony/enhanced/trunk/classlib/modules/archive/src/main/java/java/util/zip/Deflater.java
harmony/enhanced/trunk/classlib/modules/archive/src/main/java/java/util/zip/GZIPOutputStream.java
harmony/enhanced/trunk/classlib/modules/archive/src/test/java/org/apache/harmony/archive/tests/java/util/zip/GZIPOutputStreamTest.java
Modified: harmony/enhanced/trunk/classlib/modules/archive/src/main/java/java/util/zip/Deflater.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/trunk/classlib/modules/archive/src/main/java/java/util/zip/Deflater.java?rev=927846&r1=927845&r2=927846&view=diff
==============================================================================
--- harmony/enhanced/trunk/classlib/modules/archive/src/main/java/java/util/zip/Deflater.java (original)
+++ harmony/enhanced/trunk/classlib/modules/archive/src/main/java/java/util/zip/Deflater.java Fri Mar 26 13:39:15 2010
@@ -75,9 +75,21 @@ public class Deflater {
*/
public static final int NO_COMPRESSION = 0;
- private static final int Z_NO_FLUSH = 0;
+ /**
+ * Use buffering for best compression.
+ */
+ static final int Z_NO_FLUSH = 0;
- private static final int Z_FINISH = 4;
+ /**
+ * Flush buffers so recipients can immediately decode the data sent thus
+ * far. This mode may degrade compression.
+ */
+ static final int Z_SYNC_FLUSH = 2;
+
+ /**
+ * Flush buffers because there is no further data.
+ */
+ static final int Z_FINISH = 4;
// Fill in the JNI id caches
private static native void oneTimeInitialization();
@@ -174,24 +186,31 @@ public class Deflater {
* maximum number of bytes of compressed data to be written.
* @return the number of bytes of compressed data written to {@code buf}.
*/
- public synchronized int deflate(byte[] buf, int off, int nbytes) {
+ public int deflate(byte[] buf, int off, int nbytes) {
+ return deflate(buf, off, nbytes, flushParm);
+ }
+
+ /**
+ * @param flushParam one of {@link #Z_NO_FLUSH}, {@link #Z_FINISH} or
+ * {@link #Z_SYNC_FLUSH}.
+ */
+ synchronized int deflate(byte[] buf, int off, int nbytes, int flushParam) {
if (streamHandle == -1) {
throw new IllegalStateException();
}
// avoid int overflow, check null buf
- if (off <= buf.length && nbytes >= 0 && off >= 0
- && buf.length - off >= nbytes) {
- // put a stub buffer, no effect.
- if (null == inputBuffer) {
- setInput(STUB_INPUT_BUFFER);
- }
- return deflateImpl(buf, off, nbytes, streamHandle, flushParm);
+ if (off > buf.length || nbytes < 0 || off < 0 || buf.length - off < nbytes) {
+ throw new ArrayIndexOutOfBoundsException();
+ }
+ // put a stub buffer, no effect.
+ if (inputBuffer == null) {
+ setInput(STUB_INPUT_BUFFER);
}
- throw new ArrayIndexOutOfBoundsException();
+ return deflateImpl(buf, off, nbytes, streamHandle, flushParam);
}
private synchronized native int deflateImpl(byte[] buf, int off,
- int nbytes, long handle, int flushParm1);
+ int nbytes, long handle, int flushParm);
private synchronized native void endImpl(long handle);
Modified: harmony/enhanced/trunk/classlib/modules/archive/src/main/java/java/util/zip/GZIPOutputStream.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/trunk/classlib/modules/archive/src/main/java/java/util/zip/GZIPOutputStream.java?rev=927846&r1=927845&r2=927846&view=diff
==============================================================================
--- harmony/enhanced/trunk/classlib/modules/archive/src/main/java/java/util/zip/GZIPOutputStream.java (original)
+++ harmony/enhanced/trunk/classlib/modules/archive/src/main/java/java/util/zip/GZIPOutputStream.java Fri Mar 26 13:39:15 2010
@@ -67,6 +67,20 @@ public class GZIPOutputStream extends De
}
/**
+ * Writes any unwritten compressed data to the underlying stream and flushes
+ * the underlying stream.
+ *
+ * @throws IOException
+ * If an error occurs during writing.
+ */
+ @Override
+ public void flush() throws IOException {
+ int count = def.deflate(buf, 0, buf.length, Deflater.Z_SYNC_FLUSH);
+ out.write(buf, 0, count);
+ out.flush();
+ }
+
+ /**
* Indicates to the stream that all data has been written out, and any GZIP
* terminal data can now be written.
*
Modified: harmony/enhanced/trunk/classlib/modules/archive/src/test/java/org/apache/harmony/archive/tests/java/util/zip/GZIPOutputStreamTest.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/trunk/classlib/modules/archive/src/test/java/org/apache/harmony/archive/tests/java/util/zip/GZIPOutputStreamTest.java?rev=927846&r1=927845&r2=927846&view=diff
==============================================================================
--- harmony/enhanced/trunk/classlib/modules/archive/src/test/java/org/apache/harmony/archive/tests/java/util/zip/GZIPOutputStreamTest.java (original)
+++ harmony/enhanced/trunk/classlib/modules/archive/src/test/java/org/apache/harmony/archive/tests/java/util/zip/GZIPOutputStreamTest.java Fri Mar 26 13:39:15 2010
@@ -20,7 +20,10 @@ import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
+import java.io.PipedInputStream;
+import java.io.PipedOutputStream;
import java.util.zip.Checksum;
+import java.util.zip.GZIPInputStream;
import java.util.zip.GZIPOutputStream;
public class GZIPOutputStreamTest extends junit.framework.TestCase {
@@ -158,6 +161,21 @@ public class GZIPOutputStreamTest extend
}
}
+ public void testFlush() throws IOException {
+ PipedOutputStream pout = new PipedOutputStream();
+ PipedInputStream pin = new PipedInputStream(pout);
+ GZIPOutputStream out = new GZIPOutputStream(pout);
+ GZIPInputStream in = new GZIPInputStream(pin);
+
+ out.write(1);
+ out.write(2);
+ out.write(3);
+ out.flush();
+ assertEquals(1, in.read()); // without flush, this blocks forever!!
+ assertEquals(2, in.read());
+ assertEquals(3, in.read());
+ }
+
@Override
protected void setUp() {
}