#pragma once #include #include #include "fsfw/cfdp/VarLenFields.h" #include "fsfw/cfdp/tlv/FilestoreRequestTlv.h" #include "fsfw/cfdp/tlv/MessageToUserTlv.h" namespace cfdp { class PutRequest : public SerializeIF { public: /** * Metadata only constructor. * @param destId * @param msgsToUser * @param msgsToUserTotalSize * @param fsRequests * @param fsRequestsSize */ PutRequest(EntityId destId, const uint8_t* msgsToUser, size_t msgsToUserTotalSize, const uint8_t* fsRequests, size_t fsRequestsSize); /** * Put request to initiate file transfers. By default, the transmission mode and closure requested * parameter are not present, thereby being derived from the remote configuration for a * particular destination ID. * @param destId * @param sourceName * @param destName */ PutRequest(EntityId destId, cfdp::StringLv& sourceName, cfdp::StringLv& destName); /** * Default constructor for deserialization. */ PutRequest() = default; [[nodiscard]] ReturnValue_t serialize(uint8_t** buffer, size_t* size, size_t maxSize, Endianness streamEndianness) const override; ReturnValue_t deSerialize(const uint8_t** buffer, size_t* size, Endianness streamEndianness) override; [[nodiscard]] size_t getSerializedSize() const override; void setSourceAndDestName(cfdp::StringLv& sourceName, cfdp::StringLv& destName); [[nodiscard]] const cfdp::StringLv& getSourceName() const; [[nodiscard]] const cfdp::StringLv& getDestName() const; void setTransmissionMode(cfdp::TransmissionMode transmissionMode); void clearTransmissionMode(); void setClosureRequest(bool closureRequested); void clearClosureRequest(); const uint8_t* getMessagesToUser(size_t& msgSize); [[nodiscard]] bool isMetadataOnly() const; bool getTransmissionMode(TransmissionMode& mode) const; bool getClosureRequested(bool& closureRequested) const; [[nodiscard]] const EntityId& getDestId() const; void setDestId(EntityId id); private: EntityId destId; uint8_t metadataOnly = true; // Transaction parameters. Omitted if the put request is metadata only. cfdp::StringLv sourceName; cfdp::StringLv destName; bool hasTransmissionMode = false; uint8_t transmissionMode = TransmissionMode::UNACKNOWLEDGED; bool hasClosureRequested = false; uint8_t closureRequested = false; // Metadata size_t msgsToUsersTotalSize = 0; const uint8_t* msgsToUserStartPtr = nullptr; size_t fsRequestsTotalSize = 0; const uint8_t* fsRequestStartPtr = nullptr; }; } // namespace cfdp