LibCompress: Add a method that describes a Gzip Header

This can be used to display information about a gzip file that is
stored in it's header.
This commit is contained in:
Idan Horowitz 2021-05-07 23:40:02 +03:00 committed by Andreas Kling
parent 1b6824d296
commit 2119e0fb3f
Notes: sideshowbarker 2024-07-18 18:34:22 +09:00
2 changed files with 15 additions and 0 deletions

View file

@ -9,6 +9,7 @@
#include <AK/MemoryStream.h>
#include <AK/String.h>
#include <LibCore/DateTime.h>
namespace Compress {
@ -140,6 +141,19 @@ size_t GzipDecompressor::read(Bytes bytes)
return total_read;
}
Optional<String> GzipDecompressor::describe_header(ReadonlyBytes bytes)
{
if (bytes.size() < sizeof(BlockHeader))
return {};
auto& header = *(reinterpret_cast<const BlockHeader*>(bytes.data()));
if (!header.valid_magic_number() || !header.supported_by_implementation())
return {};
LittleEndian<u32> original_size = *reinterpret_cast<const u32*>(bytes.offset(bytes.size() - sizeof(u32)));
return String::formatted("last modified: {}, original size {}", Core::DateTime::from_timestamp(header.modification_time).to_string(), (u32)original_size);
}
bool GzipDecompressor::read_or_error(Bytes bytes)
{
if (read(bytes) < bytes.size()) {

View file

@ -50,6 +50,7 @@ public:
bool handle_any_error() override;
static Optional<ByteBuffer> decompress_all(ReadonlyBytes);
static Optional<String> describe_header(ReadonlyBytes);
static bool is_likely_compressed(ReadonlyBytes bytes);
private: