1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-02 23:52:07 +00:00

LibArchive: Extract logic for calculating ZIP statistics

This commit is contained in:
Sam Atkins 2023-07-27 14:21:12 +01:00 committed by Sam Atkins
parent 60e35f2a97
commit 8d53442187
5 changed files with 63 additions and 25 deletions

View file

@ -77,7 +77,7 @@ Optional<Zip> Zip::try_create(ReadonlyBytes buffer)
};
}
ErrorOr<bool> Zip::for_each_member(Function<ErrorOr<IterationDecision>(ZipMember const&)> callback)
ErrorOr<bool> Zip::for_each_member(Function<ErrorOr<IterationDecision>(ZipMember const&)> callback) const
{
size_t member_offset = m_members_start_offset;
for (size_t i = 0; i < m_member_count; i++) {
@ -104,6 +104,24 @@ ErrorOr<bool> Zip::for_each_member(Function<ErrorOr<IterationDecision>(ZipMember
return true;
}
ErrorOr<Statistics> Zip::calculate_statistics() const
{
size_t file_count = 0;
size_t directory_count = 0;
size_t uncompressed_bytes = 0;
TRY(for_each_member([&](auto zip_member) -> ErrorOr<IterationDecision> {
if (zip_member.is_directory)
directory_count++;
else
file_count++;
uncompressed_bytes += zip_member.uncompressed_size;
return IterationDecision::Continue;
}));
return Statistics(file_count, directory_count, uncompressed_bytes);
}
ZipOutputStream::ZipOutputStream(NonnullOwnPtr<Stream> stream)
: m_stream(move(stream))
{