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