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();
    }

}
