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

240 lines
9.9 KiB
C++

#pragma once
#include "file.h"
#include "../containers/hashindex.h"
#include "../containers/list.h"
#include "../text/cmdargs.h"
enum sysFolder_t : int {
FOLDER_ERROR = -1,
FOLDER_NO = 0,
FOLDER_YES = 1
};
class idFileList {
public:
idFileList();
const char* GetBasePath() const { return basePath.c_str(); }
int GetNumFiles() const { return list.Num(); }
const char* GetFile(int index) const { return list[index].c_str(); }
idStr basePath;
idList<idStr> list;
};
class idZippedFile {
public:
idStr name;
unsigned int pos;
idZippedFile* next;
};
class idCachedZipFile {
public:
idCachedZipFile();
~idCachedZipFile();
idStr zipFileName;
idStr relativeZipFileName;
void* handle;
int numFiles;
idZippedFile* hashTable[128];
idZippedFile* fileList;
idCachedZipFile* next;
};
using filePreCallback_t = idFile* (*)(const char* relativePath);
using filePostCallback_t = void (*)(const char* relativePath, idFile* file);
using fileCacheCallback_t = idFile* (*)(const char* relativePath);
using filePatchCallback_t = idFile* (*)(const char* relativePath);
class idFileSystem {
public:
virtual ~idFileSystem();
virtual void Init() = 0;
virtual void ReInit(const char* gameFolder) = 0;
virtual bool IsInitialized() const = 0;
virtual void SetFilePreCallback(filePreCallback_t callback) = 0;
virtual void SetFilePostCallback(filePostCallback_t callback) = 0;
virtual void SetFileCacheCallback(fileCacheCallback_t statCallback,
fileCacheCallback_t cacheCallback) = 0;
virtual void SetFilePatchCallback(filePatchCallback_t callback) = 0;
virtual idFileList* ListFiles(const char* relativePath,
const char* extension, bool sort = false,
bool fullRelativePath = false) = 0;
virtual idFileList* ListFilesTree(const char* relativePath,
const char* extension, bool sort = false) = 0;
virtual void FreeFileList(idFileList* fileList) = 0;
virtual bool IsRelativePath(const char* path) const = 0;
virtual idStr RelativePathToOSPath(const char* relativePath,
fsPath_t basePath) const = 0;
virtual void RelativePathToOSPath(const char* relativePath, char* osPath,
int osPathSize, fsPath_t basePath) const = 0;
virtual bool OSPathToRelativePath(const char* osPath,
char* relativePath, int relativePathSize) = 0;
virtual bool FixLongFilename(const char* basePath,
const char* extension, const char* inputPath, char* fixedPath,
int fixedPathSize) const = 0;
virtual void CreateOSPath(const char* osPath) = 0;
virtual bool FileExists(const char* relativePath,
bool allowCopyFiles = true) = 0;
virtual bool IsWritable(const char* relativePath) const = 0;
virtual sysFolder_t IsFolder(const char* relativePath,
fsPath_t basePath) const = 0;
virtual unsigned int GetTimestamp(const char* relativePath,
bool allowCopyFiles = true) = 0;
virtual void GetNumberedFilename(int& index, const char* prefix,
const char* extension, idStr& result, bool zeroPad = false) = 0;
virtual int ReadFile(const char* relativePath, void** buffer,
unsigned int* timestamp = nullptr) = 0;
virtual void FreeFile(void* buffer) = 0;
virtual unsigned int WriteFile(const char* relativePath,
const void* buffer, unsigned int length, fsPath_t basePath) = 0;
virtual bool RemoveFile(const char* relativePath, fsPath_t basePath) = 0;
virtual bool RemoveDir(const char* relativePath) = 0;
virtual bool RenameFile(const char* from, const char* to,
fsPath_t basePath) = 0;
virtual idFile* OpenFileRead(const char* relativePath,
bool allowCopyFiles = true, bool uncompressedOnly = false) = 0;
virtual idFile* OpenFileWrite(const char* relativePath,
fsPath_t basePath) = 0;
virtual idFile* OpenFileWritePermanent(const char* relativePath,
fsPath_t basePath) = 0;
virtual idFile* OpenFileReadWrite(const char* relativePath, bool create,
fsPath_t basePath) = 0;
virtual idFile* OpenFileAppend(const char* relativePath,
fsPath_t basePath) = 0;
virtual const char* GetBasePathStr(fsPath_t basePath) const = 0;
virtual idStr GeneratedPath(const char* relativePath) const = 0;
virtual std::int64_t GetFileLength(const char* relativePath) = 0;
virtual void ClearZipCache() = 0;
virtual bool CopyGameFile(const char* from, const char* to,
fsPath_t basePath) = 0;
};
class idFile_InZip;
class idFileSystemLocal : public idFileSystem {
public:
idFileSystemLocal();
~idFileSystemLocal() override;
void Init() override;
void ReInit(const char* gameFolder) override;
bool IsInitialized() const override;
void SetFilePreCallback(filePreCallback_t callback) override;
void SetFilePostCallback(filePostCallback_t callback) override;
void SetFileCacheCallback(fileCacheCallback_t statCallback,
fileCacheCallback_t cacheCallback) override;
void SetFilePatchCallback(filePatchCallback_t callback) override;
idFileList* ListFiles(const char* relativePath, const char* extension,
bool sort, bool fullRelativePath) override;
idFileList* ListFilesTree(const char* relativePath,
const char* extension, bool sort) override;
void FreeFileList(idFileList* fileList) override;
bool IsRelativePath(const char* path) const override;
idStr RelativePathToOSPath(const char* relativePath,
fsPath_t basePath) const override;
void RelativePathToOSPath(const char* relativePath, char* osPath,
int osPathSize, fsPath_t basePath) const override;
bool OSPathToRelativePath(const char* osPath, char* relativePath,
int relativePathSize) override;
bool FixLongFilename(const char* basePath, const char* extension,
const char* inputPath, char* fixedPath,
int fixedPathSize) const override;
void CreateOSPath(const char* osPath) override;
bool FileExists(const char* relativePath, bool allowCopyFiles) override;
bool IsWritable(const char* relativePath) const override;
sysFolder_t IsFolder(const char* relativePath,
fsPath_t basePath) const override;
unsigned int GetTimestamp(const char* relativePath,
bool allowCopyFiles) override;
void GetNumberedFilename(int& index, const char* prefix,
const char* extension, idStr& result, bool zeroPad) override;
int ReadFile(const char* relativePath, void** buffer,
unsigned int* timestamp) override;
void FreeFile(void* buffer) override;
unsigned int WriteFile(const char* relativePath, const void* buffer,
unsigned int length, fsPath_t basePath) override;
bool RemoveFile(const char* relativePath, fsPath_t basePath) override;
bool RemoveDir(const char* relativePath) override;
bool RenameFile(const char* from, const char* to,
fsPath_t basePath) override;
idFile* OpenFileRead(const char* relativePath, bool allowCopyFiles,
bool uncompressedOnly) override;
idFile* OpenFileWrite(const char* relativePath,
fsPath_t basePath) override;
idFile* OpenFileWritePermanent(const char* relativePath,
fsPath_t basePath) override;
idFile* OpenFileReadWrite(const char* relativePath, bool create,
fsPath_t basePath) override;
idFile* OpenFileAppend(const char* relativePath,
fsPath_t basePath) override;
const char* GetBasePathStr(fsPath_t basePath) const override;
idStr GeneratedPath(const char* relativePath) const override;
std::int64_t GetFileLength(const char* relativePath) override;
void ClearZipCache() override;
bool CopyGameFile(const char* from, const char* to,
fsPath_t basePath) override;
bool CopyGameFile(idFile* source, idFile* destination);
static void Copy_f(const idCmdArgs& args);
static void Dir_f(const idCmdArgs& args);
static void DirTree_f(const idCmdArgs& args);
static void Path_f(const idCmdArgs& args);
idList<idStr, TAG_FILE> searchPaths;
idCachedZipFile* cachedZipFiles;
int loadCount;
int loadStack;
idStr pathBase;
idStr pathCache;
idStr pathInstall;
idStr pathSave;
filePreCallback_t preCallback;
filePostCallback_t postCallback;
fileCacheCallback_t cacheStatCallback;
fileCacheCallback_t cacheCallback;
filePatchCallback_t patchCallback;
private:
void AddGameDirectory(const char* rootPath, const char* gameFolder);
int AddUnique(const char* name, idList<idStr>& list,
idHashIndex& hash) const;
idStr BuildOSPath(const char* root, const char* relativePath) const;
idStr BuildOSPath(fsPath_t basePath, const char* relativePath) const;
void GetExtensionList(const char* extensions,
idList<idStr>& extensionList) const;
int GetFileList(const char* relativePath,
const idList<idStr>& extensions, idList<idStr>& list,
idHashIndex& hash, bool fullRelativePath);
int GetFileListTree(const char* relativePath,
const idList<idStr>& extensions, idList<idStr>& list,
idHashIndex& hash);
void ListOSFiles(const char* directory, const char* extension,
idList<idStr>& list);
idCachedZipFile* LoadZipFile(const char* zipFile,
const char* relativeZipFile);
idFile* OpenFromMTP(const char* path, fsMode_t mode);
idFile* OpenFromNFS(const char* path, fsMode_t mode, bool create);
bool PreOpenFileWrite(const char* relativePath, fsPath_t& basePath,
idStr& osPath) const;
idFile_InZip* ReadFileFromZip(idCachedZipFile* zip,
const char* relativePath, bool uncompressedOnly);
};
extern idFileSystem* fileSystem;
#if INTPTR_MAX == INT32_MAX
static_assert(sizeof(idFileList) == 48, "Recovered idFileList ABI changed");
static_assert(sizeof(idZippedFile) == 40,
"Recovered idZippedFile ABI changed");
static_assert(sizeof(idCachedZipFile) == 592,
"Recovered idCachedZipFile ABI changed");
static_assert(sizeof(idFileSystem) == 4,
"Recovered idFileSystem ABI changed");
static_assert(sizeof(idFileSystemLocal) == 180,
"Recovered idFileSystemLocal ABI changed");
#endif