Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
hrydgard
GitHub Repository: hrydgard/ppsspp
Path: blob/master/Core/Loaders.h
3185 views
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
#ifdef SHARED_LIBZIP
24
#include <zip.h>
25
#else
26
#include "ext/libzip/zip.h"
27
#endif
28
#include "Common/CommonTypes.h"
29
#include "Common/File/Path.h"
30
31
enum class IdentifiedFileType {
32
ERROR_IDENTIFYING,
33
34
PSP_PBP_DIRECTORY,
35
36
PSP_PBP,
37
PSP_ELF,
38
PSP_ISO,
39
PSP_ISO_NP,
40
41
PSP_DISC_DIRECTORY,
42
43
UNKNOWN_BIN,
44
UNKNOWN_ELF,
45
UNKNOWN_ISO,
46
47
// Try to reduce support emails...
48
ARCHIVE_RAR,
49
ARCHIVE_ZIP,
50
ARCHIVE_7Z,
51
PSP_PS1_PBP,
52
ISO_MODE2,
53
54
NORMAL_DIRECTORY,
55
56
PSP_SAVEDATA_DIRECTORY,
57
PPSSPP_SAVESTATE,
58
59
PPSSPP_GE_DUMP,
60
61
UNKNOWN,
62
};
63
64
// NB: It is a REQUIREMENT that implementations of this class are entirely thread safe!
65
// TOOD: actually, is it really?
66
class FileLoader {
67
public:
68
enum class Flags {
69
NONE,
70
// Not necessary to read from / store into cache.
71
HINT_UNCACHED,
72
};
73
74
virtual ~FileLoader() {}
75
76
virtual bool IsRemote() {
77
return false;
78
}
79
virtual bool Exists() = 0;
80
virtual bool ExistsFast() {
81
return Exists();
82
}
83
virtual bool IsDirectory() = 0;
84
virtual s64 FileSize() = 0;
85
virtual Path GetPath() const = 0;
86
virtual std::string GetFileExtension() const {
87
return GetPath().GetFileExtension();
88
}
89
virtual size_t ReadAt(s64 absolutePos, size_t bytes, size_t count, void *data, Flags flags = Flags::NONE) = 0;
90
virtual size_t ReadAt(s64 absolutePos, size_t bytes, void *data, Flags flags = Flags::NONE) {
91
return ReadAt(absolutePos, 1, bytes, data, flags);
92
}
93
94
// Cancel any operations that might block, if possible.
95
virtual void Cancel() {}
96
97
virtual std::string LatestError() const {
98
return "";
99
}
100
};
101
102
class ProxiedFileLoader : public FileLoader {
103
public:
104
ProxiedFileLoader(FileLoader *backend) : backend_(backend) {}
105
~ProxiedFileLoader() {
106
// Takes ownership.
107
delete backend_;
108
}
109
bool IsRemote() override {
110
return backend_->IsRemote();
111
}
112
bool Exists() override {
113
return backend_->Exists();
114
}
115
bool ExistsFast() override {
116
return backend_->ExistsFast();
117
}
118
bool IsDirectory() override {
119
return backend_->IsDirectory();
120
}
121
s64 FileSize() override {
122
return backend_->FileSize();
123
}
124
Path GetPath() const override {
125
return backend_->GetPath();
126
}
127
void Cancel() override {
128
backend_->Cancel();
129
}
130
std::string LatestError() const override {
131
return backend_->LatestError();
132
}
133
size_t ReadAt(s64 absolutePos, size_t bytes, size_t count, void *data, Flags flags = Flags::NONE) override {
134
return backend_->ReadAt(absolutePos, bytes, count, data, flags);
135
}
136
size_t ReadAt(s64 absolutePos, size_t bytes, void *data, Flags flags = Flags::NONE) override {
137
return backend_->ReadAt(absolutePos, bytes, data, flags);
138
}
139
FileLoader *Steal() {
140
FileLoader *backend = backend_;
141
backend_ = nullptr;
142
return backend;
143
}
144
145
protected:
146
FileLoader *backend_;
147
};
148
149
inline u32 operator & (const FileLoader::Flags &a, const FileLoader::Flags &b) {
150
return (u32)a & (u32)b;
151
}
152
153
FileLoader *ConstructFileLoader(const Path &filename);
154
// Resolve to the target binary, ISO, or other file (e.g. from a directory.)
155
FileLoader *ResolveFileLoaderTarget(FileLoader *fileLoader);
156
157
Path ResolvePBPDirectory(const Path &filename);
158
Path ResolvePBPFile(const Path &filename);
159
160
IdentifiedFileType Identify_File(FileLoader *fileLoader, std::string *errorString);
161
162
bool UmdReplace(const Path &filepath, FileLoader **fileLoader, std::string &error);
163
164
165
enum class ZipFileContents {
166
UNKNOWN,
167
PSP_GAME_DIR,
168
ISO_FILE,
169
TEXTURE_PACK,
170
SAVE_DATA,
171
FRAME_DUMP,
172
};
173
174
struct ZipFileInfo {
175
ZipFileContents contents;
176
int numFiles;
177
int stripChars; // for PSP game - how much to strip from the path.
178
int isoFileIndex; // for ISO
179
int textureIniIndex; // for textures
180
bool ignoreMetaFiles;
181
std::string gameTitle; // from PARAM.SFO if available
182
std::string savedataTitle;
183
std::string savedataDetails;
184
std::string savedataDir;
185
std::string mTime;
186
s64 totalFileSize;
187
188
std::string contentName;
189
};
190
191
struct zip *ZipOpenPath(const Path &fileName);
192
void ZipClose(zip *z);
193
194
bool DetectZipFileContents(const Path &fileName, ZipFileInfo *info);
195
void DetectZipFileContents(struct zip *z, ZipFileInfo *info);
196
197