blob: 4bd7aefd34113120bcd1d9a7aff30b6fcf45e4e7 [file] [log] [blame]
// Copyright 2016 The Chromium 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 "blimp/helium/coded_value_serializer.h"
#include <stdint.h>
#include <string>
#include "base/logging.h"
#include "blimp/helium/version_vector.h"
#include "third_party/protobuf/src/google/protobuf/io/coded_stream.h"
namespace blimp {
namespace helium {
namespace {
// Large (and arbitrary) size for sanity check on string deserialization.
constexpr uint32_t kMaxStringLength = (10 << 20); // 10MB
}
// -----------------------------
// int32_t serialization methods
void CodedValueSerializer::Serialize(
const int32_t& value,
google::protobuf::io::CodedOutputStream* output_stream) {
output_stream->WriteVarint32(static_cast<uint32_t>(value));
}
bool CodedValueSerializer::Deserialize(
google::protobuf::io::CodedInputStream* input_stream,
int32_t* value) {
return input_stream->ReadVarint32(reinterpret_cast<uint32_t*>(value));
}
// ---------------------------------
// std::string serialization methods
void CodedValueSerializer::Serialize(
const std::string& value,
google::protobuf::io::CodedOutputStream* output_stream) {
DCHECK_LT(value.length(), kMaxStringLength);
output_stream->WriteVarint32(value.length());
output_stream->WriteString(value);
}
bool CodedValueSerializer::Deserialize(
google::protobuf::io::CodedInputStream* input_stream,
std::string* value) {
uint32_t length;
if (input_stream->ReadVarint32(&length) && length < kMaxStringLength) {
return input_stream->ReadString(value, length);
}
return false;
}
// -----------------------------------
// VersionVector serialization methods
void CodedValueSerializer::Serialize(
const VersionVector& value,
google::protobuf::io::CodedOutputStream* output_stream) {
output_stream->WriteVarint64(value.local_revision());
output_stream->WriteVarint64(value.remote_revision());
}
bool CodedValueSerializer::Deserialize(
google::protobuf::io::CodedInputStream* input_stream,
VersionVector* value) {
Revision local_revision;
Revision remote_revision;
if (!input_stream->ReadVarint64(&local_revision) ||
!input_stream->ReadVarint64(&remote_revision)) {
return false;
}
value->set_local_revision(local_revision);
value->set_remote_revision(remote_revision);
return true;
}
// -----------------------------------
// uint64_t serialization methods
void CodedValueSerializer::Serialize(
const uint64_t& value,
google::protobuf::io::CodedOutputStream* output_stream) {
output_stream->WriteVarint64(value);
}
bool CodedValueSerializer::Deserialize(
google::protobuf::io::CodedInputStream* input_stream,
uint64_t* value) {
return input_stream->ReadVarint64(value);
}
} // namespace helium
} // namespace blimp