blob: f79d1dba4e6b2a48cdc70b5899f677cfea56e767 [file] [log] [blame]
// Copyright 2017 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 "src/ledger/bin/storage/impl/file_index.h"
#include "src/ledger/bin/storage/impl/object_identifier_encoding.h"
namespace storage {
bool FileIndexSerialization::CheckValidFileIndexSerialization(
fxl::StringView data) {
flatbuffers::Verifier verifier(
reinterpret_cast<const unsigned char*>(data.data()), data.size());
return VerifyFileIndexBuffer(verifier);
}
Status FileIndexSerialization::ParseFileIndex(fxl::StringView content,
const FileIndex** file_index) {
if (!CheckValidFileIndexSerialization(content)) {
return Status::FORMAT_ERROR;
}
*file_index = GetFileIndex(content.data());
return Status::OK;
}
void FileIndexSerialization::BuildFileIndex(
const std::vector<ObjectIdentifierAndSize>& children,
std::unique_ptr<DataSource::DataChunk>* output, size_t* total_size) {
auto builder = std::make_unique<flatbuffers::FlatBufferBuilder>();
size_t local_total_size = 0u;
std::vector<flatbuffers::Offset<ObjectChild>> object_children;
for (const auto& identifier_and_size : children) {
local_total_size += identifier_and_size.size;
object_children.push_back(
CreateObjectChild(*builder, identifier_and_size.size,
ToObjectIdentifierStorage(
builder.get(), identifier_and_size.identifier)));
}
FinishFileIndexBuffer(
*builder, CreateFileIndex(*builder, local_total_size,
builder->CreateVector(object_children.data(),
object_children.size())));
*output = DataSource::DataChunk::Create(std::move(builder));
*total_size = local_total_size;
}
} // namespace storage