1 use std::io;
2 use std::io::prelude::*;
3 
4 use super::bufread;
5 use crate::bufreader::BufReader;
6 
7 /// A DEFLATE encoder, or compressor.
8 ///
9 /// This structure implements a [`Read`] interface. When read from, it reads
10 /// uncompressed data from the underlying [`Read`] and provides the compressed data.
11 ///
12 /// [`Read`]: https://doc.rust-lang.org/std/io/trait.Read.html
13 ///
14 /// # Examples
15 ///
16 /// ```
17 /// use std::io::prelude::*;
18 /// use std::io;
19 /// use flate2::Compression;
20 /// use flate2::read::DeflateEncoder;
21 ///
22 /// # fn main() {
23 /// #    println!("{:?}", deflateencoder_read_hello_world().unwrap());
24 /// # }
25 /// #
26 /// // Return a vector containing the Deflate compressed version of hello world
27 /// fn deflateencoder_read_hello_world() -> io::Result<Vec<u8>> {
28 ///    let mut ret_vec = Vec::new();
29 ///    let c = b"hello world";
30 ///    let mut deflater = DeflateEncoder::new(&c[..], Compression::fast());
31 ///    deflater.read_to_end(&mut ret_vec)?;
32 ///    Ok(ret_vec)
33 /// }
34 /// ```
35 #[derive(Debug)]
36 pub struct DeflateEncoder<R> {
37     inner: bufread::DeflateEncoder<BufReader<R>>,
38 }
39 
40 impl<R: Read> DeflateEncoder<R> {
41     /// Creates a new encoder which will read uncompressed data from the given
42     /// stream and emit the compressed stream.
new(r: R, level: crate::Compression) -> DeflateEncoder<R>43     pub fn new(r: R, level: crate::Compression) -> DeflateEncoder<R> {
44         DeflateEncoder {
45             inner: bufread::DeflateEncoder::new(BufReader::new(r), level),
46         }
47     }
48 }
49 
50 impl<R> DeflateEncoder<R> {
51     /// Resets the state of this encoder entirely, swapping out the input
52     /// stream for another.
53     ///
54     /// This function will reset the internal state of this encoder and replace
55     /// the input stream with the one provided, returning the previous input
56     /// stream. Future data read from this encoder will be the compressed
57     /// version of `r`'s data.
58     ///
59     /// Note that there may be currently buffered data when this function is
60     /// called, and in that case the buffered data is discarded.
reset(&mut self, r: R) -> R61     pub fn reset(&mut self, r: R) -> R {
62         super::bufread::reset_encoder_data(&mut self.inner);
63         self.inner.get_mut().reset(r)
64     }
65 
66     /// Acquires a reference to the underlying reader
get_ref(&self) -> &R67     pub fn get_ref(&self) -> &R {
68         self.inner.get_ref().get_ref()
69     }
70 
71     /// Acquires a mutable reference to the underlying stream
72     ///
73     /// Note that mutation of the stream may result in surprising results if
74     /// this encoder is continued to be used.
get_mut(&mut self) -> &mut R75     pub fn get_mut(&mut self) -> &mut R {
76         self.inner.get_mut().get_mut()
77     }
78 
79     /// Consumes this encoder, returning the underlying reader.
80     ///
81     /// Note that there may be buffered bytes which are not re-acquired as part
82     /// of this transition. It's recommended to only call this function after
83     /// EOF has been reached.
into_inner(self) -> R84     pub fn into_inner(self) -> R {
85         self.inner.into_inner().into_inner()
86     }
87 
88     /// Returns the number of bytes that have been read into this compressor.
89     ///
90     /// Note that not all bytes read from the underlying object may be accounted
91     /// for, there may still be some active buffering.
total_in(&self) -> u6492     pub fn total_in(&self) -> u64 {
93         self.inner.total_in()
94     }
95 
96     /// Returns the number of bytes that the compressor has produced.
97     ///
98     /// Note that not all bytes may have been read yet, some may still be
99     /// buffered.
total_out(&self) -> u64100     pub fn total_out(&self) -> u64 {
101         self.inner.total_out()
102     }
103 }
104 
105 impl<R: Read> Read for DeflateEncoder<R> {
read(&mut self, buf: &mut [u8]) -> io::Result<usize>106     fn read(&mut self, buf: &mut [u8]) -> io::Result<usize> {
107         self.inner.read(buf)
108     }
109 }
110 
111 impl<W: Read + Write> Write for DeflateEncoder<W> {
write(&mut self, buf: &[u8]) -> io::Result<usize>112     fn write(&mut self, buf: &[u8]) -> io::Result<usize> {
113         self.get_mut().write(buf)
114     }
115 
flush(&mut self) -> io::Result<()>116     fn flush(&mut self) -> io::Result<()> {
117         self.get_mut().flush()
118     }
119 }
120 
121 /// A DEFLATE decoder, or decompressor.
122 ///
123 /// This structure implements a [`Read`] interface. When read from, it reads
124 /// compressed data from the underlying [`Read`] and provides the uncompressed data.
125 ///
126 /// [`Read`]: https://doc.rust-lang.org/std/io/trait.Read.html
127 ///
128 /// # Examples
129 ///
130 /// ```
131 /// use std::io::prelude::*;
132 /// use std::io;
133 /// # use flate2::Compression;
134 /// # use flate2::write::DeflateEncoder;
135 /// use flate2::read::DeflateDecoder;
136 ///
137 /// # fn main() {
138 /// #    let mut e = DeflateEncoder::new(Vec::new(), Compression::default());
139 /// #    e.write_all(b"Hello World").unwrap();
140 /// #    let bytes = e.finish().unwrap();
141 /// #    println!("{}", decode_reader(bytes).unwrap());
142 /// # }
143 /// // Uncompresses a Deflate Encoded vector of bytes and returns a string or error
144 /// // Here &[u8] implements Read
145 /// fn decode_reader(bytes: Vec<u8>) -> io::Result<String> {
146 ///    let mut deflater = DeflateDecoder::new(&bytes[..]);
147 ///    let mut s = String::new();
148 ///    deflater.read_to_string(&mut s)?;
149 ///    Ok(s)
150 /// }
151 /// ```
152 #[derive(Debug)]
153 pub struct DeflateDecoder<R> {
154     inner: bufread::DeflateDecoder<BufReader<R>>,
155 }
156 
157 impl<R: Read> DeflateDecoder<R> {
158     /// Creates a new decoder which will decompress data read from the given
159     /// stream.
new(r: R) -> DeflateDecoder<R>160     pub fn new(r: R) -> DeflateDecoder<R> {
161         DeflateDecoder::new_with_buf(r, vec![0; 32 * 1024])
162     }
163 
164     /// Same as `new`, but the intermediate buffer for data is specified.
165     ///
166     /// Note that the capacity of the intermediate buffer is never increased,
167     /// and it is recommended for it to be large.
new_with_buf(r: R, buf: Vec<u8>) -> DeflateDecoder<R>168     pub fn new_with_buf(r: R, buf: Vec<u8>) -> DeflateDecoder<R> {
169         DeflateDecoder {
170             inner: bufread::DeflateDecoder::new(BufReader::with_buf(buf, r)),
171         }
172     }
173 }
174 
175 impl<R> DeflateDecoder<R> {
176     /// Resets the state of this decoder entirely, swapping out the input
177     /// stream for another.
178     ///
179     /// This will reset the internal state of this decoder and replace the
180     /// input stream with the one provided, returning the previous input
181     /// stream. Future data read from this decoder will be the decompressed
182     /// version of `r`'s data.
183     ///
184     /// Note that there may be currently buffered data when this function is
185     /// called, and in that case the buffered data is discarded.
reset(&mut self, r: R) -> R186     pub fn reset(&mut self, r: R) -> R {
187         super::bufread::reset_decoder_data(&mut self.inner);
188         self.inner.get_mut().reset(r)
189     }
190 
191     /// Acquires a reference to the underlying stream
get_ref(&self) -> &R192     pub fn get_ref(&self) -> &R {
193         self.inner.get_ref().get_ref()
194     }
195 
196     /// Acquires a mutable reference to the underlying stream
197     ///
198     /// Note that mutation of the stream may result in surprising results if
199     /// this decoder is continued to be used.
get_mut(&mut self) -> &mut R200     pub fn get_mut(&mut self) -> &mut R {
201         self.inner.get_mut().get_mut()
202     }
203 
204     /// Consumes this decoder, returning the underlying reader.
205     ///
206     /// Note that there may be buffered bytes which are not re-acquired as part
207     /// of this transition. It's recommended to only call this function after
208     /// EOF has been reached.
into_inner(self) -> R209     pub fn into_inner(self) -> R {
210         self.inner.into_inner().into_inner()
211     }
212 
213     /// Returns the number of bytes that the decompressor has consumed.
214     ///
215     /// Note that this will likely be smaller than what the decompressor
216     /// actually read from the underlying stream due to buffering.
total_in(&self) -> u64217     pub fn total_in(&self) -> u64 {
218         self.inner.total_in()
219     }
220 
221     /// Returns the number of bytes that the decompressor has produced.
total_out(&self) -> u64222     pub fn total_out(&self) -> u64 {
223         self.inner.total_out()
224     }
225 }
226 
227 impl<R: Read> Read for DeflateDecoder<R> {
read(&mut self, into: &mut [u8]) -> io::Result<usize>228     fn read(&mut self, into: &mut [u8]) -> io::Result<usize> {
229         self.inner.read(into)
230     }
231 }
232 
233 impl<W: Read + Write> Write for DeflateDecoder<W> {
write(&mut self, buf: &[u8]) -> io::Result<usize>234     fn write(&mut self, buf: &[u8]) -> io::Result<usize> {
235         self.get_mut().write(buf)
236     }
237 
flush(&mut self) -> io::Result<()>238     fn flush(&mut self) -> io::Result<()> {
239         self.get_mut().flush()
240     }
241 }
242