CoCalc provides the best real-time collaborative environment for Jupyter Notebooks, LaTeX documents, and SageMath, scalable from individual users to large groups and classes!
CoCalc provides the best real-time collaborative environment for Jupyter Notebooks, LaTeX documents, and SageMath, scalable from individual users to large groups and classes!
Path: blob/master/Core/Loaders.h
Views: 1401
// Copyright (c) 2012- PPSSPP Project.12// This program is free software: you can redistribute it and/or modify3// it under the terms of the GNU General Public License as published by4// the Free Software Foundation, version 2.0 or later versions.56// This program is distributed in the hope that it will be useful,7// but WITHOUT ANY WARRANTY; without even the implied warranty of8// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the9// GNU General Public License 2.0 for more details.1011// A copy of the GPL 2.0 should have been included with the program.12// If not, see http://www.gnu.org/licenses/1314// Official git repository and contact information can be found at15// https://github.com/hrydgard/ppsspp and http://www.ppsspp.org/.1617#pragma once1819#include <string>20#include <memory>2122#include "Common/CommonTypes.h"23#include "Common/File/Path.h"2425enum class IdentifiedFileType {26ERROR_IDENTIFYING,2728PSP_PBP_DIRECTORY,2930PSP_PBP,31PSP_ELF,32PSP_ISO,33PSP_ISO_NP,3435PSP_DISC_DIRECTORY,3637UNKNOWN_BIN,38UNKNOWN_ELF,39UNKNOWN_ISO,4041// Try to reduce support emails...42ARCHIVE_RAR,43ARCHIVE_ZIP,44ARCHIVE_7Z,45PSP_PS1_PBP,46ISO_MODE2,4748NORMAL_DIRECTORY,4950PSP_SAVEDATA_DIRECTORY,51PPSSPP_SAVESTATE,5253PPSSPP_GE_DUMP,5455UNKNOWN,56};5758// NB: It is a REQUIREMENT that implementations of this class are entirely thread safe!59class FileLoader {60public:61enum class Flags {62NONE,63// Not necessary to read from / store into cache.64HINT_UNCACHED,65};6667virtual ~FileLoader() {}6869virtual bool IsRemote() {70return false;71}72virtual bool Exists() = 0;73virtual bool ExistsFast() {74return Exists();75}76virtual bool IsDirectory() = 0;77virtual s64 FileSize() = 0;78virtual Path GetPath() const = 0;7980virtual size_t ReadAt(s64 absolutePos, size_t bytes, size_t count, void *data, Flags flags = Flags::NONE) = 0;81virtual size_t ReadAt(s64 absolutePos, size_t bytes, void *data, Flags flags = Flags::NONE) {82return ReadAt(absolutePos, 1, bytes, data, flags);83}8485// Cancel any operations that might block, if possible.86virtual void Cancel() {}8788virtual std::string LatestError() const {89return "";90}91};9293class ProxiedFileLoader : public FileLoader {94public:95ProxiedFileLoader(FileLoader *backend) : backend_(backend) {}96~ProxiedFileLoader() {97// Takes ownership.98delete backend_;99}100101bool IsRemote() override {102return backend_->IsRemote();103}104bool Exists() override {105return backend_->Exists();106}107bool ExistsFast() override {108return backend_->ExistsFast();109}110bool IsDirectory() override {111return backend_->IsDirectory();112}113s64 FileSize() override {114return backend_->FileSize();115}116Path GetPath() const override {117return backend_->GetPath();118}119void Cancel() override {120backend_->Cancel();121}122std::string LatestError() const override {123return backend_->LatestError();124}125size_t ReadAt(s64 absolutePos, size_t bytes, size_t count, void *data, Flags flags = Flags::NONE) override {126return backend_->ReadAt(absolutePos, bytes, count, data, flags);127}128size_t ReadAt(s64 absolutePos, size_t bytes, void *data, Flags flags = Flags::NONE) override {129return backend_->ReadAt(absolutePos, bytes, data, flags);130}131132protected:133FileLoader *backend_;134};135136inline u32 operator & (const FileLoader::Flags &a, const FileLoader::Flags &b) {137return (u32)a & (u32)b;138}139140FileLoader *ConstructFileLoader(const Path &filename);141// Resolve to the target binary, ISO, or other file (e.g. from a directory.)142FileLoader *ResolveFileLoaderTarget(FileLoader *fileLoader);143144Path ResolvePBPDirectory(const Path &filename);145Path ResolvePBPFile(const Path &filename);146147IdentifiedFileType Identify_File(FileLoader *fileLoader, std::string *errorString);148149// Can modify the string filename, as it calls IdentifyFile above.150bool LoadFile(FileLoader **fileLoaderPtr, std::string *error_string);151152bool UmdReplace(const Path &filepath, FileLoader **fileLoader, std::string &error);153154155