29enum class EncodedType {
48EncodedType EncodedTypeForValue(
const EncodableValue& value) {
49 switch (
value.index()) {
51 return EncodedType::kNull;
53 return std::get<bool>(value) ? EncodedType::kTrue : EncodedType::kFalse;
55 return EncodedType::kInt32;
57 return EncodedType::kInt64;
59 return EncodedType::kFloat64;
61 return EncodedType::kString;
63 return EncodedType::kUInt8List;
65 return EncodedType::kInt32List;
67 return EncodedType::kInt64List;
69 return EncodedType::kFloat64List;
71 return EncodedType::kList;
73 return EncodedType::kMap;
75 return EncodedType::kFloat32List;
78 return EncodedType::kNull;
100 stream->
WriteByte(
static_cast<uint8_t
>(EncodedTypeForValue(
value)));
102 switch (
value.index()) {
118 const auto& string_value = std::get<std::string>(
value);
119 size_t size = string_value.size();
123 reinterpret_cast<const uint8_t*
>(string_value.data()),
size);
128 WriteVector(std::get<std::vector<uint8_t>>(
value), stream);
131 WriteVector(std::get<std::vector<int32_t>>(
value), stream);
134 WriteVector(std::get<std::vector<int64_t>>(
value), stream);
137 WriteVector(std::get<std::vector<double>>(
value), stream);
140 const auto& list = std::get<EncodableList>(
value);
142 for (
const auto& item : list) {
148 const auto& map = std::get<EncodableMap>(
value);
150 for (
const auto& pair : map) {
158 <<
"Unhandled custom type in StandardCodecSerializer::WriteValue. "
159 <<
"Custom types require codec extensions." << std::endl;
162 WriteVector(std::get<std::vector<float>>(
value), stream);
171 switch (
static_cast<EncodedType
>(
type)) {
172 case EncodedType::kNull:
174 case EncodedType::kTrue:
176 case EncodedType::kFalse:
178 case EncodedType::kInt32:
180 case EncodedType::kInt64:
182 case EncodedType::kFloat64:
185 case EncodedType::kLargeInt:
186 case EncodedType::kString: {
188 std::string string_value;
189 string_value.resize(
size);
190 stream->
ReadBytes(
reinterpret_cast<uint8_t*
>(&string_value[0]),
size);
193 case EncodedType::kUInt8List:
194 return ReadVector<uint8_t>(stream);
195 case EncodedType::kInt32List:
196 return ReadVector<int32_t>(stream);
197 case EncodedType::kInt64List:
198 return ReadVector<int64_t>(stream);
199 case EncodedType::kFloat64List:
200 return ReadVector<double>(stream);
201 case EncodedType::kList: {
204 list_value.reserve(
length);
210 case EncodedType::kMap: {
216 map_value.emplace(std::move(
key), std::move(
value));
220 case EncodedType::kFloat32List: {
221 return ReadVector<float>(stream);
224 std::cerr <<
"Unknown type in StandardCodecSerializer::ReadValueOfType: "
225 <<
static_cast<int>(
type) << std::endl;
233 }
else if (
byte == 254) {
248 }
else if (
size <= 0xffff) {
250 uint16_t
value =
static_cast<uint16_t
>(
size);
254 uint32_t
value =
static_cast<uint32_t
>(
size);
263 std::vector<T> vector;
264 vector.resize(count);
265 uint8_t type_size =
static_cast<uint8_t
>(
sizeof(T));
269 stream->
ReadBytes(
reinterpret_cast<uint8_t*
>(vector.data()),
271 return EncodableValue(vector);
275void StandardCodecSerializer::WriteVector(
const std::vector<T> vector,
276 ByteStreamWriter* stream)
const {
277 size_t count = vector.size();
282 uint8_t type_size =
static_cast<uint8_t
>(
sizeof(T));
284 stream->WriteAlignment(type_size);
286 stream->WriteBytes(
reinterpret_cast<const uint8_t*
>(vector.data()),
299 std::unique_ptr<StandardMessageCodec>>;
300 auto it = sInstances->find(serializer);
301 if (it == sInstances->end()) {
305 auto emplace_result = sInstances->emplace(
306 serializer, std::unique_ptr<StandardMessageCodec>(
308 it = emplace_result.first;
310 return *(it->second);
315 : serializer_(serializer) {}
320 const uint8_t* binary_message,
321 size_t message_size)
const {
322 if (!binary_message) {
323 return std::make_unique<EncodableValue>();
326 return std::make_unique<EncodableValue>(serializer_->
ReadValue(&stream));
329std::unique_ptr<std::vector<uint8_t>>
332 auto encoded = std::make_unique<std::vector<uint8_t>>();
347 std::unique_ptr<StandardMethodCodec>>;
348 auto it = sInstances->find(serializer);
349 if (it == sInstances->end()) {
353 auto emplace_result = sInstances->emplace(
354 serializer, std::unique_ptr<StandardMethodCodec>(
356 it = emplace_result.first;
358 return *(it->second);
363 : serializer_(serializer) {}
367std::unique_ptr<MethodCall<EncodableValue>>
369 size_t message_size)
const {
372 const auto* method_name = std::get_if<std::string>(&method_name_value);
374 std::cerr <<
"Invalid method call; method name is not a string."
379 std::make_unique<EncodableValue>(serializer_->
ReadValue(&stream));
380 return std::make_unique<MethodCall<EncodableValue>>(*method_name,
381 std::move(arguments));
384std::unique_ptr<std::vector<uint8_t>>
387 auto encoded = std::make_unique<std::vector<uint8_t>>();
398std::unique_ptr<std::vector<uint8_t>>
401 auto encoded = std::make_unique<std::vector<uint8_t>>();
412std::unique_ptr<std::vector<uint8_t>>
414 const std::string& error_code,
415 const std::string& error_message,
417 auto encoded = std::make_unique<std::vector<uint8_t>>();
421 if (error_message.empty()) {
427 serializer_->
WriteValue(*error_details, &stream);
435 const uint8_t* response,
436 size_t response_size,
443 if (
value.IsNull()) {
454 const std::string& message_string =
457 result->
Error(std::get<std::string>(code), message_string);
459 result->
Error(std::get<std::string>(code), message_string, details);
uint8_t ReadByte() override
virtual uint8_t ReadByte()=0
virtual void ReadBytes(uint8_t *buffer, size_t length)=0
virtual void ReadAlignment(uint8_t alignment)=0
virtual void WriteByte(uint8_t byte)=0
void WriteInt64(int64_t value)
virtual void WriteBytes(const uint8_t *bytes, size_t length)=0
virtual void WriteAlignment(uint8_t alignment)=0
void WriteDouble(double value)
void WriteInt32(int32_t value)
void Error(const std::string &error_code, const std::string &error_message, const T &error_details)
void Success(const T &result)
virtual void WriteValue(const EncodableValue &value, ByteStreamWriter *stream) const
virtual ~StandardCodecSerializer()
void WriteSize(size_t size, ByteStreamWriter *stream) const
StandardCodecSerializer()
static const StandardCodecSerializer & GetInstance()
EncodableValue ReadValue(ByteStreamReader *stream) const
virtual EncodableValue ReadValueOfType(uint8_t type, ByteStreamReader *stream) const
size_t ReadSize(ByteStreamReader *stream) const
static const StandardMessageCodec & GetInstance(const StandardCodecSerializer *serializer=nullptr)
std::unique_ptr< EncodableValue > DecodeMessageInternal(const uint8_t *binary_message, const size_t message_size) const override
StandardMessageCodec(StandardMessageCodec const &)=delete
std::unique_ptr< std::vector< uint8_t > > EncodeMessageInternal(const EncodableValue &message) const override
std::unique_ptr< std::vector< uint8_t > > EncodeErrorEnvelopeInternal(const std::string &error_code, const std::string &error_message, const EncodableValue *error_details) const override
std::unique_ptr< std::vector< uint8_t > > EncodeMethodCallInternal(const MethodCall< EncodableValue > &method_call) const override
StandardMethodCodec(StandardMethodCodec const &)=delete
std::unique_ptr< std::vector< uint8_t > > EncodeSuccessEnvelopeInternal(const EncodableValue *result) const override
std::unique_ptr< MethodCall< EncodableValue > > DecodeMethodCallInternal(const uint8_t *message, size_t message_size) const override
static const StandardMethodCodec & GetInstance(const StandardCodecSerializer *serializer=nullptr)
bool DecodeAndProcessResponseEnvelopeInternal(const uint8_t *response, size_t response_size, MethodResult< EncodableValue > *result) const override
G_BEGIN_DECLS G_MODULE_EXPORT FlMethodCall * method_call
G_BEGIN_DECLS GBytes * message
it will be possible to load the file into Perfetto s trace viewer use test Running tests that layout and measure text will not yield consistent results across various platforms Enabling this option will make font resolution default to the Ahem test font on all disable asset Prevents usage of any non test fonts unless they were explicitly Loaded via prefetched default font Indicates whether the embedding started a prefetch of the default font manager before creating the engine run In non interactive keep the shell running after the Dart script has completed enable serial On low power devices with low core running concurrent GC tasks on threads can cause them to contend with the UI thread which could potentially lead to jank This option turns off all concurrent GC activities domain network JSON encoded network policy per domain This overrides the DisallowInsecureConnections switch Embedder can specify whether to allow or disallow insecure connections at a domain level old gen heap size
std::vector< EncodableValue > EncodableList
std::map< EncodableValue, EncodableValue > EncodableMap