// 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}}