blob: 5c8f1f0b186945649894facfba3dc8c1e7cf8f52 [file] [log] [blame]
use crate::{codec::Decode, util::PartialBuffer};
use std::io::{Error, ErrorKind, Result};
use deflate64::InflaterManaged;
#[derive(Debug)]
pub struct Deflate64Decoder {
inflater: Box<InflaterManaged>,
}
impl Deflate64Decoder {
pub(crate) fn new() -> Self {
Self {
inflater: Box::new(InflaterManaged::new()),
}
}
fn decode(
&mut self,
input: &mut PartialBuffer<impl AsRef<[u8]>>,
output: &mut PartialBuffer<impl AsRef<[u8]> + AsMut<[u8]>>,
) -> Result<bool> {
let result = self
.inflater
.inflate(input.unwritten(), output.unwritten_mut());
input.advance(result.bytes_consumed);
output.advance(result.bytes_written);
if result.data_error {
Err(Error::new(ErrorKind::InvalidData, "invalid data"))
} else {
Ok(self.inflater.finished() && self.inflater.available_output() == 0)
}
}
}
impl Decode for Deflate64Decoder {
fn reinit(&mut self) -> Result<()> {
self.inflater = Box::new(InflaterManaged::new());
Ok(())
}
fn decode(
&mut self,
input: &mut PartialBuffer<impl AsRef<[u8]>>,
output: &mut PartialBuffer<impl AsRef<[u8]> + AsMut<[u8]>>,
) -> Result<bool> {
self.decode(input, output)
}
fn flush(
&mut self,
output: &mut PartialBuffer<impl AsRef<[u8]> + AsMut<[u8]>>,
) -> Result<bool> {
self.decode(&mut PartialBuffer::new([]), output)?;
loop {
let old_len = output.written().len();
self.decode(&mut PartialBuffer::new([]), output)?;
if output.written().len() == old_len {
break;
}
}
Ok(!output.unwritten().is_empty())
}
fn finish(
&mut self,
output: &mut PartialBuffer<impl AsRef<[u8]> + AsMut<[u8]>>,
) -> Result<bool> {
self.decode(&mut PartialBuffer::new([]), output)
}
}