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