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/Core/Loaders.h
Views: 1401
1
// Copyright (c) 2012- PPSSPP Project.
2
3
// This program is free software: you can redistribute it and/or modify
4
// it under the terms of the GNU General Public License as published by
5
// the Free Software Foundation, version 2.0 or later versions.
6
7
// This program is distributed in the hope that it will be useful,
8
// but WITHOUT ANY WARRANTY; without even the implied warranty of
9
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10
// GNU General Public License 2.0 for more details.
11
12
// A copy of the GPL 2.0 should have been included with the program.
13
// If not, see http://www.gnu.org/licenses/
14
15
// Official git repository and contact information can be found at
16
// https://github.com/hrydgard/ppsspp and http://www.ppsspp.org/.
17
18
#pragma once
19
20
#include <string>
21
#include <memory>
22
23
#include "Common/CommonTypes.h"
24
#include "Common/File/Path.h"
25
26
enum class IdentifiedFileType {
27
ERROR_IDENTIFYING,
28
29
PSP_PBP_DIRECTORY,
30
31
PSP_PBP,
32
PSP_ELF,
33
PSP_ISO,
34
PSP_ISO_NP,
35
36
PSP_DISC_DIRECTORY,
37
38
UNKNOWN_BIN,
39
UNKNOWN_ELF,
40
UNKNOWN_ISO,
41
42
// Try to reduce support emails...
43
ARCHIVE_RAR,
44
ARCHIVE_ZIP,
45
ARCHIVE_7Z,
46
PSP_PS1_PBP,
47
ISO_MODE2,
48
49
NORMAL_DIRECTORY,
50
51
PSP_SAVEDATA_DIRECTORY,
52
PPSSPP_SAVESTATE,
53
54
PPSSPP_GE_DUMP,
55
56
UNKNOWN,
57
};
58
59
// NB: It is a REQUIREMENT that implementations of this class are entirely thread safe!
60
class FileLoader {
61
public:
62
enum class Flags {
63
NONE,
64
// Not necessary to read from / store into cache.
65
HINT_UNCACHED,
66
};
67
68
virtual ~FileLoader() {}
69
70
virtual bool IsRemote() {
71
return false;
72
}
73
virtual bool Exists() = 0;
74
virtual bool ExistsFast() {
75
return Exists();
76
}
77
virtual bool IsDirectory() = 0;
78
virtual s64 FileSize() = 0;
79
virtual Path GetPath() const = 0;
80
81
virtual size_t ReadAt(s64 absolutePos, size_t bytes, size_t count, void *data, Flags flags = Flags::NONE) = 0;
82
virtual size_t ReadAt(s64 absolutePos, size_t bytes, void *data, Flags flags = Flags::NONE) {
83
return ReadAt(absolutePos, 1, bytes, data, flags);
84
}
85
86
// Cancel any operations that might block, if possible.
87
virtual void Cancel() {}
88
89
virtual std::string LatestError() const {
90
return "";
91
}
92
};
93
94
class ProxiedFileLoader : public FileLoader {
95
public:
96
ProxiedFileLoader(FileLoader *backend) : backend_(backend) {}
97
~ProxiedFileLoader() {
98
// Takes ownership.
99
delete backend_;
100
}
101
102
bool IsRemote() override {
103
return backend_->IsRemote();
104
}
105
bool Exists() override {
106
return backend_->Exists();
107
}
108
bool ExistsFast() override {
109
return backend_->ExistsFast();
110
}
111
bool IsDirectory() override {
112
return backend_->IsDirectory();
113
}
114
s64 FileSize() override {
115
return backend_->FileSize();
116
}
117
Path GetPath() const override {
118
return backend_->GetPath();
119
}
120
void Cancel() override {
121
backend_->Cancel();
122
}
123
std::string LatestError() const override {
124
return backend_->LatestError();
125
}
126
size_t ReadAt(s64 absolutePos, size_t bytes, size_t count, void *data, Flags flags = Flags::NONE) override {
127
return backend_->ReadAt(absolutePos, bytes, count, data, flags);
128
}
129
size_t ReadAt(s64 absolutePos, size_t bytes, void *data, Flags flags = Flags::NONE) override {
130
return backend_->ReadAt(absolutePos, bytes, data, flags);
131
}
132
133
protected:
134
FileLoader *backend_;
135
};
136
137
inline u32 operator & (const FileLoader::Flags &a, const FileLoader::Flags &b) {
138
return (u32)a & (u32)b;
139
}
140
141
FileLoader *ConstructFileLoader(const Path &filename);
142
// Resolve to the target binary, ISO, or other file (e.g. from a directory.)
143
FileLoader *ResolveFileLoaderTarget(FileLoader *fileLoader);
144
145
Path ResolvePBPDirectory(const Path &filename);
146
Path ResolvePBPFile(const Path &filename);
147
148
IdentifiedFileType Identify_File(FileLoader *fileLoader, std::string *errorString);
149
150
// Can modify the string filename, as it calls IdentifyFile above.
151
bool LoadFile(FileLoader **fileLoaderPtr, std::string *error_string);
152
153
bool UmdReplace(const Path &filepath, FileLoader **fileLoader, std::string &error);
154
155