GCC Code Coverage Report


Directory: src/
File: src/message_parser/message_parser.cpp
Date: 2026-03-27 13:31:42
Exec Total Coverage
Lines: 0 23 0.0%
Branches: 0 34 0.0%

Line Branch Exec Source
1 #include "message_parser.h"
2 #include "sub_message_parser.h"
3 #include "tlv_item.h"
4
5 std::vector<mqtt_message> message_parser::parse_tlv(const std::vector<uint8_t> &message) {
6 uint8_t current_index = 0;
7 std::vector<mqtt_message> mqtt_messages;
8
9 // at least type and length should be available
10 if (message.size() < 2) {
11 std::cerr << "Message is not large enough to be valid TLV" << std::endl;
12 return {};
13 }
14
15 // BLE advertisement max length excluding the local short name
16 if (message.size() > 27) {
17 std::cerr << "Message is too large to be a valid TLV" << std::endl;
18 return {};
19 }
20
21 while (current_index < message.size()) {
22 // Assume we don't go out of bounds, and we don't have incorrect data :))
23 // I was here when we went out of bounds.
24 uint8_t type = message[current_index++];
25 uint8_t length = message[current_index++];
26
27 if (message.size() < current_index + length || length == 0) {
28 std::cerr << "Partial TLV found, throwing away message..." << std::endl;
29 return {};
30 }
31
32 std::vector<uint8_t> value(message.begin() + current_index,
33 message.begin() + current_index + length);
34
35 tlv_item current_item(type, length, value);
36
37 parse_response parse_response = sub_message_parser::parse_tlv(current_item);
38 if (parse_response.success) {
39 mqtt_messages.push_back(parse_response.message);
40 }
41
42 // Go to next TLV item
43 current_index += length;
44 }
45
46 return mqtt_messages;
47 }
48