124 lines
4.1 KiB
Plaintext
124 lines
4.1 KiB
Plaintext
|
// This file is generated by ValueConversions_cpp.template.
|
||
|
|
||
|
// Copyright 2020 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 {{format_include(config.protocol.package, "Protocol")}}
|
||
|
|
||
|
#include <algorithm>
|
||
|
#include <climits>
|
||
|
#include <string>
|
||
|
|
||
|
//#include "ValueConversions.h"
|
||
|
//#include "Values.h"
|
||
|
|
||
|
{% for namespace in config.protocol.namespace %}
|
||
|
namespace {{namespace}} {
|
||
|
{% endfor %}
|
||
|
|
||
|
{% for namespace in config.protocol.namespace %}
|
||
|
} // namespce
|
||
|
{% endfor %}
|
||
|
|
||
|
|
||
|
namespace {{config.crdtp.namespace}} {
|
||
|
|
||
|
namespace {
|
||
|
|
||
|
using {{"::".join(config.protocol.namespace)}}::Binary;
|
||
|
using {{"::".join(config.protocol.namespace)}}::Object;
|
||
|
using {{"::".join(config.protocol.namespace)}}::Value;
|
||
|
using {{"::".join(config.protocol.namespace)}}::String;
|
||
|
using {{"::".join(config.protocol.namespace)}}::DictionaryValue;
|
||
|
using {{"::".join(config.protocol.namespace)}}::FundamentalValue;
|
||
|
using {{"::".join(config.protocol.namespace)}}::StringValue;
|
||
|
using {{"::".join(config.protocol.namespace)}}::StringUtil;
|
||
|
//using {{"::".join(config.protocol.namespace)}}::EncodeString;
|
||
|
|
||
|
std::unique_ptr<Value> ReadValue(DeserializerState* state) {
|
||
|
cbor::CBORTokenizer* tokenizer = state->tokenizer();
|
||
|
switch (tokenizer->TokenTag()) {
|
||
|
case cbor::CBORTokenTag::TRUE_VALUE:
|
||
|
return FundamentalValue::create(true);
|
||
|
case cbor::CBORTokenTag::FALSE_VALUE:
|
||
|
return FundamentalValue::create(false);
|
||
|
case cbor::CBORTokenTag::NULL_VALUE:
|
||
|
return Value::null();
|
||
|
case cbor::CBORTokenTag::INT32:
|
||
|
return FundamentalValue::create(tokenizer->GetInt32());
|
||
|
case cbor::CBORTokenTag::DOUBLE:
|
||
|
return FundamentalValue::create(tokenizer->GetDouble());
|
||
|
case cbor::CBORTokenTag::STRING8: {
|
||
|
const auto str = tokenizer->GetString8();
|
||
|
return StringValue::create(StringUtil::fromUTF8(str.data(), str.size()));
|
||
|
}
|
||
|
case cbor::CBORTokenTag::STRING16: {
|
||
|
const auto str = tokenizer->GetString16WireRep();
|
||
|
return StringValue::create(StringUtil::fromUTF16LE(reinterpret_cast<const uint16_t*>(str.data()), str.size() / 2));
|
||
|
}
|
||
|
case cbor::CBORTokenTag::ENVELOPE: {
|
||
|
const auto env = tokenizer->GetEnvelope();
|
||
|
return Value::parseBinary(env.data(), env.size());
|
||
|
}
|
||
|
// Intentionally not supported.
|
||
|
case cbor::CBORTokenTag::BINARY:
|
||
|
// Should not be encountered outside of envelope.
|
||
|
case cbor::CBORTokenTag::MAP_START:
|
||
|
case cbor::CBORTokenTag::ARRAY_START:
|
||
|
default:
|
||
|
state->RegisterError(Error::CBOR_UNSUPPORTED_VALUE);
|
||
|
return nullptr;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
} // namespace
|
||
|
|
||
|
// static
|
||
|
bool ProtocolTypeTraits<std::unique_ptr<Value>>::Deserialize(
|
||
|
DeserializerState* state, std::unique_ptr<Value>* value) {
|
||
|
auto result = ReadValue(state);
|
||
|
if (!result)
|
||
|
return false;
|
||
|
*value = std::move(result);
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
// static
|
||
|
void ProtocolTypeTraits<std::unique_ptr<Value>>::Serialize(
|
||
|
const std::unique_ptr<Value>& value, std::vector<uint8_t>* bytes) {
|
||
|
value->AppendSerialized(bytes);
|
||
|
}
|
||
|
|
||
|
// static
|
||
|
bool ProtocolTypeTraits<std::unique_ptr<DictionaryValue>>::Deserialize(
|
||
|
DeserializerState* state, std::unique_ptr<DictionaryValue>* value) {
|
||
|
std::unique_ptr<Value> res;
|
||
|
if (!ProtocolTypeTraits<std::unique_ptr<Value>>::Deserialize(state, &res))
|
||
|
return false;
|
||
|
*value = DictionaryValue::cast(std::move(res));
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
// static
|
||
|
void ProtocolTypeTraits<std::unique_ptr<DictionaryValue>>::Serialize(
|
||
|
const std::unique_ptr<DictionaryValue>& value, std::vector<uint8_t>* bytes) {
|
||
|
value->AppendSerialized(bytes);
|
||
|
}
|
||
|
|
||
|
// static
|
||
|
bool ProtocolTypeTraits<std::unique_ptr<Object>>::Deserialize(DeserializerState* state, std::unique_ptr<Object>* value) {
|
||
|
auto res = DictionaryValue::create();
|
||
|
if (ProtocolTypeTraits<std::unique_ptr<DictionaryValue>>::Deserialize(state, &res)) {
|
||
|
*value = std::make_unique<Object>(std::move(res));
|
||
|
return true;
|
||
|
}
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
void ProtocolTypeTraits<std::unique_ptr<Object>>::Serialize(const std::unique_ptr<Object>& value, std::vector<uint8_t>* bytes) {
|
||
|
value->AppendSerialized(bytes);
|
||
|
}
|
||
|
|
||
|
} // namespace {{config.crdtp.namespace}}
|