mirror of
				https://git.zaroz.cloud/nintendo-back-up/yuzu/yuzu-mainline.git
				synced 2025-03-21 01:53:15 +00:00 
			
		
		
		
	file_sys: Consolidate common Title ID operations
This commit is contained in:
		
							parent
							
								
									51e6f8271a
								
							
						
					
					
						commit
						0eb6c6cd83
					
				| @ -41,6 +41,7 @@ add_library(core STATIC | ||||
|     file_sys/bis_factory.h | ||||
|     file_sys/card_image.cpp | ||||
|     file_sys/card_image.h | ||||
|     file_sys/common_funcs.h | ||||
|     file_sys/content_archive.cpp | ||||
|     file_sys/content_archive.h | ||||
|     file_sys/control_metadata.cpp | ||||
|  | ||||
							
								
								
									
										56
									
								
								src/core/file_sys/common_funcs.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										56
									
								
								src/core/file_sys/common_funcs.h
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,56 @@ | ||||
| // Copyright 2020 yuzu Emulator Project
 | ||||
| // Licensed under GPLv2 or any later version
 | ||||
| // Refer to the license.txt file included.
 | ||||
| 
 | ||||
| #pragma once | ||||
| 
 | ||||
| #include "common/common_types.h" | ||||
| 
 | ||||
| namespace FileSys { | ||||
| 
 | ||||
| constexpr u64 AOC_TITLE_ID_MASK = 0x7FF; | ||||
| constexpr u64 AOC_TITLE_ID_OFFSET = 0x1000; | ||||
| constexpr u64 BASE_TITLE_ID_MASK = 0xFFFFFFFFFFFFE000; | ||||
| 
 | ||||
| /**
 | ||||
|  * Gets the base title ID from a given title ID. | ||||
|  * | ||||
|  * @param title_id The title ID. | ||||
|  * @returns The base title ID. | ||||
|  */ | ||||
| [[nodiscard]] constexpr u64 GetBaseTitleID(u64 title_id) { | ||||
|     return title_id & BASE_TITLE_ID_MASK; | ||||
| } | ||||
| 
 | ||||
| /**
 | ||||
|  * Gets the base title ID with a program index offset from a given title ID. | ||||
|  * | ||||
|  * @param title_id The title ID. | ||||
|  * @param program_index The program index. | ||||
|  * @returns The base title ID with a program index offset. | ||||
|  */ | ||||
| [[nodiscard]] constexpr u64 GetBaseTitleIDWithProgramIndex(u64 title_id, u64 program_index) { | ||||
|     return GetBaseTitleID(title_id) + program_index; | ||||
| } | ||||
| 
 | ||||
| /**
 | ||||
|  * Gets the AOC (Add-On Content) base title ID from a given title ID. | ||||
|  * | ||||
|  * @param title_id The title ID. | ||||
|  * @returns The AOC base title ID. | ||||
|  */ | ||||
| [[nodiscard]] constexpr u64 GetAOCBaseTitleID(u64 title_id) { | ||||
|     return GetBaseTitleID(title_id) + AOC_TITLE_ID_OFFSET; | ||||
| } | ||||
| 
 | ||||
| /**
 | ||||
|  * Gets the AOC (Add-On Content) ID from a given AOC title ID. | ||||
|  * | ||||
|  * @param aoc_title_id The AOC title ID. | ||||
|  * @returns The AOC ID. | ||||
|  */ | ||||
| [[nodiscard]] constexpr u64 GetAOCID(u64 aoc_title_id) { | ||||
|     return aoc_title_id & AOC_TITLE_ID_MASK; | ||||
| } | ||||
| 
 | ||||
| } // namespace FileSys
 | ||||
| @ -12,6 +12,7 @@ | ||||
| #include "common/logging/log.h" | ||||
| #include "common/string_util.h" | ||||
| #include "core/core.h" | ||||
| #include "core/file_sys/common_funcs.h" | ||||
| #include "core/file_sys/content_archive.h" | ||||
| #include "core/file_sys/control_metadata.h" | ||||
| #include "core/file_sys/ips_layer.h" | ||||
| @ -30,7 +31,6 @@ namespace FileSys { | ||||
| namespace { | ||||
| 
 | ||||
| constexpr u32 SINGLE_BYTE_MODULUS = 0x100; | ||||
| constexpr u64 DLC_BASE_TITLE_ID_MASK = 0xFFFFFFFFFFFFE000; | ||||
| 
 | ||||
| constexpr std::array<const char*, 14> EXEFS_FILE_NAMES{ | ||||
|     "main",    "main.npdm", "rtld",    "sdk",     "subsdk0", "subsdk1", "subsdk2", | ||||
| @ -532,7 +532,7 @@ PatchManager::PatchVersionNames PatchManager::GetPatchVersionNames(VirtualFile u | ||||
|     dlc_match.reserve(dlc_entries.size()); | ||||
|     std::copy_if(dlc_entries.begin(), dlc_entries.end(), std::back_inserter(dlc_match), | ||||
|                  [this](const ContentProviderEntry& entry) { | ||||
|                      return (entry.title_id & DLC_BASE_TITLE_ID_MASK) == title_id && | ||||
|                      return GetBaseTitleID(entry.title_id) == title_id && | ||||
|                             content_provider.GetEntry(entry)->GetStatus() == | ||||
|                                 Loader::ResultStatus::Success; | ||||
|                  }); | ||||
|  | ||||
| @ -7,6 +7,7 @@ | ||||
| #include <vector> | ||||
| #include "common/logging/log.h" | ||||
| #include "core/core.h" | ||||
| #include "core/file_sys/common_funcs.h" | ||||
| #include "core/file_sys/content_archive.h" | ||||
| #include "core/file_sys/control_metadata.h" | ||||
| #include "core/file_sys/nca_metadata.h" | ||||
| @ -23,11 +24,8 @@ | ||||
| 
 | ||||
| namespace Service::AOC { | ||||
| 
 | ||||
| constexpr u64 DLC_BASE_TITLE_ID_MASK = 0xFFFFFFFFFFFFE000; | ||||
| constexpr u64 DLC_BASE_TO_AOC_ID = 0x1000; | ||||
| 
 | ||||
| static bool CheckAOCTitleIDMatchesBase(u64 title_id, u64 base) { | ||||
|     return (title_id & DLC_BASE_TITLE_ID_MASK) == base; | ||||
|     return FileSys::GetBaseTitleID(title_id) == base; | ||||
| } | ||||
| 
 | ||||
| static std::vector<u64> AccumulateAOCTitleIDs(Core::System& system) { | ||||
| @ -123,11 +121,11 @@ void AOC_U::ListAddOnContent(Kernel::HLERequestContext& ctx) { | ||||
|     const auto& disabled = Settings::values.disabled_addons[current]; | ||||
|     if (std::find(disabled.begin(), disabled.end(), "DLC") == disabled.end()) { | ||||
|         for (u64 content_id : add_on_content) { | ||||
|             if ((content_id & DLC_BASE_TITLE_ID_MASK) != current) { | ||||
|             if (FileSys::GetBaseTitleID(content_id) != current) { | ||||
|                 continue; | ||||
|             } | ||||
| 
 | ||||
|             out.push_back(static_cast<u32>(content_id & 0x7FF)); | ||||
|             out.push_back(static_cast<u32>(FileSys::GetAOCID(content_id))); | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
| @ -169,7 +167,7 @@ void AOC_U::GetAddOnContentBaseId(Kernel::HLERequestContext& ctx) { | ||||
| 
 | ||||
|     const auto res = pm.GetControlMetadata(); | ||||
|     if (res.first == nullptr) { | ||||
|         rb.Push(title_id + DLC_BASE_TO_AOC_ID); | ||||
|         rb.Push(FileSys::GetAOCBaseTitleID(title_id)); | ||||
|         return; | ||||
|     } | ||||
| 
 | ||||
|  | ||||
| @ -83,6 +83,7 @@ static FileSys::VirtualFile VfsDirectoryCreateFileWrapper(const FileSys::Virtual | ||||
| #include "core/core.h" | ||||
| #include "core/crypto/key_manager.h" | ||||
| #include "core/file_sys/card_image.h" | ||||
| #include "core/file_sys/common_funcs.h" | ||||
| #include "core/file_sys/content_archive.h" | ||||
| #include "core/file_sys/control_metadata.h" | ||||
| #include "core/file_sys/patch_manager.h" | ||||
| @ -148,8 +149,6 @@ __declspec(dllexport) int AmdPowerXpressRequestHighPerformance = 1; | ||||
| 
 | ||||
| constexpr int default_mouse_timeout = 2500; | ||||
| 
 | ||||
| constexpr u64 DLC_BASE_TITLE_ID_MASK = 0xFFFFFFFFFFFFE000; | ||||
| 
 | ||||
| /**
 | ||||
|  * "Callouts" are one-time instructional messages shown to the user. In the config settings, there | ||||
|  * is a bitfield "callout_flags" options, used to track if a message has already been shown to the | ||||
| @ -1529,7 +1528,7 @@ void GMainWindow::RemoveAddOnContent(u64 program_id, const QString& entry_type) | ||||
|         FileSys::TitleType::AOC, FileSys::ContentRecordType::Data); | ||||
| 
 | ||||
|     for (const auto& entry : dlc_entries) { | ||||
|         if ((entry.title_id & DLC_BASE_TITLE_ID_MASK) == program_id) { | ||||
|         if (FileSys::GetBaseTitleID(entry.title_id) == program_id) { | ||||
|             const auto res = | ||||
|                 fs_controller.GetUserNANDContents()->RemoveExistingEntry(entry.title_id) || | ||||
|                 fs_controller.GetSDMCContents()->RemoveExistingEntry(entry.title_id); | ||||
| @ -2709,7 +2708,7 @@ std::optional<u64> GMainWindow::SelectRomFSDumpTarget(const FileSys::ContentProv | ||||
|     dlc_match.reserve(dlc_entries.size()); | ||||
|     std::copy_if(dlc_entries.begin(), dlc_entries.end(), std::back_inserter(dlc_match), | ||||
|                  [&program_id, &installed](const FileSys::ContentProviderEntry& entry) { | ||||
|                      return (entry.title_id & DLC_BASE_TITLE_ID_MASK) == program_id && | ||||
|                      return FileSys::GetBaseTitleID(entry.title_id) == program_id && | ||||
|                             installed.GetEntry(entry)->GetStatus() == Loader::ResultStatus::Success; | ||||
|                  }); | ||||
| 
 | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user
	 Morph
						Morph