transfert file from zip to another (wip)
This commit is contained in:
parent
0d305fbe62
commit
0fdf619360
10 changed files with 512 additions and 273 deletions
|
|
@ -1,5 +1,6 @@
|
|||
use std::io::{SeekFrom, Write};
|
||||
|
||||
use crate::compression::CompressionMethod;
|
||||
use crate::extra_fields::{ExtraField, GenericExtraField, Zip64ExtraField};
|
||||
use crate::{cp437, general_purpose_flags, Encoding, Signature};
|
||||
use androscalpel_serializer::{ReadSeek, Result, Serializable};
|
||||
|
|
@ -9,7 +10,7 @@ pub struct LocalFileHeader {
|
|||
// signature: Signature(0x04034b50)
|
||||
pub version_needed_to_extract: u16,
|
||||
pub general_purpose_flags: u16,
|
||||
pub compression_method: u16,
|
||||
pub compression_method: CompressionMethod,
|
||||
pub last_mod_file_time: u16,
|
||||
pub last_mod_file_data: u16,
|
||||
pub crc_32: u32,
|
||||
|
|
@ -57,7 +58,7 @@ impl Serializable for LocalFileHeader {
|
|||
assert_eq!(signature, Self::SIGNATURE); // TODO
|
||||
let version_needed_to_extract = u16::deserialize(input)?;
|
||||
let general_purpose_flags = u16::deserialize(input)?;
|
||||
let compression_method = u16::deserialize(input)?;
|
||||
let compression_method = CompressionMethod::deserialize(input)?;
|
||||
let last_mod_file_time = u16::deserialize(input)?;
|
||||
let last_mod_file_data = u16::deserialize(input)?;
|
||||
let crc_32 = u32::deserialize(input)?;
|
||||
|
|
@ -103,8 +104,10 @@ impl Serializable for LocalFileHeader {
|
|||
header.extra_field.push(field);
|
||||
}
|
||||
}
|
||||
let mut failed_last_extra_field = false;
|
||||
if extra_size_read > extra_field_length as usize {
|
||||
println!("Failed to parsed last extra field in {}", header.get_name());
|
||||
//println!("Failed to parse last extra field in {}", header.get_name());
|
||||
failed_last_extra_field = true;
|
||||
let size = header.extra_field.pop().unwrap().size();
|
||||
input.seek(SeekFrom::Current(-(size as i64))).unwrap();
|
||||
}
|
||||
|
|
@ -113,6 +116,14 @@ impl Serializable for LocalFileHeader {
|
|||
header.malformed_extra_field.push(u8::deserialize(input)?);
|
||||
extra_size_read += 1;
|
||||
}
|
||||
// If it is not padding from zipalign
|
||||
if failed_last_extra_field
|
||||
&& header.malformed_extra_field != vec![0]
|
||||
&& header.malformed_extra_field != vec![0, 0]
|
||||
&& header.malformed_extra_field != vec![0, 0, 0]
|
||||
{
|
||||
println!("Failed to parse last extra field in {}", header.get_name());
|
||||
}
|
||||
//input.seek(SeekFrom::Start(end_of_extra_field)).unwrap();
|
||||
for field in &mut header.extra_field {
|
||||
if let ExtraField::Generic(GenericExtraField {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue