blob: 05304a1ef863145fdc4c55db40b4a7c356b871aa [file] [log] [blame]
// Copyright 2023 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.
// This file includes implementation details specific to offline compression that should not
// be relied on (i.e. everything defined outside of RFC 0207).
#ifndef SRC_STORAGE_BLOBFS_DELIVERY_BLOB_PRIVATE_H_
#define SRC_STORAGE_BLOBFS_DELIVERY_BLOB_PRIVATE_H_
#include "src/storage/blobfs/delivery_blob.h"
namespace blobfs {
/// Metadata format corresponding to a delivery blob of type `DeliveryBlobType::kType1`.
struct MetadataType1 {
/// Flag indicating if the payload is compressed with the zstd-chunked format. If not set, the
/// payload is assumed to be an uncompressed blob.
static constexpr uint32_t kIsCompressed = 1ul << 0;
/// Mask of all valid flags.
static constexpr uint32_t kValidFlagsMask = kIsCompressed;
/// Header corresponding to a Type 1 blob to simplify usage.
static const DeliveryBlobHeader kHeader;
// Fields:
/// Expected length of payload, in bytes. May be compressed or uncompressed depending on `flags`.
uint64_t payload_length;
/// Checksum (CRC32) covering both header + metadata. Should be set to zero when calculating.
uint32_t checksum;
/// Flags indicating format and how to decode payload.
uint32_t flags;
/// Check if the metadata is valid. Requires `header` for checksum validation.
bool IsValid(const DeliveryBlobHeader& header) const;
bool IsCompressed() const { return flags & kIsCompressed; }
/// Calculate the checksum over the header and this metadata.
uint32_t Checksum(const DeliveryBlobHeader& header) const;
/// Create new `MetadataType1` with the specified `payload_length`. If `is_compressed` is
/// true, the payload is assumed to be in the zstd-chunked format. Otherwise, the payload
/// following the metadata ia assumed to be uncompressed.
static MetadataType1 Create(const DeliveryBlobHeader& header, size_t payload_length,
bool is_compressed);
/// Parse and return a `MetadataType1` from a byte `buffer` and a parsed `header`.
static zx::result<MetadataType1> FromBuffer(cpp20::span<const uint8_t> buffer,
const blobfs::DeliveryBlobHeader& header);
};
} // namespace blobfs
#endif // SRC_STORAGE_BLOBFS_DELIVERY_BLOB_PRIVATE_H_