package eu.siacs.conversations.utils.zlib; import java.io.IOException; import java.io.InputStream; import java.util.zip.Inflater; import java.util.zip.InflaterInputStream; /** * ZLibInputStream is a zlib and input stream compatible version of an * InflaterInputStream. This class solves the incompatibility between * {@link InputStream#available()} and {@link InflaterInputStream#available()}. */ public class ZLibInputStream extends InflaterInputStream { /** * Construct a ZLibInputStream, reading data from the underlying stream. * * @param is * The {@code InputStream} to read data from. * @throws IOException * If an {@code IOException} occurs. */ public ZLibInputStream(InputStream is) throws IOException { super(is, new Inflater(), 512); } /** * Provide a more InputStream compatible version of available. A return * value of 1 means that it is likly to read one byte without blocking, 0 * means that the system is known to block for more input. * * @return 0 if no data is available, 1 otherwise * @throws IOException */ @Override public int available() throws IOException { /* * This is one of the funny code blocks. InflaterInputStream.available * violates the contract of InputStream.available, which breaks kXML2. * * I'm not sure who's to blame, oracle/sun for a broken api or the * google guys for mixing a sun bug with a xml reader that can't handle * it.... * * Anyway, this simple if breaks suns distorted reality, but helps to * use the api as intended. */ if (inf.needsInput()) { return 0; } return super.available(); } }