From fbdb48a1ee9d3f5ad5cd25ea41893fbd70b0414f Mon Sep 17 00:00:00 2001 From: Gary Talent Date: Tue, 22 Oct 2019 18:54:19 -0500 Subject: [PATCH] [ox/fs] Add modelWrite handler to FileAddress --- deps/ox/src/ox/fs/CMakeLists.txt | 1 - deps/ox/src/ox/fs/filesystem/filelocation.cpp | 5 ++ deps/ox/src/ox/fs/filesystem/filelocation.hpp | 50 +++++++++++++++++-- .../ox/src/ox/fs/filesystem/passthroughfs.cpp | 3 ++ deps/ox/src/ox/mc/write.hpp | 7 ++- deps/ox/src/ox/std/memops.hpp | 6 +++ 6 files changed, 64 insertions(+), 8 deletions(-) diff --git a/deps/ox/src/ox/fs/CMakeLists.txt b/deps/ox/src/ox/fs/CMakeLists.txt index 03da75de4..9bed1984e 100644 --- a/deps/ox/src/ox/fs/CMakeLists.txt +++ b/deps/ox/src/ox/fs/CMakeLists.txt @@ -52,7 +52,6 @@ install( install( FILES - filestore/filestoretemplate.hpp filesystem/filesystem.hpp filesystem/pathiterator.hpp DESTINATION diff --git a/deps/ox/src/ox/fs/filesystem/filelocation.cpp b/deps/ox/src/ox/fs/filesystem/filelocation.cpp index ef41f6db5..44cd279c2 100644 --- a/deps/ox/src/ox/fs/filesystem/filelocation.cpp +++ b/deps/ox/src/ox/fs/filesystem/filelocation.cpp @@ -10,6 +10,11 @@ namespace ox { +FileAddress::FileAddress() { + m_data.inode = 0; + m_type = FileAddressType::Inode; +} + FileAddress::FileAddress(uint64_t inode) { m_data.inode = inode; m_type = FileAddressType::Inode; diff --git a/deps/ox/src/ox/fs/filesystem/filelocation.hpp b/deps/ox/src/ox/fs/filesystem/filelocation.hpp index 3b160c041..488a13dd6 100644 --- a/deps/ox/src/ox/fs/filesystem/filelocation.hpp +++ b/deps/ox/src/ox/fs/filesystem/filelocation.hpp @@ -9,18 +9,26 @@ #pragma once #include +#include namespace ox { -enum class FileAddressType { - None = -1, +enum class FileAddressType: int8_t { + None = -1, Path, ConstPath, Inode, }; class FileAddress { - private: + + template + friend ox::Error modelWrite(T*, FileAddress*); + + public: + static constexpr auto Fields = 2; + + protected: FileAddressType m_type = FileAddressType::None; union { char *path; @@ -29,6 +37,8 @@ class FileAddress { } m_data; public: + FileAddress(); + FileAddress(uint64_t inode); FileAddress(char *path); @@ -69,4 +79,38 @@ class FileAddress { }; +template +ox::Error modelWrite(T *io, FileAddress *fa) { + io->setTypeInfo("ox::FileAddress", FileAddress::Fields); + switch (fa->m_type) { + case FileAddressType::Path: + case FileAddressType::ConstPath: + { + decltype(fa->m_data.inode) blank = 0; + const auto strSize = ox_strlen(fa->m_data.constPath) + 1; + auto path = ox_malloca(strSize, char, 0); + memcpy(path.get(), fa->m_data.constPath, strSize); + oxReturnError(io->field("path", SerStr(path.get(), strSize - 1))); + oxReturnError(io->field("inode", &blank)); + break; + } + case FileAddressType::Inode: + { + char blankPath[1] = ""; + oxReturnError(io->field("path", SerStr(blankPath, 0))); + oxReturnError(io->field("inode", &fa->m_data.inode)); + break; + } + case FileAddressType::None: + { + char blankPath[1] = ""; + decltype(fa->m_data.inode) blankInode = 0; + oxReturnError(io->field("path", SerStr(blankPath, 0))); + oxReturnError(io->field("inode", &blankInode)); + break; + } + } + return OxError(0); +} + } diff --git a/deps/ox/src/ox/fs/filesystem/passthroughfs.cpp b/deps/ox/src/ox/fs/filesystem/passthroughfs.cpp index 7576ec235..56612d1d5 100644 --- a/deps/ox/src/ox/fs/filesystem/passthroughfs.cpp +++ b/deps/ox/src/ox/fs/filesystem/passthroughfs.cpp @@ -84,6 +84,9 @@ ox::Error PassThroughFS::resize(uint64_t, void*) { Error PassThroughFS::write(const char *path, void *buffer, uint64_t size, uint8_t) { auto p = (m_path / stripSlash(path)); auto f = fopen(p.c_str(), "w"); + if (!f) { + return OxError(1); + } auto err = OxError(fwrite(buffer, size, 1, f) == 1 ? 0 : 1); fclose(f); return err; diff --git a/deps/ox/src/ox/mc/write.hpp b/deps/ox/src/ox/mc/write.hpp index 783eea6dc..535768c4f 100644 --- a/deps/ox/src/ox/mc/write.hpp +++ b/deps/ox/src/ox/mc/write.hpp @@ -84,19 +84,18 @@ Error MetalClawWriter::field(const char *name, ox::BString *val) { template Error MetalClawWriter::field(const char*, T *val) { - auto err = OxError(0); bool fieldSet = false; MetalClawWriter writer(m_buff + m_buffIt, m_buffLen - m_buffIt); if (val) { - err |= model(&writer, val); + oxReturnError(model(&writer, val)); if (static_cast(writer.m_fieldPresence.getMaxLen()) < writer.m_buffIt) { m_buffIt += writer.m_buffIt; fieldSet = true; } } - err |= m_fieldPresence.set(m_field, fieldSet); + oxReturnError(m_fieldPresence.set(m_field, fieldSet)); m_field++; - return err; + return OxError(0); } template diff --git a/deps/ox/src/ox/std/memops.hpp b/deps/ox/src/ox/std/memops.hpp index 2a23e18f3..2a3ef6ec9 100644 --- a/deps/ox/src/ox/std/memops.hpp +++ b/deps/ox/src/ox/std/memops.hpp @@ -10,6 +10,12 @@ #include "types.hpp" +#if __has_include() +#include +#else +void *memcpy(void *dest, const void *src, std::size_t size); +#endif + int ox_memcmp(const void *ptr1, const void *ptr2, std::size_t size) noexcept; constexpr void *ox_memcpy(void *dest, const void *src, std::size_t size) noexcept {