9 ESP_LOGV(TAG,
"Building NdefMessage with %zu bytes", data.size());
11 while (index < data.size()) {
13 if (index + 2 >= data.size()) {
14 ESP_LOGE(TAG,
"Truncated record header; aborting");
18 uint8_t tnf_byte = data[index++];
19 bool me = tnf_byte & 0x40;
20 bool sr = tnf_byte & 0x10;
21 bool il = tnf_byte & 0x08;
22 uint8_t tnf = tnf_byte & 0x07;
24 ESP_LOGVV(TAG,
"me=%s, sr=%s, il=%s, tnf=%d", YESNO(me), YESNO(sr), YESNO(il), tnf);
26 uint8_t type_length = data[index++];
29 payload_length = data[index++];
31 if (index + 4 > data.size()) {
32 ESP_LOGE(TAG,
"Truncated payload length; aborting");
35 payload_length = (
static_cast<uint32_t>(data[index]) << 24) | (
static_cast<uint32_t>(data[index + 1]) << 16) |
36 (
static_cast<uint32_t>(data[index + 2]) << 8) |
static_cast<uint32_t>(data[index + 3]);
40 uint8_t id_length = 0;
42 if (index >= data.size()) {
43 ESP_LOGE(TAG,
"Truncated ID length; aborting");
46 id_length = data[index++];
49 ESP_LOGVV(TAG,
"Lengths: type=%d, payload=%" PRIu32
", id=%d", type_length, payload_length, id_length);
51 std::string type_str(data.begin() + index, data.begin() + index + type_length);
57 id_str = std::string(data.begin() + index, data.begin() + index + id_length);
61 if ((data.begin() + index > data.end()) || (data.begin() + index + payload_length > data.end())) {
62 ESP_LOGE(TAG,
"Corrupt record encountered; NdefMessage constructor aborting");
66 std::vector<uint8_t> payload_data(data.begin() + index, data.begin() + index + payload_length);
68 std::unique_ptr<NdefRecord> record;
72 if (tnf == TNF_WELL_KNOWN && type_str ==
"U") {
73 record = make_unique<NdefRecordUri>(payload_data);
74 }
else if (tnf == TNF_WELL_KNOWN && type_str ==
"T") {
75 record = make_unique<NdefRecordText>(payload_data);
78 record = make_unique<NdefRecord>(payload_data);
80 record->set_type(type_str);
83 record->set_id(id_str);
85 index += payload_length;
87 ESP_LOGV(TAG,
"Adding record type %s = %s", record->get_type().c_str(), record->get_payload().c_str());