blob: 623f0e75fd37a659d112f8ac23baaa812b8bf020 [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 "peridot/bin/ledger/storage/impl/object_identifier_encoding.h"
#include <limits>
#include "peridot/bin/ledger/storage/impl/object_digest.h"
namespace storage {
ObjectIdentifier ToObjectIdentifier(
const ObjectIdentifierStorage* object_identifier_storage) {
return {object_identifier_storage->key_index(),
object_identifier_storage->deletion_scope_id(),
ObjectDigest(object_identifier_storage->object_digest())};
}
flatbuffers::Offset<ObjectIdentifierStorage> ToObjectIdentifierStorage(
flatbuffers::FlatBufferBuilder* builder,
const ObjectIdentifier& object_identifier) {
return CreateObjectIdentifierStorage(
*builder, object_identifier.key_index(),
object_identifier.deletion_scope_id(),
convert::ToFlatBufferVector(
builder, object_identifier.object_digest().Serialize()));
}
std::string EncodeObjectIdentifier(const ObjectIdentifier& object_identifier) {
flatbuffers::FlatBufferBuilder builder;
builder.Finish(ToObjectIdentifierStorage(&builder, object_identifier));
return std::string(reinterpret_cast<const char*>(builder.GetBufferPointer()),
builder.GetSize());
}
bool DecodeObjectIdentifier(fxl::StringView data,
ObjectIdentifier* object_identifier) {
flatbuffers::Verifier verifier(
reinterpret_cast<const unsigned char*>(data.data()), data.size());
if (!VerifyObjectIdentifierStorageBuffer(verifier)) {
return false;
}
const ObjectIdentifierStorage* storage = GetObjectIdentifierStorage(
reinterpret_cast<const unsigned char*>(data.data()));
if (!IsObjectIdentifierStorageValid(storage)) {
return false;
}
*object_identifier = ToObjectIdentifier(storage);
return true;
}
bool IsObjectIdentifierStorageValid(const ObjectIdentifierStorage* storage) {
return storage && storage->object_digest() &&
IsDigestValid(storage->object_digest());
}
} // namespace storage