Change auto expand to own buff attribute in OxFS

This commit is contained in:
Gary Talent 2017-05-19 20:14:51 -05:00
parent fea0a2e1c3
commit 9d28d20858
3 changed files with 26 additions and 17 deletions

View File

@ -10,7 +10,7 @@
namespace ox { namespace ox {
FileSystem *createFileSystem(void *buff, size_t buffSize, bool autoExpand) { FileSystem *createFileSystem(uint8_t *buff, size_t buffSize, bool ownsBuff) {
auto version = ((FileStore16*) buff)->version(); auto version = ((FileStore16*) buff)->version();
auto type = ((FileStore16*) buff)->fsType(); auto type = ((FileStore16*) buff)->fsType();
FileSystem *fs = nullptr; FileSystem *fs = nullptr;
@ -19,13 +19,13 @@ FileSystem *createFileSystem(void *buff, size_t buffSize, bool autoExpand) {
case 5: case 5:
switch (type) { switch (type) {
case ox::OxFS_16: case ox::OxFS_16:
fs = new FileSystem16(buff, autoExpand); fs = new FileSystem16(buff, ownsBuff);
break; break;
case ox::OxFS_32: case ox::OxFS_32:
fs = new FileSystem32(buff, autoExpand); fs = new FileSystem32(buff, ownsBuff);
break; break;
case ox::OxFS_64: case ox::OxFS_64:
fs = new FileSystem64(buff, autoExpand); fs = new FileSystem64(buff, ownsBuff);
break; break;
} }
break; break;

View File

@ -248,7 +248,7 @@ int FileSystem::ls(const char *path, List *list) {
return err; return err;
} }
FileSystem *createFileSystem(void *buff, size_t buffSize, bool autoExpand = false); FileSystem *createFileSystem(uint8_t *buff, size_t buffSize, bool ownsBuff = false);
/** /**
* Creates a larger version of the given FileSystem. * Creates a larger version of the given FileSystem.
@ -266,7 +266,7 @@ class FileSystemTemplate: public FileSystem {
private: private:
FileStore *m_store = nullptr; FileStore *m_store = nullptr;
bool m_autoExpand = false; bool m_ownsBuff = false;
public: public:
// static members // static members
@ -274,7 +274,9 @@ class FileSystemTemplate: public FileSystem {
static typename FileStore::InodeId_t INODE_ROOT_DIR; static typename FileStore::InodeId_t INODE_ROOT_DIR;
static typename FileStore::InodeId_t INODE_RESERVED_END; static typename FileStore::InodeId_t INODE_RESERVED_END;
explicit FileSystemTemplate(void *buff, bool autoExpand = false); explicit FileSystemTemplate(uint8_t *buff, bool ownsBuff = false);
~FileSystemTemplate();
int stripDirectories() override; int stripDirectories() override;
@ -324,7 +326,7 @@ class FileSystemTemplate: public FileSystem {
*/ */
int rmDirectoryEntry(const char *path); int rmDirectoryEntry(const char *path);
static uint8_t *format(void *buffer, typename FileStore::FsSize_t size, bool useDirectories); static uint8_t *format(uint8_t *buffer, typename FileStore::FsSize_t size, bool useDirectories);
protected: protected:
int readDirectory(const char *path, Directory<uint64_t, uint64_t> *dirOut) override; int readDirectory(const char *path, Directory<uint64_t, uint64_t> *dirOut) override;
@ -338,9 +340,16 @@ class FileSystemTemplate: public FileSystem {
}; };
template<typename FileStore, FsType FS_TYPE> template<typename FileStore, FsType FS_TYPE>
FileSystemTemplate<FileStore, FS_TYPE>::FileSystemTemplate(void *buff, bool autoExpand) { FileSystemTemplate<FileStore, FS_TYPE>::FileSystemTemplate(uint8_t *buff, bool ownsBuff) {
m_store = (FileStore*) buff; m_store = (FileStore*) buff;
m_autoExpand = autoExpand; m_ownsBuff = ownsBuff;
}
template<typename FileStore, FsType FS_TYPE>
FileSystemTemplate<FileStore, FS_TYPE>::~FileSystemTemplate() {
if (m_ownsBuff) {
delete (uint8_t*) m_store;
}
} }
template<typename FileStore, FsType FS_TYPE> template<typename FileStore, FsType FS_TYPE>
@ -551,7 +560,7 @@ int FileSystemTemplate<FileStore, FS_TYPE>::write(const char *path, void *buffer
#endif #endif
template<typename FileStore, FsType FS_TYPE> template<typename FileStore, FsType FS_TYPE>
int FileSystemTemplate<FileStore, FS_TYPE>::write(uint64_t inode, void *buffer, uint64_t size, uint8_t fileType) { int FileSystemTemplate<FileStore, FS_TYPE>::write(uint64_t inode, void *buffer, uint64_t size, uint8_t fileType) {
if (m_autoExpand) { if (m_ownsBuff) {
while (m_store->spaceNeeded(size) > m_store->available()) { while (m_store->spaceNeeded(size) > m_store->available()) {
expand(this->size() * 2); expand(this->size() * 2);
} }
@ -627,12 +636,12 @@ uint8_t *FileSystemTemplate<FileStore, FS_TYPE>::buff() {
#pragma warning(disable:4244) #pragma warning(disable:4244)
#endif #endif
template<typename FileStore, FsType FS_TYPE> template<typename FileStore, FsType FS_TYPE>
uint8_t *FileSystemTemplate<FileStore, FS_TYPE>::format(void *buffer, typename FileStore::FsSize_t size, bool useDirectories) { uint8_t *FileSystemTemplate<FileStore, FS_TYPE>::format(uint8_t *buffer, typename FileStore::FsSize_t size, bool useDirectories) {
buffer = FileStore::format((uint8_t*) buffer, size, (uint16_t) FS_TYPE); buffer = FileStore::format(buffer, size, (uint16_t) FS_TYPE);
if (buffer && useDirectories) { if (buffer && useDirectories) {
Directory<typename FileStore::InodeId_t, typename FileStore::FsSize_t> dir; Directory<typename FileStore::InodeId_t, typename FileStore::FsSize_t> dir;
FileSystemTemplate<FileStore, FS_TYPE> fs(buffer); FileSystemTemplate<FileStore, FS_TYPE> fs((uint8_t*) buffer);
fs.write(INODE_ROOT_DIR, &dir, sizeof(dir), FileType::FileType_Directory); fs.write(INODE_ROOT_DIR, &dir, sizeof(dir), FileType::FileType_Directory);
} }

View File

@ -30,12 +30,12 @@ const static auto usage = "usage:\n"
"\toxfs compact <FS file>\n" "\toxfs compact <FS file>\n"
"\toxfs version\n"; "\toxfs version\n";
char *loadFileBuff(FILE *file, ::size_t *sizeOut = nullptr) { uint8_t *loadFileBuff(FILE *file, ::size_t *sizeOut = nullptr) {
if (file) { if (file) {
fseek(file, 0, SEEK_END); fseek(file, 0, SEEK_END);
const auto size = ftell(file); const auto size = ftell(file);
rewind(file); rewind(file);
auto buff = new char[size]; auto buff = new uint8_t[size];
auto itemsRead = fread(buff, size, 1, file); auto itemsRead = fread(buff, size, 1, file);
fclose(file); fclose(file);
if (sizeOut) { if (sizeOut) {
@ -47,7 +47,7 @@ char *loadFileBuff(FILE *file, ::size_t *sizeOut = nullptr) {
} }
} }
char *loadFileBuff(const char *path, ::size_t *sizeOut = nullptr) { uint8_t *loadFileBuff(const char *path, ::size_t *sizeOut = nullptr) {
return loadFileBuff(fopen(path, "rb"), sizeOut); return loadFileBuff(fopen(path, "rb"), sizeOut);
} }