|
|
|
@ -669,157 +669,3 @@ void DirectoryFileSystem::DoState(PointerWrap &p) {
|
|
|
|
|
ERROR_LOG(FILESYS, "FIXME: Open files during savestate, could go badly.");
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
|
|
|
|
|
VFSFileSystem::VFSFileSystem(IHandleAllocator *_hAlloc, std::string _basePath) : basePath(_basePath) {
|
|
|
|
|
INFO_LOG(FILESYS, "Creating VFS file system");
|
|
|
|
|
hAlloc = _hAlloc;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
VFSFileSystem::~VFSFileSystem() {
|
|
|
|
|
for (auto iter = entries.begin(); iter != entries.end(); ++iter) {
|
|
|
|
|
delete [] iter->second.fileData;
|
|
|
|
|
}
|
|
|
|
|
entries.clear();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
std::string VFSFileSystem::GetLocalPath(std::string localPath) {
|
|
|
|
|
return basePath + localPath;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool VFSFileSystem::MkDir(const std::string &dirname) {
|
|
|
|
|
// NOT SUPPORTED - READ ONLY
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool VFSFileSystem::RmDir(const std::string &dirname) {
|
|
|
|
|
// NOT SUPPORTED - READ ONLY
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int VFSFileSystem::RenameFile(const std::string &from, const std::string &to) {
|
|
|
|
|
// NOT SUPPORTED - READ ONLY
|
|
|
|
|
return -1;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool VFSFileSystem::RemoveFile(const std::string &filename) {
|
|
|
|
|
// NOT SUPPORTED - READ ONLY
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
u32 VFSFileSystem::OpenFile(std::string filename, FileAccess access, const char *devicename) {
|
|
|
|
|
if (access != FILEACCESS_READ) {
|
|
|
|
|
ERROR_LOG(FILESYS, "VFSFileSystem only supports plain reading");
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
std::string fullName = GetLocalPath(filename);
|
|
|
|
|
const char *fullNameC = fullName.c_str();
|
|
|
|
|
INFO_LOG(FILESYS,"VFSFileSystem actually opening %s (%s)", fullNameC, filename.c_str());
|
|
|
|
|
|
|
|
|
|
size_t size;
|
|
|
|
|
u8 *data = VFSReadFile(fullNameC, &size);
|
|
|
|
|
if (!data) {
|
|
|
|
|
ERROR_LOG(FILESYS, "VFSFileSystem failed to open %s", filename.c_str());
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
OpenFileEntry entry;
|
|
|
|
|
entry.fileData = data;
|
|
|
|
|
entry.size = size;
|
|
|
|
|
entry.seekPos = 0;
|
|
|
|
|
u32 newHandle = hAlloc->GetNewHandle();
|
|
|
|
|
entries[newHandle] = entry;
|
|
|
|
|
return newHandle;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
FileInfo VFSFileSystem::GetFileInfo(std::string filename) {
|
|
|
|
|
FileInfo x;
|
|
|
|
|
x.name = filename;
|
|
|
|
|
|
|
|
|
|
std::string fullName = GetLocalPath(filename);
|
|
|
|
|
INFO_LOG(FILESYS,"Getting VFS file info %s (%s)", fullName.c_str(), filename.c_str());
|
|
|
|
|
FileInfo fo;
|
|
|
|
|
VFSGetFileInfo(fullName.c_str(), &fo);
|
|
|
|
|
x.exists = fo.exists;
|
|
|
|
|
if (x.exists) {
|
|
|
|
|
x.size = fo.size;
|
|
|
|
|
x.type = fo.isDirectory ? FILETYPE_DIRECTORY : FILETYPE_NORMAL;
|
|
|
|
|
}
|
|
|
|
|
INFO_LOG(FILESYS,"Got VFS file info: size = %i", (int)x.size);
|
|
|
|
|
return x;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void VFSFileSystem::CloseFile(u32 handle) {
|
|
|
|
|
EntryMap::iterator iter = entries.find(handle);
|
|
|
|
|
if (iter != entries.end()) {
|
|
|
|
|
delete [] iter->second.fileData;
|
|
|
|
|
entries.erase(iter);
|
|
|
|
|
} else {
|
|
|
|
|
//This shouldn't happen...
|
|
|
|
|
ERROR_LOG(FILESYS,"Cannot close file that hasn't been opened: %08x", handle);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool VFSFileSystem::OwnsHandle(u32 handle) {
|
|
|
|
|
EntryMap::iterator iter = entries.find(handle);
|
|
|
|
|
return (iter != entries.end());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
size_t VFSFileSystem::ReadFile(u32 handle, u8 *pointer, s64 size) {
|
|
|
|
|
INFO_LOG(FILESYS,"VFSFileSystem::ReadFile %08x %p %i", handle, pointer, (u32)size);
|
|
|
|
|
EntryMap::iterator iter = entries.find(handle);
|
|
|
|
|
if (iter != entries.end())
|
|
|
|
|
{
|
|
|
|
|
size_t bytesRead = size;
|
|
|
|
|
memcpy(pointer, iter->second.fileData + iter->second.seekPos, size);
|
|
|
|
|
iter->second.seekPos += size;
|
|
|
|
|
return bytesRead;
|
|
|
|
|
} else {
|
|
|
|
|
ERROR_LOG(FILESYS,"Cannot read file that hasn't been opened: %08x", handle);
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
size_t VFSFileSystem::WriteFile(u32 handle, const u8 *pointer, s64 size) {
|
|
|
|
|
// NOT SUPPORTED - READ ONLY
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
size_t VFSFileSystem::SeekFile(u32 handle, s32 position, FileMove type) {
|
|
|
|
|
EntryMap::iterator iter = entries.find(handle);
|
|
|
|
|
if (iter != entries.end()) {
|
|
|
|
|
switch (type) {
|
|
|
|
|
case FILEMOVE_BEGIN: iter->second.seekPos = position; break;
|
|
|
|
|
case FILEMOVE_CURRENT: iter->second.seekPos += position; break;
|
|
|
|
|
case FILEMOVE_END: iter->second.seekPos = iter->second.size + position; break;
|
|
|
|
|
}
|
|
|
|
|
return iter->second.seekPos;
|
|
|
|
|
} else {
|
|
|
|
|
//This shouldn't happen...
|
|
|
|
|
ERROR_LOG(FILESYS,"Cannot seek in file that hasn't been opened: %08x", handle);
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
bool VFSFileSystem::GetHostPath(const std::string &inpath, std::string &outpath) {
|
|
|
|
|
// NOT SUPPORTED
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
std::vector<FileInfo> VFSFileSystem::GetDirListing(std::string path) {
|
|
|
|
|
std::vector<FileInfo> myVector;
|
|
|
|
|
// TODO
|
|
|
|
|
return myVector;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void VFSFileSystem::DoState(PointerWrap &p) {
|
|
|
|
|
if (!entries.empty()) {
|
|
|
|
|
p.SetError(p.ERROR_WARNING);
|
|
|
|
|
ERROR_LOG(FILESYS, "FIXME: Open files during savestate, could go badly.");
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
*/
|
|
|
|
|