compression_codecs/deflate64/
decoder.rs

1use 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            // Safety: We **trust** deflate64 to not write uninitialized bytes
32            .inflate_uninit(input.unwritten(), unsafe { output.unwritten_mut() });
33
34        input.advance(result.bytes_consumed);
35        // Safety: We **trust** deflate64 to properly write bytes into buffer
36        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}