blob: 2eebf6f4c48ad604c6b0ed471fc724906b6b6fe6 (
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
|
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();
}
}
|