flute/receiver/
uncompress.rs1use 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}