• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

bblanchon / ArduinoJson / 8882347116

29 Apr 2024 04:50PM UTC coverage: 99.521%. First build
8882347116

push

github

bblanchon
Implement MsgPackBinary using raw strings and converters

74 of 75 new or added lines in 2 files covered. (98.67%)

3737 of 3755 relevant lines covered (99.52%)

14069.53 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

98.31
/src/ArduinoJson/MsgPack/MsgPackBinary.hpp
1
#pragma once
2

3
ARDUINOJSON_BEGIN_PUBLIC_NAMESPACE
4

5
class MsgPackBinary {
6
 public:
7
  MsgPackBinary() : data_(nullptr), size_(0) {}
2✔
8
  explicit MsgPackBinary(const void* c, size_t size) : data_(c), size_(size) {}
21✔
9

10
  const void* data() const {
36✔
11
    return data_;
36✔
12
  }
13

14
  size_t size() const {
78✔
15
    return size_;
78✔
16
  }
17

18
 private:
19
  const void* data_;
20
  size_t size_;
21
};
22

23
template <>
24
struct Converter<MsgPackBinary> : private detail::VariantAttorney {
25
  static void toJson(MsgPackBinary src, JsonVariant dst) {
15✔
26
    auto data = VariantAttorney::getData(dst);
15✔
27
    if (!data)
15✔
28
      return;
1✔
29
    auto resources = getResourceManager(dst);
14✔
30
    if (src.data()) {
14✔
31
      size_t headerSize =
32
          src.size() >= 0x10000 ? 5 : src.size() >= 0x100 ? 3 : 2;
14✔
33
      auto str = resources->createString(src.size() + headerSize);
14✔
34
      auto ptr = str->data;
14✔
35
      if (str) {
14✔
36
        switch (headerSize) {
12✔
37
          case 2:
8✔
38
            ptr[0] = static_cast<char>(0xc4);
8✔
39
            ptr[1] = static_cast<char>(src.size());
8✔
40
            break;
8✔
41
          case 3:
2✔
42
            ptr[0] = static_cast<char>(0xc5);
2✔
43
            ptr[1] = static_cast<char>(src.size() >> 8);
2✔
44
            ptr[2] = static_cast<char>(src.size());
2✔
45
            break;
2✔
46
          case 5:
2✔
47
            ptr[0] = static_cast<char>(0xc6);
2✔
48
            ptr[1] = static_cast<char>(src.size() >> 24);
2✔
49
            ptr[2] = static_cast<char>(src.size() >> 16);
2✔
50
            ptr[3] = static_cast<char>(src.size() >> 8);
2✔
51
            ptr[4] = static_cast<char>(src.size());
2✔
52
            break;
2✔
53
        }
54
        memcpy(ptr + headerSize, src.data(), src.size());
12✔
55
        data->setRawString(str);
12✔
56
        return;
12✔
57
      }
58
    }
59
    data->setNull();
2✔
60
  }
61

62
  static MsgPackBinary fromJson(JsonVariantConst src) {
8✔
63
    auto data = getData(src);
8✔
64
    if (!data)
8✔
65
      return {};
2✔
66
    auto rawstr = data->asRawString();
6✔
67
    auto p = reinterpret_cast<const uint8_t*>(rawstr.c_str());
6✔
68
    auto n = rawstr.size();
6✔
69
    if (n >= 2 && p[0] == 0xc4) {  // bin 8
6✔
70
      size_t size = p[1];
2✔
71
      if (size + 2 == n)
2✔
72
        return MsgPackBinary(p + 2, size);
2✔
73
    } else if (n >= 3 && p[0] == 0xc5) {  // bin 16
4✔
74
      size_t size = (p[1] << 8) | p[2];
2✔
75
      if (size + 3 == n)
2✔
76
        return MsgPackBinary(p + 3, size);
2✔
77
    } else if (n >= 5 && p[0] == 0xc6) {  // bin 32
2✔
78
      size_t size = (p[1] << 24) | (p[2] << 16) | (p[3] << 8) | p[4];
2✔
79
      if (size + 5 == n)
2✔
80
        return MsgPackBinary(p + 5, size);
2✔
81
    }
NEW
82
    return {};
×
83
  }
84

85
  static bool checkJson(JsonVariantConst src) {
3✔
86
    return fromJson(src).data() != nullptr;
3✔
87
  }
88
};
89

90
ARDUINOJSON_END_PUBLIC_NAMESPACE
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc