am: Properly handle operations involving content indices.

This commit is contained in:
Steveice10
2018-07-06 00:44:22 -07:00
parent 932eeefff0
commit 630a1311ca
6 changed files with 43 additions and 10 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::string file_path =
Service::AM::GetTitleContentPath(media_type, title_id, openfile_path.content_index);
Service::AM::GetTitleContentPath(media_type, title_id, openfile_path.content_index, false, true);
auto ncch_container = NCCHContainer(file_path);
Loader::ResultStatus result;

View File

@@ -201,7 +201,7 @@ u64 CIAContainer::GetTotalContentSize() const {
u64 CIAContainer::GetContentSize(u16 index) const {
// If the content doesn't exist in the CIA, it doesn't have a size.
if (!cia_header.isContentPresent(index))
if (!cia_header.isContentPresent(cia_tmd.GetContentIndexByIndex(index)))
return 0;
return cia_tmd.GetContentSizeByIndex(index);

View File

@@ -86,6 +86,7 @@ Loader::ResultStatus TitleMetadata::Load(const std::vector<u8> file_data, size_t
memcpy(&chunk, &file_data[offset + body_end + (i * sizeof(ContentChunk))],
sizeof(ContentChunk));
tmd_chunks.push_back(chunk);
content_index_to_index[chunk.index] = tmd_chunks.size() - 1;
}
return Loader::ResultStatus::Success;
@@ -180,6 +181,10 @@ u32 TitleMetadata::GetContentIDByIndex(u16 index) const {
return tmd_chunks[index].id;
}
u16 TitleMetadata::GetContentIndexByIndex(u16 index) const {
return tmd_chunks[index].index;
}
u16 TitleMetadata::GetContentTypeByIndex(u16 index) const {
return tmd_chunks[index].type;
}
@@ -188,6 +193,14 @@ u64 TitleMetadata::GetContentSizeByIndex(u16 index) const {
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) {
tmd_body.title_id = title_id;
}
@@ -206,6 +219,7 @@ void TitleMetadata::SetSystemVersion(u64 version) {
void TitleMetadata::AddContentChunk(const ContentChunk& chunk) {
tmd_chunks.push_back(chunk);
content_index_to_index[chunk.index] = tmd_chunks.size() - 1;
}
void TitleMetadata::Print() const {

View File

@@ -5,6 +5,7 @@
#pragma once
#include <array>
#include <map>
#include <string>
#include <vector>
#include "common/common_types.h"
@@ -106,8 +107,11 @@ public:
u32 GetManualContentID() const;
u32 GetDLPContentID() const;
u32 GetContentIDByIndex(u16 index) const;
u16 GetContentIndexByIndex(u16 index) const;
u16 GetContentTypeByIndex(u16 index) const;
u64 GetContentSizeByIndex(u16 index) const;
bool ContentIndexExists(u16 contentIndex) const;
u16 ContentIndexToIndex(u16 contentIndex) const;
void SetTitleID(u64 title_id);
void SetTitleType(u32 type);
@@ -122,6 +126,7 @@ private:
u32_be signature_type;
std::vector<u8> tmd_signature;
std::vector<ContentChunk> tmd_chunks;
std::map<u16, size_t> content_index_to_index;
};
} // namespace FileSys