blob: d1ca564c54a37a6779cd46472f1d62e811546e33 [file] [log] [blame]
/*
* 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_UTI_ZIP_INFLATER_H_
#define _DECAF_UTI_ZIP_INFLATER_H_
#include <decaf/util/Config.h>
#include <decaf/lang/exceptions/NullPointerException.h>
#include <decaf/lang/exceptions/IllegalArgumentException.h>
#include <decaf/lang/exceptions/IllegalStateException.h>
#include <decaf/lang/exceptions/IndexOutOfBoundsException.h>
#include <decaf/util/zip/DataFormatException.h>
#include <vector>
namespace decaf {
namespace util {
namespace zip {
class InflaterData;
/**
* This class uncompresses data that was compressed using the <i>DEFLATE</i>
* algorithm (see <a href="http://www.gzip.org/algorithm.txt">specification</a>).
* <p>
* Basically this class is part of the API to the stream based ZLIB compression
* library and is used as such by InflaterInputStream and its descendants.
* <p>
* The typical usage of a Inflater outside this package consists of a specific
* call to one of its constructors before being passed to an instance of
* InflaterInputStream.
*
* @see InflaterInputStream
* @see Deflater
*
* @since 1.0
*/
class DECAF_API Inflater {
private:
InflaterData* data;
private:
Inflater(const Inflater&);
Inflater& operator=(const Inflater&);
public:
/**
* Creates a new decompressor. This constructor defaults the inflater to use the ZLIB
* header and checksum fields.
*/
Inflater();
/**
* Creates a new decompressor. If the parameter 'nowrap' is true then the ZLIB header
* and checksum fields will not be used. This provides compatibility with the compression
* format used by both GZIP and PKZIP.
*
* Note: When using the 'nowrap' option it is also necessary to provide an extra "dummy"
* byte as input. This is required by the ZLIB native library in order to support
* certain optimizations.
*/
Inflater(bool nowrap);
virtual ~Inflater();
/**
* Sets input data for decompression. This should be called whenever needsInput() returns
* true indicating that more input data is required.
*
* @param buffer
* The Buffer to read in for decompression.
* @param size
* The size of the buffer passed in.
* @param offset
* The position in the Buffer to start reading from.
* @param length
* The number of bytes to read from the input buffer.
*
* @throws NullPointerException if buffer is NULL.
* @throws IndexOutOfBoundsException if the offset + length > size of the buffer.
* @throws IllegalStateException if in the end state.
*/
void setInput(const unsigned char* buffer, int size, int offset, int length);
/**
* Sets input data for decompression. This should be called whenever needsInput() returns
* true indicating that more input data is required.
*
* @param buffer
* The Buffer to read in for decompression.
* @param offset
* The position in the Buffer to start reading from.
* @param length
* The number of bytes to read from the input buffer.
*
* @throws IndexOutOfBoundsException if the offset + length > size of the buffer.
* @throws IllegalStateException if in the end state.
*/
void setInput(const std::vector<unsigned char>& buffer, int offset, int length);
/**
* Sets input data for decompression. This should be called whenever needsInput() returns
* true indicating that more input data is required.
*
* @param buffer
* The Buffer to read in for decompression.
*
* @throws IllegalStateException if in the end state.
*/
void setInput(const std::vector<unsigned char>& buffer);
/**
* Returns the total number of bytes remaining in the input buffer. This can be used to
* find out what bytes still remain in the input buffer after decompression has finished.
*
* @return the total number of bytes remaining in the input buffer
*/
int getRemaining() const;
/**
* Sets the preset dictionary to the given array of bytes. Should be called when inflate()
* returns 0 and needsDictionary() returns true indicating that a preset dictionary is
* required. The method getAdler() can be used to get the Adler-32 value of the dictionary
* needed.
*
* @param buffer
* The Buffer to read in for decompression.
* @param size
* The size of the buffer passed in.
* @param offset
* The position in the Buffer to start reading from.
* @param length
* The number of bytes to read from the input buffer.
*
* @throws NullPointerException if buffer is NULL.
* @throws IndexOutOfBoundsException if the offset + length > size of the buffer.
* @throws IllegalStateException if in the end state.
* @throws IllegalArgumentException if the given dictionary doesn't match thre required
* dictionaries checksum value.
*/
void setDictionary(const unsigned char* buffer, int size, int offset, int length);
/**
* Sets the preset dictionary to the given array of bytes. Should be called when inflate()
* returns 0 and needsDictionary() returns true indicating that a preset dictionary is
* required. The method getAdler() can be used to get the Adler-32 value of the dictionary
* needed.
*
* @param buffer
* The Buffer to read in for decompression.
* @param offset
* The position in the Buffer to start reading from.
* @param length
* The number of bytes to read from the input buffer.
*
* @throws IndexOutOfBoundsException if the offset + length > size of the buffer.
* @throws IllegalStateException if in the end state.
* @throws IllegalArgumentException if the given dictionary doesn't match thre required
* dictionaries checksum value.
*/
void setDictionary(const std::vector<unsigned char>& buffer, int offset, int length);
/**
* Sets the preset dictionary to the given array of bytes. Should be called when inflate()
* returns 0 and needsDictionary() returns true indicating that a preset dictionary is
* required. The method getAdler() can be used to get the Adler-32 value of the dictionary
* needed.
*
* @param buffer
* The Buffer to read in for decompression.
*
* @throws IllegalStateException if in the end state.
* @throws IllegalArgumentException if the given dictionary doesn't match the required
* dictionaries checksum value.
*/
void setDictionary(const std::vector<unsigned char>& buffer);
/**
* @return true if the input data buffer is empty and setInput() should be called in
* order to provide more input
*/
bool needsInput() const;
/**
* @return true if a preset dictionary is needed for decompression.
*/
bool needsDictionary() const;
/**
* When called, indicates that decompression should end with the current contents of
* the input buffer.
*/
void finish();
/**
* @return true if the end of the compressed data output stream has been reached.
*/
bool finished() const;
/**
* Uncompresses bytes into specified buffer. Returns actual number of bytes uncompressed.
* A return value of 0 indicates that needsInput() or needsDictionary() should be called
* in order to determine if more input data or a preset dictionary is required. In the
* latter case, getAdler() can be used to get the Adler-32 value of the dictionary required.
*
* @param buffer
* The Buffer to write the compressed data to.
* @param size
* The size of the buffer passed in.
* @param offset
* The position in the Buffer to start writing at.
* @param length
* The maximum number of byte of data to write.
*
* @throws NullPointerException if buffer is NULL.
* @throws IllegalStateException if in the end state.
* @throws IndexOutOfBoundsException if the offset + length > size of the buffer.
* @throws DataFormatException if the compressed data format is invalid.
*/
int inflate(unsigned char* buffer, int size, int offset, int length);
/**
* Uncompresses bytes into specified buffer. Returns actual number of bytes uncompressed.
* A return value of 0 indicates that needsInput() or needsDictionary() should be called
* in order to determine if more input data or a preset dictionary is required. In the
* latter case, getAdler() can be used to get the Adler-32 value of the dictionary required.
*
* @param buffer
* The Buffer to write the compressed data to.
* @param offset
* The position in the Buffer to start writing at.
* @param length
* The maximum number of byte of data to write.
*
* @throws IllegalStateException if in the end state.
* @throws IndexOutOfBoundsException if the offset + length > size of the buffer.
* @throws DataFormatException if the compressed data format is invalid.
*/
int inflate(std::vector<unsigned char>& buffer, int offset, int length);
/**
* Uncompresses bytes into specified buffer. Returns actual number of bytes uncompressed.
* A return value of 0 indicates that needsInput() or needsDictionary() should be called
* in order to determine if more input data or a preset dictionary is required. In the
* latter case, getAdler() can be used to get the Adler-32 value of the dictionary required.
*
* @param buffer
* The Buffer to write the compressed data to.
*
* @throws IllegalStateException if in the end state.
* @throws DataFormatException if the compressed data format is invalid.
*/
int inflate(std::vector<unsigned char>& buffer);
/**
* @return the ADLER-32 value of the uncompressed data.
*
* @throws IllegalStateException if in the end state.
*/
long long getAdler() const;
/**
* @return the total number of compressed bytes input so far.
*
* @throws IllegalStateException if in the end state.
*/
long long getBytesRead() const;
/**
* @return the total number of decompressed bytes output so far.
*
* @throws IllegalStateException if in the end state.
*/
long long getBytesWritten() const;
/**
* Resets deflater so that a new set of input data can be processed. Keeps current decompression
* level and strategy settings.
*
* @throws IllegalStateException if in the end state.
*/
void reset();
/**
* Closes the decompressor and discards any unprocessed input. This method should be called
* when the decompressor is no longer being used, but will also be called automatically by the
* destructor. Once this method is called, the behavior of the Inflater object is undefined.
*/
void end();
};
}}}
#endif /* _DECAF_UTI_ZIP_INFLATER_H_ */