/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef _DECAF_UTIL_ZIP_INFLATERINPUTSTREAM_H_ #define _DECAF_UTIL_ZIP_INFLATERINPUTSTREAM_H_ #include #include #include #include #include namespace decaf { namespace util { namespace zip { /** * A FilterInputStream that decompresses data read from the wrapped InputStream instance. * * @since 1.0 */ class DECAF_API InflaterInputStream : public decaf::io::FilterInputStream { protected: /** * The Inflater instance to use. */ Inflater* inflater; /** * The buffer to hold chunks of data read from the stream before inflation. */ std::vector buff; /** * The amount of data currently stored in the input buffer. */ int length; bool ownInflater; bool atEOF; static const int DEFAULT_BUFFER_SIZE; private: InflaterInputStream( const InflaterInputStream& ); InflaterInputStream& operator= ( const InflaterInputStream& ); public: /** * Create an instance of this class with a default inflater and buffer size. * * @param inputStream * The InputStream instance to wrap. * @param own * Should this Filter take ownership of the InputStream pointer (defaults to false). */ InflaterInputStream( decaf::io::InputStream* inputStream, bool own = false ); /** * Creates a new InflaterInputStream with a user supplied Inflater and a default buffer size. * When the user supplied a Inflater instance the InflaterInputStream does not take ownership * of the Inflater pointer unless the ownInflater parameter is set to true, otherwise the * caller is still responsible for deleting the Inflater. * * @param inputStream * The InputStream instance to wrap. * @param inflater * The user supplied Inflater to use for decompression. ( * @param own * Should this filter take ownership of the InputStream pointer (default is false). * @param ownInflater * Should the filter take ownership of the passed Inflater object (default is false). * * @throws NullPointerException if the Inflater given is NULL. */ InflaterInputStream( decaf::io::InputStream* inputStream, Inflater* inflater, bool own = false, bool ownInflater = false ); /** * Creates a new DeflateOutputStream with a user supplied Inflater and specified buffer size. * When the user supplied a Inflater instance the InflaterInputStream does not take ownership * of the Inflater pointer unless the ownInflater parameter is set to true, otherwise the caller * is still responsible for deleting the Inflater. * * @param inputStream * The InputStream instance to wrap. * @param inflater * The user supplied Inflater to use for decompression. * @param bufferSize * The size of the input buffer. * @param own * Should this filter take ownership of the InputStream pointer (default is false). * @param ownInflater * Should the filter take ownership of the passed Inflater object (default is false). * * @throws NullPointerException if the Inflater given is NULL. * @throws IllegalArgumentException if the bufferSize value is zero. */ InflaterInputStream( decaf::io::InputStream* inputStream, Inflater* inflater, int bufferSize, bool own = false, bool ownInflater = false ); virtual ~InflaterInputStream(); /** * {@inheritDoc} * * Until EOF this method always returns 1, thereafter it always returns 0. */ virtual int available() const; /** * {@inheritDoc} * * Closes any resources associated with this InflaterInputStream. */ virtual void close(); /** * {@inheritDoc} * * Skips the specified amount of uncompressed input data. */ virtual long long skip( long long num ); /** * {@inheritDoc} * * Does nothing. */ virtual void mark( int readLimit ); /** * {@inheritDoc} * * Always throws an IOException when called. */ virtual void reset(); /** * {@inheritDoc} * * Always returns false. */ virtual bool markSupported() const; protected: /** * Fills the input buffer with the next chunk of data. * * @throws IOException if an I/O error occurs. */ virtual void fill(); protected: virtual int doReadByte(); virtual int doReadArrayBounded( unsigned char* buffer, int size, int offset, int length ); }; }}} #endif /* _DECAF_UTIL_ZIP_INFLATERINPUTSTREAM_H_ */