mirror of
https://github.com/RGBCube/serenity
synced 2025-07-26 09:57:34 +00:00
LibCompress: Switch DeflateCompressor
to a fallible constructor
This commit is contained in:
parent
8cd2cf2b77
commit
f4afee4278
4 changed files with 19 additions and 10 deletions
|
@ -438,10 +438,17 @@ ErrorOr<void> DeflateDecompressor::decode_codes(CanonicalCode& literal_code, Opt
|
||||||
return {};
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
DeflateCompressor::DeflateCompressor(Core::Stream::Handle<Core::Stream::Stream> stream, CompressionLevel compression_level)
|
ErrorOr<NonnullOwnPtr<DeflateCompressor>> DeflateCompressor::construct(Core::Stream::Handle<Core::Stream::Stream> stream, CompressionLevel compression_level)
|
||||||
|
{
|
||||||
|
auto bit_stream = TRY(Core::Stream::LittleEndianOutputBitStream::construct(move(stream)));
|
||||||
|
auto deflate_compressor = TRY(adopt_nonnull_own_or_enomem(new (nothrow) DeflateCompressor(move(bit_stream), compression_level)));
|
||||||
|
return deflate_compressor;
|
||||||
|
}
|
||||||
|
|
||||||
|
DeflateCompressor::DeflateCompressor(NonnullOwnPtr<Core::Stream::LittleEndianOutputBitStream> stream, CompressionLevel compression_level)
|
||||||
: m_compression_level(compression_level)
|
: m_compression_level(compression_level)
|
||||||
, m_compression_constants(compression_constants[static_cast<int>(m_compression_level)])
|
, m_compression_constants(compression_constants[static_cast<int>(m_compression_level)])
|
||||||
, m_output_stream(Core::Stream::LittleEndianOutputBitStream::construct(move(stream)).release_value_but_fixme_should_propagate_errors())
|
, m_output_stream(move(stream))
|
||||||
{
|
{
|
||||||
m_symbol_frequencies.fill(0);
|
m_symbol_frequencies.fill(0);
|
||||||
m_distance_frequencies.fill(0);
|
m_distance_frequencies.fill(0);
|
||||||
|
@ -1002,10 +1009,10 @@ ErrorOr<void> DeflateCompressor::final_flush()
|
||||||
ErrorOr<ByteBuffer> DeflateCompressor::compress_all(ReadonlyBytes bytes, CompressionLevel compression_level)
|
ErrorOr<ByteBuffer> DeflateCompressor::compress_all(ReadonlyBytes bytes, CompressionLevel compression_level)
|
||||||
{
|
{
|
||||||
auto output_stream = TRY(try_make<Core::Stream::AllocatingMemoryStream>());
|
auto output_stream = TRY(try_make<Core::Stream::AllocatingMemoryStream>());
|
||||||
DeflateCompressor deflate_stream { Core::Stream::Handle<Core::Stream::Stream>(*output_stream), compression_level };
|
auto deflate_stream = TRY(DeflateCompressor::construct(Core::Stream::Handle<Core::Stream::Stream>(*output_stream), compression_level));
|
||||||
|
|
||||||
TRY(deflate_stream.write_entire_buffer(bytes));
|
TRY(deflate_stream->write_entire_buffer(bytes));
|
||||||
TRY(deflate_stream.final_flush());
|
TRY(deflate_stream->final_flush());
|
||||||
|
|
||||||
auto buffer = TRY(ByteBuffer::create_uninitialized(output_stream->used_buffer_size()));
|
auto buffer = TRY(ByteBuffer::create_uninitialized(output_stream->used_buffer_size()));
|
||||||
TRY(output_stream->read_entire_buffer(buffer));
|
TRY(output_stream->read_entire_buffer(buffer));
|
||||||
|
|
|
@ -139,7 +139,7 @@ public:
|
||||||
BEST // WARNING: this one can take an unreasonable amount of time!
|
BEST // WARNING: this one can take an unreasonable amount of time!
|
||||||
};
|
};
|
||||||
|
|
||||||
DeflateCompressor(Core::Stream::Handle<Core::Stream::Stream>, CompressionLevel = CompressionLevel::GOOD);
|
static ErrorOr<NonnullOwnPtr<DeflateCompressor>> construct(Core::Stream::Handle<Core::Stream::Stream>, CompressionLevel = CompressionLevel::GOOD);
|
||||||
~DeflateCompressor();
|
~DeflateCompressor();
|
||||||
|
|
||||||
virtual ErrorOr<Bytes> read(Bytes) override;
|
virtual ErrorOr<Bytes> read(Bytes) override;
|
||||||
|
@ -152,6 +152,8 @@ public:
|
||||||
static ErrorOr<ByteBuffer> compress_all(ReadonlyBytes bytes, CompressionLevel = CompressionLevel::GOOD);
|
static ErrorOr<ByteBuffer> compress_all(ReadonlyBytes bytes, CompressionLevel = CompressionLevel::GOOD);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
DeflateCompressor(NonnullOwnPtr<Core::Stream::LittleEndianOutputBitStream>, CompressionLevel = CompressionLevel::GOOD);
|
||||||
|
|
||||||
Bytes pending_block() { return { m_rolling_window + block_size, block_size }; }
|
Bytes pending_block() { return { m_rolling_window + block_size, block_size }; }
|
||||||
|
|
||||||
// LZ77 Compression
|
// LZ77 Compression
|
||||||
|
|
|
@ -194,9 +194,9 @@ ErrorOr<size_t> GzipCompressor::write(ReadonlyBytes bytes)
|
||||||
header.extra_flags = 3; // DEFLATE sets 2 for maximum compression and 4 for minimum compression
|
header.extra_flags = 3; // DEFLATE sets 2 for maximum compression and 4 for minimum compression
|
||||||
header.operating_system = 3; // unix
|
header.operating_system = 3; // unix
|
||||||
TRY(m_output_stream->write_entire_buffer({ &header, sizeof(header) }));
|
TRY(m_output_stream->write_entire_buffer({ &header, sizeof(header) }));
|
||||||
DeflateCompressor compressed_stream { Core::Stream::Handle(*m_output_stream) };
|
auto compressed_stream = TRY(DeflateCompressor::construct(Core::Stream::Handle(*m_output_stream)));
|
||||||
TRY(compressed_stream.write_entire_buffer(bytes));
|
TRY(compressed_stream->write_entire_buffer(bytes));
|
||||||
TRY(compressed_stream.final_flush());
|
TRY(compressed_stream->final_flush());
|
||||||
Crypto::Checksum::CRC32 crc32;
|
Crypto::Checksum::CRC32 crc32;
|
||||||
crc32.update(bytes);
|
crc32.update(bytes);
|
||||||
LittleEndian<u32> digest = crc32.digest();
|
LittleEndian<u32> digest = crc32.digest();
|
||||||
|
|
|
@ -83,7 +83,7 @@ ErrorOr<NonnullOwnPtr<ZlibCompressor>> ZlibCompressor::construct(Core::Stream::H
|
||||||
ZlibCompressor::ZlibCompressor(Core::Stream::Handle<Core::Stream::Stream> stream, ZlibCompressionLevel compression_level)
|
ZlibCompressor::ZlibCompressor(Core::Stream::Handle<Core::Stream::Stream> stream, ZlibCompressionLevel compression_level)
|
||||||
: m_output_stream(move(stream))
|
: m_output_stream(move(stream))
|
||||||
// FIXME: Find a way to compress with Deflate's "Best" compression level.
|
// FIXME: Find a way to compress with Deflate's "Best" compression level.
|
||||||
, m_compressor(make<DeflateCompressor>(Core::Stream::Handle(*m_output_stream), static_cast<DeflateCompressor::CompressionLevel>(compression_level)))
|
, m_compressor(DeflateCompressor::construct(Core::Stream::Handle(*m_output_stream), static_cast<DeflateCompressor::CompressionLevel>(compression_level)).release_value_but_fixme_should_propagate_errors())
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue