[XAM] XamContentGetCreator: Use deferred overlap
This commit is contained in:
parent
9ba96d46d1
commit
365a220b74
|
@ -315,40 +315,58 @@ dword_result_t XamContentGetCreator_entry(dword_t user_index,
|
||||||
lpdword_t is_creator_ptr,
|
lpdword_t is_creator_ptr,
|
||||||
lpqword_t creator_xuid_ptr,
|
lpqword_t creator_xuid_ptr,
|
||||||
lpunknown_t overlapped_ptr) {
|
lpunknown_t overlapped_ptr) {
|
||||||
auto result = X_ERROR_SUCCESS;
|
if (!is_creator_ptr) {
|
||||||
|
return X_ERROR_INVALID_PARAMETER;
|
||||||
|
}
|
||||||
|
|
||||||
XCONTENT_AGGREGATE_DATA content_data = *content_data_ptr.as<XCONTENT_DATA*>();
|
XCONTENT_AGGREGATE_DATA content_data = *content_data_ptr.as<XCONTENT_DATA*>();
|
||||||
|
|
||||||
bool content_exists =
|
auto run = [content_data, user_index, is_creator_ptr, creator_xuid_ptr,
|
||||||
kernel_state()->content_manager()->ContentExists(content_data);
|
overlapped_ptr](uint32_t& extended_error,
|
||||||
|
uint32_t& length) -> X_RESULT {
|
||||||
|
X_RESULT result = X_ERROR_SUCCESS;
|
||||||
|
|
||||||
if (content_exists) {
|
bool content_exists =
|
||||||
if (content_data.content_type == XContentType::kSavedGame) {
|
kernel_state()->content_manager()->ContentExists(content_data);
|
||||||
// User always creates saves.
|
|
||||||
*is_creator_ptr = 1;
|
if (content_exists) {
|
||||||
if (creator_xuid_ptr) {
|
if (content_data.content_type == XContentType::kSavedGame) {
|
||||||
if (kernel_state()->IsUserSignedIn(user_index)) {
|
// User always creates saves.
|
||||||
const auto& user_profile = kernel_state()->user_profile(user_index);
|
*is_creator_ptr = 1;
|
||||||
*creator_xuid_ptr = user_profile->xuid();
|
if (creator_xuid_ptr) {
|
||||||
} else {
|
if (kernel_state()->IsUserSignedIn(user_index)) {
|
||||||
result = X_ERROR_NO_SUCH_USER;
|
const auto& user_profile = kernel_state()->user_profile(user_index);
|
||||||
|
*creator_xuid_ptr = user_profile->xuid();
|
||||||
|
} else {
|
||||||
|
result = X_ERROR_NO_SUCH_USER;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
*is_creator_ptr = 0;
|
||||||
|
if (creator_xuid_ptr) {
|
||||||
|
*creator_xuid_ptr = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
*is_creator_ptr = 0;
|
result = X_ERROR_PATH_NOT_FOUND;
|
||||||
if (creator_xuid_ptr) {
|
}
|
||||||
*creator_xuid_ptr = 0;
|
|
||||||
}
|
extended_error = X_HRESULT_FROM_WIN32(result);
|
||||||
|
length = 0;
|
||||||
|
|
||||||
|
if (result && overlapped_ptr) {
|
||||||
|
result = X_ERROR_FUNCTION_FAILED;
|
||||||
}
|
}
|
||||||
} else {
|
|
||||||
result = X_ERROR_PATH_NOT_FOUND;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (overlapped_ptr) {
|
|
||||||
kernel_state()->CompleteOverlappedImmediate(overlapped_ptr, result);
|
|
||||||
return X_ERROR_IO_PENDING;
|
|
||||||
} else {
|
|
||||||
return result;
|
return result;
|
||||||
|
};
|
||||||
|
|
||||||
|
if (!overlapped_ptr) {
|
||||||
|
uint32_t extended_error, length;
|
||||||
|
return run(extended_error, length);
|
||||||
|
} else {
|
||||||
|
kernel_state()->CompleteOverlappedDeferredEx(run, overlapped_ptr);
|
||||||
|
return X_ERROR_IO_PENDING;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
DECLARE_XAM_EXPORT1(XamContentGetCreator, kContent, kImplemented);
|
DECLARE_XAM_EXPORT1(XamContentGetCreator, kContent, kImplemented);
|
||||||
|
|
Loading…
Reference in New Issue