forked from eden-emu/eden
		
	 a4392c24cf
			
		
	
	
		a4392c24cf
		
	
	
	
	
		
			
			We can use these to avoid typing the same type redundantly. This way, if these ever change, only a single location needs to be modified.
		
			
				
	
	
		
			85 lines
		
	
	
	
		
			2.9 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			85 lines
		
	
	
	
		
			2.9 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| // Copyright 2018 yuzu emulator team
 | |
| // Licensed under GPLv2 or any later version
 | |
| // Refer to the license.txt file included.
 | |
| 
 | |
| #pragma once
 | |
| 
 | |
| #include <map>
 | |
| #include <memory>
 | |
| #include <optional>
 | |
| #include <string>
 | |
| #include "common/common_types.h"
 | |
| #include "core/file_sys/nca_metadata.h"
 | |
| #include "core/file_sys/vfs_types.h"
 | |
| #include "core/memory/dmnt_cheat_types.h"
 | |
| 
 | |
| namespace Core {
 | |
| class System;
 | |
| }
 | |
| 
 | |
| namespace FileSys {
 | |
| 
 | |
| class NCA;
 | |
| class NACP;
 | |
| 
 | |
| // A centralized class to manage patches to games.
 | |
| class PatchManager {
 | |
| public:
 | |
|     using BuildID = std::array<u8, 0x20>;
 | |
|     using Metadata = std::pair<std::unique_ptr<NACP>, VirtualFile>;
 | |
|     using PatchVersionNames = std::map<std::string, std::string, std::less<>>;
 | |
| 
 | |
|     explicit PatchManager(u64 title_id);
 | |
|     ~PatchManager();
 | |
| 
 | |
|     [[nodiscard]] u64 GetTitleID() const;
 | |
| 
 | |
|     // Currently tracked ExeFS patches:
 | |
|     // - Game Updates
 | |
|     [[nodiscard]] VirtualDir PatchExeFS(VirtualDir exefs) const;
 | |
| 
 | |
|     // Currently tracked NSO patches:
 | |
|     // - IPS
 | |
|     // - IPSwitch
 | |
|     [[nodiscard]] std::vector<u8> PatchNSO(const std::vector<u8>& nso,
 | |
|                                            const std::string& name) const;
 | |
| 
 | |
|     // Checks to see if PatchNSO() will have any effect given the NSO's build ID.
 | |
|     // Used to prevent expensive copies in NSO loader.
 | |
|     [[nodiscard]] bool HasNSOPatch(const BuildID& build_id) const;
 | |
| 
 | |
|     // Creates a CheatList object with all
 | |
|     [[nodiscard]] std::vector<Core::Memory::CheatEntry> CreateCheatList(
 | |
|         const Core::System& system, const BuildID& build_id) const;
 | |
| 
 | |
|     // Currently tracked RomFS patches:
 | |
|     // - Game Updates
 | |
|     // - LayeredFS
 | |
|     [[nodiscard]] VirtualFile PatchRomFS(VirtualFile base, u64 ivfc_offset,
 | |
|                                          ContentRecordType type = ContentRecordType::Program,
 | |
|                                          VirtualFile update_raw = nullptr) const;
 | |
| 
 | |
|     // Returns a vector of pairs between patch names and patch versions.
 | |
|     // i.e. Update 3.2.2 will return {"Update", "3.2.2"}
 | |
|     [[nodiscard]] PatchVersionNames GetPatchVersionNames(VirtualFile update_raw = nullptr) const;
 | |
| 
 | |
|     // If the game update exists, returns the u32 version field in its Meta-type NCA. If that fails,
 | |
|     // it will fallback to the Meta-type NCA of the base game. If that fails, the result will be
 | |
|     // std::nullopt
 | |
|     [[nodiscard]] std::optional<u32> GetGameVersion() const;
 | |
| 
 | |
|     // Given title_id of the program, attempts to get the control data of the update and parse
 | |
|     // it, falling back to the base control data.
 | |
|     [[nodiscard]] Metadata GetControlMetadata() const;
 | |
| 
 | |
|     // Version of GetControlMetadata that takes an arbitrary NCA
 | |
|     [[nodiscard]] Metadata ParseControlNCA(const NCA& nca) const;
 | |
| 
 | |
| private:
 | |
|     [[nodiscard]] std::vector<VirtualFile> CollectPatches(const std::vector<VirtualDir>& patch_dirs,
 | |
|                                                           const std::string& build_id) const;
 | |
| 
 | |
|     u64 title_id;
 | |
| };
 | |
| 
 | |
| } // namespace FileSys
 |