diff --git a/Userland/Libraries/LibCompress/Gzip.cpp b/Userland/Libraries/LibCompress/Gzip.cpp index 10b6788b6b..d64a8fab6f 100644 --- a/Userland/Libraries/LibCompress/Gzip.cpp +++ b/Userland/Libraries/LibCompress/Gzip.cpp @@ -11,6 +11,7 @@ #include #include #include +#include namespace Compress { @@ -179,6 +180,22 @@ ErrorOr GzipDecompressor::decompress_all(ReadonlyBytes bytes) return output_buffer; } +ErrorOr GzipDecompressor::decompress_file(StringView input_filename, NonnullOwnPtr output_stream) +{ + auto input_file = TRY(Core::File::open(input_filename, Core::File::OpenMode::Read)); + auto input_stream = TRY(Core::BufferedFile::create(move(input_file), 256 * KiB)); + + auto gzip_stream = GzipDecompressor { move(input_stream) }; + auto buffer = TRY(ByteBuffer::create_uninitialized(256 * KiB)); + + while (!gzip_stream.is_eof()) { + auto span = TRY(gzip_stream.read_some(buffer)); + TRY(output_stream->write_until_depleted(span)); + } + + return {}; +} + bool GzipDecompressor::is_eof() const { return m_input_stream->is_eof(); } ErrorOr GzipDecompressor::write_some(ReadonlyBytes) diff --git a/Userland/Libraries/LibCompress/Gzip.h b/Userland/Libraries/LibCompress/Gzip.h index de5d103a9c..6dcfbd5113 100644 --- a/Userland/Libraries/LibCompress/Gzip.h +++ b/Userland/Libraries/LibCompress/Gzip.h @@ -52,6 +52,8 @@ public: virtual void close() override {}; static ErrorOr decompress_all(ReadonlyBytes); + static ErrorOr decompress_file(StringView input_file, NonnullOwnPtr output_stream); + static Optional describe_header(ReadonlyBytes); static bool is_likely_compressed(ReadonlyBytes bytes); diff --git a/Userland/Utilities/gunzip.cpp b/Userland/Utilities/gunzip.cpp index d7601c4561..5d4ef11af5 100644 --- a/Userland/Utilities/gunzip.cpp +++ b/Userland/Utilities/gunzip.cpp @@ -11,19 +11,6 @@ #include #include -static ErrorOr decompress_file(NonnullOwnPtr input_stream, Stream& output_stream) -{ - auto gzip_stream = Compress::GzipDecompressor { move(input_stream) }; - - auto buffer = TRY(ByteBuffer::create_uninitialized(256 * KiB)); - while (!gzip_stream.is_eof()) { - auto span = TRY(gzip_stream.read_some(buffer)); - TRY(output_stream.write_until_depleted(span)); - } - - return {}; -} - ErrorOr serenity_main(Main::Arguments args) { Vector filenames; @@ -51,12 +38,8 @@ ErrorOr serenity_main(Main::Arguments args) output_filename = filename; } - auto input_file = TRY(Core::File::open(input_filename, Core::File::OpenMode::Read)); - auto buffered_input_file = TRY(Core::BufferedFile::create(move(input_file), 256 * KiB)); - auto output_stream = write_to_stdout ? TRY(Core::File::standard_output()) : TRY(Core::File::open(output_filename, Core::File::OpenMode::Write)); - - TRY(decompress_file(move(buffered_input_file), *output_stream)); + TRY(Compress::GzipDecompressor::decompress_file(input_filename, move(output_stream))); if (!keep_input_files) TRY(Core::System::unlink(input_filename));