InflaterInputStream.java revision adc854b798c1cfe3bfd4c27d68d5cee38ca617da
1adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/* 2adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Licensed to the Apache Software Foundation (ASF) under one or more 3adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * contributor license agreements. See the NOTICE file distributed with 4adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * this work for additional information regarding copyright ownership. 5adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * The ASF licenses this file to You under the Apache License, Version 2.0 6adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * (the "License"); you may not use this file except in compliance with 7adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the License. You may obtain a copy of the License at 8adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 9adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 10adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 11adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Unless required by applicable law or agreed to in writing, software 12adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 13adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * See the License for the specific language governing permissions and 15adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * limitations under the License. 16adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 17adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 18adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectpackage java.util.zip; 19adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 20adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 21adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.io.EOFException; 22adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.io.FilterInputStream; 23adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.io.IOException; 24adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.io.InputStream; 25adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 26adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport org.apache.harmony.archive.internal.nls.Messages; 27adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 28adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/** 29adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * This class provides an implementation of {@code FilterInputStream} that 30adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * uncompresses data that was compressed using the <i>DEFLATE</i> algorithm 31adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * (see <a href="http://www.gzip.org/algorithm.txt">specification</a>). 32adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Basically it wraps the {@code Inflater} class and takes care of the 33adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * buffering. 34adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 35adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see Inflater 36adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see DeflaterOutputStream 37adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @since Android 1.0 38adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 39adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectpublic class InflaterInputStream extends FilterInputStream { 40adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 41adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 42adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * The inflater used for this stream. 43adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 44adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @since Android 1.0 45adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 46adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project protected Inflater inf; 47adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 48adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 49adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * The input buffer used for decompression. 50adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 51adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @since Android 1.0 52adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 53adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project protected byte[] buf; 54adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 55adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 56adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * The length of the buffer. 57adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 58adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @since Android 1.0 59adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 60adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project protected int len; 61adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 62adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project boolean closed; 63adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 64adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project boolean eof; 65adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 66adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project static final int BUF_SIZE = 512; 67adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 68adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // BEGIN android-added 69adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project int nativeEndBufSize = 0; 70adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // END android-added 71adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 72adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 73adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * This is the most basic constructor. You only need to pass the {@code 74adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * InputStream} from which the compressed data is to be read from. Default 75adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * settings for the {@code Inflater} and internal buffer are be used. In 76adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * particular the Inflater expects a ZLIB header from the input stream. 77adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 78adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param is 79adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the {@code InputStream} to read data from. 80adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @since Android 1.0 81adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 82adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public InflaterInputStream(InputStream is) { 83adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project this(is, new Inflater(), BUF_SIZE); 84adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 85adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 86adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 87adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * This constructor lets you pass a specifically initialized Inflater, 88adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * for example one that expects no ZLIB header. 89adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 90adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param is 91adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the {@code InputStream} to read data from. 92adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param inf 93adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the specific {@code Inflater} for uncompressing data. 94adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @since Android 1.0 95adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 96adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public InflaterInputStream(InputStream is, Inflater inf) { 97adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project this(is, inf, BUF_SIZE); 98adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 99adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 100adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 101adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * This constructor lets you specify both the {@code Inflater} as well as 102adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the internal buffer size to be used. 103adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 104adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param is 105adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the {@code InputStream} to read data from. 106adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param inf 107adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the specific {@code Inflater} for uncompressing data. 108adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param bsize 109adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the size to be used for the internal buffer. 110adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @since Android 1.0 111adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 112adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public InflaterInputStream(InputStream is, Inflater inf, int bsize) { 113adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project super(is); 114adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (is == null || inf == null) { 115adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throw new NullPointerException(); 116adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 117adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (bsize <= 0) { 118adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throw new IllegalArgumentException(); 119adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 120adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project this.inf = inf; 121adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // BEGIN android-changed 122adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (is instanceof ZipFile.RAFStream) { 123adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project nativeEndBufSize = bsize; 124adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } else { 125adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project buf = new byte[bsize]; 126adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 127adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // END android-changed 128adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 129adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 130adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 131adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Reads a single byte of decompressed data. 132adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 133adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the byte read. 134adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IOException 135adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if an error occurs reading the byte. 136adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @since Android 1.0 137adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 138adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @Override 139adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public int read() throws IOException { 140adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project byte[] b = new byte[1]; 141adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (read(b, 0, 1) == -1) { 142adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return -1; 143adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 144adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return b[0] & 0xff; 145adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 146adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 147adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 148adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Reads up to {@code nbytes} of decompressed data and stores it in 149adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code buffer} starting at {@code off}. 150adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 151adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param buffer 152adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the buffer to write data to. 153adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param off 154adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * offset in buffer to start writing. 155adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param nbytes 156adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * number of bytes to read. 157adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return Number of uncompressed bytes read 158adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IOException 159adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if an IOException occurs. 160adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @since Android 1.0 161adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 162adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @Override 163adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public int read(byte[] buffer, int off, int nbytes) throws IOException { 164adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /* archive.1E=Stream is closed */ 165adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (closed) { 166adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throw new IOException(Messages.getString("archive.1E")); //$NON-NLS-1$ 167adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 168adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 169adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (null == buffer) { 170adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throw new NullPointerException(); 171adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 172adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 173adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (off < 0 || nbytes < 0 || off + nbytes > buffer.length) { 174adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throw new IndexOutOfBoundsException(); 175adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 176adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 177adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (nbytes == 0) { 178adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return 0; 179adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 180adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 181adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (inf.finished()) { 182adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project eof = true; 183adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return -1; 184adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 185adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 186adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // avoid int overflow, check null buffer 187adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (off <= buffer.length && nbytes >= 0 && off >= 0 188adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project && buffer.length - off >= nbytes) { 189adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project do { 190adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (inf.needsInput()) { 191adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project fill(); 192adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 193adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project int result; 194adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 195adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project result = inf.inflate(buffer, off, nbytes); 196adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } catch (DataFormatException e) { 197adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (len == -1) { 198adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throw new EOFException(); 199adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 200adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throw (IOException)(new IOException().initCause(e)); 201adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 202adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (result > 0) { 203adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return result; 204adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } else if (inf.finished()) { 205adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project eof = true; 206adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return -1; 207adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } else if (inf.needsDictionary()) { 208adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return -1; 209adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } else if (len == -1) { 210adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throw new EOFException(); 211adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // If result == 0, fill() and try again 212adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 213adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } while (true); 214adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 215adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throw new ArrayIndexOutOfBoundsException(); 216adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 217adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 218adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 219adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 220adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Fills the input buffer with data to be decompressed. 221adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 222adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IOException 223adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if an {@code IOException} occurs. 224adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @since Android 1.0 225adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 226adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project protected void fill() throws IOException { 227adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (closed) { 228adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throw new IOException(Messages.getString("archive.1E")); //$NON-NLS-1$ 229adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 230adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // BEGIN android-changed 231adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (nativeEndBufSize > 0) { 232adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project ZipFile.RAFStream is = (ZipFile.RAFStream)in; 233adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project synchronized (is.mSharedRaf) { 234adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project long len = is.mLength - is.mOffset; 235adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (len > nativeEndBufSize) len = nativeEndBufSize; 236adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project int cnt = inf.setFileInput(is.mSharedRaf.getFD(), is.mOffset, (int)nativeEndBufSize); 237adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project is.skip(cnt); 238adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 239adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } else { 240adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if ((len = in.read(buf)) > 0) { 241adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project inf.setInput(buf, 0, len); 242adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 243adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 244adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // END android-changed 245adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 246adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 247adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 248adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Skips up to n bytes of uncompressed data. 249adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 250adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param nbytes 251adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the number of bytes to skip. 252adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the number of uncompressed bytes skipped. 253adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IOException 254adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if an error occurs skipping. 255adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @since Android 1.0 256adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 257adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @Override 258adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public long skip(long nbytes) throws IOException { 259adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (nbytes >= 0) { 260adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project long count = 0, rem = 0; 261adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project while (count < nbytes) { 262adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project int x = read(buf, 0, 263adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project (rem = nbytes - count) > buf.length ? buf.length 264adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project : (int) rem); 265adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (x == -1) { 266adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project eof = true; 267adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return count; 268adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 269adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project count += x; 270adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 271adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return count; 272adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 273adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throw new IllegalArgumentException(); 274adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 275adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 276adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 277adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Returns whether data can be read from this stream. 278adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 279adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return 0 if this stream has been closed, 1 otherwise. 280adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IOException 281adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * If an error occurs. 282adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @since Android 1.0 283adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 284adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @Override 285adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public int available() throws IOException { 286adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (closed) { 287adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // archive.1E=Stream is closed 288adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throw new IOException(Messages.getString("archive.1E")); //$NON-NLS-1$ 289adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 290adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (eof) { 291adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return 0; 292adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 293adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return 1; 294adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 295adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 296adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 297adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Closes the input stream. 298adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 299adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IOException 300adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * If an error occurs closing the input stream. 301adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @since Android 1.0 302adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 303adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @Override 304adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void close() throws IOException { 305adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (!closed) { 306adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project inf.end(); 307adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project closed = true; 308adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project eof = true; 309adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project super.close(); 310adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 311adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 312adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 313adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 314adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * This implementation overrides the super type implementation to do nothing 315adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * at all. 316adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 317adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param readlimit 318adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * of no use. 319adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @since Android 1.0 320adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 321adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @Override 322adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @SuppressWarnings("unused") 323adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void mark(int readlimit) { 324adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // do nothing 325adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 326adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 327adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 328adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Reset the position of the stream to the last marked position. This 329adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * implementation overrides the supertype implementation and always throws 330adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * an {@link IOException IOException} when called. 331adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 332adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IOException 333adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if the method is called 334adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @since Android 1.0 335adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 336adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @Override 337adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void reset() throws IOException{ 338adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throw new IOException(); 339adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 340adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 341adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 342adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Returns whether the receiver implements {@code mark} semantics. This type 343adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * does not support {@code mark()}, so always responds {@code false}. 344adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 345adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return false, always 346adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @since Android 1.0 347adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 348adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @Override 349adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public boolean markSupported() { 350adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return false; 351adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 352adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 353adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project} 354