2021-12-03 15:37:49 +01:00
|
|
|
#include "NakPduDeserializer.h"
|
|
|
|
|
2022-02-02 10:29:30 +01:00
|
|
|
NakPduDeserializer::NakPduDeserializer(const uint8_t* pduBuf, size_t maxSize, NakInfo& info)
|
|
|
|
: FileDirectiveDeserializer(pduBuf, maxSize), nakInfo(info) {}
|
2021-12-03 15:37:49 +01:00
|
|
|
|
|
|
|
ReturnValue_t NakPduDeserializer::parseData() {
|
2022-02-02 10:29:30 +01:00
|
|
|
ReturnValue_t result = FileDirectiveDeserializer::parseData();
|
2022-08-15 20:28:16 +02:00
|
|
|
if (result != returnvalue::OK) {
|
2022-02-02 10:29:30 +01:00
|
|
|
return result;
|
|
|
|
}
|
|
|
|
size_t currentIdx = FileDirectiveDeserializer::getHeaderSize();
|
|
|
|
const uint8_t* buffer = rawPtr + currentIdx;
|
|
|
|
size_t remSize = FileDirectiveDeserializer::getWholePduSize() - currentIdx;
|
|
|
|
if (remSize < 1) {
|
|
|
|
return SerializeIF::STREAM_TOO_SHORT;
|
|
|
|
}
|
|
|
|
result =
|
|
|
|
nakInfo.getStartOfScope().deSerialize(&buffer, &remSize, SerializeIF::Endianness::NETWORK);
|
2022-08-15 20:28:16 +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-15 20:28:16 +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;
|
2021-12-03 15:37:49 +01:00
|
|
|
}
|
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-15 20:28:16 +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-15 20:28:16 +02:00
|
|
|
if (result != returnvalue::OK) {
|
2022-02-02 10:29:30 +01:00
|
|
|
return result;
|
|
|
|
}
|
|
|
|
idx++;
|
|
|
|
}
|
|
|
|
nakInfo.setSegmentRequestLen(idx);
|
2021-12-03 15:37:49 +01:00
|
|
|
}
|
2022-02-02 10:29:30 +01:00
|
|
|
}
|
|
|
|
return result;
|
2021-12-03 15:37:49 +01:00
|
|
|
}
|