diff options
author | eldritch horrors <pennae@lix.systems> | 2024-05-03 22:23:02 +0200 |
---|---|---|
committer | eldritch horrors <pennae@lix.systems> | 2024-06-19 10:50:12 +0000 |
commit | 67f778670c085615470b67eb3c54885b8c2d482e (patch) | |
tree | 414340cf5c91ff32286472206d71c588dd4ac260 /src/libutil/compression.cc | |
parent | 3425e90d76a311c6639b7c040f6a9e14856e18f4 (diff) |
libutil: add makeDecompressionSource
Change-Id: Iac7f24d79e24417436b9b5cbefd6af051aeea0a6
Diffstat (limited to 'src/libutil/compression.cc')
-rw-r--r-- | src/libutil/compression.cc | 21 |
1 files changed, 16 insertions, 5 deletions
diff --git a/src/libutil/compression.cc b/src/libutil/compression.cc index e78d76500..d93a1b1d6 100644 --- a/src/libutil/compression.cc +++ b/src/libutil/compression.cc @@ -192,11 +192,9 @@ struct BrotliDecompressionSource : Source std::string decompress(const std::string & method, std::string_view in) { - StringSink ssink; - auto sink = makeDecompressionSink(method, ssink); - (*sink)(in); - sink->finish(); - return std::move(ssink.s); + StringSource src{in}; + auto filter = makeDecompressionSource(method, src); + return filter->drain(); } std::unique_ptr<FinishSink> makeDecompressionSink(const std::string & method, Sink & nextSink) @@ -224,6 +222,19 @@ std::unique_ptr<FinishSink> makeDecompressionSink(const std::string & method, Si }); } +std::unique_ptr<Source> makeDecompressionSource(const std::string & method, Source & inner) +{ + if (method == "none" || method == "") { + return std::make_unique<LambdaSource>([&](char * data, size_t len) { + return inner.read(data, len); + }); + } else if (method == "br") { + return std::make_unique<BrotliDecompressionSource>(inner); + } else { + return std::make_unique<ArchiveDecompressionSource>(inner); + } +} + struct BrotliCompressionSink : ChunkedCompressionSink { Sink & nextSink; |