use std::io::{self, Read, Cursor}; use flate2::read::ZlibDecoder; use flate2::read::GzDecoder; use lzma_rs::lzma_decompress; use lz4::block::decompress; use bzip2::read::BzDecoder; use liblzma::read::XzDecoder; use crate::utils::common; pub fn decompress_zlib(data: &[u8]) -> io::Result> { let mut decoder = ZlibDecoder::new(data); let mut decompressed = Vec::new(); decoder.read_to_end(&mut decompressed)?; Ok(decompressed) } pub fn decompress_gzip(compressed_data: &[u8]) -> Result, Box> { let mut decoder = GzDecoder::new(compressed_data); let mut decompressed = Vec::new(); decoder.read_to_end(&mut decompressed)?; Ok(decompressed) } pub fn decompress_gzip_get_filename(compressed_data: &[u8]) -> Result<(Vec, Option), Box> { let mut decoder = GzDecoder::new(compressed_data); let mut filename: Option = None; if let Some(filename_bytes) = decoder.header().unwrap().filename() { filename = Some(common::string_from_bytes(filename_bytes)); } let mut decompressed = Vec::new(); decoder.read_to_end(&mut decompressed)?; Ok((decompressed, filename)) } pub fn decompress_lzma(compressed_data: &[u8]) -> Result, Box> { let mut input = Cursor::new(compressed_data); let mut output = Vec::new(); lzma_decompress(&mut input, &mut output)?; Ok(output) } pub fn decompress_lz4(compressed_data: &[u8], original_size: i32) -> Result, std::io::Error> { match decompress(compressed_data, Some(original_size)) { Ok(decompressed) => Ok(decompressed), Err(e) => Err(std::io::Error::new(std::io::ErrorKind::InvalidData, e)), } } pub fn decompress_bzip(compressed: &[u8]) -> std::io::Result> { let mut decoder = BzDecoder::new(compressed); let mut decompressed = Vec::new(); decoder.read_to_end(&mut decompressed)?; Ok(decompressed) } pub fn decompress_xz(compressed: &[u8]) -> std::io::Result> { let mut decoder = XzDecoder::new(compressed); let mut decompressed = Vec::new(); decoder.read_to_end(&mut decompressed)?; Ok(decompressed) }