fsfw/src/fsfw/cfdp/tlv/Lv.cpp

92 lines
2.3 KiB
C++
Raw Normal View History

#include "Lv.h"
2022-02-02 10:29:30 +01:00
cfdp::Lv::Lv(const uint8_t* value, size_t size) : value(value, size, true) {
if (size > 0) {
zeroLen = false;
}
}
2022-08-10 09:39:57 +02:00
cfdp::Lv::Lv(const std::vector<uint8_t>& data) : value(data.data(), data.size(), true) {
if (!data.empty()) {
2022-08-08 18:29:32 +02:00
zeroLen = false;
}
}
2022-02-02 10:29:30 +01:00
cfdp::Lv::Lv() : value(static_cast<uint8_t*>(nullptr), 0, true) {}
2022-02-02 10:29:30 +01:00
cfdp::Lv::Lv(const Lv& other)
: value(other.value.getConstBuffer(), other.value.getSerializedSize() - 1, true) {
if (other.value.getSerializedSize() - 1 > 0) {
zeroLen = false;
}
}
2022-02-02 10:29:30 +01:00
cfdp::Lv& cfdp::Lv::operator=(const Lv& other) {
size_t otherSize = 0;
2022-08-10 09:39:57 +02:00
auto* otherVal = const_cast<uint8_t*>(other.getValue(&otherSize));
if (otherVal == nullptr or otherSize == 0) {
2022-02-02 10:29:30 +01:00
this->zeroLen = true;
}
this->value.setConstBuffer(otherVal, otherSize);
2022-02-02 10:29:30 +01:00
return *this;
}
2022-02-02 10:29:30 +01:00
ReturnValue_t cfdp::Lv::serialize(uint8_t** buffer, size_t* size, size_t maxSize,
Endianness streamEndianness) const {
if (maxSize < 1) {
return BUFFER_TOO_SHORT;
}
if (buffer == nullptr or size == nullptr) {
2022-08-16 01:08:26 +02:00
return returnvalue::FAILED;
2022-02-02 10:29:30 +01:00
}
if (zeroLen) {
**buffer = 0;
*size += 1;
*buffer += 1;
2022-08-16 01:08:26 +02:00
return returnvalue::OK;
2022-02-02 10:29:30 +01:00
}
return value.serialize(buffer, size, maxSize, streamEndianness);
}
size_t cfdp::Lv::getSerializedSize() const {
2022-02-02 10:29:30 +01:00
if (zeroLen) {
return 1;
} else if (value.getConstBuffer() == nullptr) {
return 0;
}
return value.getSerializedSize();
}
2022-02-02 10:29:30 +01:00
ReturnValue_t cfdp::Lv::deSerialize(const uint8_t** buffer, size_t* size,
Endianness streamEndianness) {
if (buffer == nullptr or size == nullptr) {
2022-08-16 01:08:26 +02:00
return returnvalue::FAILED;
2022-02-02 10:29:30 +01:00
}
if (*size < 1) {
return SerializeIF::STREAM_TOO_SHORT;
}
size_t lengthField = **buffer;
if (lengthField == 0) {
zeroLen = true;
*buffer += 1;
*size -= 1;
2022-08-16 01:08:26 +02:00
return returnvalue::OK;
2022-02-02 10:29:30 +01:00
} else if (*size < lengthField + 1) {
return SerializeIF::STREAM_TOO_SHORT;
}
zeroLen = false;
// Zero-copy implementation
2022-09-05 16:31:56 +02:00
value.setConstBuffer(*buffer + 1, lengthField);
2022-02-02 10:29:30 +01:00
*buffer += 1 + lengthField;
*size -= 1 + lengthField;
2022-08-16 01:08:26 +02:00
return returnvalue::OK;
}
const uint8_t* cfdp::Lv::getValue(size_t* size) const {
2022-02-02 10:29:30 +01:00
if (size != nullptr) {
// Length without length field
*size = value.getSerializedSize() - 1;
}
return value.getConstBuffer();
}