OSDN Git Service

PR libgcj/27271:
authortromey <tromey@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 12 Jul 2006 17:00:49 +0000 (17:00 +0000)
committertromey <tromey@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 12 Jul 2006 17:00:49 +0000 (17:00 +0000)
* java/util/zip/ZipFile.java (getInputStream): Call addDummyByte
on PartialInputStream.
(PartialInputStream.dummyByteCount): New field.
(PartialInputStream.fillBuffer): Handle dummy byte.
(PartialInputStream.read): Likewise.
(PartialInputStream.addDummyByte): New method.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@115378 138bc75d-0d04-0410-961f-82ee72b054a4

libjava/classpath/ChangeLog.gcj
libjava/classpath/java/util/zip/ZipFile.java

index 7304d66..55eab66 100644 (file)
@@ -1,3 +1,13 @@
+2006-07-12  Tom Tromey  <tromey@redhat.com>
+
+       PR libgcj/27271:
+       * java/util/zip/ZipFile.java (getInputStream): Call addDummyByte
+       on PartialInputStream.
+       (PartialInputStream.dummyByteCount): New field.
+       (PartialInputStream.fillBuffer): Handle dummy byte.
+       (PartialInputStream.read): Likewise.
+       (PartialInputStream.addDummyByte): New method.
+
 2006-06-14  Tom Tromey  <tromey@redhat.com>
 
        PR java/28024:
index b849551..10c8365 100644 (file)
@@ -445,6 +445,7 @@ public class ZipFile implements ZipConstants
       case ZipOutputStream.STORED:
        return inp;
       case ZipOutputStream.DEFLATED:
+        inp.addDummyByte();
         final Inflater inf = new Inflater(true);
         final int sz = (int) entry.getSize();
         return new InflaterInputStream(inp, inf)
@@ -520,6 +521,11 @@ public class ZipFile implements ZipConstants
     private long bufferOffset;
     private int pos;
     private long end;
+    // We may need to supply an extra dummy byte to our reader.
+    // See Inflater.  We use a count here to simplify the logic
+    // elsewhere in this class.  Note that we ignore the dummy
+    // byte in methods where we know it is not needed.
+    private int dummyByteCount;
 
     public PartialInputStream(RandomAccessFile raf, int bufferSize)
       throws IOException
@@ -540,8 +546,17 @@ public class ZipFile implements ZipConstants
     {
       synchronized (raf)
         {
-          raf.seek(bufferOffset);
-          raf.readFully(buffer, 0, (int) Math.min(buffer.length, end - bufferOffset));
+          long len = end - bufferOffset;
+          if (len == 0 && dummyByteCount > 0)
+            {
+              buffer[0] = 0;
+              dummyByteCount = 0;
+            }
+          else
+            {
+              raf.seek(bufferOffset);
+              raf.readFully(buffer, 0, (int) Math.min(buffer.length, len));
+            }
         }
     }
     
@@ -555,7 +570,7 @@ public class ZipFile implements ZipConstants
     
     public int read() throws IOException
     {
-      if (bufferOffset + pos >= end)
+      if (bufferOffset + pos >= end + dummyByteCount)
        return -1;
       if (pos == buffer.length)
         {
@@ -569,9 +584,9 @@ public class ZipFile implements ZipConstants
 
     public int read(byte[] b, int off, int len) throws IOException
     {
-      if (len > end - (bufferOffset + pos))
+      if (len > end + dummyByteCount - (bufferOffset + pos))
        {
-         len = (int) (end - (bufferOffset + pos));
+         len = (int) (end + dummyByteCount - (bufferOffset + pos));
          if (len == 0)
            return -1;
        }
@@ -681,5 +696,10 @@ public class ZipFile implements ZipConstants
           throw new AssertionError(uee);
         }
     }
+
+    public void addDummyByte()
+    {
+      dummyByteCount = 1;
+    }
   }
 }