am: Revert changes to content index handling.

This commit is contained in:
Steveice10 2018-07-06 17:15:30 -07:00
parent d67f119589
commit ba35079449
6 changed files with 16 additions and 42 deletions

View File

@ -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;

View File

@ -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);

View File

@ -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 {

View File

@ -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

View File

@ -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,16 +399,12 @@ 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
// apps this is usually the manual and not set optional, DLC has it set optional. // apps this is usually the manual and not set optional, DLC has it set optional.
@ -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

View File

@ -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.