use crate::common::lct;
use crate::tools::error::{FluteError, Result};
use flate2::write::{DeflateEncoder, GzEncoder, ZlibEncoder};
use std::io::Write;
pub fn compress_buffer(data: &[u8], cenc: lct::Cenc) -> Result<Vec<u8>> {
match cenc {
lct::Cenc::Null => Err(FluteError::new("Null compression ?")),
lct::Cenc::Zlib => compress_zlib(data),
lct::Cenc::Deflate => compress_deflate(data),
lct::Cenc::Gzip => compress_gzip(data),
}
}
pub fn compress_stream(
input: &mut dyn std::io::Read,
cenc: lct::Cenc,
output: &mut dyn std::io::Write,
) -> Result<()> {
match cenc {
lct::Cenc::Null => Err(FluteError::new("Null compression ?")),
lct::Cenc::Zlib => stream_compress_zlib(input, output),
lct::Cenc::Deflate => stream_compress_deflate(input, output),
lct::Cenc::Gzip => stream_compress_gzip(input, output),
}
}
fn compress_gzip(data: &[u8]) -> Result<Vec<u8>> {
log::debug!("Create GZIP encoder");
let mut encoder = GzEncoder::new(Vec::new(), flate2::Compression::default());
encoder.write_all(data)?;
let output = encoder.finish()?;
Ok(output)
}
fn compress_deflate(data: &[u8]) -> Result<Vec<u8>> {
let mut encoder = DeflateEncoder::new(Vec::new(), flate2::Compression::default());
encoder.write_all(data)?;
let output = encoder.finish()?;
Ok(output)
}
fn compress_zlib(data: &[u8]) -> Result<Vec<u8>> {
let mut encoder = ZlibEncoder::new(Vec::new(), flate2::Compression::default());
encoder.write_all(data)?;
let output = encoder.finish()?;
Ok(output)
}
fn stream_compress_gzip(
input: &mut dyn std::io::Read,
output: &mut dyn std::io::Write,
) -> Result<()> {
log::debug!("Create GZIP encoder");
let mut encoder = GzEncoder::new(output, flate2::Compression::default());
let mut buffer = vec![0; 1024 * 1024];
loop {
let read = input.read(&mut buffer)?;
if read == 0 {
break;
}
encoder.write_all(&buffer[..read])?;
}
encoder.finish()?;
Ok(())
}
fn stream_compress_zlib(
input: &mut dyn std::io::Read,
output: &mut dyn std::io::Write,
) -> Result<()> {
log::debug!("Create GZIP encoder");
let mut encoder = ZlibEncoder::new(output, flate2::Compression::default());
let mut buffer = vec![0; 1024 * 1024];
loop {
let read = input.read(&mut buffer)?;
if read == 0 {
break;
}
encoder.write_all(&buffer[..read])?;
}
encoder.finish()?;
Ok(())
}
fn stream_compress_deflate(
input: &mut dyn std::io::Read,
output: &mut dyn std::io::Write,
) -> Result<()> {
log::debug!("Create GZIP encoder");
let mut encoder = DeflateEncoder::new(output, flate2::Compression::default());
let mut buffer = vec![0; 1024 * 1024];
loop {
let read = input.read(&mut buffer)?;
if read == 0 {
break;
}
encoder.write_all(&buffer[..read])?;
}
encoder.finish()?;
Ok(())
}