10 ESP_LOGV(TAG,
"Building NdefMessage with %zu bytes", data.size());
12 while (index < data.size()) {
14 if (index + 2 >= data.size()) {
15 ESP_LOGE(TAG,
"Truncated record header; aborting");
19 uint8_t tnf_byte = data[index++];
20 bool me = tnf_byte & 0x40;
21 bool sr = tnf_byte & 0x10;
22 bool il = tnf_byte & 0x08;
23 uint8_t tnf = tnf_byte & 0x07;
25 ESP_LOGVV(TAG,
"me=%s, sr=%s, il=%s, tnf=%d", YESNO(me), YESNO(sr), YESNO(il), tnf);
27 uint8_t type_length = data[index++];
30 payload_length = data[index++];
32 if (index + 4 > data.size()) {
33 ESP_LOGE(TAG,
"Truncated payload length; aborting");
36 payload_length = (
static_cast<uint32_t>(data[index]) << 24) | (
static_cast<uint32_t>(data[index + 1]) << 16) |
37 (
static_cast<uint32_t>(data[index + 2]) << 8) |
static_cast<uint32_t>(data[index + 3]);
41 uint8_t id_length = 0;
43 if (index >= data.size()) {
44 ESP_LOGE(TAG,
"Truncated ID length; aborting");
47 id_length = data[index++];
50 ESP_LOGVV(TAG,
"Lengths: type=%d, payload=%" PRIu32
", id=%d", type_length, payload_length, id_length);
52 std::string type_str(data.begin() + index, data.begin() + index + type_length);
56 std::string id_str =
"";
58 id_str = std::string(data.begin() + index, data.begin() + index + id_length);
62 if ((data.begin() + index > data.end()) || (data.begin() + index + payload_length > data.end())) {
63 ESP_LOGE(TAG,
"Corrupt record encountered; NdefMessage constructor aborting");
67 std::vector<uint8_t> payload_data(data.begin() + index, data.begin() + index + payload_length);
69 std::unique_ptr<NdefRecord> record;
73 if (tnf == TNF_WELL_KNOWN && type_str ==
"U") {
74 record = make_unique<NdefRecordUri>(payload_data);
75 }
else if (tnf == TNF_WELL_KNOWN && type_str ==
"T") {
76 record = make_unique<NdefRecordText>(payload_data);
79 record = make_unique<NdefRecord>(payload_data);
81 record->set_type(type_str);
84 record->set_id(id_str);
86 index += payload_length;
88 ESP_LOGV(TAG,
"Adding record type %s = %s", record->get_type().c_str(), record->get_payload().c_str());