/* * Copyright (c) 2020, the SerenityOS developers. * * SPDX-License-Identifier: BSD-2-Clause */ #pragma once #include #include #include #include #include #include #include #include #include namespace Compress { enum class ZlibCompressionMethod : u8 { Deflate = 8, }; enum class ZlibCompressionLevel : u8 { Fastest, Fast, Default, Best, }; struct ZlibHeader { union { struct { ZlibCompressionMethod compression_method : 4; u8 compression_info : 4; u8 check_bits : 5; bool present_dictionary : 1; ZlibCompressionLevel compression_level : 2; }; NetworkOrdered as_u16; }; }; static_assert(sizeof(ZlibHeader) == sizeof(u16)); class ZlibDecompressor { public: Optional decompress(); u32 checksum(); static Optional try_create(ReadonlyBytes data); static Optional decompress_all(ReadonlyBytes); private: ZlibDecompressor(ZlibHeader, ReadonlyBytes data); ZlibHeader m_header; u32 m_checksum { 0 }; ReadonlyBytes m_input_data; ReadonlyBytes m_data_bytes; }; class ZlibCompressor : public AK::Stream { public: static ErrorOr> construct(MaybeOwned, ZlibCompressionLevel = ZlibCompressionLevel::Default); ~ZlibCompressor(); virtual ErrorOr read(Bytes) override; virtual ErrorOr write(ReadonlyBytes) override; virtual bool is_eof() const override; virtual bool is_open() const override; virtual void close() override; ErrorOr finish(); static ErrorOr compress_all(ReadonlyBytes bytes, ZlibCompressionLevel = ZlibCompressionLevel::Default); private: ZlibCompressor(MaybeOwned stream, NonnullOwnPtr compressor_stream); ErrorOr write_header(ZlibCompressionMethod, ZlibCompressionLevel); bool m_finished { false }; MaybeOwned m_output_stream; NonnullOwnPtr m_compressor; Crypto::Checksum::Adler32 m_adler32_checksum; }; }