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/bis_factory.h | ||||||
|     file_sys/card_image.cpp |     file_sys/card_image.cpp | ||||||
|     file_sys/card_image.h |     file_sys/card_image.h | ||||||
|  |     file_sys/common_funcs.h | ||||||
|     file_sys/content_archive.cpp |     file_sys/content_archive.cpp | ||||||
|     file_sys/content_archive.h |     file_sys/content_archive.h | ||||||
|     file_sys/control_metadata.cpp |     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/logging/log.h" | ||||||
| #include "common/string_util.h" | #include "common/string_util.h" | ||||||
| #include "core/core.h" | #include "core/core.h" | ||||||
|  | #include "core/file_sys/common_funcs.h" | ||||||
| #include "core/file_sys/content_archive.h" | #include "core/file_sys/content_archive.h" | ||||||
| #include "core/file_sys/control_metadata.h" | #include "core/file_sys/control_metadata.h" | ||||||
| #include "core/file_sys/ips_layer.h" | #include "core/file_sys/ips_layer.h" | ||||||
| @ -30,7 +31,6 @@ namespace FileSys { | |||||||
| namespace { | namespace { | ||||||
| 
 | 
 | ||||||
| constexpr u32 SINGLE_BYTE_MODULUS = 0x100; | constexpr u32 SINGLE_BYTE_MODULUS = 0x100; | ||||||
| constexpr u64 DLC_BASE_TITLE_ID_MASK = 0xFFFFFFFFFFFFE000; |  | ||||||
| 
 | 
 | ||||||
| constexpr std::array<const char*, 14> EXEFS_FILE_NAMES{ | constexpr std::array<const char*, 14> EXEFS_FILE_NAMES{ | ||||||
|     "main",    "main.npdm", "rtld",    "sdk",     "subsdk0", "subsdk1", "subsdk2", |     "main",    "main.npdm", "rtld",    "sdk",     "subsdk0", "subsdk1", "subsdk2", | ||||||
| @ -532,7 +532,7 @@ PatchManager::PatchVersionNames PatchManager::GetPatchVersionNames(VirtualFile u | |||||||
|     dlc_match.reserve(dlc_entries.size()); |     dlc_match.reserve(dlc_entries.size()); | ||||||
|     std::copy_if(dlc_entries.begin(), dlc_entries.end(), std::back_inserter(dlc_match), |     std::copy_if(dlc_entries.begin(), dlc_entries.end(), std::back_inserter(dlc_match), | ||||||
|                  [this](const ContentProviderEntry& entry) { |                  [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() == |                             content_provider.GetEntry(entry)->GetStatus() == | ||||||
|                                 Loader::ResultStatus::Success; |                                 Loader::ResultStatus::Success; | ||||||
|                  }); |                  }); | ||||||
|  | |||||||
| @ -7,6 +7,7 @@ | |||||||
| #include <vector> | #include <vector> | ||||||
| #include "common/logging/log.h" | #include "common/logging/log.h" | ||||||
| #include "core/core.h" | #include "core/core.h" | ||||||
|  | #include "core/file_sys/common_funcs.h" | ||||||
| #include "core/file_sys/content_archive.h" | #include "core/file_sys/content_archive.h" | ||||||
| #include "core/file_sys/control_metadata.h" | #include "core/file_sys/control_metadata.h" | ||||||
| #include "core/file_sys/nca_metadata.h" | #include "core/file_sys/nca_metadata.h" | ||||||
| @ -23,11 +24,8 @@ | |||||||
| 
 | 
 | ||||||
| namespace Service::AOC { | 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) { | 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) { | 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]; |     const auto& disabled = Settings::values.disabled_addons[current]; | ||||||
|     if (std::find(disabled.begin(), disabled.end(), "DLC") == disabled.end()) { |     if (std::find(disabled.begin(), disabled.end(), "DLC") == disabled.end()) { | ||||||
|         for (u64 content_id : add_on_content) { |         for (u64 content_id : add_on_content) { | ||||||
|             if ((content_id & DLC_BASE_TITLE_ID_MASK) != current) { |             if (FileSys::GetBaseTitleID(content_id) != current) { | ||||||
|                 continue; |                 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(); |     const auto res = pm.GetControlMetadata(); | ||||||
|     if (res.first == nullptr) { |     if (res.first == nullptr) { | ||||||
|         rb.Push(title_id + DLC_BASE_TO_AOC_ID); |         rb.Push(FileSys::GetAOCBaseTitleID(title_id)); | ||||||
|         return; |         return; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -83,6 +83,7 @@ static FileSys::VirtualFile VfsDirectoryCreateFileWrapper(const FileSys::Virtual | |||||||
| #include "core/core.h" | #include "core/core.h" | ||||||
| #include "core/crypto/key_manager.h" | #include "core/crypto/key_manager.h" | ||||||
| #include "core/file_sys/card_image.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/content_archive.h" | ||||||
| #include "core/file_sys/control_metadata.h" | #include "core/file_sys/control_metadata.h" | ||||||
| #include "core/file_sys/patch_manager.h" | #include "core/file_sys/patch_manager.h" | ||||||
| @ -148,8 +149,6 @@ __declspec(dllexport) int AmdPowerXpressRequestHighPerformance = 1; | |||||||
| 
 | 
 | ||||||
| constexpr int default_mouse_timeout = 2500; | 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 |  * "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 |  * 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); |         FileSys::TitleType::AOC, FileSys::ContentRecordType::Data); | ||||||
| 
 | 
 | ||||||
|     for (const auto& entry : dlc_entries) { |     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 = |             const auto res = | ||||||
|                 fs_controller.GetUserNANDContents()->RemoveExistingEntry(entry.title_id) || |                 fs_controller.GetUserNANDContents()->RemoveExistingEntry(entry.title_id) || | ||||||
|                 fs_controller.GetSDMCContents()->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()); |     dlc_match.reserve(dlc_entries.size()); | ||||||
|     std::copy_if(dlc_entries.begin(), dlc_entries.end(), std::back_inserter(dlc_match), |     std::copy_if(dlc_entries.begin(), dlc_entries.end(), std::back_inserter(dlc_match), | ||||||
|                  [&program_id, &installed](const FileSys::ContentProviderEntry& entry) { |                  [&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; |                             installed.GetEntry(entry)->GetStatus() == Loader::ResultStatus::Success; | ||||||
|                  }); |                  }); | ||||||
| 
 | 
 | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user
	 Morph
						Morph