1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-28 09:57:36 +00:00

LibArchive: Add support for modification time and date

This commit is contained in:
Ollrogge 2023-02-08 18:34:27 +01:00 committed by Andrew Kaster
parent 361df6eff8
commit 0ce1c52577
4 changed files with 59 additions and 8 deletions

View file

@ -90,6 +90,8 @@ ErrorOr<bool> Zip::for_each_member(Function<IterationDecision(ZipMember const&)>
member.compression_method = central_directory_record.compression_method;
member.uncompressed_size = central_directory_record.uncompressed_size;
member.crc32 = central_directory_record.crc32;
member.modification_time = central_directory_record.modification_time;
member.modification_date = central_directory_record.modification_date;
member.is_directory = central_directory_record.external_attributes & zip_directory_external_attribute || member.name.bytes_as_string_view().ends_with('/'); // FIXME: better directory detection
if (callback(member) == IterationDecision::Break)
@ -122,8 +124,8 @@ ErrorOr<void> ZipOutputStream::add_member(ZipMember const& member)
.minimum_version = minimum_version_needed(member.compression_method),
.general_purpose_flags = { .flags = 0 },
.compression_method = static_cast<u16>(member.compression_method),
.modification_time = 0, // TODO: support modification time
.modification_date = 0,
.modification_time = member.modification_time,
.modification_date = member.modification_date,
.crc32 = member.crc32,
.compressed_size = static_cast<u32>(member.compressed_data.size()),
.uncompressed_size = member.uncompressed_size,
@ -150,8 +152,8 @@ ErrorOr<void> ZipOutputStream::finish()
.minimum_version = zip_version,
.general_purpose_flags = { .flags = 0 },
.compression_method = member.compression_method,
.modification_time = 0, // TODO: support modification time
.modification_date = 0,
.modification_time = member.modification_time,
.modification_date = member.modification_date,
.crc32 = member.crc32,
.compressed_size = static_cast<u32>(member.compressed_data.size()),
.uncompressed_size = member.uncompressed_size,

View file

@ -8,6 +8,7 @@
#pragma once
#include <AK/Array.h>
#include <AK/DOSPackedTime.h>
#include <AK/Function.h>
#include <AK/IterationDecision.h>
#include <AK/String.h>
@ -112,8 +113,8 @@ struct [[gnu::packed]] CentralDirectoryRecord {
u16 minimum_version;
ZipGeneralPurposeFlags general_purpose_flags;
ZipCompressionMethod compression_method;
u16 modification_time;
u16 modification_date;
DOSPackedTime modification_time;
DOSPackedDate modification_date;
u32 crc32;
u32 compressed_size;
u32 uncompressed_size;
@ -186,8 +187,8 @@ struct [[gnu::packed]] LocalFileHeader {
u16 minimum_version;
ZipGeneralPurposeFlags general_purpose_flags;
u16 compression_method;
u16 modification_time;
u16 modification_date;
DOSPackedTime modification_time;
DOSPackedDate modification_date;
u32 crc32;
u32 compressed_size;
u32 uncompressed_size;
@ -244,6 +245,8 @@ struct ZipMember {
u32 uncompressed_size;
u32 crc32;
bool is_directory;
DOSPackedTime modification_time;
DOSPackedDate modification_date;
};
class Zip {