1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-26 01:27:43 +00:00

LibCompress: Port GzipDecompressor to Core::Stream

This commit is contained in:
Tim Schumacher 2022-11-29 15:43:31 +01:00 committed by Linus Groh
parent 4e7da96d58
commit f93c7fbb5e
9 changed files with 80 additions and 145 deletions

View file

@ -11,18 +11,17 @@
#include <LibMain/Main.h>
#include <unistd.h>
static bool decompress_file(Buffered<Core::InputFileStream>& input_stream, Buffered<Core::OutputFileStream>& output_stream)
static ErrorOr<void> decompress_file(NonnullOwnPtr<Core::Stream::File> input_stream, Buffered<Core::OutputFileStream>& output_stream)
{
auto gzip_stream = Compress::GzipDecompressor { input_stream };
auto gzip_stream = Compress::GzipDecompressor { move(input_stream) };
u8 buffer[4096];
while (!gzip_stream.has_any_error() && !gzip_stream.unreliable_eof()) {
auto const nread = gzip_stream.read({ buffer, sizeof(buffer) });
output_stream.write_or_error({ buffer, nread });
auto buffer = TRY(ByteBuffer::create_uninitialized(4096));
while (!gzip_stream.is_eof()) {
auto span = TRY(gzip_stream.read(buffer));
output_stream.write_or_error(span);
}
return !gzip_stream.handle_any_error();
return {};
}
ErrorOr<int> serenity_main(Main::Arguments args)
@ -52,20 +51,15 @@ ErrorOr<int> serenity_main(Main::Arguments args)
output_filename = filename;
}
auto input_stream_result = TRY(Core::InputFileStream::open_buffered(input_filename));
auto input_stream_result = TRY(Core::Stream::File::open(input_filename, Core::Stream::OpenMode::Read));
auto success = false;
if (write_to_stdout) {
auto stdout = Core::OutputFileStream::stdout_buffered();
success = decompress_file(input_stream_result, stdout);
TRY(decompress_file(move(input_stream_result), stdout));
} else {
auto output_stream_result = TRY(Core::OutputFileStream::open_buffered(output_filename));
success = decompress_file(input_stream_result, output_stream_result);
}
if (!success) {
warnln("Failed gzip decompressing input file");
return 1;
TRY(decompress_file(move(input_stream_result), output_stream_result));
}
if (!keep_input_files)

View file

@ -52,7 +52,7 @@ ErrorOr<int> serenity_main(Main::Arguments arguments)
AK::Optional<ByteBuffer> output_bytes;
if (decompress)
output_bytes = Compress::GzipDecompressor::decompress_all(input_bytes);
output_bytes = TRY(Compress::GzipDecompressor::decompress_all(input_bytes));
else
output_bytes = Compress::GzipCompressor::compress_all(input_bytes);

View file

@ -65,27 +65,10 @@ ErrorOr<int> serenity_main(Main::Arguments arguments)
if (!directory.is_empty())
TRY(Core::System::chdir(directory));
// FIXME: Remove these once we have smart pointers everywhere in LibArchive and LibCompress (or just ported the whole stack to Core::Stream).
// Until then, we have to hold on to _some_ instance of the file AK::Stream.
// Note that this is only in use together with gzip.
OwnPtr<Core::InputFileStream> file_stream;
NonnullOwnPtr<Core::Stream::Stream> input_stream = TRY(Core::Stream::File::open_file_or_standard_stream(archive_file, Core::Stream::OpenMode::Read));
auto input_stream = TRY([&]() -> ErrorOr<NonnullOwnPtr<Core::Stream::Stream>> {
if (gzip) {
// FIXME: Port gzip to Core::Stream.
auto file = Core::File::standard_input();
if (!archive_file.is_empty())
file = TRY(Core::File::open(archive_file, Core::OpenMode::ReadOnly));
file_stream = adopt_own(*new Core::InputFileStream(file));
NonnullOwnPtr<InputStream> gzip_stream = make<Compress::GzipDecompressor>(*file_stream);
return make<Core::Stream::WrappedAKInputStream>(move(gzip_stream));
} else {
return TRY(Core::Stream::File::open_file_or_standard_stream(archive_file, Core::Stream::OpenMode::Read));
}
}());
if (gzip)
input_stream = make<Compress::GzipDecompressor>(move(input_stream));
auto tar_stream = TRY(Archive::TarInputStream::construct(move(input_stream)));