From 54ac86fce71e8a581e2a96c692d51ca84b33c142 Mon Sep 17 00:00:00 2001 From: Gary Talent Date: Sat, 12 Oct 2019 11:56:49 -0500 Subject: [PATCH] [ox/fs] Add FileAddress support to FileSystem --- deps/ox/src/ox/fs/filesystem/filelocation.cpp | 19 +++++- deps/ox/src/ox/fs/filesystem/filelocation.hpp | 56 ++++++++++++++--- deps/ox/src/ox/fs/filesystem/filesystem.cpp | 60 +++++++++++++++++++ deps/ox/src/ox/fs/filesystem/filesystem.hpp | 11 ++++ deps/ox/src/ox/fs/fs.hpp | 1 + deps/ox/src/ox/std/error.hpp | 4 ++ 6 files changed, 142 insertions(+), 9 deletions(-) diff --git a/deps/ox/src/ox/fs/filesystem/filelocation.cpp b/deps/ox/src/ox/fs/filesystem/filelocation.cpp index 7fb30a21..ef41f6db 100644 --- a/deps/ox/src/ox/fs/filesystem/filelocation.cpp +++ b/deps/ox/src/ox/fs/filesystem/filelocation.cpp @@ -10,8 +10,23 @@ namespace ox { -FileLocation::~FileLocation() { - if (m_type == Path) { +FileAddress::FileAddress(uint64_t inode) { + m_data.inode = inode; + m_type = FileAddressType::Inode; +} + +FileAddress::FileAddress(char *path) { + m_data.path = path; + m_type = FileAddressType::Path; +} + +FileAddress::FileAddress(const char *path) { + m_data.constPath = path; + m_type = FileAddressType::ConstPath; +} + +FileAddress::~FileAddress() { + if (m_type == FileAddressType::Path) { delete m_data.path; m_data.path = nullptr; } diff --git a/deps/ox/src/ox/fs/filesystem/filelocation.hpp b/deps/ox/src/ox/fs/filesystem/filelocation.hpp index 3d093889..3b160c04 100644 --- a/deps/ox/src/ox/fs/filesystem/filelocation.hpp +++ b/deps/ox/src/ox/fs/filesystem/filelocation.hpp @@ -6,24 +6,66 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ +#pragma once + #include namespace ox { -class FileLocation { +enum class FileAddressType { + None = -1, + Path, + ConstPath, + Inode, +}; + +class FileAddress { private: - enum { - None = -1, - Path = 0, - Inode = 1, - } m_type = None; + FileAddressType m_type = FileAddressType::None; union { char *path; + const char *constPath; uint64_t inode; } m_data; public: - ~FileLocation(); + FileAddress(uint64_t inode); + + FileAddress(char *path); + + FileAddress(const char *path); + + ~FileAddress(); + + [[nodiscard]] constexpr FileAddressType type() const noexcept { + switch (m_type) { + case FileAddressType::Path: + case FileAddressType::ConstPath: + return FileAddressType::Path; + default: + return m_type; + } + } + + [[nodiscard]] constexpr ValErr getInode() const noexcept { + switch (m_type) { + case FileAddressType::Inode: + return m_data.inode; + default: + return OxError(1); + } + } + + [[nodiscard]] constexpr ValErr getPath() const noexcept { + switch (m_type) { + case FileAddressType::Path: + return m_data.path; + case FileAddressType::ConstPath: + return m_data.constPath; + default: + return OxError(1); + } + } }; diff --git a/deps/ox/src/ox/fs/filesystem/filesystem.cpp b/deps/ox/src/ox/fs/filesystem/filesystem.cpp index b2d65a46..27b67ac6 100644 --- a/deps/ox/src/ox/fs/filesystem/filesystem.cpp +++ b/deps/ox/src/ox/fs/filesystem/filesystem.cpp @@ -10,6 +10,66 @@ namespace ox { +[[nodiscard]] ox::Error FileSystem::read(FileAddress addr, void *buffer, std::size_t size) { + switch (addr.type()) { + case FileAddressType::Inode: + return read(addr.getInode().value, buffer, size); + case FileAddressType::ConstPath: + case FileAddressType::Path: + return read(addr.getPath().value, buffer, size); + default: + return OxError(1); + } +} + +[[nodiscard]] ox::Error FileSystem::read(FileAddress addr, std::size_t readStart, std::size_t readSize, void *buffer, std::size_t *size) { + switch (addr.type()) { + case FileAddressType::Inode: + return read(addr.getInode().value, readStart, readSize, buffer, size); + case FileAddressType::ConstPath: + case FileAddressType::Path: + return read(addr.getPath().value, readStart, readSize, buffer, size); + default: + return OxError(1); + } +} + +[[nodiscard]] ox::Error FileSystem::remove(FileAddress addr, bool recursive) { + switch (addr.type()) { + case FileAddressType::Inode: + return remove(addr.getInode().value, recursive); + case FileAddressType::ConstPath: + case FileAddressType::Path: + return remove(addr.getPath().value, recursive); + default: + return OxError(1); + } +} + +ox::Error FileSystem::write(FileAddress addr, void *buffer, uint64_t size, uint8_t fileType) { + switch (addr.type()) { + case FileAddressType::Inode: + return write(addr.getInode().value, buffer, size, fileType); + case FileAddressType::ConstPath: + case FileAddressType::Path: + return write(addr.getPath().value, buffer, size, fileType); + default: + return OxError(1); + } +} + +ox::ValErr FileSystem::stat(FileAddress addr) { + switch (addr.type()) { + case FileAddressType::Inode: + return stat(addr.getInode().value); + case FileAddressType::ConstPath: + case FileAddressType::Path: + return stat(addr.getPath().value); + default: + return OxError(1); + } +} + template class FileSystemTemplate; template class FileSystemTemplate; diff --git a/deps/ox/src/ox/fs/filesystem/filesystem.hpp b/deps/ox/src/ox/fs/filesystem/filesystem.hpp index 1734cf16..529b9a7f 100644 --- a/deps/ox/src/ox/fs/filesystem/filesystem.hpp +++ b/deps/ox/src/ox/fs/filesystem/filesystem.hpp @@ -9,6 +9,7 @@ #pragma once #include +#include #include #include "directory.hpp" @@ -35,18 +36,28 @@ class FileSystem { virtual ox::Error read(uint64_t inode, std::size_t readStart, std::size_t readSize, void *buffer, std::size_t *size) = 0; + [[nodiscard]] ox::Error read(FileAddress addr, void *buffer, std::size_t size); + + [[nodiscard]] ox::Error read(FileAddress addr, std::size_t readStart, std::size_t readSize, void *buffer, std::size_t *size); + virtual ox::Error remove(const char *path, bool recursive = false) = 0; + [[nodiscard]] ox::Error remove(FileAddress addr, bool recursive = false); + virtual ox::Error resize(uint64_t size, void *buffer = nullptr) = 0; virtual ox::Error write(const char *path, void *buffer, uint64_t size, uint8_t fileType = FileType_NormalFile) = 0; virtual ox::Error write(uint64_t inode, void *buffer, uint64_t size, uint8_t fileType = FileType_NormalFile) = 0; + [[nodiscard]] ox::Error write(FileAddress addr, void *buffer, uint64_t size, uint8_t fileType = FileType_NormalFile); + virtual ox::ValErr stat(uint64_t inode) = 0; virtual ox::ValErr stat(const char *path) = 0; + [[nodiscard]] ox::ValErr stat(FileAddress addr); + virtual uint64_t spaceNeeded(uint64_t size) = 0; virtual uint64_t available() = 0; diff --git a/deps/ox/src/ox/fs/fs.hpp b/deps/ox/src/ox/fs/fs.hpp index 13890bd7..a0e4de86 100644 --- a/deps/ox/src/ox/fs/fs.hpp +++ b/deps/ox/src/ox/fs/fs.hpp @@ -9,6 +9,7 @@ #pragma once #include "filestore/filestoretemplate.hpp" +#include "filesystem/filelocation.hpp" #include "filesystem/filesystem.hpp" #include "filesystem/passthroughfs.hpp" #include "filesystem/directory.hpp" diff --git a/deps/ox/src/ox/std/error.hpp b/deps/ox/src/ox/std/error.hpp index 1fd2112e..26184bff 100644 --- a/deps/ox/src/ox/std/error.hpp +++ b/deps/ox/src/ox/std/error.hpp @@ -64,6 +64,10 @@ struct ValErr { constexpr ValErr() noexcept: error(0) { } + constexpr ValErr(Error error) noexcept: value(ox::move(value)), error(error) { + this->error = error; + } + constexpr ValErr(T value, Error error = OxError(0)) noexcept: value(ox::move(value)), error(error) { }