fsfw/src/fsfw/cfdp/pdu/NakPduDeserializer.cpp

57 lines
1.8 KiB
C++
Raw Normal View History

#include "NakPduDeserializer.h"
2022-02-02 10:29:30 +01:00
NakPduDeserializer::NakPduDeserializer(const uint8_t* pduBuf, size_t maxSize, NakInfo& info)
2022-08-03 16:00:48 +02:00
: FileDirectiveReader(pduBuf, maxSize), nakInfo(info) {}
ReturnValue_t NakPduDeserializer::parseData() {
2022-08-03 16:00:48 +02:00
ReturnValue_t result = FileDirectiveReader::parseData();
2022-08-16 01:08:26 +02:00
if (result != returnvalue::OK) {
2022-02-02 10:29:30 +01:00
return result;
}
2022-08-03 16:00:48 +02:00
size_t currentIdx = FileDirectiveReader::getHeaderSize();
2022-08-08 18:29:32 +02:00
const uint8_t* buffer = pointers.rawPtr + currentIdx;
2022-08-03 16:00:48 +02:00
size_t remSize = FileDirectiveReader::getWholePduSize() - currentIdx;
2022-02-02 10:29:30 +01:00
if (remSize < 1) {
return SerializeIF::STREAM_TOO_SHORT;
}
result =
nakInfo.getStartOfScope().deSerialize(&buffer, &remSize, SerializeIF::Endianness::NETWORK);
2022-08-16 01:08:26 +02:00
if (result != returnvalue::OK) {
2022-02-02 10:29:30 +01:00
return result;
}
result = nakInfo.getEndOfScope().deSerialize(&buffer, &remSize, SerializeIF::Endianness::NETWORK);
2022-08-16 01:08:26 +02:00
if (result != returnvalue::OK) {
2022-02-02 10:29:30 +01:00
return result;
}
nakInfo.setSegmentRequestLen(0);
if (remSize > 0) {
if (not nakInfo.canHoldSegmentRequests()) {
return cfdp::NAK_CANT_PARSE_OPTIONS;
}
2022-02-02 10:29:30 +01:00
NakInfo::SegmentRequest* segReqs = nullptr;
size_t maxSegReqs = 0;
nakInfo.getSegmentRequests(&segReqs, nullptr, &maxSegReqs);
if (segReqs != nullptr) {
size_t idx = 0;
while (remSize > 0) {
if (idx == maxSegReqs) {
return cfdp::NAK_CANT_PARSE_OPTIONS;
}
result =
segReqs[idx].first.deSerialize(&buffer, &remSize, SerializeIF::Endianness::NETWORK);
2022-08-16 01:08:26 +02:00
if (result != returnvalue::OK) {
2022-02-02 10:29:30 +01:00
return result;
}
result =
segReqs[idx].second.deSerialize(&buffer, &remSize, SerializeIF::Endianness::NETWORK);
2022-08-16 01:08:26 +02:00
if (result != returnvalue::OK) {
2022-02-02 10:29:30 +01:00
return result;
}
idx++;
}
nakInfo.setSegmentRequestLen(idx);
}
2022-02-02 10:29:30 +01:00
}
return result;
}