/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * License); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 */

// #include "gzip_compressor.h"

// using  namespace common;

//
// {
// namespace storage
// {

// GzipCompressor::GzipCompressor() : compressed_buf()
// {
//   zstream_valid_ = false;
// }

// GzipCompressor::~GzipCompressor()
// {
//   end_zstream();
// }

// int GzipCompressor::reset()
// {
//   int ret = E_OK;
//   if (RET_FAIL(end_zstream())) {
//   } else if (RET_FAIL(init_zstream())) {
//   }
//   return ret;
// }

// int GzipCompressor::init_zstream()
// {
//   if (zstream_valid_) {
//     return E_OK;
//   }
//   compress_stream_.zalloc = (alloc_func)0;  // Z_NULL
//   compress_stream_.zfree = (free_func)0;
//   compress_stream_.opaque = (voidpf)0;
//   compress_stream_.next_in = 0;
//   compress_stream_.avail_in = 0;
//   compress_stream_.next_out = 0;
//   compress_stream_.avail_out = 0;

//   memset(compressed_buf, 0, DEFLATE_BUFFER_SIZE);

//   if (deflateInit2(&compress_stream_,
//                    Z_DEFAULT_COMPRESSION,
//                    Z_DEFLATED,
//                    31,
//                    8,
//                    Z_DEFAULT_STRATEGY) != Z_OK) {
//     //log_err("gzip deflateInit2 failed");
//     return E_COMPRESS_ERR;
//   }
//   zstream_valid_ = true;
//   return E_OK;
// }

// int GzipCompressor::end_zstream()
// {
//   if (!zstream_valid_) {
//     return E_OK;
//   }
//   if(deflateEnd(&compress_stream_) != Z_OK) {
//     //log_err("deflateEnd failed");
//     return E_COMPRESS_ERR;
//   }
//   zstream_valid_ = false;
//   return E_OK;
// }

// int GzipCompressor::compress_into_bytestream(char *uncompressed_buf,
//                                              uint32_t uncompressed_buf_len,
//                                              ByteStream &out)
// {
//   int ret = Z_OK;

//   compress_stream_.next_in = (Bytef *)uncompressed_buf;
//   compress_stream_.avail_in = uncompressed_buf_len;
//   compress_stream_.next_out = (Bytef *)compressed_buf;
//   compress_stream_.avail_out = DEFLATE_BUFFER_SIZE;

//   if (uncompressed_buf == nullptr || uncompressed_buf_len == 0) {  // no more
//   data will come in
//     if (compress_stream_.next_out) {
//       while (ret != Z_STREAM_END) {
//         ret = deflate(&compress_stream_, Z_FINISH);
//         if(ret != Z_OK && ret != Z_STREAM_END) {
//           //log_err("deflate failed");
//           return E_COMPRESS_ERR;
//         }
//         out.write_buf(compressed_buf, DEFLATE_BUFFER_SIZE -
//         compress_stream_.avail_out); compress_stream_.next_out = (Bytef
//         *)compressed_buf; compress_stream_.avail_out = DEFLATE_BUFFER_SIZE;
//       }
//     }
//     return E_OK;
//   }

//   for (;;) {
//     ret = deflate(&compress_stream_, Z_NO_FLUSH);
//     if (ret != Z_OK) {
//       //log_err("deflate failed");
//       return E_COMPRESS_ERR;
//     }

//     if (compress_stream_.avail_in == 0) {  // current input data are all
//     consumed
//       out.write_buf(compressed_buf, DEFLATE_BUFFER_SIZE -
//       compress_stream_.avail_out); compress_stream_.next_out = (Bytef
//       *)compressed_buf; compress_stream_.avail_out = DEFLATE_BUFFER_SIZE;
//       break;
//     }
//     else if (compress_stream_.avail_out == 0) {  // no more space for output
//       out.write_buf(compressed_buf, DEFLATE_BUFFER_SIZE);
//       compress_stream_.next_out = (Bytef *)compressed_buf;
//       compress_stream_.avail_out = DEFLATE_BUFFER_SIZE;
//     }
//   }

//   return E_OK;
// }

// int GzipCompressor::compress(char *uncompressed_buf,
//                              uint32_t uncompressed_buf_len,
//                              char *&compressed_buf,
//                              uint32_t &compressed_buf_len)
// {
//   int ret = E_OK;
//   ByteStream out(DEFLATE_BUFFER_SIZE, MOD_COMPRESSOR_OBJ);
//   if (RET_FAIL(compress_into_bytestream(uncompressed_buf,
//   uncompressed_buf_len, out))) {
//     return ret;
//   }
//   if (RET_FAIL(compress_into_bytestream(nullptr, 0, out))) {
//     return ret;
//   }
//   compressed_buf = get_bytes_from_bytestream(out);
//   compressed_buf_len = out.total_size();
//   out.destroy();
//   return ret;
// }

// GzipDeCompressor::GzipDeCompressor() : decompressed_buf()
// {
//   zstream_valid_ = false;
// }

// GzipDeCompressor::~GzipDeCompressor()
// {
//   end_zstream();
// }

// int GzipDeCompressor::init_zstream()
// {
//   if (zstream_valid_) {
//     return E_OK;
//   }
//   decompress_stream_.zalloc = (alloc_func)0;  // Z_NULL
//   decompress_stream_.zfree = (free_func)0;
//   decompress_stream_.opaque = (voidpf)0;
//   decompress_stream_.next_in = 0;
//   decompress_stream_.avail_in = 0;
//   decompress_stream_.next_out = 0;
//   decompress_stream_.avail_out = 0;

//   memset(decompressed_buf, 0, INFLATE_BUFFER_SIZE);

//   if (inflateInit2(&decompress_stream_, 31) != Z_OK) {
//     //log_err("inflateInit2 failed");
//     return E_COMPRESS_ERR;
//   }
//   zstream_valid_ = true;
//   return E_OK;
// }

// int GzipDeCompressor::end_zstream()
// {
//   if (!zstream_valid_) {
//     return E_OK;
//   }
//   if(inflateEnd(&decompress_stream_) != Z_OK) {
//     //log_err("inflateEnd failed");
//     return E_COMPRESS_ERR;
//   }
//   zstream_valid_ = false;
//   return E_OK;
// }

// int GzipDeCompressor::reset()
// {
//   int ret = E_OK;
//   if (RET_FAIL(end_zstream())) {
//   } else if (RET_FAIL(init_zstream())) {
//   }
//   return ret;
// }

// int GzipDeCompressor::decompress_into_bytestream(char *compressed_buf,
//                                                  uint32_t compressed_buf_len,
//                                                  ByteStream &out)
// {
//   int ret = Z_OK;

//   decompress_stream_.next_in = (Bytef *)compressed_buf;
//   decompress_stream_.avail_in = compressed_buf_len;
//   decompress_stream_.next_out = (Bytef *)decompressed_buf;
//   decompress_stream_.avail_out = INFLATE_BUFFER_SIZE;

//   if (compressed_buf == nullptr || compressed_buf_len == 0) {
//     if (decompress_stream_.next_out) {
//       while (ret != Z_STREAM_END) {
//         ret = inflate(&decompress_stream_, Z_FINISH);
//         if(ret != Z_OK && ret != Z_STREAM_END) {
//           //log_err("inflate failed");
//           return E_COMPRESS_ERR;
//         }
//         out.write_buf(decompressed_buf, INFLATE_BUFFER_SIZE -
//         decompress_stream_.avail_out); decompress_stream_.next_out = (Bytef
//         *)decompressed_buf; decompress_stream_.avail_out =
//         INFLATE_BUFFER_SIZE;
//       }
//     }
//     return E_OK;
//   }

//   for (;;) {
//     ret = inflate(&decompress_stream_, Z_NO_FLUSH);
//     if (ret == Z_STREAM_END) {
//       out.write_buf(decompressed_buf, INFLATE_BUFFER_SIZE -
//       decompress_stream_.avail_out); break;
//     }
//     if (ret != Z_OK) {
//       //log_err("inflate failed");
//       return E_COMPRESS_ERR;
//     }
//     if (decompress_stream_.avail_in == 0) {
//       out.write_buf(decompressed_buf, INFLATE_BUFFER_SIZE -
//       decompress_stream_.avail_out); decompress_stream_.next_out = (Bytef
//       *)decompressed_buf; decompress_stream_.avail_out = INFLATE_BUFFER_SIZE;
//       break;
//     }
//     else if (decompress_stream_.avail_out == 0) {
//       out.write_buf(decompressed_buf, INFLATE_BUFFER_SIZE);
//       decompress_stream_.next_out = (Bytef *)decompressed_buf;
//       decompress_stream_.avail_out = INFLATE_BUFFER_SIZE;
//     }
//   }

//   return E_OK;
// }

// int GzipDeCompressor::uncompress(char *compressed_buf,
//                                  uint32_t compressed_buf_len,
//                                  char *&uncompressed_buf,
//                                  uint32_t &uncompressed_buf_len)
// {
//   int ret = E_OK;
//   ByteStream out(INFLATE_BUFFER_SIZE, MOD_COMPRESSOR_OBJ);
//   if(RET_FAIL(decompress_into_bytestream(compressed_buf, compressed_buf_len,
//   out))) {
//     return ret;
//   }
//   if (RET_FAIL(decompress_into_bytestream(nullptr, 0, out))) {
//     return ret;
//   }
//   uncompressed_buf = get_bytes_from_bytestream(out);
//   uncompressed_buf_len = out.total_size();
// //   uncompressed_buf[uncompressed_buf_len] = '\0';
//   out.destroy();
//   return ret;
// }

// } // end namespace storage
// } // end
