| // 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 "peridot/bin/ledger/storage/impl/file_index.h" |
| |
| #include "peridot/bin/ledger/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 |