[Xam/Content] - Implement XamContentCreateEnumeratorInternal
- Implement XamContentCreateEnumeratorInternal
This commit is contained in:
committed by
Radosław Gliński
parent
ef67d1ca3f
commit
f88bfbe41e
@@ -126,8 +126,8 @@ dword_result_t XamContentResolve_entry(
|
|||||||
DECLARE_XAM_EXPORT1(XamContentResolve, kContent, kSketchy);
|
DECLARE_XAM_EXPORT1(XamContentResolve, kContent, kSketchy);
|
||||||
|
|
||||||
// https://github.com/MrColdbird/gameservice/blob/master/ContentManager.cpp
|
// https://github.com/MrColdbird/gameservice/blob/master/ContentManager.cpp
|
||||||
dword_result_t XamContentCreateEnumerator_entry(
|
dword_result_t XamContentCreateEnumeratorInternal_entry(
|
||||||
dword_t user_index, dword_t device_id, dword_t content_type,
|
qword_t xuid, dword_t device_id, dword_t content_type, dword_t title_id,
|
||||||
dword_t content_flags, dword_t items_per_enumerate,
|
dword_t content_flags, dword_t items_per_enumerate,
|
||||||
lpdword_t buffer_size_ptr, lpdword_t handle_out) {
|
lpdword_t buffer_size_ptr, lpdword_t handle_out) {
|
||||||
assert_not_null(handle_out);
|
assert_not_null(handle_out);
|
||||||
@@ -146,26 +146,22 @@ dword_result_t XamContentCreateEnumerator_entry(
|
|||||||
*buffer_size_ptr = sizeof(XCONTENT_DATA) * items_per_enumerate;
|
*buffer_size_ptr = sizeof(XCONTENT_DATA) * items_per_enumerate;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint64_t xuid = 0;
|
|
||||||
if (user_index != XUserIndexNone) {
|
|
||||||
const auto& user = kernel_state()->xam_state()->GetUserProfile(user_index);
|
|
||||||
|
|
||||||
if (!user) {
|
|
||||||
return X_ERROR_NO_SUCH_USER;
|
|
||||||
}
|
|
||||||
|
|
||||||
xuid = user->xuid();
|
|
||||||
}
|
|
||||||
|
|
||||||
auto e = object_ref<ContentEnumerator>(
|
auto e = object_ref<ContentEnumerator>(
|
||||||
new ContentEnumerator(kernel_state(), items_per_enumerate));
|
new ContentEnumerator(kernel_state(), items_per_enumerate));
|
||||||
|
|
||||||
auto result = e->Initialize(XUserIndexAny, 0xFE, 0x20005, 0x20007, 0);
|
auto result =
|
||||||
|
e->Initialize(XUserIndexAny, 0xFE, 0x20005, 0x20007, 0, 0x98, nullptr);
|
||||||
if (XFAILED(result)) {
|
if (XFAILED(result)) {
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::vector<XCONTENT_AGGREGATE_DATA> enumerated_content = {};
|
uint32_t title = title_id;
|
||||||
|
if (!title) {
|
||||||
|
title = kernel_state()->title_id();
|
||||||
|
}
|
||||||
|
|
||||||
|
std::vector<XCONTENT_AGGREGATE_DATA> enumerated_content =
|
||||||
|
{}; // XCONTENT_DATA_INTERNAL
|
||||||
|
|
||||||
if (!device_info || device_info->device_id == DummyDeviceId::HDD) {
|
if (!device_info || device_info->device_id == DummyDeviceId::HDD) {
|
||||||
std::vector<uint64_t> xuids_to_enumerate = {};
|
std::vector<uint64_t> xuids_to_enumerate = {};
|
||||||
@@ -180,8 +176,7 @@ dword_result_t XamContentCreateEnumerator_entry(
|
|||||||
for (const auto& xuid : xuids_to_enumerate) {
|
for (const auto& xuid : xuids_to_enumerate) {
|
||||||
auto user_enumerated_data =
|
auto user_enumerated_data =
|
||||||
kernel_state()->content_manager()->ListContent(
|
kernel_state()->content_manager()->ListContent(
|
||||||
static_cast<uint32_t>(DummyDeviceId::HDD), xuid,
|
static_cast<uint32_t>(DummyDeviceId::HDD), xuid, title,
|
||||||
kernel_state()->title_id(),
|
|
||||||
static_cast<XContentType>(content_type.value()));
|
static_cast<XContentType>(content_type.value()));
|
||||||
|
|
||||||
enumerated_content.insert(enumerated_content.end(),
|
enumerated_content.insert(enumerated_content.end(),
|
||||||
@@ -198,8 +193,8 @@ dword_result_t XamContentCreateEnumerator_entry(
|
|||||||
if (!device_info || device_info->device_id == DummyDeviceId::ODD) {
|
if (!device_info || device_info->device_id == DummyDeviceId::ODD) {
|
||||||
auto disc_enumerated_data =
|
auto disc_enumerated_data =
|
||||||
kernel_state()->content_manager()->ListContentODD(
|
kernel_state()->content_manager()->ListContentODD(
|
||||||
static_cast<uint32_t>(DummyDeviceId::ODD), 0,
|
static_cast<uint32_t>(DummyDeviceId::ODD), 0, title,
|
||||||
kernel_state()->title_id(), XContentType(uint32_t(content_type)));
|
XContentType(uint32_t(content_type)));
|
||||||
|
|
||||||
enumerated_content.insert(enumerated_content.end(),
|
enumerated_content.insert(enumerated_content.end(),
|
||||||
disc_enumerated_data.cbegin(),
|
disc_enumerated_data.cbegin(),
|
||||||
@@ -212,12 +207,33 @@ dword_result_t XamContentCreateEnumerator_entry(
|
|||||||
xe::to_utf8(content_data.display_name()), content_data.file_name());
|
xe::to_utf8(content_data.display_name()), content_data.file_name());
|
||||||
}
|
}
|
||||||
|
|
||||||
XELOGD("XamContentCreateEnumerator: added {} items to enumerator",
|
XELOGD("XamContentCreateEnumeratorInternal: added {} items to enumerator",
|
||||||
e->item_count());
|
e->item_count());
|
||||||
|
|
||||||
*handle_out = e->handle();
|
*handle_out = e->handle();
|
||||||
return X_ERROR_SUCCESS;
|
return X_ERROR_SUCCESS;
|
||||||
}
|
}
|
||||||
|
DECLARE_XAM_EXPORT1(XamContentCreateEnumeratorInternal, kContent, kImplemented);
|
||||||
|
|
||||||
|
dword_result_t XamContentCreateEnumerator_entry(
|
||||||
|
dword_t user_index, dword_t device_id, dword_t content_type,
|
||||||
|
dword_t content_flags, dword_t items_per_enumerate,
|
||||||
|
lpdword_t buffer_size_ptr, lpdword_t handle_out) {
|
||||||
|
uint64_t xuid = 0;
|
||||||
|
if (user_index < XUserMaxUserCount) {
|
||||||
|
const auto& user = kernel_state()->xam_state()->GetUserProfile(user_index);
|
||||||
|
|
||||||
|
if (!user) {
|
||||||
|
return X_ERROR_NO_SUCH_USER;
|
||||||
|
}
|
||||||
|
|
||||||
|
xuid = user->xuid();
|
||||||
|
}
|
||||||
|
|
||||||
|
return XamContentCreateEnumeratorInternal_entry(
|
||||||
|
xuid, device_id, content_type, 0, content_flags, items_per_enumerate,
|
||||||
|
buffer_size_ptr, handle_out);
|
||||||
|
}
|
||||||
DECLARE_XAM_EXPORT1(XamContentCreateEnumerator, kContent, kImplemented);
|
DECLARE_XAM_EXPORT1(XamContentCreateEnumerator, kContent, kImplemented);
|
||||||
|
|
||||||
enum class kDispositionState : uint32_t { Unknown = 0, Create = 1, Open = 2 };
|
enum class kDispositionState : uint32_t { Unknown = 0, Create = 1, Open = 2 };
|
||||||
|
|||||||
Reference in New Issue
Block a user