From 5e9d402598b67ec9dce8e54b6d745d71cae10a35 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Mon, 17 Jul 2023 16:40:44 +0200 Subject: [PATCH] getFileSize API for fsfw --- src/fsfw/cfdp/handler/SourceHandler.cpp | 14 ++++++++++++-- src/fsfw/cfdp/handler/defs.h | 1 + src/fsfw/filesystem/HasFileSystemIF.h | 2 ++ src/fsfw_hal/host/HostFilesystem.cpp | 8 ++++++++ src/fsfw_hal/host/HostFilesystem.h | 1 + unittests/mocks/FilesystemMock.cpp | 10 ++++++++++ unittests/mocks/FilesystemMock.h | 1 + 7 files changed, 35 insertions(+), 2 deletions(-) diff --git a/src/fsfw/cfdp/handler/SourceHandler.cpp b/src/fsfw/cfdp/handler/SourceHandler.cpp index 37f29419..fd33226a 100644 --- a/src/fsfw/cfdp/handler/SourceHandler.cpp +++ b/src/fsfw/cfdp/handler/SourceHandler.cpp @@ -4,6 +4,7 @@ #include +#include "fsfw/cfdp/pdu/MetadataPduCreator.h" #include "fsfw/filesystem/HasFileSystemIF.h" using namespace returnvalue; @@ -124,6 +125,13 @@ ReturnValue_t cfdp::SourceHandler::putRequest(PutRequestFull& putRequest, Remote } std::memcpy(transactionParams.sourceName.data(), putRequest.sourceName, putRequest.sourceNameSize); + FilesystemParams params(transactionParams.sourceName.data()); + if (!sourceParams.user.vfs.fileExists(params)) { + return FILE_DOES_NOT_EXIST; + } + size_t fileSize = 0; + sourceParams.user.vfs.getFileSize(params, fileSize); + transactionParams.fileSize.setFileSize(fileSize, false); if (putRequest.destNameSize > transactionParams.destName.size()) { return FAILED; } @@ -133,8 +141,10 @@ ReturnValue_t cfdp::SourceHandler::putRequest(PutRequestFull& putRequest, Remote } ReturnValue_t cfdp::SourceHandler::prepareAndSendMetadataPdu() { - // TODO: Implement - // Advance FSM if everythings works + // FileSize fileSize(); + // auto metadataInfo = MetadataInfo(); + // TODO: Implement + // Advance FSM if everythings works step = TransactionStep::SENDING_FILE_DATA; return OK; } diff --git a/src/fsfw/cfdp/handler/defs.h b/src/fsfw/cfdp/handler/defs.h index 56f231b3..dc300e7e 100644 --- a/src/fsfw/cfdp/handler/defs.h +++ b/src/fsfw/cfdp/handler/defs.h @@ -73,6 +73,7 @@ static constexpr Event FILENAME_TOO_LARGE_ERROR = event::makeEvent(SSID, 4, seve } // namespace events static constexpr ReturnValue_t SOURCE_TRANSACTION_PENDING = returnvalue::makeCode(CID, 0); +static constexpr ReturnValue_t FILE_DOES_NOT_EXIST = returnvalue::makeCode(CID, 1); } // namespace cfdp #endif // FSFW_CFDP_HANDLER_DEFS_H diff --git a/src/fsfw/filesystem/HasFileSystemIF.h b/src/fsfw/filesystem/HasFileSystemIF.h index a507938e..db3e8ddf 100644 --- a/src/fsfw/filesystem/HasFileSystemIF.h +++ b/src/fsfw/filesystem/HasFileSystemIF.h @@ -80,6 +80,8 @@ class HasFileSystemIF { virtual bool isDirectory(const char* path) = 0; + virtual bool getFileSize(FilesystemParams params, size_t& fileSize) = 0; + virtual bool fileExists(FilesystemParams params) = 0; /** diff --git a/src/fsfw_hal/host/HostFilesystem.cpp b/src/fsfw_hal/host/HostFilesystem.cpp index 20984f77..e2f8d808 100644 --- a/src/fsfw_hal/host/HostFilesystem.cpp +++ b/src/fsfw_hal/host/HostFilesystem.cpp @@ -184,3 +184,11 @@ ReturnValue_t HostFilesystem::getBaseFilename(FilesystemParams params, char *nam baseNameLen = baseName.size(); return returnvalue::OK; } + +bool HostFilesystem::getFileSize(FilesystemParams params, size_t &fileSize) { + if (!fileExists(params)) { + return false; + } + fileSize = std::filesystem::file_size(params.path); + return true; +} diff --git a/src/fsfw_hal/host/HostFilesystem.h b/src/fsfw_hal/host/HostFilesystem.h index da217aec..1946ab9a 100644 --- a/src/fsfw_hal/host/HostFilesystem.h +++ b/src/fsfw_hal/host/HostFilesystem.h @@ -11,6 +11,7 @@ class HostFilesystem : public HasFileSystemIF { ReturnValue_t getBaseFilename(FilesystemParams params, char *nameBuf, size_t maxLen, size_t &baseNameLen) override; + virtual bool getFileSize(FilesystemParams params, size_t &fileSize) override; bool isDirectory(const char *path) override; bool fileExists(FilesystemParams params) override; ReturnValue_t truncateFile(FilesystemParams params) override; diff --git a/unittests/mocks/FilesystemMock.cpp b/unittests/mocks/FilesystemMock.cpp index 24850227..6efa12f2 100644 --- a/unittests/mocks/FilesystemMock.cpp +++ b/unittests/mocks/FilesystemMock.cpp @@ -145,3 +145,13 @@ ReturnValue_t FilesystemMock::getBaseFilename(FilesystemParams params, char *nam } bool FilesystemMock::isDirectory(const char *path) { return false; } + +bool FilesystemMock::getFileSize(FilesystemParams params, size_t &fileSize) { + std::string filename(params.path); + auto iter = fileMap.find(filename); + if (iter == fileMap.end()) { + fileSize = iter->second.fileRaw.size(); + return true; + } + return false; +} diff --git a/unittests/mocks/FilesystemMock.h b/unittests/mocks/FilesystemMock.h index 2ddbefc3..b24d5c4c 100644 --- a/unittests/mocks/FilesystemMock.h +++ b/unittests/mocks/FilesystemMock.h @@ -62,6 +62,7 @@ class FilesystemMock : public HasFileSystemIF { bool isDirectory(const char *path) override; bool fileExists(FilesystemParams params) override; ReturnValue_t truncateFile(FilesystemParams params) override; + bool getFileSize(FilesystemParams params, size_t &fileSize) override; ReturnValue_t writeToFile(FileOpParams params, const uint8_t *data) override; ReturnValue_t readFromFile(FileOpParams params, uint8_t **buffer, size_t &readSize,