1use std::io::Read;
2
3use crate::{
4 internal::ppmd8::{PPMd8, RangeDecoder},
5 Error, RestoreMethod, PPMD8_MAX_MEM_SIZE, PPMD8_MAX_ORDER, PPMD8_MIN_MEM_SIZE, PPMD8_MIN_ORDER,
6 SYM_END,
7};
8
9pub struct Ppmd8Decoder<R: Read> {
11 ppmd: PPMd8<RangeDecoder<R>>,
12 finished: bool,
13}
14
15unsafe impl<R: Read> Send for Ppmd8Decoder<R> {}
16unsafe impl<R: Read> Sync for Ppmd8Decoder<R> {}
17
18impl<R: Read> Ppmd8Decoder<R> {
19 pub fn new(
24 reader: R,
25 order: u32,
26 mem_size: u32,
27 restore_method: RestoreMethod,
28 ) -> crate::Result<Self> {
29 if !(PPMD8_MIN_ORDER..=PPMD8_MAX_ORDER).contains(&order)
30 || !(PPMD8_MIN_MEM_SIZE..=PPMD8_MAX_MEM_SIZE).contains(&mem_size)
31 {
32 return Err(Error::InvalidParameter);
33 }
34
35 let ppmd = PPMd8::new_decoder(reader, order, mem_size, restore_method)?;
36
37 Ok(Self {
38 ppmd,
39 finished: false,
40 })
41 }
42
43 pub fn into_inner(self) -> R {
45 self.ppmd.into_inner()
46 }
47}
48
49impl<R: Read> Read for Ppmd8Decoder<R> {
50 fn read(&mut self, buf: &mut [u8]) -> std::io::Result<usize> {
51 if self.finished {
52 return Ok(0);
53 }
54
55 if buf.is_empty() {
56 return Ok(0);
57 }
58
59 let mut sym = 0;
60 let mut decoded = 0;
61
62 for byte in buf.iter_mut() {
63 match self.ppmd.decode_symbol() {
64 Ok(symbol) => sym = symbol,
65 Err(err) => {
66 if err.kind() == std::io::ErrorKind::UnexpectedEof {
67 self.finished = true;
68 return Ok(decoded);
69 }
70 return Err(err);
71 }
72 }
73
74 if sym < 0 {
75 break;
76 }
77
78 *byte = sym as u8;
79 decoded += 1;
80 }
81
82 let code = self.ppmd.range_decoder_code();
83
84 if sym >= 0 {
85 return Ok(decoded);
86 }
87
88 self.finished = true;
89
90 if sym != SYM_END || code != 0 {
91 return Err(std::io::Error::new(
92 std::io::ErrorKind::InvalidData,
93 "Error during PPMd decoding",
94 ));
95 }
96
97 Ok(decoded)
99 }
100}