[Kernel] Let XamContentAggregate.. make use of XEX alt-title-ids header

This commit is contained in:
emoose
2021-06-15 22:29:29 +01:00
committed by Rick Gibbed
parent c889a8af3f
commit 716d4c412a

View File

@@ -11,6 +11,7 @@
#include "xenia/base/math.h" #include "xenia/base/math.h"
#include "xenia/base/string_util.h" #include "xenia/base/string_util.h"
#include "xenia/kernel/kernel_state.h" #include "xenia/kernel/kernel_state.h"
#include "xenia/kernel/user_module.h"
#include "xenia/kernel/util/shim_utils.h" #include "xenia/kernel/util/shim_utils.h"
#include "xenia/kernel/xam/xam_content_device.h" #include "xenia/kernel/xam/xam_content_device.h"
#include "xenia/kernel/xam/xam_private.h" #include "xenia/kernel/xam/xam_private.h"
@@ -99,13 +100,26 @@ dword_result_t XamContentAggregateCreateEnumerator(qword_t xuid,
auto content_type_enum = XContentType(uint32_t(content_type)); auto content_type_enum = XContentType(uint32_t(content_type));
if (!device_info || device_info->device_type == DeviceType::HDD) { if (!device_info || device_info->device_type == DeviceType::HDD) {
// Get all content data. // Fetch any alternate title IDs defined in the XEX header
auto content_datas = kernel_state()->content_manager()->ListContent( // (used by games to load saves from other titles, etc)
static_cast<uint32_t>(DummyDeviceId::HDD), content_type_enum); std::vector<uint32_t> title_ids{kCurrentlyRunningTitleId};
for (const auto& content_data : content_datas) { auto exe_module = kernel_state()->GetExecutableModule();
auto item = reinterpret_cast<XCONTENT_AGGREGATE_DATA*>(e->AppendItem()); if (exe_module && exe_module->xex_module()) {
assert_not_null(item); const auto& alt_ids = exe_module->xex_module()->opt_alternate_title_ids();
*item = content_data; std::copy(alt_ids.cbegin(), alt_ids.cend(),
std::back_inserter(title_ids));
}
for (auto& title_id : title_ids) {
// Get all content data.
auto content_datas = kernel_state()->content_manager()->ListContent(
static_cast<uint32_t>(DummyDeviceId::HDD), content_type_enum,
title_id);
for (const auto& content_data : content_datas) {
auto item = reinterpret_cast<XCONTENT_AGGREGATE_DATA*>(e->AppendItem());
assert_not_null(item);
*item = content_data;
}
} }
} }