mirror of
https://github.com/RGBCube/serenity
synced 2025-07-26 04:37:44 +00:00
LibArchive: Extract logic for calculating ZIP statistics
This commit is contained in:
parent
60e35f2a97
commit
8d53442187
5 changed files with 63 additions and 25 deletions
33
Userland/Libraries/LibArchive/Statistics.h
Normal file
33
Userland/Libraries/LibArchive/Statistics.h
Normal file
|
@ -0,0 +1,33 @@
|
|||
/*
|
||||
* Copyright (c) 2023, Sam Atkins <atkinssj@serenityos.org>
|
||||
*
|
||||
* SPDX-License-Identifier: BSD-2-Clause
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <AK/Types.h>
|
||||
|
||||
namespace Archive {
|
||||
|
||||
class Statistics {
|
||||
public:
|
||||
Statistics(size_t file_count, size_t directory_count, size_t total_uncompressed_bytes)
|
||||
: m_file_count(file_count)
|
||||
, m_directory_count(directory_count)
|
||||
, m_total_uncompressed_bytes(total_uncompressed_bytes)
|
||||
{
|
||||
}
|
||||
|
||||
size_t file_count() const { return m_file_count; }
|
||||
size_t directory_count() const { return m_directory_count; }
|
||||
size_t member_count() const { return file_count() + directory_count(); }
|
||||
size_t total_uncompressed_bytes() const { return m_total_uncompressed_bytes; }
|
||||
|
||||
private:
|
||||
size_t m_file_count { 0 };
|
||||
size_t m_directory_count { 0 };
|
||||
size_t m_total_uncompressed_bytes { 0 };
|
||||
};
|
||||
|
||||
}
|
|
@ -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))
|
||||
{
|
||||
|
|
|
@ -15,6 +15,7 @@
|
|||
#include <AK/Stream.h>
|
||||
#include <AK/String.h>
|
||||
#include <AK/Vector.h>
|
||||
#include <LibArchive/Statistics.h>
|
||||
#include <LibCore/DateTime.h>
|
||||
#include <string.h>
|
||||
|
||||
|
@ -254,7 +255,8 @@ struct ZipMember {
|
|||
class Zip {
|
||||
public:
|
||||
static Optional<Zip> try_create(ReadonlyBytes buffer);
|
||||
ErrorOr<bool> for_each_member(Function<ErrorOr<IterationDecision>(ZipMember const&)>);
|
||||
ErrorOr<bool> for_each_member(Function<ErrorOr<IterationDecision>(ZipMember const&)>) const;
|
||||
ErrorOr<Statistics> calculate_statistics() const;
|
||||
|
||||
private:
|
||||
static bool find_end_of_central_directory_offset(ReadonlyBytes, size_t& offset);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue