*
* @throws IOException If there is an error parsing the stream.
*/
private void doDecode( COSName filterName, int filterIndex ) throws IOException
{
Filter filter = FilterFactory.INSTANCE.getFilter( filterName );
boolean done = false;
IOException exception = null;
long position = unFilteredStream.getPosition();
long length = unFilteredStream.getLength();
// in case we need it later
long writtenLength = unFilteredStream.getLengthWritten();
if (length == 0 && writtenLength == 0)
{
//if the length is zero then don't bother trying to decode
//some filters don't work when attempting to decode
//with a zero length stream. See zlib_error_01.pdf
IOUtils.closeQuietly(unFilteredStream);
unFilteredStream = new RandomAccessFileOutputStream( buffer );
done = true;
}
else
{
//ok this is a simple hack, sometimes we read a couple extra
//bytes that shouldn't be there, so we encounter an error we will just
//try again with one less byte.
for (int tryCount = 0; length > 0 && !done && tryCount < 5; tryCount++)
{
InputStream input = null;
try
{
input = new BufferedInputStream(
new RandomAccessFileInputStream( buffer, position, length ), BUFFER_SIZE );
IOUtils.closeQuietly(unFilteredStream);
unFilteredStream = new RandomAccessFileOutputStream( buffer );
decodeResult = filter.decode( input, unFilteredStream, this, filterIndex );
done = true;
}
catch( IOException io )
{
length--;
exception = io;
}
finally
{
IOUtils.closeQuietly(input);
}
}
if( !done )
{
//if no good stream was found then lets try again but with the
//length of data that was actually read and not length
//defined in the dictionary
length = writtenLength;
for( int tryCount=0; !done && tryCount<5; tryCount++ )
{
InputStream input = null;
try
{
input = new BufferedInputStream(
new RandomAccessFileInputStream( buffer, position, length ), BUFFER_SIZE );
IOUtils.closeQuietly(unFilteredStream);
unFilteredStream = new RandomAccessFileOutputStream( buffer );
decodeResult = filter.decode( input, unFilteredStream, this, filterIndex);
done = true;
}
catch( IOException io )
{
length--;