fsfw/src/fsfw/cfdp/FileSize.h

81 lines
2.3 KiB
C
Raw Normal View History

2022-08-08 18:29:32 +02:00
#ifndef FSFW_CFDP_FILESIZE_H_
#define FSFW_CFDP_FILESIZE_H_
#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;
2022-08-08 18:29:32 +02:00
explicit FileSize(uint64_t fileSize, bool isLarge = false) { setFileSize(fileSize, isLarge); };
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);
}
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);
}
2022-02-02 10:29:30 +01:00
return SerializeAdapter::serialize(&fileSize, buffer, size, maxSize, streamEndianness);
}
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;
}
2022-02-02 10:29:30 +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;
}
2022-02-02 10:29:30 +01:00
}
2022-09-02 14:39:53 +02:00
ReturnValue_t setFileSize(uint64_t fileSize_, bool largeFile_) {
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;
}
2022-09-02 14:39:53 +02:00
this->fileSize = fileSize_;
this->largeFile = largeFile_;
2022-08-16 01:08:26 +02:00
return returnvalue::OK;
2022-02-02 10:29:30 +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;
}
2022-02-02 10:29:30 +01:00
return fileSize;
}
private:
uint64_t fileSize = 0;
bool largeFile = false;
};
2022-02-02 10:29:30 +01:00
} // namespace cfdp
2022-08-08 18:29:32 +02:00
#endif /* FSFW_CFDP_FILESIZE_H_ */