// Copyright 2021 Dolphin Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #pragma once #include #include #include #include #include #include "DiscIO/DirectoryBlob.h" #include "DiscIO/RiivolutionParser.h" namespace Core { class CPUThreadGuard; } namespace DiscIO::Riivolution { struct SavegameRedirect { std::string m_target_path; bool m_clone; }; class FileDataLoader { public: struct Node { std::string m_filename; bool m_is_directory; }; virtual ~FileDataLoader(); virtual std::optional GetExternalFileSize(std::string_view external_relative_path) = 0; virtual std::vector GetFileContents(std::string_view external_relative_path) = 0; virtual std::vector GetFolderContents(std::string_view external_relative_path) = 0; virtual BuilderContentSource MakeContentSource(std::string_view external_relative_path, u64 external_offset, u64 external_size, u64 disc_offset) = 0; virtual std::optional ResolveSavegameRedirectPath(std::string_view external_relative_path) = 0; }; class FileDataLoaderHostFS : public FileDataLoader { public: // sd_root should be an absolute path to the folder representing our virtual SD card // xml_path should be an absolute path to the parsed XML file // patch_root should be the 'root' attribute given in the 'patch' or 'wiiroot' XML element FileDataLoaderHostFS(std::string sd_root, const std::string& xml_path, std::string_view patch_root); std::optional GetExternalFileSize(std::string_view external_relative_path) override; std::vector GetFileContents(std::string_view external_relative_path) override; std::vector GetFolderContents(std::string_view external_relative_path) override; BuilderContentSource MakeContentSource(std::string_view external_relative_path, u64 external_offset, u64 external_size, u64 disc_offset) override; std::optional ResolveSavegameRedirectPath(std::string_view external_relative_path) override; private: std::optional MakeAbsoluteFromRelative(std::string_view external_relative_path); std::string m_sd_root; std::string m_patch_root; }; enum class PatchIndex { FileSystem, DolphinSysFiles, }; void ApplyPatchesToFiles(std::span patches, PatchIndex index, std::vector* fst, FSTBuilderNode* dol_node); void ApplyGeneralMemoryPatches(const Core::CPUThreadGuard& guard, std::span patches); void ApplyApploaderMemoryPatches(const Core::CPUThreadGuard& guard, std::span patches, u32 ram_address, u32 ram_length); std::optional ExtractSavegameRedirect(std::span riivolution_patches); } // namespace DiscIO::Riivolution