blob: 9b163d91d5c6181325a32f35d579a0576d057ff9 [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/object_identifier_encoding.h"
#include <limits>
#include "src/ledger/bin/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