use compression flag to write data

This commit is contained in:
Jean-Marie 'Histausse' Mineau 2025-01-31 11:19:52 +01:00
parent 4b4ef6032d
commit 9da167348b
Signed by: histausse
GPG key ID: B66AEEDA9B645AD2

View file

@ -77,9 +77,10 @@ impl<T: Write> ZipFileWriter<T> {
assert!( assert!(
header.general_purpose_flags header.general_purpose_flags
& (general_purpose_flags::MASK_COMPRESS_OPTION_1 & (general_purpose_flags::MASK_COMPRESS_OPTION_1
| general_purpose_flags::MASK_COMPRESS_OPTION_2 | general_purpose_flags::MASK_COMPRESS_OPTION_2)
| general_purpose_flags::MASK_UTF8_FILENAME)
== 0 == 0
|| header.compression_method == CompressionMethod::Deflated
|| header.compression_method == CompressionMethod::Stored
); );
assert!( assert!(
header.compression_method == CompressionMethod::Deflated header.compression_method == CompressionMethod::Deflated
@ -100,9 +101,10 @@ impl<T: Write> ZipFileWriter<T> {
assert!( assert!(
header.general_purpose_flags header.general_purpose_flags
& (general_purpose_flags::MASK_COMPRESS_OPTION_1 & (general_purpose_flags::MASK_COMPRESS_OPTION_1
| general_purpose_flags::MASK_COMPRESS_OPTION_2 | general_purpose_flags::MASK_COMPRESS_OPTION_2)
| general_purpose_flags::MASK_UTF8_FILENAME)
== 0 == 0
|| header.compression_method == CompressionMethod::Deflated
|| header.compression_method == CompressionMethod::Stored
); );
assert!( assert!(
header.compression_method == CompressionMethod::Deflated header.compression_method == CompressionMethod::Deflated
@ -168,9 +170,17 @@ impl<T: Write> ZipFileWriter<T> {
CompressionMethod::Deflated => { CompressionMethod::Deflated => {
// TODO: find a way to do this in place, the compressed data can be large, and storing it // TODO: find a way to do this in place, the compressed data can be large, and storing it
// in memory is bad, but Deflate consume the Reader, so we cannot juste give it self.data // in memory is bad, but Deflate consume the Reader, so we cannot juste give it self.data
// TODO: Compression::default -> use flag? let option = match header.general_purpose_flags
let mut compressor = & (general_purpose_flags::MASK_COMPRESS_OPTION_1
CrcWriter::new(DeflateEncoder::new(Vec::new(), Compression::default())); | general_purpose_flags::MASK_COMPRESS_OPTION_2)
{
0b000 => Compression::default(),
0b010 => Compression::best(),
0b100 => Compression::fast(),
0b110 => panic!("Super Fast deflate compression not supported"),
flag => panic!("Something is verry wrong: {flag:b}"),
};
let mut compressor = CrcWriter::new(DeflateEncoder::new(Vec::new(), option));
io::copy(file, &mut compressor).unwrap(); io::copy(file, &mut compressor).unwrap();
local_header.crc_32 = compressor.crc().sum(); local_header.crc_32 = compressor.crc().sum();
compressor.into_inner().finish().unwrap() compressor.into_inner().finish().unwrap()
@ -188,12 +198,6 @@ impl<T: Write> ZipFileWriter<T> {
header.set_uncompressed_size(local_header.get_uncompressed_size()); header.set_uncompressed_size(local_header.get_uncompressed_size());
header.set_offset_local_header(header_offset); header.set_offset_local_header(header_offset);
// TODO: compression flags are not used right now, set to zero
local_header.general_purpose_flags &= !(general_purpose_flags::MASK_COMPRESS_OPTION_1
| general_purpose_flags::MASK_COMPRESS_OPTION_2);
header.general_purpose_flags &= !(general_purpose_flags::MASK_COMPRESS_OPTION_1
| general_purpose_flags::MASK_COMPRESS_OPTION_2);
if data_descriptor.is_some() { if data_descriptor.is_some() {
panic!("Writing file with data_descriptor is not yet implemented"); panic!("Writing file with data_descriptor is not yet implemented");
} }