aboutsummaryrefslogtreecommitdiffstats
path: root/conversations/src/main/java/eu/siacs/conversations/utils/zlib/ZLibInputStream.java
blob: b777c10c8f7cbac1ef73b47a05cdf05505c87572 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
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();
	}

}