diff --git a/deps/ox/src/ox/fs/filesystem.cpp b/deps/ox/src/ox/fs/filesystem.cpp index 1f649c92..d2f203e8 100644 --- a/deps/ox/src/ox/fs/filesystem.cpp +++ b/deps/ox/src/ox/fs/filesystem.cpp @@ -10,7 +10,7 @@ namespace ox { -FileSystem *createFileSystem(void *buff, size_t buffSize) { +FileSystem *createFileSystem(void *buff, size_t buffSize, bool autoExpand) { auto version = ((FileStore16*) buff)->version(); auto type = ((FileStore16*) buff)->fsType(); FileSystem *fs = nullptr; @@ -19,13 +19,13 @@ FileSystem *createFileSystem(void *buff, size_t buffSize) { case 5: switch (type) { case ox::OxFS_16: - fs = new FileSystem16(buff); + fs = new FileSystem16(buff, autoExpand); break; case ox::OxFS_32: - fs = new FileSystem32(buff); + fs = new FileSystem32(buff, autoExpand); break; case ox::OxFS_64: - fs = new FileSystem64(buff); + fs = new FileSystem64(buff, autoExpand); break; } break; diff --git a/deps/ox/src/ox/fs/filesystem.hpp b/deps/ox/src/ox/fs/filesystem.hpp index 47810a95..a0983114 100644 --- a/deps/ox/src/ox/fs/filesystem.hpp +++ b/deps/ox/src/ox/fs/filesystem.hpp @@ -248,7 +248,7 @@ int FileSystem::ls(const char *path, List *list) { return err; } -FileSystem *createFileSystem(void *buff, size_t buffSize); +FileSystem *createFileSystem(void *buff, size_t buffSize, bool autoExpand = false); /** * Creates a larger version of the given FileSystem. @@ -266,6 +266,7 @@ class FileSystemTemplate: public FileSystem { private: FileStore *m_store = nullptr; + bool m_autoExpand = false; public: // static members @@ -273,7 +274,7 @@ class FileSystemTemplate: public FileSystem { static typename FileStore::InodeId_t INODE_ROOT_DIR; static typename FileStore::InodeId_t INODE_RESERVED_END; - explicit FileSystemTemplate(void *buff); + explicit FileSystemTemplate(void *buff, bool autoExpand = false); int stripDirectories() override; @@ -332,11 +333,14 @@ class FileSystemTemplate: public FileSystem { uint64_t generateInodeId(); int insertDirectoryEntry(const char *dirPath, const char *fileName, uint64_t inode); + + void expand(uint64_t size); }; template -FileSystemTemplate::FileSystemTemplate(void *buff) { +FileSystemTemplate::FileSystemTemplate(void *buff, bool autoExpand) { m_store = (FileStore*) buff; + m_autoExpand = autoExpand; } template @@ -547,6 +551,9 @@ int FileSystemTemplate::write(const char *path, void *buffer #endif template int FileSystemTemplate::write(uint64_t inode, void *buffer, uint64_t size, uint8_t fileType) { + if (size > this->size()) { + expand(this->size() * 2); + } return m_store->write(inode, buffer, size, fileType); } #ifdef _MSC_VER @@ -780,6 +787,16 @@ int FileSystemTemplate::readDirectory(const char *path, Dire } } +template +void FileSystemTemplate::expand(uint64_t newSize) { + if (newSize > size()) { + auto newBuff = new uint8_t[newSize]; + ox_memcpy(newBuff, m_store, m_store->size()); + delete m_store; + m_store = (FileStore*) newBuff; + resize(newSize); + } +} typedef FileSystemTemplate FileSystem16; typedef FileSystemTemplate FileSystem32;