compression_codecs/deflate64/
decoder.rs1use crate::DecodeV2;
2use compression_core::util::{PartialBuffer, WriteBuffer};
3use deflate64::InflaterManaged;
4use std::io::{Error, ErrorKind, Result};
5
6#[derive(Debug)]
7pub struct Deflate64Decoder {
8 inflater: Box<InflaterManaged>,
9}
10
11impl Default for Deflate64Decoder {
12 fn default() -> Self {
13 Self {
14 inflater: Box::new(InflaterManaged::new()),
15 }
16 }
17}
18
19impl Deflate64Decoder {
20 pub fn new() -> Self {
21 Self::default()
22 }
23
24 fn decode(
25 &mut self,
26 input: &mut PartialBuffer<&[u8]>,
27 output: &mut WriteBuffer<'_>,
28 ) -> Result<bool> {
29 let result = self
30 .inflater
31 .inflate_uninit(input.unwritten(), unsafe { output.unwritten_mut() });
33
34 input.advance(result.bytes_consumed);
35 unsafe { output.assume_init_and_advance(result.bytes_written) };
37
38 if result.data_error {
39 Err(Error::new(ErrorKind::InvalidData, "invalid data"))
40 } else {
41 Ok(self.inflater.finished() && self.inflater.available_output() == 0)
42 }
43 }
44}
45
46impl DecodeV2 for Deflate64Decoder {
47 fn reinit(&mut self) -> Result<()> {
48 *self.inflater = InflaterManaged::new();
49 Ok(())
50 }
51
52 fn decode(
53 &mut self,
54 input: &mut PartialBuffer<&[u8]>,
55 output: &mut WriteBuffer<'_>,
56 ) -> Result<bool> {
57 self.decode(input, output)
58 }
59
60 fn flush(&mut self, output: &mut WriteBuffer<'_>) -> Result<bool> {
61 self.decode(&mut PartialBuffer::new(&[]), output)?;
62
63 loop {
64 let old_len = output.written_len();
65 self.decode(&mut PartialBuffer::new(&[]), output)?;
66 if output.written_len() == old_len {
67 break;
68 }
69 }
70
71 Ok(!output.has_no_spare_space())
72 }
73
74 fn finish(&mut self, output: &mut WriteBuffer<'_>) -> Result<bool> {
75 self.decode(&mut PartialBuffer::new(&[]), output)
76 }
77}