Files
tech5/source/shared/idlib/filesystem/file.h
T
2026-08-08 19:30:03 -07:00

180 lines
5.8 KiB
C++

#pragma once
#include "../bv/bounds.h"
#include "../text/strstatic.h"
#include <cstdarg>
#include <cstdint>
#include <cstdio>
enum fsPath_t : int {
FSPATH_BASE = 0,
FSPATH_CACHE = 1,
FSPATH_SAVE = 2,
FSPATH_INSTALL = 3
};
enum fsDevice_t : int {
FS_DEVICE_HARD_DISK_DRIVE = 0,
FS_DEVICE_OPTICAL_DISK_DRIVE = 1,
FS_DEVICE_SOLID_STATE_DRIVE = 2,
FS_DEVICE_NETWORK = 3,
FS_DEVICE_MEMORY = 4
};
enum fsOrigin_t : int {
FS_SEEK_CUR = 0,
FS_SEEK_END = 1,
FS_SEEK_SET = 2
};
enum fsMode_t : int {
FS_READ = 0,
FS_WRITE = 1,
FS_READ_WRITE = 2,
FS_READ_NO_BUFFERING = 3,
FS_APPEND = 4
};
enum fsLock_t : int {
FS_LOCK_SHARED = 0,
FS_LOCK_EXCLUSIVE = 1
};
class idFile {
public:
idFile();
virtual ~idFile() = default;
virtual const char* GetName() const { return ""; }
virtual const char* GetFullPath() const { return GetName(); }
virtual unsigned int Read(void*, unsigned int) { return 0; }
virtual unsigned int Write(const void*, unsigned int) { return 0; }
virtual unsigned int ReadOfs(std::int64_t offset, void* data,
unsigned int length);
virtual unsigned int WriteOfs(std::int64_t offset, const void* data,
unsigned int length);
virtual bool Lock(std::int64_t, unsigned int, fsLock_t) { return false; }
virtual bool Unlock(std::int64_t, unsigned int) { return false; }
virtual std::int64_t Length() const { return 0; }
virtual void SetLength(unsigned int) {}
virtual std::int64_t Tell() const { return 0; }
virtual int Seek(std::int64_t, fsOrigin_t) { return -1; }
virtual unsigned int Printf(const char* format, ...);
virtual unsigned int VPrintf(const char* format, char* arguments);
virtual unsigned int WriteFloatString(const char* format, ...);
virtual unsigned int Timestamp() const { return 0; }
virtual void Flush() {}
virtual void ForceFlush() {}
virtual int GetSectorSize() const { return 1; }
virtual fsDevice_t GetDevice() const { return FS_DEVICE_MEMORY; }
virtual bool IsOSNative() const { return false; }
template<class type_t>
unsigned int ReadLittle(type_t& value) {
return Read(&value, static_cast<unsigned int>(sizeof(value)));
}
template<class type_t>
unsigned int WriteLittle(const type_t& value) {
return Write(&value, static_cast<unsigned int>(sizeof(value)));
}
unsigned int ReadString(idStr& string);
unsigned int WriteString(const idStr& string);
unsigned int WriteString(const char* string);
unsigned int uniqID;
};
class idFile_Memory : public idFile {
public:
idFile_Memory();
explicit idFile_Memory(const char* fileName);
~idFile_Memory() override;
const char* GetName() const override { return name.c_str(); }
const char* GetFullPath() const override { return name.c_str(); }
unsigned int Read(void* data, unsigned int length) override;
unsigned int Write(const void* data, unsigned int length) override;
unsigned int ReadOfs(std::int64_t offset, void* data,
unsigned int length) override;
unsigned int WriteOfs(std::int64_t offset, const void* data,
unsigned int length) override;
std::int64_t Length() const override { return fileSize; }
void SetLength(unsigned int length) override;
std::int64_t Tell() const override;
int Seek(std::int64_t offset, fsOrigin_t origin) override;
unsigned int Timestamp() const override { return timestamp; }
fsDevice_t GetDevice() const override { return FS_DEVICE_MEMORY; }
virtual void Clear(bool freeMemory = true);
void SetReadOnlyData(const char* data, unsigned int length);
void SetWritableData(char* data, unsigned int length);
void SetMaxLength(unsigned int length);
void MakeReadOnly();
void MakeWritable();
const char* GetDataPtr() const { return filePtr; }
char* GetDataPtr() { return filePtr; }
idStrStatic<260> name;
int mode;
unsigned int maxSize;
unsigned int fileSize;
unsigned int allocated;
unsigned int timestamp;
char* filePtr;
char* curPtr;
bool ownsData;
};
class idFile_Stat : public idFile {
public:
idFile_Stat(const char* name = "", std::int64_t size = 0,
unsigned int time = 0)
: fileName(name), fileSize(size), fileTimestamp(time) {}
const char* GetName() const override { return fileName.c_str(); }
const char* GetFullPath() const override { return fileName.c_str(); }
unsigned int Read(void* data, unsigned int length) override;
unsigned int Write(const void* data, unsigned int length) override;
unsigned int ReadOfs(std::int64_t offset, void* data,
unsigned int length) override;
unsigned int WriteOfs(std::int64_t offset, const void* data,
unsigned int length) override;
std::int64_t Length() const override { return fileSize; }
void SetLength(unsigned int length) override;
int Seek(std::int64_t offset, fsOrigin_t origin) override;
unsigned int Timestamp() const override { return fileTimestamp; }
idStr fileName;
std::int64_t fileSize;
unsigned int fileTimestamp;
};
class idFile_String : public idFile_Memory {
public:
using idFile_Memory::idFile_Memory;
};
class idFileLocal {
public:
explicit idFileLocal(idFile* filePointer = nullptr) : file(filePointer) {}
~idFileLocal() { delete file; }
idFile* operator->() { return file; }
const idFile* operator->() const { return file; }
idFile* Release() { idFile* result = file; file = nullptr; return result; }
idFile* file;
};
using HFILE = int;
using _HFILE = void*;
#if INTPTR_MAX == INT32_MAX
static_assert(sizeof(idFile) == 8, "Recovered idFile ABI changed");
static_assert(sizeof(idFile_Memory) == 332,
"Recovered idFile_Memory ABI changed");
static_assert(sizeof(idFile_Stat) == 56, "Recovered idFile_Stat ABI changed");
static_assert(sizeof(idFileLocal) == 4, "Recovered idFileLocal ABI changed");
#endif