#include "ReservedMessageParser.h" #include "fsfw/cfdp/CfdpMessage.h" #include "fsfw/cfdp/handler/PutRequest.h" #include "fsfw/cfdp/tlv/MessageToUserTlv.h" #include "fsfw/ipc/CommandMessage.h" #include "fsfw/ipc/QueueFactory.h" using namespace returnvalue; cfdp::ReservedMessageParser::ReservedMessageParser(StorageManagerIF& ipcStore, MessageQueueIF& msgQueue, MessageQueueId_t userDestination) : msgQueue(msgQueue), ipcStore(ipcStore), userDestination(userDestination) {} ReturnValue_t cfdp::ReservedMessageParser::parse(const uint8_t* msgsToUserPtr, size_t sizeOfMessages) { ReturnValue_t result; size_t currentIdx = 0; const uint8_t* currentPtr = msgsToUserPtr; MessageToUserTlv tlv; size_t deserSize = sizeOfMessages; PutRequest putRequest; bool needToSendPutRequest = false; while (currentIdx < sizeOfMessages) { result = tlv.deSerialize(¤tPtr, &deserSize, SerializeIF::Endianness::NETWORK); if (result != returnvalue::OK) { return result; } uint8_t messageType = 0; if (tlv.isReservedCfdpMessage(messageType)) { if (messageType == static_cast(ProxyOpMessageType::PUT_REQUEST)) { cfdp::Lv entityIdLv; result = entityIdLv.deSerialize(¤tPtr, &deserSize, SerializeIF::Endianness::NETWORK); if (result != returnvalue::OK) { return result; } size_t entityIdSize = 0; const uint8_t* deserStart = entityIdLv.getValue(&entityIdSize); result = putRequest.destId.deSerialize(static_cast(entityIdSize), &deserStart, &entityIdSize, SerializeIF::Endianness::NETWORK); if (result != OK) { return result; } cfdp::StringLv sourceFileName; result = sourceFileName.deSerialize(¤tPtr, &deserSize, SerializeIF::Endianness::NETWORK); if (result != OK) { return result; } cfdp::StringLv destFileName; result = destFileName.deSerialize(¤tPtr, &deserSize, SerializeIF::Endianness::NETWORK); if (result != OK) { return result; } putRequest.setSourceAndDestName(sourceFileName, destFileName); needToSendPutRequest = true; } } currentIdx += tlv.getSerializedSize(); } if (needToSendPutRequest) { store_address_t storeId; uint8_t* dataPtr; result = ipcStore.getFreeElement(&storeId, putRequest.getSerializedSize(), &dataPtr); if (result != OK) { return result; } size_t serLen = 0; result = putRequest.serialize(&dataPtr, &serLen, putRequest.getSerializedSize(), SerializeIF::Endianness::MACHINE); if (result != OK) { return result; } CommandMessage msg; CfdpMessage::setPutRequest(&msg, storeId); result = msgQueue.sendMessage(userDestination, &msg); if (result != OK) { return result; } } return OK; }