mirror of
				https://github.com/PabloMK7/citra.git
				synced 2025-10-30 21:30:04 +00:00 
			
		
		
		
	am: Revert changes to content index handling.
This commit is contained in:
		
							parent
							
								
									d67f119589
								
							
						
					
					
						commit
						ba35079449
					
				
					 6 changed files with 16 additions and 42 deletions
				
			
		|  | @ -63,7 +63,7 @@ ResultVal<std::unique_ptr<FileBackend>> NCCHArchive::OpenFile(const Path& path, | ||||||
|     std::memcpy(&openfile_path, binary.data(), sizeof(NCCHFilePath)); |     std::memcpy(&openfile_path, binary.data(), sizeof(NCCHFilePath)); | ||||||
| 
 | 
 | ||||||
|     std::string file_path = |     std::string file_path = | ||||||
|         Service::AM::GetTitleContentPath(media_type, title_id, openfile_path.content_index, false, true); |         Service::AM::GetTitleContentPath(media_type, title_id, openfile_path.content_index); | ||||||
|     auto ncch_container = NCCHContainer(file_path); |     auto ncch_container = NCCHContainer(file_path); | ||||||
| 
 | 
 | ||||||
|     Loader::ResultStatus result; |     Loader::ResultStatus result; | ||||||
|  |  | ||||||
|  | @ -201,7 +201,7 @@ u64 CIAContainer::GetTotalContentSize() const { | ||||||
| 
 | 
 | ||||||
| u64 CIAContainer::GetContentSize(u16 index) const { | u64 CIAContainer::GetContentSize(u16 index) const { | ||||||
|     // If the content doesn't exist in the CIA, it doesn't have a size.
 |     // If the content doesn't exist in the CIA, it doesn't have a size.
 | ||||||
|     if (!cia_header.isContentPresent(cia_tmd.GetContentIndexByIndex(index))) |     if (!cia_header.isContentPresent(index)) | ||||||
|         return 0; |         return 0; | ||||||
| 
 | 
 | ||||||
|     return cia_tmd.GetContentSizeByIndex(index); |     return cia_tmd.GetContentSizeByIndex(index); | ||||||
|  |  | ||||||
|  | @ -86,7 +86,6 @@ Loader::ResultStatus TitleMetadata::Load(const std::vector<u8> file_data, size_t | ||||||
|         memcpy(&chunk, &file_data[offset + body_end + (i * sizeof(ContentChunk))], |         memcpy(&chunk, &file_data[offset + body_end + (i * sizeof(ContentChunk))], | ||||||
|                sizeof(ContentChunk)); |                sizeof(ContentChunk)); | ||||||
|         tmd_chunks.push_back(chunk); |         tmd_chunks.push_back(chunk); | ||||||
|         content_index_to_index[chunk.index] = tmd_chunks.size() - 1; |  | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     return Loader::ResultStatus::Success; |     return Loader::ResultStatus::Success; | ||||||
|  | @ -181,10 +180,6 @@ u32 TitleMetadata::GetContentIDByIndex(u16 index) const { | ||||||
|     return tmd_chunks[index].id; |     return tmd_chunks[index].id; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| u16 TitleMetadata::GetContentIndexByIndex(u16 index) const { |  | ||||||
|     return tmd_chunks[index].index; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| u16 TitleMetadata::GetContentTypeByIndex(u16 index) const { | u16 TitleMetadata::GetContentTypeByIndex(u16 index) const { | ||||||
|     return tmd_chunks[index].type; |     return tmd_chunks[index].type; | ||||||
| } | } | ||||||
|  | @ -193,14 +188,6 @@ u64 TitleMetadata::GetContentSizeByIndex(u16 index) const { | ||||||
|     return tmd_chunks[index].size; |     return tmd_chunks[index].size; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| bool TitleMetadata::ContentIndexExists(u16 contentIndex) const { |  | ||||||
|     return content_index_to_index.find(contentIndex) != content_index_to_index.end(); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| u16 TitleMetadata::ContentIndexToIndex(u16 contentIndex) const { |  | ||||||
|     return content_index_to_index.at(contentIndex); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| void TitleMetadata::SetTitleID(u64 title_id) { | void TitleMetadata::SetTitleID(u64 title_id) { | ||||||
|     tmd_body.title_id = title_id; |     tmd_body.title_id = title_id; | ||||||
| } | } | ||||||
|  | @ -219,7 +206,6 @@ void TitleMetadata::SetSystemVersion(u64 version) { | ||||||
| 
 | 
 | ||||||
| void TitleMetadata::AddContentChunk(const ContentChunk& chunk) { | void TitleMetadata::AddContentChunk(const ContentChunk& chunk) { | ||||||
|     tmd_chunks.push_back(chunk); |     tmd_chunks.push_back(chunk); | ||||||
|     content_index_to_index[chunk.index] = tmd_chunks.size() - 1; |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void TitleMetadata::Print() const { | void TitleMetadata::Print() const { | ||||||
|  |  | ||||||
|  | @ -6,7 +6,6 @@ | ||||||
| 
 | 
 | ||||||
| #include <array> | #include <array> | ||||||
| #include <string> | #include <string> | ||||||
| #include <unordered_map> |  | ||||||
| #include <vector> | #include <vector> | ||||||
| #include "common/common_types.h" | #include "common/common_types.h" | ||||||
| #include "common/swap.h" | #include "common/swap.h" | ||||||
|  | @ -107,11 +106,8 @@ public: | ||||||
|     u32 GetManualContentID() const; |     u32 GetManualContentID() const; | ||||||
|     u32 GetDLPContentID() const; |     u32 GetDLPContentID() const; | ||||||
|     u32 GetContentIDByIndex(u16 index) const; |     u32 GetContentIDByIndex(u16 index) const; | ||||||
|     u16 GetContentIndexByIndex(u16 index) const; |  | ||||||
|     u16 GetContentTypeByIndex(u16 index) const; |     u16 GetContentTypeByIndex(u16 index) const; | ||||||
|     u64 GetContentSizeByIndex(u16 index) const; |     u64 GetContentSizeByIndex(u16 index) const; | ||||||
|     bool ContentIndexExists(u16 contentIndex) const; |  | ||||||
|     u16 ContentIndexToIndex(u16 contentIndex) const; |  | ||||||
| 
 | 
 | ||||||
|     void SetTitleID(u64 title_id); |     void SetTitleID(u64 title_id); | ||||||
|     void SetTitleType(u32 type); |     void SetTitleType(u32 type); | ||||||
|  | @ -126,7 +122,6 @@ private: | ||||||
|     u32_be signature_type; |     u32_be signature_type; | ||||||
|     std::vector<u8> tmd_signature; |     std::vector<u8> tmd_signature; | ||||||
|     std::vector<ContentChunk> tmd_chunks; |     std::vector<ContentChunk> tmd_chunks; | ||||||
|     std::unordered_map<u16, size_t> content_index_to_index; |  | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| } // namespace FileSys
 | } // namespace FileSys
 | ||||||
|  |  | ||||||
|  | @ -384,7 +384,7 @@ std::string GetTitleMetadataPath(Service::FS::MediaType media_type, u64 tid, boo | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| std::string GetTitleContentPath(Service::FS::MediaType media_type, u64 tid, u16 index, | std::string GetTitleContentPath(Service::FS::MediaType media_type, u64 tid, u16 index, | ||||||
|                                 bool update, bool contentIndex) { |                                 bool update) { | ||||||
|     std::string content_path = GetTitlePath(media_type, tid) + "content/"; |     std::string content_path = GetTitlePath(media_type, tid) + "content/"; | ||||||
| 
 | 
 | ||||||
|     if (media_type == Service::FS::MediaType::GameCard) { |     if (media_type == Service::FS::MediaType::GameCard) { | ||||||
|  | @ -399,15 +399,11 @@ std::string GetTitleContentPath(Service::FS::MediaType media_type, u64 tid, u16 | ||||||
|     u32 content_id = 0; |     u32 content_id = 0; | ||||||
|     FileSys::TitleMetadata tmd; |     FileSys::TitleMetadata tmd; | ||||||
|     if (tmd.Load(tmd_path) == Loader::ResultStatus::Success) { |     if (tmd.Load(tmd_path) == Loader::ResultStatus::Success) { | ||||||
|         if(contentIndex) { |         if(index < tmd.GetContentCount()) { | ||||||
|             if(tmd.ContentIndexExists(index)) { |             content_id = tmd.GetContentIDByIndex(index); | ||||||
|                 index = tmd.ContentIndexToIndex(index); |  | ||||||
|         } else { |         } else { | ||||||
|             LOG_ERROR(Service_AM, "Attempted to get path for non-existent content index {:04x}.", index); |             LOG_ERROR(Service_AM, "Attempted to get path for non-existent content index {:04x}.", index); | ||||||
|         } |         } | ||||||
|         } |  | ||||||
| 
 |  | ||||||
|         content_id = tmd.GetContentIDByIndex(index); |  | ||||||
| 
 | 
 | ||||||
|         // TODO(shinyquagsire23): how does DLC actually get this folder on hardware?
 |         // TODO(shinyquagsire23): how does DLC actually get this folder on hardware?
 | ||||||
|         // For now, check if the second (index 1) content has the optional flag set, for most
 |         // For now, check if the second (index 1) content has the optional flag set, for most
 | ||||||
|  | @ -533,7 +529,7 @@ void Module::Interface::FindDLCContentInfos(Kernel::HLERequestContext& ctx) { | ||||||
|             std::shared_ptr<FileUtil::IOFile> romfs_file; |             std::shared_ptr<FileUtil::IOFile> romfs_file; | ||||||
|             u64 romfs_offset = 0; |             u64 romfs_offset = 0; | ||||||
| 
 | 
 | ||||||
|             if (!tmd.ContentIndexExists(content_requested[i])) { |             if (content_requested[i] >= tmd.GetContentCount()) { | ||||||
|                 LOG_ERROR(Service_AM, "Attempted to get info for non-existent content index {:04x}.", content_requested[i]); |                 LOG_ERROR(Service_AM, "Attempted to get info for non-existent content index {:04x}.", content_requested[i]); | ||||||
| 
 | 
 | ||||||
|                 IPC::RequestBuilder rb = rp.MakeBuilder(1, 4); |                 IPC::RequestBuilder rb = rp.MakeBuilder(1, 4); | ||||||
|  | @ -543,16 +539,14 @@ void Module::Interface::FindDLCContentInfos(Kernel::HLERequestContext& ctx) { | ||||||
|                 return; |                 return; | ||||||
|             } |             } | ||||||
| 
 | 
 | ||||||
|             u16 index = tmd.ContentIndexToIndex(content_requested[i]); |  | ||||||
| 
 |  | ||||||
|             ContentInfo content_info = {}; |             ContentInfo content_info = {}; | ||||||
|             content_info.index = content_requested[i]; |             content_info.index = content_requested[i]; | ||||||
|             content_info.type = tmd.GetContentTypeByIndex(index); |             content_info.type = tmd.GetContentTypeByIndex(content_requested[i]); | ||||||
|             content_info.content_id = tmd.GetContentIDByIndex(index); |             content_info.content_id = tmd.GetContentIDByIndex(content_requested[i]); | ||||||
|             content_info.size = tmd.GetContentSizeByIndex(index); |             content_info.size = tmd.GetContentSizeByIndex(content_requested[i]); | ||||||
|             content_info.ownership = OWNERSHIP_OWNED; // TODO: Pull this from the ticket.
 |             content_info.ownership = OWNERSHIP_OWNED; // TODO: Pull this from the ticket.
 | ||||||
| 
 | 
 | ||||||
|             if (FileUtil::Exists(GetTitleContentPath(media_type, title_id, index))) { |             if (FileUtil::Exists(GetTitleContentPath(media_type, title_id, content_requested[i]))) { | ||||||
|                 content_info.ownership |= OWNERSHIP_DOWNLOADED; |                 content_info.ownership |= OWNERSHIP_DOWNLOADED; | ||||||
|             } |             } | ||||||
| 
 | 
 | ||||||
|  | @ -600,7 +594,7 @@ void Module::Interface::ListDLCContentInfos(Kernel::HLERequestContext& ctx) { | ||||||
|             u64 romfs_offset = 0; |             u64 romfs_offset = 0; | ||||||
| 
 | 
 | ||||||
|             ContentInfo content_info = {}; |             ContentInfo content_info = {}; | ||||||
|             content_info.index = tmd.GetContentIndexByIndex(i); |             content_info.index = static_cast<u16>(i); | ||||||
|             content_info.type = tmd.GetContentTypeByIndex(i); |             content_info.type = tmd.GetContentTypeByIndex(i); | ||||||
|             content_info.content_id = tmd.GetContentIDByIndex(i); |             content_info.content_id = tmd.GetContentIDByIndex(i); | ||||||
|             content_info.size = tmd.GetContentSizeByIndex(i); |             content_info.size = tmd.GetContentSizeByIndex(i); | ||||||
|  | @ -937,7 +931,7 @@ void Module::Interface::CheckContentRights(Kernel::HLERequestContext& ctx) { | ||||||
| 
 | 
 | ||||||
|     // TODO(shinyquagsire23): Read tickets for this instead?
 |     // TODO(shinyquagsire23): Read tickets for this instead?
 | ||||||
|     bool has_rights = |     bool has_rights = | ||||||
|         FileUtil::Exists(GetTitleContentPath(Service::FS::MediaType::SDMC, tid, content_index, false, true)); |         FileUtil::Exists(GetTitleContentPath(Service::FS::MediaType::SDMC, tid, content_index)); | ||||||
| 
 | 
 | ||||||
|     IPC::RequestBuilder rb = rp.MakeBuilder(2, 0); |     IPC::RequestBuilder rb = rp.MakeBuilder(2, 0); | ||||||
|     rb.Push(RESULT_SUCCESS); // No error
 |     rb.Push(RESULT_SUCCESS); // No error
 | ||||||
|  | @ -953,7 +947,7 @@ void Module::Interface::CheckContentRightsIgnorePlatform(Kernel::HLERequestConte | ||||||
| 
 | 
 | ||||||
|     // TODO(shinyquagsire23): Read tickets for this instead?
 |     // TODO(shinyquagsire23): Read tickets for this instead?
 | ||||||
|     bool has_rights = |     bool has_rights = | ||||||
|         FileUtil::Exists(GetTitleContentPath(Service::FS::MediaType::SDMC, tid, content_index, false, true)); |         FileUtil::Exists(GetTitleContentPath(Service::FS::MediaType::SDMC, tid, content_index)); | ||||||
| 
 | 
 | ||||||
|     IPC::RequestBuilder rb = rp.MakeBuilder(2, 0); |     IPC::RequestBuilder rb = rp.MakeBuilder(2, 0); | ||||||
|     rb.Push(RESULT_SUCCESS); // No error
 |     rb.Push(RESULT_SUCCESS); // No error
 | ||||||
|  |  | ||||||
|  | @ -121,11 +121,10 @@ std::string GetTitleMetadataPath(Service::FS::MediaType media_type, u64 tid, boo | ||||||
|  * @param tid the title ID to get |  * @param tid the title ID to get | ||||||
|  * @param index the content index to get |  * @param index the content index to get | ||||||
|  * @param update set true if the incoming TMD should be used instead of the current TMD |  * @param update set true if the incoming TMD should be used instead of the current TMD | ||||||
|  * @param contentIndex set true if the supplied index is a 3DS content index value instead of a raw index. |  | ||||||
|  * @returns string path to the .app file |  * @returns string path to the .app file | ||||||
|  */ |  */ | ||||||
| std::string GetTitleContentPath(Service::FS::MediaType media_type, u64 tid, u16 index = 0, | std::string GetTitleContentPath(Service::FS::MediaType media_type, u64 tid, u16 index = 0, | ||||||
|                                 bool update = false, bool contentIndex = false); |                                 bool update = false); | ||||||
| 
 | 
 | ||||||
| /**
 | /**
 | ||||||
|  * Get the folder for a title's installed content. |  * Get the folder for a title's installed content. | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue