Fix for HARMONY-6394 ([classlib][archive] ZipFile.getInputStream implements available() differently to the RI)


git-svn-id: https://svn.apache.org/repos/asf/harmony/enhanced/classlib/trunk@885602 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/modules/archive/src/main/java/java/util/zip/ZipFile.java b/modules/archive/src/main/java/java/util/zip/ZipFile.java
index 2378fd3..7a412fd 100644
--- a/modules/archive/src/main/java/java/util/zip/ZipFile.java
+++ b/modules/archive/src/main/java/java/util/zip/ZipFile.java
@@ -247,7 +247,8 @@
             rafstrm.skip(entry.nameLen + localExtraLenOrWhatever);
             rafstrm.mLength = rafstrm.mOffset + entry.compressedSize;
             if (entry.compressionMethod == ZipEntry.DEFLATED) {
-                return new InflaterInputStream(rafstrm, new Inflater(true));
+                int bufSize = Math.max(1024, (int)Math.min(entry.getSize(), 65535L));
+                return new ZipInflaterInputStream(rafstrm, new Inflater(true), bufSize, entry);
             } else {
                 return rafstrm;
             }
@@ -415,4 +416,29 @@
             return n;
         }
     }
+    
+    static class ZipInflaterInputStream extends InflaterInputStream {
+
+        ZipEntry entry;
+        long bytesRead = 0;
+
+        public ZipInflaterInputStream(InputStream is, Inflater inf, int bsize, ZipEntry entry) {
+            super(is, inf, bsize);
+            this.entry = entry;
+        }
+
+        @Override
+        public int read(byte[] buffer, int off, int nbytes) throws IOException {
+            int i = super.read(buffer, off, nbytes);
+            if (i != -1) {
+                bytesRead += i;
+            }
+            return i;
+        }
+
+        @Override
+        public int available() throws IOException {
+            return super.available() == 0 ? 0 : (int) (entry.getSize() - bytesRead);
+        }
+    }
 }