#pragma once
#include <vector>
#include <cstdint>
#include "Common/File/DirListing.h"
class VFSFileReference {
public:
virtual ~VFSFileReference() {}
};
class VFSOpenFile {
public:
virtual ~VFSOpenFile() {}
};
class VFSInterface {
public:
virtual ~VFSInterface() {}
virtual uint8_t *ReadFile(const char *path, size_t *size) = 0;
virtual bool GetFileListing(const char *path, std::vector<File::FileInfo> *listing, const char *filter = nullptr) = 0;
};
class VFSBackend : public VFSInterface {
public:
virtual VFSFileReference *GetFile(const char *path) = 0;
virtual bool GetFileInfo(VFSFileReference *vfsReference, File::FileInfo *fileInfo) = 0;
virtual void ReleaseFile(VFSFileReference *vfsReference) = 0;
virtual VFSOpenFile *OpenFileForRead(VFSFileReference *vfsReference, size_t *size) = 0;
virtual void Rewind(VFSOpenFile *vfsOpenFile) = 0;
virtual size_t Read(VFSOpenFile *vfsOpenFile, void *buffer, size_t length) = 0;
virtual void CloseFile(VFSOpenFile *vfsOpenFile) = 0;
virtual bool GetFileInfo(const char *path, File::FileInfo *info) = 0;
virtual bool Exists(const char *path) {
File::FileInfo info{};
return GetFileInfo(path, &info) && info.exists;
}
virtual std::string toString() const = 0;
};
class VFS : public VFSInterface {
public:
~VFS() { Clear(); }
void Register(const char *prefix, VFSBackend *reader);
void Clear();
uint8_t *ReadFile(const char *filename, size_t *size) override;
bool GetFileListing(const char *path, std::vector<File::FileInfo> *listing, const char *filter = nullptr) override;
bool GetFileInfo(const char *filename, File::FileInfo *fileInfo);
bool Exists(const char *path);
private:
struct VFSEntry {
const char *prefix;
VFSBackend *reader;
};
std::vector<VFSEntry> entries_;
};
extern VFS g_VFS;