#include "MetadataPduReader.h" MetadataPduReader::MetadataPduReader(const uint8_t* pduBuf, size_t maxSize, MetadataGenericInfo& info, cfdp::Tlv* optionsArray, size_t optArrayMaxSize) : FileDirectiveReader(pduBuf, maxSize), info(info), optionArray(optionsArray), optionArrayMaxSize(optArrayMaxSize) {} ReturnValue_t MetadataPduReader::parseData() { parsedOptions = 0; ReturnValue_t result = FileDirectiveReader::parseData(); if (result != returnvalue::OK) { return result; } size_t currentIdx = FileDirectiveReader::getHeaderSize(); const uint8_t* buf = pointers.rawPtr + currentIdx; size_t remSize = FileDirectiveReader::getWholePduSize() - currentIdx; if (remSize < 1) { return SerializeIF::STREAM_TOO_SHORT; } info.setClosureRequested((*buf >> 6) & 0x01); info.setChecksumType(static_cast(*buf & 0x0f)); remSize -= 1; buf += 1; auto endianness = getEndianness(); result = info.getMutFileSize().deSerialize(&buf, &remSize, endianness); if (result != returnvalue::OK) { return result; } result = srcFileName.deSerialize(&buf, &remSize, endianness); if (result != returnvalue::OK) { return result; } result = destFileName.deSerialize(&buf, &remSize, endianness); if (result != returnvalue::OK) { return result; } if (remSize > 0) { if (optionArrayMaxSize == 0 or optionArray == nullptr) { return cfdp::METADATA_CANT_PARSE_OPTIONS; } size_t optsIdx = 0; while (remSize > 0) { if (optsIdx > optionArrayMaxSize) { return cfdp::METADATA_CANT_PARSE_OPTIONS; } result = optionArray[optsIdx].deSerialize(&buf, &remSize, endianness); if (result != returnvalue::OK) { return result; } optsIdx++; } parsedOptions = optsIdx; } return result; } size_t MetadataPduReader::getNumberOfParsedOptions() const { return parsedOptions; } const cfdp::StringLv& MetadataPduReader::getSourceFileName() const { return srcFileName; } const cfdp::StringLv& MetadataPduReader::getDestFileName() const { return destFileName; } const MetadataGenericInfo& MetadataPduReader::getGenericInfo() const { return info; }