tlvParser.cpp
Go to the documentation of this file.
1 #include <cassert>
2 #include <cstdlib>
3 #include <cstring>
4 #include <stdint.h>
5 
6 #include "osefTypes.h"
7 
8 #include "tlvParser.h"
9 
10 namespace Tlv
11 {
12 int checkBufferSize(uint8_t *&buffer, size_t &buffer_size, size_t size_requested)
13 {
14  if (buffer_size >= size_requested)
15  return 0;
16 
17  buffer = (uint8_t *)realloc(buffer, size_requested);
18  if (!buffer) {
19  buffer_size = 0;
20  return -1;
21  }
22 
23  buffer_size = size_requested;
24  return 0;
25 }
26 
27 tlv_s *readFromFile(FILE *in_fd, uint8_t *&out_buffer, size_t &out_buffer_size)
28 {
29  size_t read_sz;
30  size_t length;
31 
32  // Read the header (T+L)
33  if (checkBufferSize(out_buffer, out_buffer_size, sizeof(header_s)) < 0) {
34  printf("[TLVParser] Failed to reallocate buffer\n");
35  return nullptr;
36  }
37  read_sz = fread(out_buffer, sizeof(header_s), 1, in_fd);
38  if (read_sz != 1)
39  return nullptr;
40 
41  tlv_s *root = (tlv_s *)out_buffer;
42  length = Tlv::getSize(*root);
43  assert(length >= sizeof(header_s));
44 
45  // Read the value (V)
46  if (checkBufferSize(out_buffer, out_buffer_size, length) < 0) {
47  printf("[TLVParser] Failed to reallocate buffer\n");
48  return nullptr;
49  }
50  read_sz = fread(out_buffer + sizeof(header_s), length - sizeof(header_s), 1, in_fd);
51  if (read_sz != 1)
52  return nullptr;
53 
54  return (tlv_s *)out_buffer;
55 }
56 
57 Parser::Parser(const uint8_t *buffer_in, size_t buffer_size_in)
58 {
59  buffer = buffer_in;
60  buffer_size = buffer_size_in;
61  next_index = 0;
62 };
63 
64 tlv_s *Parser::getFirstTlv(void)
65 {
66  size_t root_index = 0;
67 
68  return iter(root_index);
69 };
70 
71 tlv_s *Parser::nextTlv(void)
72 {
73  return iter(next_index);
74 };
75 
76 tlv_s *Parser::findTlv(type_t type) const
77 {
78  tlv_s *current_tlv;
79  size_t index = 0;
80 
81  while ((current_tlv = iter(index)))
82  if (current_tlv->getType() == type)
83  break;
84 
85  return current_tlv;
86 };
87 
88 tlv_s *Parser::iter(size_t &index) const
89 {
90  tlv_s *next_tlv = (tlv_s *)(buffer + index);
91  size_t next_size = 0;
92 
93  // Check that reading header element is not out of bound
94  // Can be equal to buffer_size for latest element with a size of 0
95  if (index + sizeof(header_s) > buffer_size)
96  return nullptr;
97 
98  next_size = getSize(*next_tlv);
99 
100  // Check that the final size is not out of bound
101  // Can be equal to buffer_size for the latest element
102  if (index + next_size > buffer_size) {
103  printf("[TLVParser] Next element is out of bound\n");
104  return nullptr;
105  }
106 
107  index += next_size;
108 
109  return next_tlv;
110 };
111 
112 int Parser::parseTimestamp(const uint8_t *buffer, size_t buffer_size, timeval &output)
113 {
114  Parser root_parser(buffer, buffer_size);
115 
116  tlv_s *read = root_parser.getFirstTlv();
117  if (!read || read->getType() != OSEF_TYPE_TIMESTAMP_MICROSECOND || read->getLength() != 2 * sizeof(uint32_t)) {
118  printf("[TLVParser] Bad TLV element passed to parseTimestamp\n");
119  return -1;
120  }
121 
122  // Do not memcpy!, Linux timeval can be defined as 2x32bits or 2x64bits fields.
123  // That's why we explicitly init the struct with 2x32bits.
124  uint32_t *casted = (uint32_t *)read->getValue();
125  output.tv_sec = casted[0];
126  output.tv_usec = casted[1];
127 
128  return 0;
129 }
130 
131 } // namespace Tlv
Tlv::getSize
static size_t getSize(const tlv_s &tlv)
Definition: tlvCommon.h:61
Tlv
Definition: tlvCommon.h:6
Tlv::readFromFile
tlv_s * readFromFile(FILE *in_fd, uint8_t *&out_buffer, size_t &out_buffer_sz)
Definition: tlvParser.cpp:27
Tlv::Parser::parseTimestamp
static int parseTimestamp(const uint8_t *buffer, size_t buffer_size, timeval &output)
Definition: tlvParser.cpp:112
Tlv::Parser::getFirstTlv
tlv_s * getFirstTlv(void)
Definition: tlvParser.cpp:64
OSEF_TYPE_TIMESTAMP_MICROSECOND
#define OSEF_TYPE_TIMESTAMP_MICROSECOND
Definition: osefTypes.h:81
tlvParser.h
Tlv::Parser::next_index
size_t next_index
Definition: tlvParser.h:36
Tlv::Parser::buffer_size
size_t buffer_size
Definition: tlvParser.h:35
Tlv::type_t
uint32_t type_t
Definition: tlvCommon.h:9
Tlv::Parser::nextTlv
tlv_s * nextTlv(void)
Definition: tlvParser.cpp:71
Tlv::Parser::buffer
const uint8_t * buffer
Definition: tlvParser.h:34
Tlv::Parser
Definition: tlvParser.h:15
Tlv::Parser::Parser
Parser(const uint8_t *buffer, size_t buffer_size)
Definition: tlvParser.cpp:57
length
TFSIMD_FORCE_INLINE tfScalar length(const Quaternion &q)
Tlv::Parser::findTlv
tlv_s * findTlv(type_t type) const
Definition: tlvParser.cpp:76
Tlv::Parser::iter
tlv_s * iter(size_t &index) const
Definition: tlvParser.cpp:88
osefTypes.h
Tlv::checkBufferSize
int checkBufferSize(uint8_t *&buffer, size_t &buffer_size, size_t size_requested)
Definition: tlvParser.cpp:12


outsight_alb_driver
Author(s): Outsight
autogenerated on Thu Oct 13 2022 02:21:45