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-07-24 16:40:44 +02:00
|
|
|
ReturnValue_t cfdp::ReservedMessageParser::parse(const uint8_t* msgsToUserPtr,
|
2023-07-24 18:01:25 +02:00
|
|
|
size_t sizeOfMessages) {
|
2023-07-24 16:38:11 +02:00
|
|
|
ReturnValue_t result;
|
2023-07-24 11:57:33 +02:00
|
|
|
size_t currentIdx = 0;
|
2023-07-24 16:38:11 +02:00
|
|
|
const uint8_t* currentPtr = msgsToUserPtr;
|
|
|
|
MessageToUserTlv tlv;
|
|
|
|
size_t deserSize = sizeOfMessages;
|
|
|
|
PutRequest putRequest;
|
|
|
|
bool needToSendPutRequest = false;
|
2023-07-24 11:57:33 +02:00
|
|
|
while (currentIdx < sizeOfMessages) {
|
2023-07-24 16:38:11 +02:00
|
|
|
result = tlv.deSerialize(¤tPtr, &deserSize, SerializeIF::Endianness::NETWORK);
|
|
|
|
if (result != returnvalue::OK) {
|
|
|
|
return result;
|
|
|
|
}
|
|
|
|
uint8_t messageType = 0;
|
2023-07-25 16:16:35 +02:00
|
|
|
if (tlv.isReservedCfdpMessage(messageType, ¤tPtr, deserSize)) {
|
2023-07-24 16:38:11 +02:00
|
|
|
if (messageType == static_cast<uint8_t>(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<cfdp::WidthInBytes>(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;
|
|
|
|
}
|
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
|
|
|
}
|