This commit is contained in:
Jean-Marie Mineau 2024-01-19 11:46:36 +01:00
parent 99ecf178df
commit 3f521b5754
Signed by: histausse
GPG key ID: B66AEEDA9B645AD2
4 changed files with 277 additions and 5 deletions

View file

@ -220,6 +220,31 @@ impl FileHeader {
}
}
pub fn set_uncompressed_size(&mut self, uncompressed_size: u64) {
if let Some(ExtraField::Zip64(Zip64ExtraField {
original_size: Some(original_size),
..
})) = self
.extra_field
.iter_mut()
.find(|f| matches!(f, ExtraField::Zip64(_)))
{
*original_size = uncompressed_size;
self.uncompressed_size = u32::MAX;
} else if uncompressed_size > u32::MAX as u64 {
self.extra_field.push(ExtraField::Zip64(Zip64ExtraField {
original_size: Some(uncompressed_size),
compressed_size: Some(self.compressed_size as u64),
disk_number: None,
offset_header: None,
}));
self.uncompressed_size = u32::MAX;
self.compressed_size = u32::MAX;
} else {
self.uncompressed_size = uncompressed_size as u32;
}
}
pub fn get_compressed_size(&self) -> u64 {
if self.compressed_size != u32::MAX {
self.compressed_size as u64
@ -237,6 +262,31 @@ impl FileHeader {
}
}
pub fn set_compressed_size(&mut self, compressed_size: u64) {
if let Some(ExtraField::Zip64(Zip64ExtraField {
compressed_size: Some(compressed_size_),
..
})) = self
.extra_field
.iter_mut()
.find(|f| matches!(f, ExtraField::Zip64(_)))
{
*compressed_size_ = compressed_size;
self.compressed_size = u32::MAX;
} else if compressed_size > u32::MAX as u64 {
self.extra_field.push(ExtraField::Zip64(Zip64ExtraField {
original_size: Some(self.uncompressed_size as u64),
compressed_size: Some(compressed_size),
disk_number: None,
offset_header: None,
}));
self.uncompressed_size = u32::MAX;
self.compressed_size = u32::MAX;
} else {
self.compressed_size = compressed_size as u32;
}
}
pub fn get_offset_local_header(&self) -> u64 {
if self.offset_local_header != u32::MAX {
self.offset_local_header as u64
@ -254,6 +304,32 @@ impl FileHeader {
}
}
pub fn set_offset_local_header(&mut self, offset: u64) {
if let Some(ExtraField::Zip64(Zip64ExtraField {
offset_header: Some(offset_header),
..
})) = self
.extra_field
.iter_mut()
.find(|f| matches!(f, ExtraField::Zip64(_)))
{
*offset_header = offset;
self.offset_local_header = u32::MAX;
} else if offset > u32::MAX as u64 {
self.extra_field.push(ExtraField::Zip64(Zip64ExtraField {
original_size: Some(self.uncompressed_size as u64),
compressed_size: Some(self.compressed_size as u64),
disk_number: None,
offset_header: Some(offset),
}));
self.uncompressed_size = u32::MAX;
self.compressed_size = u32::MAX;
self.offset_local_header = u32::MAX;
} else {
self.offset_local_header = offset as u32;
}
}
pub fn get_disk_number_start(&self) -> u32 {
if self.disk_number_start != u16::MAX {
self.disk_number_start as u32