blob: c9388ca3c0ef29ee2444929c3bb3ce9ed3941d14 [file] [log] [blame]
// Copyright 2020 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include <zircon/assert.h>
#include <algorithm>
#include <src/lib/chunked-compression/chunked-compressor.h>
#include <src/lib/chunked-compression/status.h>
#include <src/lib/chunked-compression/streaming-chunked-compressor.h>
namespace chunked_compression {
ChunkedCompressor::ChunkedCompressor() : ChunkedCompressor(CompressionParams{}) {}
ChunkedCompressor::ChunkedCompressor(CompressionParams params) : inner_(params) {}
ChunkedCompressor::~ChunkedCompressor() {}
Status ChunkedCompressor::CompressBytes(const void* data, size_t data_len,
fbl::Array<uint8_t>* compressed_data_out,
size_t* bytes_written_out) {
ChunkedCompressor compressor;
size_t out_len = compressor.ComputeOutputSizeLimit(data_len);
fbl::Array<uint8_t> buf(new uint8_t[out_len], out_len);
Status status = compressor.Compress(data, data_len, buf.get(), out_len, bytes_written_out);
if (status == kStatusOk) {
*compressed_data_out = std::move(buf);
}
return status;
}
size_t ChunkedCompressor::ComputeOutputSizeLimit(size_t len) {
return inner_.ComputeOutputSizeLimit(len);
}
Status ChunkedCompressor::Compress(const void* data, size_t data_len, void* dst, size_t dst_len,
size_t* bytes_written_out) {
if (data_len == 0) {
*bytes_written_out = 0ul;
return kStatusOk;
}
Status status = inner_.Init(data_len, dst, dst_len);
if (status != kStatusOk) {
return status;
}
status = inner_.Update(data, data_len);
if (status != kStatusOk) {
return status;
}
status = inner_.Final(bytes_written_out);
if (status != kStatusOk) {
return status;
}
return kStatusOk;
}
} // namespace chunked_compression