Flutter macOS Embedder
FlutterStandardCodecHelper.cc File Reference
#include "flutter/shell/platform/darwin/common/framework/Source/FlutterStandardCodecHelper.h"
#include <stdint.h>
#include <vector>
#include "flutter/fml/logging.h"

Go to the source code of this file.

Functions

void FlutterStandardCodecHelperReadAlignment (unsigned long *location, uint8_t alignment)
 
static uint8_t PeekByte (unsigned long location, CFDataRef data)
 
void FlutterStandardCodecHelperReadBytes (unsigned long *location, unsigned long length, void *destination, CFDataRef data)
 
uint8_t FlutterStandardCodecHelperReadByte (unsigned long *location, CFDataRef data)
 
uint32_t FlutterStandardCodecHelperReadSize (unsigned long *location, CFDataRef data)
 
static CFDataRef ReadDataNoCopy (unsigned long *location, unsigned long length, CFDataRef data)
 
CFStringRef FlutterStandardCodecHelperReadUTF8 (unsigned long *location, CFDataRef data)
 
static CFTypeRef FastReadValue (unsigned long *location, CFDataRef data, CFTypeRef(*ReadValue)(CFTypeRef), CFTypeRef(*ReadTypedDataOfType)(FlutterStandardField, CFTypeRef), CFTypeRef user_data)
 
CFTypeRef FlutterStandardCodecHelperReadValueOfType (unsigned long *location, CFDataRef data, uint8_t type, CFTypeRef(*ReadValue)(CFTypeRef), CFTypeRef(*ReadTypedDataOfType)(FlutterStandardField, CFTypeRef), CFTypeRef user_data)
 
void FlutterStandardCodecHelperWriteByte (CFMutableDataRef data, uint8_t value)
 
void FlutterStandardCodecHelperWriteBytes (CFMutableDataRef data, const void *bytes, unsigned long length)
 
void FlutterStandardCodecHelperWriteSize (CFMutableDataRef data, uint32_t size)
 
void FlutterStandardCodecHelperWriteAlignment (CFMutableDataRef data, uint8_t alignment)
 
void FlutterStandardCodecHelperWriteUTF8 (CFMutableDataRef data, CFStringRef value)
 
void FlutterStandardCodecHelperWriteData (CFMutableDataRef data, CFDataRef value)
 
bool FlutterStandardCodecHelperWriteNumber (CFMutableDataRef data, CFNumberRef number)
 

Function Documentation

◆ FastReadValue()

static CFTypeRef FastReadValue ( unsigned long *  location,
CFDataRef  data,
CFTypeRef(*)(CFTypeRef)  ReadValue,
CFTypeRef(*)(FlutterStandardField, CFTypeRef)  ReadTypedDataOfType,
CFTypeRef  user_data 
)
inlinestatic

Definition at line 87 of file FlutterStandardCodecHelper.cc.

92  {
93  uint8_t type = PeekByte(*location, data);
95  *location += 1;
97  location, data, type, ReadValue, ReadTypedDataOfType, user_data);
98  } else {
99  return ReadValue(user_data);
100  }
101 }

References FlutterStandardCodecHelperReadValueOfType(), FlutterStandardFieldIsStandardType(), PeekByte(), and user_data.

Referenced by FlutterStandardCodecHelperReadValueOfType().

◆ FlutterStandardCodecHelperReadAlignment()

void FlutterStandardCodecHelperReadAlignment ( unsigned long *  location,
uint8_t  alignment 
)

Definition at line 18 of file FlutterStandardCodecHelper.cc.

19  {
20  uint8_t mod = *location % alignment;
21  if (mod) {
22  *location += (alignment - mod);
23  }
24 }

Referenced by FlutterStandardCodecHelperReadValueOfType(), and FlutterStandardReader::readAlignment:.

◆ FlutterStandardCodecHelperReadByte()

uint8_t FlutterStandardCodecHelperReadByte ( unsigned long *  location,
CFDataRef  data 
)

Definition at line 42 of file FlutterStandardCodecHelper.cc.

43  {
44  uint8_t value;
45  FlutterStandardCodecHelperReadBytes(location, 1, &value, data);
46  return value;
47 }

References FlutterStandardCodecHelperReadBytes().

Referenced by FlutterStandardCodecHelperReadSize(), and FlutterStandardReader::readByte.

◆ FlutterStandardCodecHelperReadBytes()

void FlutterStandardCodecHelperReadBytes ( unsigned long *  location,
unsigned long  length,
void *  destination,
CFDataRef  data 
)

Definition at line 33 of file FlutterStandardCodecHelper.cc.

36  {
37  CFRange range = CFRangeMake(*location, length);
38  CFDataGetBytes(data, range, static_cast<UInt8*>(destination));
39  *location += length;
40 }

Referenced by FlutterStandardCodecHelperReadByte(), FlutterStandardCodecHelperReadSize(), FlutterStandardCodecHelperReadValueOfType(), and FlutterStandardReader::readBytes:length:.

◆ FlutterStandardCodecHelperReadSize()

uint32_t FlutterStandardCodecHelperReadSize ( unsigned long *  location,
CFDataRef  data 
)

Definition at line 49 of file FlutterStandardCodecHelper.cc.

50  {
51  uint8_t byte = FlutterStandardCodecHelperReadByte(location, data);
52  if (byte < 254) {
53  return (uint32_t)byte;
54  } else if (byte == 254) {
55  UInt16 value;
56  FlutterStandardCodecHelperReadBytes(location, 2, &value, data);
57  return value;
58  } else {
59  UInt32 value;
60  FlutterStandardCodecHelperReadBytes(location, 4, &value, data);
61  return value;
62  }
63 }

References FlutterStandardCodecHelperReadByte(), and FlutterStandardCodecHelperReadBytes().

Referenced by FlutterStandardCodecHelperReadUTF8(), FlutterStandardCodecHelperReadValueOfType(), and FlutterStandardReader::readSize.

◆ FlutterStandardCodecHelperReadUTF8()

CFStringRef FlutterStandardCodecHelperReadUTF8 ( unsigned long *  location,
CFDataRef  data 
)

Definition at line 75 of file FlutterStandardCodecHelper.cc.

76  {
77  uint32_t size = FlutterStandardCodecHelperReadSize(location, data);
78  CFDataRef bytes = ReadDataNoCopy(location, size, data);
79  CFStringRef result = CFStringCreateFromExternalRepresentation(
80  kCFAllocatorDefault, bytes, kCFStringEncodingUTF8);
81  return static_cast<CFStringRef>(CFAutorelease(result));
82 }

References FlutterStandardCodecHelperReadSize(), and ReadDataNoCopy().

Referenced by FlutterStandardCodecHelperReadValueOfType(), and FlutterStandardReader::readUTF8.

◆ FlutterStandardCodecHelperReadValueOfType()

CFTypeRef FlutterStandardCodecHelperReadValueOfType ( unsigned long *  location,
CFDataRef  data,
uint8_t  type,
CFTypeRef(*)(CFTypeRef)  ReadValue,
CFTypeRef(*)(FlutterStandardField, CFTypeRef)  ReadTypedDataOfType,
CFTypeRef  user_data 
)

Definition at line 103 of file FlutterStandardCodecHelper.cc.

109  {
111  switch (field) {
113  return nil;
115  return kCFBooleanTrue;
117  return kCFBooleanFalse;
119  int32_t value;
120  FlutterStandardCodecHelperReadBytes(location, 4, &value, data);
121  return CFAutorelease(
122  CFNumberCreate(kCFAllocatorDefault, kCFNumberSInt32Type, &value));
123  }
125  int64_t value;
126  FlutterStandardCodecHelperReadBytes(location, 8, &value, data);
127  return CFAutorelease(
128  CFNumberCreate(kCFAllocatorDefault, kCFNumberSInt64Type, &value));
129  }
131  Float64 value;
133  FlutterStandardCodecHelperReadBytes(location, 8, &value, data);
134  return CFAutorelease(
135  CFNumberCreate(kCFAllocatorDefault, kCFNumberDoubleType, &value));
136  }
139  return FlutterStandardCodecHelperReadUTF8(location, data);
145  return ReadTypedDataOfType(field, user_data);
147  UInt32 length = FlutterStandardCodecHelperReadSize(location, data);
148  CFMutableArrayRef array = CFArrayCreateMutable(
149  kCFAllocatorDefault, length, &kCFTypeArrayCallBacks);
150  for (UInt32 i = 0; i < length; i++) {
151  CFTypeRef value = FastReadValue(location, data, ReadValue,
152  ReadTypedDataOfType, user_data);
153  CFArrayAppendValue(array, (value == nil ? kCFNull : value));
154  }
155  return CFAutorelease(array);
156  }
158  UInt32 size = FlutterStandardCodecHelperReadSize(location, data);
159  CFMutableDictionaryRef dict = CFDictionaryCreateMutable(
160  kCFAllocatorDefault, size, &kCFTypeDictionaryKeyCallBacks,
161  &kCFTypeDictionaryValueCallBacks);
162  for (UInt32 i = 0; i < size; i++) {
163  CFTypeRef key = FastReadValue(location, data, ReadValue,
164  ReadTypedDataOfType, user_data);
165  CFTypeRef val = FastReadValue(location, data, ReadValue,
166  ReadTypedDataOfType, user_data);
167  CFDictionaryAddValue(dict, (key == nil ? kCFNull : key),
168  (val == nil ? kCFNull : val));
169  }
170  return CFAutorelease(dict);
171  }
172  default:
173  // Malformed message.
174  FML_DCHECK(false);
175  }
176 }

References FastReadValue(), FlutterStandardCodecHelperReadAlignment(), FlutterStandardCodecHelperReadBytes(), FlutterStandardCodecHelperReadSize(), FlutterStandardCodecHelperReadUTF8(), FlutterStandardFieldFalse, FlutterStandardFieldFloat32Data, FlutterStandardFieldFloat64, FlutterStandardFieldFloat64Data, FlutterStandardFieldInt32, FlutterStandardFieldInt32Data, FlutterStandardFieldInt64, FlutterStandardFieldInt64Data, FlutterStandardFieldIntHex, FlutterStandardFieldList, FlutterStandardFieldMap, FlutterStandardFieldNil, FlutterStandardFieldString, FlutterStandardFieldTrue, FlutterStandardFieldUInt8Data, and user_data.

Referenced by FastReadValue(), and FlutterStandardReader::readValueOfType:.

◆ FlutterStandardCodecHelperWriteAlignment()

void FlutterStandardCodecHelperWriteAlignment ( CFMutableDataRef  data,
uint8_t  alignment 
)

Definition at line 201 of file FlutterStandardCodecHelper.cc.

202  {
203  uint8_t mod = CFDataGetLength(data) % alignment;
204  if (mod) {
205  for (int i = 0; i < (alignment - mod); i++) {
207  }
208  }
209 }

References FlutterStandardCodecHelperWriteByte().

Referenced by FlutterStandardCodecHelperWriteNumber(), and FlutterStandardWriter::writeAlignment:.

◆ FlutterStandardCodecHelperWriteByte()

void FlutterStandardCodecHelperWriteByte ( CFMutableDataRef  data,
uint8_t  value 
)

◆ FlutterStandardCodecHelperWriteBytes()

void FlutterStandardCodecHelperWriteBytes ( CFMutableDataRef  data,
const void *  bytes,
unsigned long  length 
)

◆ FlutterStandardCodecHelperWriteData()

void FlutterStandardCodecHelperWriteData ( CFMutableDataRef  data,
CFDataRef  value 
)

Definition at line 232 of file FlutterStandardCodecHelper.cc.

233  {
234  const UInt8* bytes = CFDataGetBytePtr(value);
235  CFIndex length = CFDataGetLength(value);
236  FlutterStandardCodecHelperWriteBytes(data, bytes, length);
237 }

References FlutterStandardCodecHelperWriteBytes().

Referenced by FlutterStandardWriter::writeData:.

◆ FlutterStandardCodecHelperWriteNumber()

bool FlutterStandardCodecHelperWriteNumber ( CFMutableDataRef  data,
CFNumberRef  number 
)

Definition at line 239 of file FlutterStandardCodecHelper.cc.

240  {
241  bool success = false;
242  if (CFGetTypeID(number) == CFBooleanGetTypeID()) {
243  bool b = CFBooleanGetValue((CFBooleanRef)number);
246  success = true;
247  } else if (CFNumberIsFloatType(number)) {
248  Float64 f;
249  success = CFNumberGetValue(number, kCFNumberFloat64Type, &f);
250  if (success) {
254  }
255  } else if (CFNumberGetByteSize(number) <= 4) {
256  SInt32 n;
257  success = CFNumberGetValue(number, kCFNumberSInt32Type, &n);
258  if (success) {
261  }
262  } else if (CFNumberGetByteSize(number) <= 8) {
263  SInt64 n;
264  success = CFNumberGetValue(number, kCFNumberSInt64Type, &n);
265  if (success) {
268  }
269  }
270  return success;
271 }

References FlutterStandardCodecHelperWriteAlignment(), FlutterStandardCodecHelperWriteByte(), FlutterStandardCodecHelperWriteBytes(), FlutterStandardFieldFalse, FlutterStandardFieldFloat64, FlutterStandardFieldInt32, FlutterStandardFieldInt64, and FlutterStandardFieldTrue.

◆ FlutterStandardCodecHelperWriteSize()

void FlutterStandardCodecHelperWriteSize ( CFMutableDataRef  data,
uint32_t  size 
)

Definition at line 188 of file FlutterStandardCodecHelper.cc.

188  {
189  if (size < 254) {
191  } else if (size <= 0xffff) {
193  UInt16 value = (UInt16)size;
194  FlutterStandardCodecHelperWriteBytes(data, &value, 2);
195  } else {
197  FlutterStandardCodecHelperWriteBytes(data, &size, 4);
198  }
199 }

References FlutterStandardCodecHelperWriteByte(), and FlutterStandardCodecHelperWriteBytes().

Referenced by FlutterStandardCodecHelperWriteUTF8(), and FlutterStandardWriter::writeSize:.

◆ FlutterStandardCodecHelperWriteUTF8()

void FlutterStandardCodecHelperWriteUTF8 ( CFMutableDataRef  data,
CFStringRef  value 
)

Definition at line 211 of file FlutterStandardCodecHelper.cc.

212  {
213  const char* utf8 = CFStringGetCStringPtr(value, kCFStringEncodingUTF8);
214  if (utf8) {
215  size_t length = strlen(utf8);
217  FlutterStandardCodecHelperWriteBytes(data, utf8, length);
218  } else {
219  CFIndex length = CFStringGetLength(value);
220  CFIndex used_length = 0;
221  // UTF16 length times 3 will fit all UTF8.
222  CFIndex buffer_length = length * 3;
223  std::vector<UInt8> buffer;
224  buffer.resize(buffer_length);
225  CFStringGetBytes(value, CFRangeMake(0, length), kCFStringEncodingUTF8, 0,
226  false, buffer.data(), buffer_length, &used_length);
227  FlutterStandardCodecHelperWriteSize(data, used_length);
228  FlutterStandardCodecHelperWriteBytes(data, buffer.data(), used_length);
229  }
230 }

References FlutterStandardCodecHelperWriteBytes(), and FlutterStandardCodecHelperWriteSize().

Referenced by FlutterStandardWriter::writeUTF8:.

◆ PeekByte()

static uint8_t PeekByte ( unsigned long  location,
CFDataRef  data 
)
static

Definition at line 26 of file FlutterStandardCodecHelper.cc.

26  {
27  uint8_t result;
28  CFRange range = CFRangeMake(location, 1);
29  CFDataGetBytes(data, range, &result);
30  return result;
31 }

Referenced by FastReadValue().

◆ ReadDataNoCopy()

static CFDataRef ReadDataNoCopy ( unsigned long *  location,
unsigned long  length,
CFDataRef  data 
)
static

Definition at line 65 of file FlutterStandardCodecHelper.cc.

67  {
68  CFDataRef result = CFDataCreateWithBytesNoCopy(
69  kCFAllocatorDefault, CFDataGetBytePtr(data) + *location, length,
70  kCFAllocatorNull);
71  *location += length;
72  return static_cast<CFDataRef>(CFAutorelease(result));
73 }

Referenced by FlutterStandardCodecHelperReadUTF8().

FlutterStandardFieldInt64
@ FlutterStandardFieldInt64
Definition: FlutterStandardCodecHelper.h:25
FlutterStandardCodecHelperReadUTF8
CFStringRef FlutterStandardCodecHelperReadUTF8(unsigned long *location, CFDataRef data)
Definition: FlutterStandardCodecHelper.cc:75
FlutterStandardCodecHelperReadSize
uint32_t FlutterStandardCodecHelperReadSize(unsigned long *location, CFDataRef data)
Definition: FlutterStandardCodecHelper.cc:49
FlutterStandardFieldList
@ FlutterStandardFieldList
Definition: FlutterStandardCodecHelper.h:33
user_data
void * user_data
Definition: texture_registrar_unittests.cc:27
FlutterStandardFieldFloat64
@ FlutterStandardFieldFloat64
Definition: FlutterStandardCodecHelper.h:27
FlutterStandardFieldFloat32Data
@ FlutterStandardFieldFloat32Data
Definition: FlutterStandardCodecHelper.h:35
FlutterStandardCodecHelperWriteAlignment
void FlutterStandardCodecHelperWriteAlignment(CFMutableDataRef data, uint8_t alignment)
Definition: FlutterStandardCodecHelper.cc:201
FlutterStandardCodecHelperReadByte
uint8_t FlutterStandardCodecHelperReadByte(unsigned long *location, CFDataRef data)
Definition: FlutterStandardCodecHelper.cc:42
FlutterStandardFieldInt32
@ FlutterStandardFieldInt32
Definition: FlutterStandardCodecHelper.h:24
FlutterStandardCodecHelperReadValueOfType
CFTypeRef FlutterStandardCodecHelperReadValueOfType(unsigned long *location, CFDataRef data, uint8_t type, CFTypeRef(*ReadValue)(CFTypeRef), CFTypeRef(*ReadTypedDataOfType)(FlutterStandardField, CFTypeRef), CFTypeRef user_data)
Definition: FlutterStandardCodecHelper.cc:103
FlutterStandardFieldString
@ FlutterStandardFieldString
Definition: FlutterStandardCodecHelper.h:28
FlutterStandardFieldInt32Data
@ FlutterStandardFieldInt32Data
Definition: FlutterStandardCodecHelper.h:30
FlutterStandardFieldFalse
@ FlutterStandardFieldFalse
Definition: FlutterStandardCodecHelper.h:23
FlutterStandardFieldUInt8Data
@ FlutterStandardFieldUInt8Data
Definition: FlutterStandardCodecHelper.h:29
ReadDataNoCopy
static CFDataRef ReadDataNoCopy(unsigned long *location, unsigned long length, CFDataRef data)
Definition: FlutterStandardCodecHelper.cc:65
FlutterStandardFieldIsStandardType
static bool FlutterStandardFieldIsStandardType(uint8_t field)
Definition: FlutterStandardCodecHelper.h:39
FlutterStandardFieldTrue
@ FlutterStandardFieldTrue
Definition: FlutterStandardCodecHelper.h:22
FlutterStandardCodecHelperReadBytes
void FlutterStandardCodecHelperReadBytes(unsigned long *location, unsigned long length, void *destination, CFDataRef data)
Definition: FlutterStandardCodecHelper.cc:33
FlutterStandardCodecHelperWriteSize
void FlutterStandardCodecHelperWriteSize(CFMutableDataRef data, uint32_t size)
Definition: FlutterStandardCodecHelper.cc:188
FlutterStandardField
FlutterStandardField
Definition: FlutterStandardCodecHelper.h:19
FastReadValue
static CFTypeRef FastReadValue(unsigned long *location, CFDataRef data, CFTypeRef(*ReadValue)(CFTypeRef), CFTypeRef(*ReadTypedDataOfType)(FlutterStandardField, CFTypeRef), CFTypeRef user_data)
Definition: FlutterStandardCodecHelper.cc:87
FlutterStandardCodecHelperWriteBytes
void FlutterStandardCodecHelperWriteBytes(CFMutableDataRef data, const void *bytes, unsigned long length)
Definition: FlutterStandardCodecHelper.cc:182
FlutterStandardCodecHelperReadAlignment
void FlutterStandardCodecHelperReadAlignment(unsigned long *location, uint8_t alignment)
Definition: FlutterStandardCodecHelper.cc:18
FlutterStandardFieldNil
@ FlutterStandardFieldNil
Definition: FlutterStandardCodecHelper.h:21
FlutterStandardFieldMap
@ FlutterStandardFieldMap
Definition: FlutterStandardCodecHelper.h:34
PeekByte
static uint8_t PeekByte(unsigned long location, CFDataRef data)
Definition: FlutterStandardCodecHelper.cc:26
FlutterStandardCodecHelperWriteByte
void FlutterStandardCodecHelperWriteByte(CFMutableDataRef data, uint8_t value)
Definition: FlutterStandardCodecHelper.cc:178
FlutterStandardFieldFloat64Data
@ FlutterStandardFieldFloat64Data
Definition: FlutterStandardCodecHelper.h:32
FlutterStandardFieldInt64Data
@ FlutterStandardFieldInt64Data
Definition: FlutterStandardCodecHelper.h:31
FlutterStandardFieldIntHex
@ FlutterStandardFieldIntHex
Definition: FlutterStandardCodecHelper.h:26