89 lines
2.3 KiB
C++
89 lines
2.3 KiB
C++
#include "Lv.h"
|
|
|
|
cfdp::Lv::Lv(const uint8_t *value, size_t size): value(value, size, true) {
|
|
if(size > 0) {
|
|
zeroLen = false;
|
|
}
|
|
}
|
|
|
|
cfdp::Lv::Lv(): value(static_cast<uint8_t*>(nullptr), 0, true) {
|
|
}
|
|
|
|
cfdp::Lv::Lv(const Lv& other):
|
|
value(other.value.getConstBuffer(), other.value.getSerializedSize() - 1, true) {
|
|
if(other.value.getSerializedSize() - 1 > 0) {
|
|
zeroLen = false;
|
|
}
|
|
}
|
|
|
|
cfdp::Lv& cfdp::Lv::operator =(const Lv& other) {
|
|
size_t otherSize = 0;
|
|
uint8_t* value = const_cast<uint8_t*>(other.getValue(&otherSize));
|
|
if (value == nullptr or otherSize == 0) {
|
|
this->zeroLen = true;
|
|
}
|
|
this->value.setBuffer(value, otherSize);
|
|
return *this;
|
|
}
|
|
|
|
|
|
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) {
|
|
return HasReturnvaluesIF::RETURN_FAILED;
|
|
}
|
|
if(zeroLen) {
|
|
**buffer = 0;
|
|
*size += 1;
|
|
*buffer += 1;
|
|
return HasReturnvaluesIF::RETURN_OK;
|
|
}
|
|
return value.serialize(buffer, size, maxSize, streamEndianness);
|
|
}
|
|
|
|
size_t cfdp::Lv::getSerializedSize() const {
|
|
if(zeroLen) {
|
|
return 1;
|
|
}
|
|
else if(value.getConstBuffer() == nullptr) {
|
|
return 0;
|
|
}
|
|
return value.getSerializedSize();
|
|
}
|
|
|
|
ReturnValue_t cfdp::Lv::deSerialize(const uint8_t **buffer, size_t *size,
|
|
Endianness streamEndianness) {
|
|
if(buffer == nullptr or size == nullptr) {
|
|
return HasReturnvaluesIF::RETURN_FAILED;
|
|
}
|
|
if(*size < 1) {
|
|
return SerializeIF::STREAM_TOO_SHORT;
|
|
}
|
|
size_t lengthField = **buffer;
|
|
if(lengthField == 0) {
|
|
zeroLen = true;
|
|
*buffer += 1;
|
|
*size -= 1;
|
|
return HasReturnvaluesIF::RETURN_OK;
|
|
} else if(*size < lengthField + 1) {
|
|
return SerializeIF::STREAM_TOO_SHORT;
|
|
}
|
|
zeroLen = false;
|
|
// Zero-copy implementation
|
|
value.setBuffer(const_cast<uint8_t*>(*buffer + 1), lengthField);
|
|
*buffer += 1 + lengthField;
|
|
*size -= 1 + lengthField;
|
|
return HasReturnvaluesIF::RETURN_OK;
|
|
}
|
|
|
|
const uint8_t* cfdp::Lv::getValue(size_t* size) const {
|
|
if(size != nullptr) {
|
|
// Length without length field
|
|
*size = value.getSerializedSize() - 1;
|
|
}
|
|
return value.getConstBuffer();
|
|
}
|