Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
hrydgard
GitHub Repository: hrydgard/ppsspp
Path: blob/master/Common/File/VFS/DirectoryReader.cpp
3187 views
1
#include <cstdio>
2
3
#include "Common/Common.h"
4
#include "Common/Log.h"
5
#include "Common/File/VFS/DirectoryReader.h"
6
7
DirectoryReader::DirectoryReader(const Path &path) {
8
path_ = path;
9
}
10
11
uint8_t *DirectoryReader::ReadFile(const char *path, size_t *size) {
12
Path new_path = Path(path).StartsWith(path_) ? Path(path) : path_ / path;
13
return File::ReadLocalFile(new_path, size);
14
}
15
16
bool DirectoryReader::GetFileListing(const char *path, std::vector<File::FileInfo> *listing, const char *filter = nullptr) {
17
Path new_path = Path(path).StartsWith(path_) ? Path(path) : path_ / path;
18
19
File::FileInfo info;
20
if (!File::GetFileInfo(new_path, &info))
21
return false;
22
23
if (info.isDirectory) {
24
File::GetFilesInDir(new_path, listing, filter);
25
return true;
26
}
27
return false;
28
}
29
30
bool DirectoryReader::GetFileInfo(const char *path, File::FileInfo *info) {
31
Path new_path = Path(path).StartsWith(path_) ? Path(path) : path_ / path;
32
return File::GetFileInfo(new_path, info);
33
}
34
35
bool DirectoryReader::Exists(const char *path) {
36
Path new_path = Path(path).StartsWith(path_) ? Path(path) : path_ / path;
37
return File::Exists(new_path);
38
}
39
40
class DirectoryReaderFileReference : public VFSFileReference {
41
public:
42
Path path;
43
};
44
45
class DirectoryReaderOpenFile : public VFSOpenFile {
46
public:
47
~DirectoryReaderOpenFile() {
48
_dbg_assert_(file == nullptr);
49
}
50
FILE *file = nullptr;
51
};
52
53
VFSFileReference *DirectoryReader::GetFile(const char *path) {
54
Path filePath = path_ / path;
55
if (!File::Exists(filePath)) {
56
return nullptr;
57
}
58
59
DirectoryReaderFileReference *reference = new DirectoryReaderFileReference();
60
reference->path = filePath;
61
return reference;
62
}
63
64
bool DirectoryReader::GetFileInfo(VFSFileReference *vfsReference, File::FileInfo *fileInfo) {
65
DirectoryReaderFileReference *reference = (DirectoryReaderFileReference *)vfsReference;
66
return File::GetFileInfo(reference->path, fileInfo);
67
}
68
69
void DirectoryReader::ReleaseFile(VFSFileReference *vfsReference) {
70
DirectoryReaderFileReference *reference = (DirectoryReaderFileReference *)vfsReference;
71
delete reference;
72
}
73
74
VFSOpenFile *DirectoryReader::OpenFileForRead(VFSFileReference *vfsReference, size_t *size) {
75
DirectoryReaderFileReference *reference = (DirectoryReaderFileReference *)vfsReference;
76
FILE *file = File::OpenCFile(reference->path, "rb");
77
if (!file) {
78
return nullptr;
79
}
80
fseek(file, 0, SEEK_END);
81
*size = ftell(file);
82
fseek(file, 0, SEEK_SET);
83
DirectoryReaderOpenFile *openFile = new DirectoryReaderOpenFile();
84
openFile->file = file;
85
return openFile;
86
}
87
88
void DirectoryReader::Rewind(VFSOpenFile *vfsOpenFile) {
89
DirectoryReaderOpenFile *openFile = (DirectoryReaderOpenFile *)vfsOpenFile;
90
fseek(openFile->file, 0, SEEK_SET);
91
}
92
93
size_t DirectoryReader::Read(VFSOpenFile *vfsOpenFile, void *buffer, size_t length) {
94
DirectoryReaderOpenFile *openFile = (DirectoryReaderOpenFile *)vfsOpenFile;
95
return fread(buffer, 1, length, openFile->file);
96
}
97
98
void DirectoryReader::CloseFile(VFSOpenFile *vfsOpenFile) {
99
DirectoryReaderOpenFile *openFile = (DirectoryReaderOpenFile *)vfsOpenFile;
100
_dbg_assert_(openFile);
101
if (!openFile) {
102
return;
103
}
104
_dbg_assert_(openFile->file != nullptr);
105
if (openFile->file) {
106
fclose(openFile->file);
107
openFile->file = nullptr;
108
}
109
delete openFile;
110
}
111
112