2022-08-08 18:29:32 +02:00
|
|
|
#ifndef FSFW_CFDP_FILESIZE_H_
|
|
|
|
#define FSFW_CFDP_FILESIZE_H_
|
2021-12-03 15:37:49 +01:00
|
|
|
|
2022-09-02 17:54:25 +02:00
|
|
|
#include <optional>
|
|
|
|
|
2021-12-03 15:37:49 +01:00
|
|
|
#include "fsfw/serialize/SerializeAdapter.h"
|
|
|
|
#include "fsfw/serialize/SerializeIF.h"
|
|
|
|
|
|
|
|
namespace cfdp {
|
|
|
|
|
2022-02-02 10:29:30 +01:00
|
|
|
struct FileSize : public SerializeIF {
|
|
|
|
public:
|
2022-09-02 14:39:53 +02:00
|
|
|
FileSize() = default;
|
2021-12-03 15:37:49 +01:00
|
|
|
|
2022-08-08 18:29:32 +02:00
|
|
|
explicit FileSize(uint64_t fileSize, bool isLarge = false) { setFileSize(fileSize, isLarge); };
|
2021-12-03 15:37:49 +01:00
|
|
|
|
2022-09-02 14:39:53 +02:00
|
|
|
[[nodiscard]] uint64_t value() const { return fileSize; }
|
|
|
|
|
2022-02-02 10:29:30 +01:00
|
|
|
ReturnValue_t serialize(bool isLarge, uint8_t **buffer, size_t *size, size_t maxSize,
|
|
|
|
Endianness streamEndianness) {
|
|
|
|
this->largeFile = isLarge;
|
|
|
|
return serialize(buffer, size, maxSize, streamEndianness);
|
|
|
|
}
|
2021-12-03 15:37:49 +01:00
|
|
|
|
2022-02-02 10:29:30 +01:00
|
|
|
ReturnValue_t serialize(uint8_t **buffer, size_t *size, size_t maxSize,
|
|
|
|
Endianness streamEndianness) const override {
|
|
|
|
if (not largeFile) {
|
|
|
|
uint32_t fileSizeTyped = fileSize;
|
|
|
|
return SerializeAdapter::serialize(&fileSizeTyped, buffer, size, maxSize, streamEndianness);
|
2021-12-03 15:37:49 +01:00
|
|
|
}
|
2022-02-02 10:29:30 +01:00
|
|
|
return SerializeAdapter::serialize(&fileSize, buffer, size, maxSize, streamEndianness);
|
|
|
|
}
|
2021-12-03 15:37:49 +01:00
|
|
|
|
2022-08-08 18:29:32 +02:00
|
|
|
[[nodiscard]] size_t getSerializedSize() const override {
|
2022-02-02 10:29:30 +01:00
|
|
|
if (largeFile) {
|
|
|
|
return 8;
|
|
|
|
} else {
|
|
|
|
return 4;
|
2021-12-03 15:37:49 +01:00
|
|
|
}
|
2022-02-02 10:29:30 +01:00
|
|
|
}
|
2021-12-03 15:37:49 +01:00
|
|
|
|
2022-02-02 10:29:30 +01:00
|
|
|
ReturnValue_t deSerialize(const uint8_t **buffer, size_t *size,
|
|
|
|
Endianness streamEndianness) override {
|
|
|
|
if (largeFile) {
|
|
|
|
return SerializeAdapter::deSerialize(&size, buffer, size, streamEndianness);
|
|
|
|
} else {
|
|
|
|
uint32_t sizeTmp = 0;
|
|
|
|
ReturnValue_t result =
|
|
|
|
SerializeAdapter::deSerialize(&sizeTmp, buffer, size, streamEndianness);
|
2022-08-16 01:08:26 +02:00
|
|
|
if (result == returnvalue::OK) {
|
2022-02-02 10:29:30 +01:00
|
|
|
fileSize = sizeTmp;
|
|
|
|
}
|
|
|
|
return result;
|
2021-12-03 15:37:49 +01:00
|
|
|
}
|
2022-02-02 10:29:30 +01:00
|
|
|
}
|
2021-12-03 15:37:49 +01:00
|
|
|
|
2022-09-02 17:54:25 +02:00
|
|
|
ReturnValue_t setFileSize(uint64_t fileSize_, std::optional<bool> largeFile_) {
|
|
|
|
if (largeFile_) {
|
|
|
|
largeFile = largeFile_.value();
|
|
|
|
}
|
2022-02-02 10:29:30 +01:00
|
|
|
if (not largeFile and fileSize > UINT32_MAX) {
|
|
|
|
// TODO: emit warning here
|
2022-08-16 01:08:26 +02:00
|
|
|
return returnvalue::FAILED;
|
2021-12-03 15:37:49 +01:00
|
|
|
}
|
2022-09-02 14:39:53 +02:00
|
|
|
this->fileSize = fileSize_;
|
2022-08-16 01:08:26 +02:00
|
|
|
return returnvalue::OK;
|
2022-02-02 10:29:30 +01:00
|
|
|
}
|
2021-12-03 15:37:49 +01:00
|
|
|
|
2022-08-08 18:29:32 +02:00
|
|
|
[[nodiscard]] bool isLargeFile() const { return largeFile; }
|
2022-09-02 14:39:53 +02:00
|
|
|
uint64_t getSize(bool *largeFile_ = nullptr) const {
|
|
|
|
if (largeFile_ != nullptr) {
|
|
|
|
*largeFile_ = this->largeFile;
|
2021-12-03 15:37:49 +01:00
|
|
|
}
|
2022-02-02 10:29:30 +01:00
|
|
|
return fileSize;
|
|
|
|
}
|
|
|
|
|
|
|
|
private:
|
|
|
|
uint64_t fileSize = 0;
|
|
|
|
bool largeFile = false;
|
2021-12-03 15:37:49 +01:00
|
|
|
};
|
|
|
|
|
2022-02-02 10:29:30 +01:00
|
|
|
} // namespace cfdp
|
2021-12-03 15:37:49 +01:00
|
|
|
|
2022-08-08 18:29:32 +02:00
|
|
|
#endif /* FSFW_CFDP_FILESIZE_H_ */
|