2021-12-03 15:37:49 +01:00
|
|
|
#include "EofPduDeserializer.h"
|
2022-02-02 10:29:30 +01:00
|
|
|
|
2021-12-03 15:37:49 +01:00
|
|
|
#include "fsfw/FSFW.h"
|
|
|
|
#include "fsfw/serviceinterface.h"
|
|
|
|
|
2022-02-02 10:29:30 +01:00
|
|
|
EofPduDeserializer::EofPduDeserializer(const uint8_t* pduBuf, size_t maxSize, EofInfo& eofInfo)
|
2022-08-03 16:00:48 +02:00
|
|
|
: FileDirectiveReader(pduBuf, maxSize), info(eofInfo) {}
|
2021-12-03 15:37:49 +01:00
|
|
|
|
|
|
|
ReturnValue_t EofPduDeserializer::parseData() {
|
2022-08-03 16:00:48 +02:00
|
|
|
ReturnValue_t result = FileDirectiveReader::parseData();
|
2022-02-02 10:29:30 +01:00
|
|
|
if (result != HasReturnvaluesIF::RETURN_OK) {
|
|
|
|
return result;
|
|
|
|
}
|
2021-12-03 15:37:49 +01:00
|
|
|
|
2022-02-02 10:29:30 +01:00
|
|
|
const uint8_t* bufPtr = rawPtr;
|
|
|
|
size_t expectedFileFieldLen = 4;
|
|
|
|
if (this->getLargeFileFlag()) {
|
|
|
|
expectedFileFieldLen = 8;
|
|
|
|
}
|
2022-08-03 16:00:48 +02:00
|
|
|
size_t currentIdx = FileDirectiveReader::getHeaderSize();
|
2022-02-02 10:29:30 +01:00
|
|
|
size_t deserLen = maxSize;
|
|
|
|
if (maxSize < currentIdx + 5 + expectedFileFieldLen) {
|
|
|
|
return SerializeIF::STREAM_TOO_SHORT;
|
|
|
|
}
|
2021-12-03 15:37:49 +01:00
|
|
|
|
2022-02-02 10:29:30 +01:00
|
|
|
bufPtr += currentIdx;
|
|
|
|
deserLen -= currentIdx;
|
|
|
|
info.setConditionCode(static_cast<cfdp::ConditionCode>(*bufPtr >> 4));
|
|
|
|
bufPtr += 1;
|
|
|
|
deserLen -= 1;
|
|
|
|
uint32_t checksum = 0;
|
|
|
|
auto endianness = getEndianness();
|
|
|
|
result = SerializeAdapter::deSerialize(&checksum, &bufPtr, &deserLen, endianness);
|
|
|
|
if (result != HasReturnvaluesIF::RETURN_OK) {
|
|
|
|
return result;
|
|
|
|
}
|
|
|
|
info.setChecksum(checksum);
|
|
|
|
if (this->getLargeFileFlag()) {
|
|
|
|
uint64_t fileSizeValue = 0;
|
|
|
|
result = SerializeAdapter::deSerialize(&fileSizeValue, &bufPtr, &deserLen, endianness);
|
|
|
|
info.setFileSize(fileSizeValue, true);
|
|
|
|
} else {
|
|
|
|
uint32_t fileSizeValue = 0;
|
|
|
|
result = SerializeAdapter::deSerialize(&fileSizeValue, &bufPtr, &deserLen, endianness);
|
|
|
|
info.setFileSize(fileSizeValue, false);
|
|
|
|
}
|
|
|
|
if (result != HasReturnvaluesIF::RETURN_OK) {
|
|
|
|
return result;
|
|
|
|
}
|
|
|
|
if (info.getConditionCode() != cfdp::ConditionCode::NO_ERROR) {
|
|
|
|
EntityIdTlv* tlvPtr = info.getFaultLoc();
|
|
|
|
if (tlvPtr == nullptr) {
|
2021-12-03 15:37:49 +01:00
|
|
|
#if FSFW_VERBOSE_LEVEL >= 1
|
|
|
|
#if FSFW_CPP_OSTREAM_ENABLED == 1
|
2022-02-02 10:29:30 +01:00
|
|
|
sif::warning << "EofPduDeserializer::parseData: Ca not deserialize fault location,"
|
|
|
|
" given TLV pointer invalid"
|
|
|
|
<< std::endl;
|
2021-12-03 15:37:49 +01:00
|
|
|
#else
|
2022-02-02 10:29:30 +01:00
|
|
|
sif::printWarning(
|
|
|
|
"EofPduDeserializer::parseData: Ca not deserialize fault location,"
|
|
|
|
" given TLV pointer invalid");
|
2021-12-03 15:37:49 +01:00
|
|
|
#endif
|
|
|
|
#endif /* FSFW_VERBOSE_LEVEL >= 1 */
|
2022-02-02 10:29:30 +01:00
|
|
|
return HasReturnvaluesIF::RETURN_FAILED;
|
2021-12-03 15:37:49 +01:00
|
|
|
}
|
2022-02-02 10:29:30 +01:00
|
|
|
result = tlvPtr->deSerialize(&bufPtr, &deserLen, endianness);
|
|
|
|
}
|
|
|
|
return result;
|
2021-12-03 15:37:49 +01:00
|
|
|
}
|