flute/receiver/
uncompress.rs

1use crate::tools::ringbuffer::RingBuffer;
2use flate2::read::{DeflateDecoder, GzDecoder, ZlibDecoder};
3use std::io::Read;
4use std::io::Write;
5
6pub trait Decompress {
7    fn write(&mut self, data: &[u8]) -> std::io::Result<usize>;
8    fn read(&mut self, data: &mut [u8]) -> std::io::Result<usize>;
9    fn finish(&mut self);
10}
11
12impl std::fmt::Debug for dyn Decompress {
13    fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
14        write!(f, "Decompress {{  }}")
15    }
16}
17
18pub struct DecompressGzip {
19    decoder: GzDecoder<RingBuffer>,
20}
21
22impl DecompressGzip {
23    pub fn new(pkt: &[u8]) -> DecompressGzip {
24        let mut ring = RingBuffer::new(pkt.len() * 2);
25        let result = ring.write(pkt).unwrap();
26        debug_assert!(result == pkt.len());
27        DecompressGzip {
28            decoder: GzDecoder::new(ring),
29        }
30    }
31}
32
33impl Decompress for DecompressGzip {
34    fn write(&mut self, data: &[u8]) -> std::io::Result<usize> {
35        self.decoder.get_mut().write(data)
36    }
37
38    fn read(&mut self, data: &mut [u8]) -> std::io::Result<usize> {
39        self.decoder.read(data)
40    }
41    fn finish(&mut self) {
42        self.decoder.get_mut().finish();
43    }
44}
45
46pub struct DecompressDeflate {
47    decoder: DeflateDecoder<RingBuffer>,
48}
49
50impl DecompressDeflate {
51    pub fn new(pkt: &[u8]) -> DecompressDeflate {
52        let mut ring = RingBuffer::new(pkt.len() * 2);
53        let result = ring.write(pkt).unwrap();
54        debug_assert!(result == pkt.len());
55        DecompressDeflate {
56            decoder: DeflateDecoder::new(ring),
57        }
58    }
59}
60
61impl Decompress for DecompressDeflate {
62    fn write(&mut self, data: &[u8]) -> std::io::Result<usize> {
63        self.decoder.get_mut().write(data)
64    }
65
66    fn read(&mut self, data: &mut [u8]) -> std::io::Result<usize> {
67        self.decoder.read(data)
68    }
69    fn finish(&mut self) {
70        self.decoder.get_mut().finish();
71    }
72}
73
74pub struct DecompressZlib {
75    decoder: ZlibDecoder<RingBuffer>,
76}
77
78impl DecompressZlib {
79    pub fn new(pkt: &[u8]) -> DecompressZlib {
80        let mut ring = RingBuffer::new(pkt.len() * 2);
81        let result = ring.write(pkt).unwrap();
82        debug_assert!(result == pkt.len());
83        DecompressZlib {
84            decoder: ZlibDecoder::new(ring),
85        }
86    }
87}
88
89impl Decompress for DecompressZlib {
90    fn write(&mut self, data: &[u8]) -> std::io::Result<usize> {
91        self.decoder.get_mut().write(data)
92    }
93
94    fn read(&mut self, data: &mut [u8]) -> std::io::Result<usize> {
95        self.decoder.read(data)
96    }
97    fn finish(&mut self) {
98        self.decoder.get_mut().finish();
99    }
100}
101
102#[cfg(test)]
103mod tests {
104    #[test]
105    pub fn test_gzip() {}
106}