blob: f90079ea572c38802c6dacb9274e4ae7ca0218f7 [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.
#pragma once
#ifndef __Fuchsia__
static_assert(false, "Fuchsia only header");
#endif
#include <optional>
#include <blobfs/compression/compressor.h>
#include <fbl/macros.h>
#include <fbl/unique_ptr.h>
#include <lib/fzl/owned-vmo-mapper.h>
#include <lz4/lz4frame.h>
#include <zircon/types.h>
#include <zstd/zstd.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(fbl::unique_ptr<Compressor> compressor, fzl::OwnedVmoMapper compressed_blob);
fbl::unique_ptr<Compressor> compressor_;
fzl::OwnedVmoMapper compressed_blob_;
};
} // namespace blobfs