24 {
25 if (!outHeader || !outEnvelope) {
26 return false;
27 }
28 if (!data) {
29 return false;
30 }
31 if (len < kHeaderBytes) {
32 return false;
33 }
34 if (data[0] != kMagic[0] || data[1] != kMagic[1] ||
35 data[2] != kMagic[2] || data[3] != kMagic[3]) {
36 return false;
37 }
38 const fl::u8 ver = data[4];
39 if (ver != kVersionV1) {
40 return false;
41 }
42 if (data[6] != 0 || data[7] != 0) {
43 return false;
44 }
45 const fl::u8 pixelFormat = data[5];
46 const fl::u32 jsonLen =
47 static_cast<fl::u32>(data[8]) |
48 (static_cast<fl::u32>(data[9]) << 8) |
49 (static_cast<fl::u32>(data[10]) << 16) |
50 (static_cast<fl::u32>(data[11]) << 24);
51
52
53 if (jsonLen > static_cast<fl::u32>(kMaxJsonBytes)) {
54 return false;
55 }
56 if (jsonLen > static_cast<fl::u32>(len - kHeaderBytes)) {
57 return false;
58 }
59 const fl::size jsonLenSz = static_cast<fl::size>(jsonLen);
60
61
63 jsonLenSz);
65
66
68 return false;
69 }
73 *outEnvelope = parsed;
74 return true;
75}
bool has_value() const FL_NO_EXCEPT
static json parse(const fl::string &txt) FL_NO_EXCEPT
constexpr fl::size kHeaderBytes
To reinterpret_cast_(const From &from) FL_NO_EXCEPT