#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 MessageToUserTlv* msgsToUserArray, size_t numMsgToUser) { ReturnValue_t result = returnvalue::OK; cfdp::StringLv sourceFileName; cfdp::StringLv destFileName; PutRequest putRequest; const uint8_t* currentPtr = nullptr; size_t deserSize = 0; bool needToSendPutRequest = false; for (size_t idx = 0; idx < numMsgToUser; idx++) { if (&msgsToUserArray[idx] == nullptr) { continue; } uint8_t messageType = 0; if (msgsToUserArray[idx].isReservedCfdpMessage(messageType, ¤tPtr, deserSize)) { if (messageType == static_cast(ProxyOpMessageType::PUT_REQUEST)) { EntityId entityIdLv; result = entityIdLv.deSerializeFromLv(¤tPtr, &deserSize); if (result != returnvalue::OK) { return result; } putRequest.setDestId(entityIdLv); result = sourceFileName.deSerialize(¤tPtr, &deserSize, SerializeIF::Endianness::NETWORK); if (result != OK) { return result; } result = destFileName.deSerialize(¤tPtr, &deserSize, SerializeIF::Endianness::NETWORK); if (result != OK) { return result; } putRequest.setSourceAndDestName(sourceFileName, destFileName); needToSendPutRequest = true; } } } 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; }