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
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
use miniz_oxide::{
inflate::core::DecompressorOxide,
inflate::{
core::inflate_flags::{
TINFL_FLAG_HAS_MORE_INPUT, TINFL_FLAG_PARSE_ZLIB_HEADER, TINFL_FLAG_USING_NON_WRAPPING_OUTPUT_BUF,
},
TINFLStatus,
},
};
use quick_error::quick_error;
quick_error! {
#[derive(Debug)]
pub enum Error {
WriteInflated(err: std::io::Error) {
display("Could not write all bytes when decompressing content")
from()
source(err)
}
Inflate(status: miniz_oxide::inflate::TINFLStatus) {
display("Could not decode zip stream, status was '{:?}'", status)
}
}
}
pub struct Inflate {
state: DecompressorOxide,
pub is_done: bool,
}
impl Default for Inflate {
fn default() -> Self {
Inflate {
state: DecompressorOxide::default(),
is_done: false,
}
}
}
impl Inflate {
pub fn once(
&mut self,
input: &[u8],
out: &mut [u8],
parse_header: bool,
) -> Result<(TINFLStatus, usize, usize), Error> {
let (status, in_consumed, out_consumed) = miniz_oxide::inflate::core::decompress(
&mut self.state,
input,
out,
0,
if parse_header { TINFL_FLAG_PARSE_ZLIB_HEADER } else { 0 }
| TINFL_FLAG_HAS_MORE_INPUT
| TINFL_FLAG_USING_NON_WRAPPING_OUTPUT_BUF,
);
use miniz_oxide::inflate::TINFLStatus::*;
match status {
Failed | FailedCannotMakeProgress | BadParam | Adler32Mismatch => return Err(Error::Inflate(status)),
HasMoreOutput | NeedsMoreInput => {}
Done => {
self.is_done = true;
}
};
Ok((status, in_consumed, out_consumed))
}
}
pub mod stream;