fsfw/src/fsfw/cfdp/handler/ReservedMessageParser.cpp

75 lines
2.6 KiB
C++
Raw Normal View History

2023-07-24 16:42:13 +02:00
#include "ReservedMessageParser.h"
2023-07-24 16:38:11 +02:00
#include "fsfw/cfdp/CfdpMessage.h"
#include "fsfw/cfdp/handler/PutRequest.h"
2023-07-24 11:57:33 +02:00
#include "fsfw/cfdp/tlv/MessageToUserTlv.h"
2023-07-24 16:38:11 +02:00
#include "fsfw/ipc/CommandMessage.h"
2023-07-24 11:57:33 +02:00
#include "fsfw/ipc/QueueFactory.h"
2023-07-24 16:38:11 +02:00
using namespace returnvalue;
2023-07-24 16:40:25 +02:00
cfdp::ReservedMessageParser::ReservedMessageParser(StorageManagerIF& ipcStore,
MessageQueueIF& msgQueue,
MessageQueueId_t userDestination)
2023-07-24 16:42:13 +02:00
: msgQueue(msgQueue), ipcStore(ipcStore), userDestination(userDestination) {}
2023-07-24 16:38:11 +02:00
ReturnValue_t cfdp::ReservedMessageParser::parse(const MessageToUserTlv* msgsToUserArray,
size_t numMsgToUser) {
2023-09-11 15:38:46 +02:00
ReturnValue_t result = returnvalue::OK;
2023-07-27 14:55:46 +02:00
cfdp::StringLv sourceFileName;
cfdp::StringLv destFileName;
2023-07-24 16:38:11 +02:00
PutRequest putRequest;
const uint8_t* currentPtr = nullptr;
size_t deserSize = 0;
2023-07-24 16:38:11 +02:00
bool needToSendPutRequest = false;
for (size_t idx = 0; idx < numMsgToUser; idx++) {
if (&msgsToUserArray[idx] == nullptr) {
continue;
2023-07-24 16:38:11 +02:00
}
uint8_t messageType = 0;
if (msgsToUserArray[idx].isReservedCfdpMessage(messageType, &currentPtr, deserSize)) {
2023-07-24 16:38:11 +02:00
if (messageType == static_cast<uint8_t>(ProxyOpMessageType::PUT_REQUEST)) {
EntityId entityIdLv;
2023-09-11 15:38:06 +02:00
result = entityIdLv.deSerializeFromLv(&currentPtr, &deserSize);
2023-07-24 16:38:11 +02:00
if (result != returnvalue::OK) {
return result;
}
putRequest.setDestId(entityIdLv);
2023-07-24 16:38:11 +02:00
result =
sourceFileName.deSerialize(&currentPtr, &deserSize, SerializeIF::Endianness::NETWORK);
if (result != OK) {
return result;
}
result =
destFileName.deSerialize(&currentPtr, &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;
}
2023-07-24 11:57:33 +02:00
}
2023-07-24 16:38:11 +02:00
return OK;
2023-07-24 11:57:33 +02:00
}