diff --git a/source/mijin/virtual_filesystem/filesystem.cpp b/source/mijin/virtual_filesystem/filesystem.cpp index dbad57f..acf3072 100644 --- a/source/mijin/virtual_filesystem/filesystem.cpp +++ b/source/mijin/virtual_filesystem/filesystem.cpp @@ -107,6 +107,11 @@ FileInfo OSFileSystemAdapter::getFileInfo(const fs::path& file) return info; } +Optional OSFileSystemAdapter::getNativePath(const fs::path& file) +{ + return file; +} + StreamError OSFileSystemAdapter::open(const fs::path& path, FileOpenMode mode, std::unique_ptr& outStream) { const std::string pathStr = path.string(); diff --git a/source/mijin/virtual_filesystem/filesystem.hpp b/source/mijin/virtual_filesystem/filesystem.hpp index bc6863b..8228b7f 100644 --- a/source/mijin/virtual_filesystem/filesystem.hpp +++ b/source/mijin/virtual_filesystem/filesystem.hpp @@ -10,6 +10,7 @@ #include #include #include +#include "../container/optional.hpp" #include "../io/stream.hpp" #include "../util/hash.hpp" @@ -62,6 +63,7 @@ public: [[nodiscard]] class FileSystemAdapter* getAdapter() const noexcept { return adapter_; } [[nodiscard]] const fs::path& getPath() const noexcept { return path_; } [[nodiscard]] inline FileInfo getInfo() const; + [[nodiscard]] inline Optional getNativePath() const; [[nodiscard]] inline StreamError open(FileOpenMode mode, std::unique_ptr& outStream) const; }; @@ -74,6 +76,7 @@ public: [[nodiscard]] virtual fs::path getHomeFolder() = 0; [[nodiscard]] virtual std::vector listFiles(const fs::path& folder) = 0; [[nodiscard]] virtual FileInfo getFileInfo(const fs::path& file) = 0; + [[nodiscard]] virtual Optional getNativePath(const fs::path& /* file */) { return NULL_OPTIONAL; } [[nodiscard]] virtual StreamError open(const fs::path& path, FileOpenMode mode, std::unique_ptr& outStream) = 0; [[nodiscard]] PathReference getPath(fs::path path) noexcept { return PathReference(this, std::move(path)); } @@ -86,6 +89,7 @@ public: fs::path getHomeFolder() override; std::vector listFiles(const fs::path& folder) override; FileInfo getFileInfo(const fs::path& file) override; + Optional getNativePath(const fs::path& file) override; StreamError open(const fs::path& path, FileOpenMode mode, std::unique_ptr& outStream) override; static OSFileSystemAdapter& getInstance(); @@ -100,6 +104,11 @@ inline FileInfo PathReference::getInfo() const return adapter_->getFileInfo(path_); } +Optional PathReference::getNativePath() const +{ + return adapter_->getNativePath(path_); +} + inline StreamError PathReference::open(FileOpenMode mode, std::unique_ptr& outStream) const { return adapter_->open(path_, mode, outStream); diff --git a/source/mijin/virtual_filesystem/relative.hpp b/source/mijin/virtual_filesystem/relative.hpp index f13d18d..fb25aca 100644 --- a/source/mijin/virtual_filesystem/relative.hpp +++ b/source/mijin/virtual_filesystem/relative.hpp @@ -41,6 +41,7 @@ public: fs::path getHomeFolder() override; std::vector listFiles(const fs::path& folder) override; FileInfo getFileInfo(const fs::path& file) override; + Optional getNativePath(const fs::path& file) override; StreamError open(const fs::path& path, FileOpenMode mode, std::unique_ptr& outStream) override; private: fs::path appendPath(const fs::path& other) const noexcept; @@ -80,6 +81,12 @@ FileInfo RelativeFileSystemAdapter::getFileInfo(const fs::path& file) return wrapped_.getFileInfo(appendPath(file)); } +template +Optional RelativeFileSystemAdapter::getNativePath(const fs::path& file) +{ + return wrapped_.getNativePath(appendPath(file)); +} + template StreamError RelativeFileSystemAdapter::open(const fs::path& path, FileOpenMode mode, std::unique_ptr& outStream) { diff --git a/source/mijin/virtual_filesystem/stacked.cpp b/source/mijin/virtual_filesystem/stacked.cpp index 2609ba6..f01d2f3 100644 --- a/source/mijin/virtual_filesystem/stacked.cpp +++ b/source/mijin/virtual_filesystem/stacked.cpp @@ -90,6 +90,19 @@ FileInfo StackedFileSystemAdapter::getFileInfo(const fs::path& file) return {}; } +Optional StackedFileSystemAdapter::getNativePath(const fs::path& file) +{ + for (auto& adapter : adapters_) + { + Optional result = adapter->getNativePath(file); + if (!result.empty()) + { + return result; + } + } + return NULL_OPTIONAL; +} + StreamError StackedFileSystemAdapter::open(const fs::path& path, FileOpenMode mode, std::unique_ptr& outStream) { for (auto& adapter : adapters_) diff --git a/source/mijin/virtual_filesystem/stacked.hpp b/source/mijin/virtual_filesystem/stacked.hpp index cdc6924..6f38f9f 100644 --- a/source/mijin/virtual_filesystem/stacked.hpp +++ b/source/mijin/virtual_filesystem/stacked.hpp @@ -32,6 +32,7 @@ public: fs::path getHomeFolder() override; std::vector listFiles(const fs::path& folder) override; FileInfo getFileInfo(const fs::path& file) override; + Optional getNativePath(const fs::path& file) override; StreamError open(const fs::path& path, FileOpenMode mode, std::unique_ptr& outStream) override; inline void addAdapter(std::unique_ptr&& adapter) {