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
|
|
|
|
2023-08-16 13:10:21 +02:00
|
|
|
ReturnValue_t cfdp::ReservedMessageParser::parse(const MessageToUserTlv* msgsToUserArray,
|
|
|
|
size_t numMsgToUser) {
|
2023-07-24 16:38:11 +02:00
|
|
|
ReturnValue_t result;
|
2023-07-27 14:55:46 +02:00
|
|
|
cfdp::StringLv sourceFileName;
|
|
|
|
cfdp::StringLv destFileName;
|
2023-07-24 16:38:11 +02:00
|
|
|
PutRequest putRequest;
|
2023-08-16 13:10:21 +02:00
|
|
|
const uint8_t* currentPtr = nullptr;
|
|
|
|
size_t deserSize = 0;
|
2023-07-24 16:38:11 +02:00
|
|
|
bool needToSendPutRequest = false;
|
2023-08-16 13:10:21 +02:00
|
|
|
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;
|
2023-08-16 13:10:21 +02:00
|
|
|
if (msgsToUserArray[idx].isReservedCfdpMessage(messageType, ¤tPtr, deserSize)) {
|
2023-07-24 16:38:11 +02:00
|
|
|
if (messageType == static_cast<uint8_t>(ProxyOpMessageType::PUT_REQUEST)) {
|
2023-07-26 17:17:51 +02:00
|
|
|
EntityId entityIdLv;
|
|
|
|
entityIdLv.deSerializeFromLv(¤tPtr, &deserSize);
|
2023-07-24 16:38:11 +02:00
|
|
|
if (result != returnvalue::OK) {
|
|
|
|
return result;
|
|
|
|
}
|
2023-07-26 17:17:51 +02:00
|
|
|
putRequest.setDestId(entityIdLv);
|
2023-07-24 16:38:11 +02:00
|
|
|
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;
|
|
|
|
}
|
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
|
|
|
}
|