/* * Copyright 2015 - 2024 gary@drinkingtea.net * * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ #pragma once #if __has_include() && defined(OX_USE_STDLIB) #include #include #include "filesystem.hpp" #define OX_HAS_PASSTHROUGHFS namespace ox { constexpr auto HasPassThroughFS = true; /** * */ class PassThroughFS: public FileSystem { private: std::filesystem::path m_path; public: explicit PassThroughFS(CRStringView dirPath); ~PassThroughFS() noexcept override; [[nodiscard]] String basePath() const noexcept; Error mkdir(CRStringView path, bool recursive) noexcept override; Error move(CRStringView src, CRStringView dest) noexcept override; Result> ls(CRStringView dir) const noexcept override; template Error ls(CRStringView dir, F cb) const noexcept; Error remove(CRStringView path, bool recursive) noexcept override; Error resize(uint64_t size, void *buffer) noexcept override; Result statInode(uint64_t inode) const noexcept override; Result statPath(CRStringView path) const noexcept override; [[nodiscard]] uint64_t spaceNeeded(uint64_t size) const noexcept override; Result available() const noexcept override; Result size() const noexcept override; [[nodiscard]] char *buff() noexcept override; Error walk(Error(*cb)(uint8_t, uint64_t, uint64_t)) noexcept override; [[nodiscard]] bool valid() const noexcept override; protected: Error readFilePath(CRStringView path, void *buffer, std::size_t buffSize) noexcept override; Error readFileInode(uint64_t inode, void *buffer, std::size_t size) noexcept override; Error readFileInodeRange(uint64_t inode, std::size_t readStart, std::size_t readSize, void *buffer, std::size_t *size) noexcept override; Error writeFilePath(CRStringView path, const void *buffer, uint64_t size, FileType fileType) noexcept override; Error writeFileInode(uint64_t inode, const void *buffer, uint64_t size, FileType fileType) noexcept override; private: /** * Strips the leading slashes from a string. */ [[nodiscard]] static std::string_view stripSlash(StringView path) noexcept; }; template Error PassThroughFS::ls(CRStringView dir, F cb) const noexcept { std::error_code ec; const auto di = std::filesystem::directory_iterator(m_path / stripSlash(dir), ec); oxReturnError(OxError(static_cast(ec.value()), "PassThroughFS: ls failed")); for (auto &p : di) { oxReturnError(cb(p.path().filename().c_str(), 0)); } return OxError(0); } } #else namespace ox { constexpr auto HasPassThroughFS = false; } #endif