package com.limegroup.gnutella.util;
import java.io.IOException;
import java.io.InputStream;
import java.util.zip.Inflater;
import java.util.zip.InflaterInputStream;
/**
* The counterpart to CompressingOutputStream. This class extends
* InflaterInputStream solely to catch the potential NPE that can occur
* during the native inflateBytes call if we have concurrently closed
* the stream.
*/
public final class UncompressingInputStream extends InflaterInputStream {
public UncompressingInputStream (final InputStream in, final Inflater flate) {
super(in, flate);
}
public int read(byte[] b, int off, int len) throws IOException {
try {
return super.read(b, off, len);
} catch(NullPointerException e) {
//This will happen if 'end' was called on the inflate
//while we were inflating.
throw new IOException("inflater was ended");
} catch(ArrayIndexOutOfBoundsException aioobe) {
//This will happen occasionally on Windows machines
//when the underlying socket was closed/disconnected
//while the read reached the native socketRead0
throw new IOException(aioobe.getMessage());
} catch(OutOfMemoryError oome) {
throw new IOException(oome.getMessage());
}
}
} // class