CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutSign UpSign In
hrydgard

CoCalc provides the best real-time collaborative environment for Jupyter Notebooks, LaTeX documents, and SageMath, scalable from individual users to large groups and classes!

GitHub Repository: hrydgard/ppsspp
Path: blob/master/Common/File/VFS/DirectoryReader.cpp
Views: 1401
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
class DirectoryReaderFileReference : public VFSFileReference {
36
public:
37
Path path;
38
};
39
40
class DirectoryReaderOpenFile : public VFSOpenFile {
41
public:
42
~DirectoryReaderOpenFile() {
43
_dbg_assert_(file == nullptr);
44
}
45
FILE *file = nullptr;
46
};
47
48
VFSFileReference *DirectoryReader::GetFile(const char *path) {
49
Path filePath = path_ / path;
50
if (!File::Exists(filePath)) {
51
return nullptr;
52
}
53
54
DirectoryReaderFileReference *reference = new DirectoryReaderFileReference();
55
reference->path = filePath;
56
return reference;
57
}
58
59
bool DirectoryReader::GetFileInfo(VFSFileReference *vfsReference, File::FileInfo *fileInfo) {
60
DirectoryReaderFileReference *reference = (DirectoryReaderFileReference *)vfsReference;
61
return File::GetFileInfo(reference->path, fileInfo);
62
}
63
64
void DirectoryReader::ReleaseFile(VFSFileReference *vfsReference) {
65
DirectoryReaderFileReference *reference = (DirectoryReaderFileReference *)vfsReference;
66
delete reference;
67
}
68
69
VFSOpenFile *DirectoryReader::OpenFileForRead(VFSFileReference *vfsReference, size_t *size) {
70
DirectoryReaderFileReference *reference = (DirectoryReaderFileReference *)vfsReference;
71
FILE *file = File::OpenCFile(reference->path, "rb");
72
if (!file) {
73
return nullptr;
74
}
75
fseek(file, 0, SEEK_END);
76
*size = ftell(file);
77
fseek(file, 0, SEEK_SET);
78
DirectoryReaderOpenFile *openFile = new DirectoryReaderOpenFile();
79
openFile->file = file;
80
return openFile;
81
}
82
83
void DirectoryReader::Rewind(VFSOpenFile *vfsOpenFile) {
84
DirectoryReaderOpenFile *openFile = (DirectoryReaderOpenFile *)vfsOpenFile;
85
fseek(openFile->file, 0, SEEK_SET);
86
}
87
88
size_t DirectoryReader::Read(VFSOpenFile *vfsOpenFile, void *buffer, size_t length) {
89
DirectoryReaderOpenFile *openFile = (DirectoryReaderOpenFile *)vfsOpenFile;
90
return fread(buffer, 1, length, openFile->file);
91
}
92
93
void DirectoryReader::CloseFile(VFSOpenFile *vfsOpenFile) {
94
DirectoryReaderOpenFile *openFile = (DirectoryReaderOpenFile *)vfsOpenFile;
95
_dbg_assert_(openFile->file != nullptr);
96
fclose(openFile->file);
97
openFile->file = nullptr;
98
delete openFile;
99
}
100
101