(
&mut self,
data: &[u8],
max_length: Option<usize>,
bufsize: usize,
vm: &VirtualMachine,
)
| 310 | } |
| 311 | |
| 312 | pub fn decompress( |
| 313 | &mut self, |
| 314 | data: &[u8], |
| 315 | max_length: Option<usize>, |
| 316 | bufsize: usize, |
| 317 | vm: &VirtualMachine, |
| 318 | ) -> Result<Vec<u8>, DecompressError<D::Error>> { |
| 319 | if self.eof { |
| 320 | return Err(DecompressError::Eof(EofError)); |
| 321 | } |
| 322 | |
| 323 | let input_buffer = &mut self.input_buffer; |
| 324 | let d = &mut self.decompress; |
| 325 | |
| 326 | let mut chunks = Chunker::chain(input_buffer, data); |
| 327 | |
| 328 | let prev_len = chunks.len(); |
| 329 | let (ret, stream_end) = |
| 330 | match _decompress_chunks(&mut chunks, d, bufsize, max_length, flush_sync) { |
| 331 | Ok((buf, stream_end)) => (Ok(buf), stream_end), |
| 332 | Err(err) => (Err(err), false), |
| 333 | }; |
| 334 | let consumed = prev_len - chunks.len(); |
| 335 | |
| 336 | self.eof |= stream_end; |
| 337 | |
| 338 | if self.eof { |
| 339 | self.needs_input = false; |
| 340 | if !chunks.is_empty() { |
| 341 | self.unused_data = vm.ctx.new_bytes(chunks.to_vec()); |
| 342 | } |
| 343 | } else if chunks.is_empty() { |
| 344 | input_buffer.clear(); |
| 345 | self.needs_input = true; |
| 346 | } else { |
| 347 | self.needs_input = false; |
| 348 | if let Some(n_consumed_from_data) = consumed.checked_sub(input_buffer.len()) { |
| 349 | input_buffer.clear(); |
| 350 | input_buffer.extend_from_slice(&data[n_consumed_from_data..]); |
| 351 | } else { |
| 352 | input_buffer.drain(..consumed); |
| 353 | input_buffer.extend_from_slice(data); |
| 354 | } |
| 355 | } |
| 356 | |
| 357 | ret.map_err(DecompressError::Decompress) |
| 358 | } |
| 359 | } |
| 360 | |
| 361 | pub enum DecompressError<E> { |
no test coverage detected