use compression flag to write data
This commit is contained in:
parent
4b4ef6032d
commit
9da167348b
1 changed files with 17 additions and 13 deletions
|
|
@ -77,9 +77,10 @@ impl<T: Write> ZipFileWriter<T> {
|
|||
assert!(
|
||||
header.general_purpose_flags
|
||||
& (general_purpose_flags::MASK_COMPRESS_OPTION_1
|
||||
| general_purpose_flags::MASK_COMPRESS_OPTION_2
|
||||
| general_purpose_flags::MASK_UTF8_FILENAME)
|
||||
| general_purpose_flags::MASK_COMPRESS_OPTION_2)
|
||||
== 0
|
||||
|| header.compression_method == CompressionMethod::Deflated
|
||||
|| header.compression_method == CompressionMethod::Stored
|
||||
);
|
||||
assert!(
|
||||
header.compression_method == CompressionMethod::Deflated
|
||||
|
|
@ -100,9 +101,10 @@ impl<T: Write> ZipFileWriter<T> {
|
|||
assert!(
|
||||
header.general_purpose_flags
|
||||
& (general_purpose_flags::MASK_COMPRESS_OPTION_1
|
||||
| general_purpose_flags::MASK_COMPRESS_OPTION_2
|
||||
| general_purpose_flags::MASK_UTF8_FILENAME)
|
||||
| general_purpose_flags::MASK_COMPRESS_OPTION_2)
|
||||
== 0
|
||||
|| header.compression_method == CompressionMethod::Deflated
|
||||
|| header.compression_method == CompressionMethod::Stored
|
||||
);
|
||||
assert!(
|
||||
header.compression_method == CompressionMethod::Deflated
|
||||
|
|
@ -168,9 +170,17 @@ impl<T: Write> ZipFileWriter<T> {
|
|||
CompressionMethod::Deflated => {
|
||||
// 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
|
||||
// TODO: Compression::default -> use flag?
|
||||
let mut compressor =
|
||||
CrcWriter::new(DeflateEncoder::new(Vec::new(), Compression::default()));
|
||||
let option = match header.general_purpose_flags
|
||||
& (general_purpose_flags::MASK_COMPRESS_OPTION_1
|
||||
| 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();
|
||||
local_header.crc_32 = compressor.crc().sum();
|
||||
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_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() {
|
||||
panic!("Writing file with data_descriptor is not yet implemented");
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue