19 template <
typename TRecType,
typename TRecLen>
class TLVRecord
50 m_Data = other.m_Data;
60 m_Data =
reinterpret_cast<TLVRawData*
>(recordRawData);
67 static bool canAssign(
const uint8_t* recordRawData,
size_t tlvDataLen)
69 return recordRawData !=
nullptr &&
79 m_Data = other.m_Data;
89 if (m_Data == rhs.m_Data)
98 return (memcmp(m_Data, rhs.m_Data,
getTotalSize()) == 0);
112 if (m_Data ==
nullptr)
121 if (m_Data ==
nullptr)
130 return (m_Data ==
nullptr);
136 return (m_Data !=
nullptr);
142 return reinterpret_cast<uint8_t*
>(m_Data);
165 static_assert(std::is_trivially_copyable<T>::value && std::is_default_constructible<T>::value &&
166 !std::is_pointer<T>::value,
167 "TLVRecord::getValueAs<T>() requires T to be a non-pointer, "
168 "default-constructible, trivially copyable type");
176 memcpy(&result, m_Data->
recordValue + getValueOffset() + offset,
sizeof(T));
188 template <
typename T>
bool setValue(T newValue,
int valueOffset = 0)
190 static_assert(std::is_trivially_copyable<T>::value && !std::is_pointer<T>::value,
191 "TLVRecord::setValue<T>() requires T to be a non-pointer, trivially copyable type");
198 memcpy(m_Data->
recordValue + getValueOffset() + valueOffset, &newValue,
sizeof(T));
209 virtual size_t getValueOffset()
const
221 mutable size_t m_RecordCount;
227 m_RecordCount =
static_cast<size_t>(-1);
233 m_RecordCount = other.m_RecordCount;
243 m_RecordCount = other.m_RecordCount;
256 TLVRecordType resRec(
nullptr);
257 if (!TLVRecordType::canAssign(tlvDataBasePtr, tlvDataLen))
260 resRec.assign(tlvDataBasePtr);
262 if (resRec.getRecordBasePtr() + resRec.getTotalSize() > tlvDataBasePtr + tlvDataLen)
263 resRec.assign(
nullptr);
266 if (!resRec.isNull() && (tlvDataLen == 0 || resRec.getTotalSize() == 0))
267 resRec.assign(
nullptr);
280 TLVRecordType
getNextTLVRecord(TLVRecordType& record,
const uint8_t* tlvDataBasePtr,
size_t tlvDataLen)
const
282 TLVRecordType resRec(
nullptr);
287 if (!TLVRecordType::canAssign(record.getRecordBasePtr() + record.getTotalSize(),
288 tlvDataBasePtr - record.getRecordBasePtr() + tlvDataLen -
289 record.getTotalSize()))
292 resRec.assign(record.getRecordBasePtr() + record.getTotalSize());
294 if (resRec.getTotalSize() == 0)
295 resRec.assign(
nullptr);
298 if ((resRec.getRecordBasePtr() - tlvDataBasePtr) < 0)
299 resRec.assign(
nullptr);
302 if (!resRec.isNull() && resRec.getRecordBasePtr() + resRec.getTotalSize() > tlvDataBasePtr + tlvDataLen)
303 resRec.assign(
nullptr);
314 TLVRecordType
getTLVRecord(uint32_t recordType, uint8_t* tlvDataBasePtr,
size_t tlvDataLen)
const
317 while (!curRec.isNull())
319 if (curRec.getType() == recordType)
327 curRec.assign(
nullptr);
340 if (m_RecordCount !=
static_cast<size_t>(-1))
341 return m_RecordCount;
345 while (!curRec.isNull())
351 return m_RecordCount;
361 if (m_RecordCount !=
static_cast<size_t>(-1))
362 m_RecordCount += changedBy;
378 TLVRecordBuilder(uint32_t recType,
const uint8_t* recValue, uint8_t recValueLen);
388 TLVRecordBuilder(uint32_t recType,
const std::string& recValue,
bool valueIsHexString =
false);
396 void init(uint32_t recType,
const uint8_t* recValue,
size_t recValueLen);
399 size_t m_RecValueLen;
Definition: IpAddress.h:30
Definition: TLVData.h:374
TLVRecord(uint8_t *recordRawData)
Definition: TLVData.h:40
TLVRecord(const TLVRecord &other)
Definition: TLVData.h:48
virtual size_t getTotalSize() const =0
virtual ~TLVRecord()=default
A d'tor for this class, currently does nothing.
TRecType getType() const
Definition: TLVData.h:110
bool setValue(T newValue, int valueOffset=0)
Definition: TLVData.h:188
bool operator!=(const TLVRecord &rhs) const
Definition: TLVData.h:104
uint8_t * getRecordBasePtr() const
Definition: TLVData.h:140
uint8_t * getValue() const
Definition: TLVData.h:119
bool operator==(const TLVRecord &rhs) const
Definition: TLVData.h:87
static bool canAssign(const uint8_t *recordRawData, size_t tlvDataLen)
Definition: TLVData.h:67
virtual size_t getDataSize() const =0
bool isNotNull() const
Definition: TLVData.h:134
bool isNull() const
Definition: TLVData.h:128
T getValueAs(size_t offset=0) const
Definition: TLVData.h:163
TLVRecord & operator=(const TLVRecord &other)
Definition: TLVData.h:77
void purgeRecordData()
Free the memory of the TLV record raw data.
Definition: TLVData.h:146
void assign(uint8_t *recordRawData)
Definition: TLVData.h:58
Definition: TLVData.h:219
void changeTLVRecordCount(int changedBy)
Definition: TLVData.h:359
TLVRecordReader & operator=(const TLVRecordReader &other)
Definition: TLVData.h:241
virtual ~TLVRecordReader()=default
A d'tor for this class which currently does nothing.
TLVRecordType getTLVRecord(uint32_t recordType, uint8_t *tlvDataBasePtr, size_t tlvDataLen) const
Definition: TLVData.h:314
TLVRecordReader(const TLVRecordReader &other)
A default copy c'tor for this class.
Definition: TLVData.h:231
TLVRecordType getNextTLVRecord(TLVRecordType &record, const uint8_t *tlvDataBasePtr, size_t tlvDataLen) const
Definition: TLVData.h:280
TLVRecordReader()
A default c'tor for this class.
Definition: TLVData.h:225
TLVRecordType getFirstTLVRecord(uint8_t *tlvDataBasePtr, size_t tlvDataLen) const
Definition: TLVData.h:254
size_t getTLVRecordCount(uint8_t *tlvDataBasePtr, size_t tlvDataLen) const
Definition: TLVData.h:338
The main namespace for the PcapPlusPlus lib.
Definition: AssertionUtils.h:19
A struct representing the TLV construct.
Definition: TLVData.h:25
uint8_t recordValue[]
Record value (variable size)
Definition: TLVData.h:31
TRecType recordType
Record type.
Definition: TLVData.h:27
TRecLen recordLen
Record length in bytes.
Definition: TLVData.h:29