blob: fa0888be534085becdee1b856eabc3c4fde3be5c [file] [log] [blame]
// Copyright 2019 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.
#ifndef ZIRCON_SYSTEM_ULIB_BLOBFS_COMPRESSION_BLOB_COMPRESSOR_H_
#define ZIRCON_SYSTEM_ULIB_BLOBFS_COMPRESSION_BLOB_COMPRESSOR_H_
#ifndef __Fuchsia__
static_assert(false, "Fuchsia only header");
#endif
#include <lib/fzl/owned-vmo-mapper.h>
#include <zircon/types.h>
#include <memory>
#include <optional>
#include <fbl/macros.h>
#include <lz4/lz4frame.h>
#include <zstd/zstd.h>
#include "compressor.h"
namespace blobfs {
// A BlobCompressor is used to compress a blob transparently before it is written
// back to disk. This object owns the compression buffer, and abstracts away the
// differences between compression algorithms.
class BlobCompressor {
public:
// Initializes a compression object given the requested |algorithm| and input |blob_size|.
static std::optional<BlobCompressor> Create(CompressionAlgorithm algorithm, size_t blob_size);
DISALLOW_COPY_AND_ASSIGN_ALLOW_MOVE(BlobCompressor);
~BlobCompressor();
BlobCompressor(BlobCompressor&& o)
: compressor_(std::move(o.compressor_)), compressed_blob_(std::move(o.compressed_blob_)) {}
BlobCompressor& operator=(BlobCompressor&& o) {
compressor_ = std::move(o.compressor_);
compressed_blob_ = std::move(o.compressed_blob_);
return *this;
}
size_t Size() const { return compressor_->Size(); }
zx_status_t Update(const void* input_data, size_t input_length) {
return compressor_->Update(input_data, input_length);
}
zx_status_t End() { return compressor_->End(); }
// Returns a reference to a VMO containing the compressed blob.
const zx::vmo& Vmo() const { return compressed_blob_.vmo(); }
// Returns a reference to the compression buffer.
const void* Data() const { return compressed_blob_.start(); }
private:
BlobCompressor(std::unique_ptr<Compressor> compressor, fzl::OwnedVmoMapper compressed_blob);
std::unique_ptr<Compressor> compressor_;
fzl::OwnedVmoMapper compressed_blob_;
};
} // namespace blobfs
#endif // ZIRCON_SYSTEM_ULIB_BLOBFS_COMPRESSION_BLOB_COMPRESSOR_H_