From 940227416e3e152398b0fcb508481d7310a97cf7 Mon Sep 17 00:00:00 2001 From: Adrien Beraud <adrien.beraud@savoirfairelinux.com> Date: Tue, 8 Aug 2017 11:55:10 -0400 Subject: [PATCH] archiver: add Gzip support Add methods for Gzip file compression/decompression. Change-Id: I81d52c09a98b835c32d7a07ab2cb9a22aca19e8e Reviewed-by: Guillaume Roguez <guillaume.roguez@savoirfairelinux.com> --- src/archiver.cpp | 27 +++++++++++++++++++++++++++ src/archiver.h | 10 ++++++++++ 2 files changed, 37 insertions(+) diff --git a/src/archiver.cpp b/src/archiver.cpp index b90500538c..4c3c8631a6 100644 --- a/src/archiver.cpp +++ b/src/archiver.cpp @@ -223,6 +223,33 @@ compress(const std::string& str) return outbuffer; } +void +compressGzip(const std::string& str, const std::string& path) +{ + auto fi = gzopen(path.c_str(), "wb"); + gzwrite(fi, str.data(), str.size()); + gzclose(fi); +} + +std::vector<uint8_t> +decompressGzip(const std::string& path) +{ + std::vector<uint8_t> out; + auto fi = gzopen(path.c_str(),"rb"); + gzrewind(fi); + while (not gzeof(fi)) { + std::array<uint8_t, 32768> outbuffer; + int len = gzread(fi, outbuffer.data(), outbuffer.size()); + if (len == -1) { + gzclose(fi); + throw std::runtime_error("Exception during gzip decompression"); + } + out.insert(out.end(), outbuffer.begin(), outbuffer.begin() + len); + } + gzclose(fi); + return out; +} + std::vector<uint8_t> decompress(const std::vector<uint8_t>& str) { diff --git a/src/archiver.h b/src/archiver.h index cfdf613172..f7b637d041 100644 --- a/src/archiver.h +++ b/src/archiver.h @@ -64,6 +64,16 @@ std::vector<uint8_t> compress(const std::string& str); */ std::vector<uint8_t> decompress(const std::vector<uint8_t>& dat); +/** + * Compress string to a Gzip file + */ +void compressGzip(const std::string& str, const std::string& path); + +/** + * Decompress Gzip file to bytes + */ +std::vector<uint8_t> decompressGzip(const std::string& path); + } } // namespace ring -- GitLab