Files
Nithishvelan M 89e1425662 fix(libScePlayGoDialog): return COMMON_DIALOG_ERROR_NOT_FINISHED for uncompleted dialog
Align scePlayGoDialogGetResult unfinished error code with the other common dialog modules across the tree (0x80B80005, COMMON_DIALOG_ERROR_NOT_FINISHED) instead of 0x80ED0005. Update GuestPlayGoDialog test and technical debt entry accordingly.
2026-10-19 16:58:29 +02:00

83 lines
2.6 KiB
C++

#include <atomic>
#include <cstdint>
#include <cstddef>
#include <cstring>
#include "SceTypes.hpp"
#include "prx/libc/include/General.hpp"
static_assert(sizeof(PlayGoDialogResult) == 40);
namespace {
constexpr std::int32_t STATUS_NONE = 0;
constexpr std::int32_t STATUS_INITIALIZED = 1;
constexpr std::int32_t STATUS_RUNNING = 2;
constexpr std::int32_t STATUS_FINISHED = 3;
constexpr std::int32_t RESULT_OK = 0;
constexpr std::int32_t ERROR_NOT_INITIALIZED = static_cast<std::int32_t>(0x80ED0001);
constexpr std::int32_t ERROR_ALREADY_INITIALIZED = static_cast<std::int32_t>(0x80ED0002);
constexpr std::int32_t ERROR_PARAM_INVALID = static_cast<std::int32_t>(0x80ED0003);
constexpr std::int32_t ERROR_INVALID_STATE = static_cast<std::int32_t>(0x80ED0005);
constexpr std::int32_t COMMON_DIALOG_ERROR_NOT_FINISHED = static_cast<std::int32_t>(0x80B80005u);
std::atomic<int> g_status{STATUS_NONE};
}
extern "C" {
int APS5_VABI scePlayGoDialogInitialize(void) {
int expected = STATUS_NONE;
if (!g_status.compare_exchange_strong(expected, STATUS_INITIALIZED)) return ERROR_ALREADY_INITIALIZED;
return 0;
}
int APS5_VABI scePlayGoDialogTerminate(void) {
int expected = STATUS_INITIALIZED;
if (!g_status.compare_exchange_strong(expected, STATUS_NONE)) {
expected = STATUS_FINISHED;
if (!g_status.compare_exchange_strong(expected, STATUS_NONE)) return ERROR_NOT_INITIALIZED;
}
return 0;
}
int APS5_VABI scePlayGoDialogOpen(const void* param) {
if (!param) return ERROR_PARAM_INVALID;
int expected = STATUS_INITIALIZED;
if (!g_status.compare_exchange_strong(expected, STATUS_FINISHED)) {
expected = STATUS_FINISHED;
if (!g_status.compare_exchange_strong(expected, STATUS_FINISHED)) return ERROR_INVALID_STATE;
}
return 0;
}
int APS5_VABI scePlayGoDialogClose(void) {
if (g_status.load() == STATUS_NONE) return ERROR_NOT_INITIALIZED;
g_status.store(STATUS_FINISHED);
return 0;
}
int APS5_VABI scePlayGoDialogUpdateStatus(void) {
int expected = STATUS_RUNNING;
g_status.compare_exchange_strong(expected, STATUS_FINISHED);
return g_status.load();
}
int APS5_VABI scePlayGoDialogGetResult(void* result) {
if (g_status.load() == STATUS_NONE) return ERROR_NOT_INITIALIZED;
if (!result) return ERROR_PARAM_INVALID;
if (g_status.load() != STATUS_FINISHED) return COMMON_DIALOG_ERROR_NOT_FINISHED;
auto* r = static_cast<PlayGoDialogResult*>(result);
std::memset(r, 0, sizeof(*r));
r->result = RESULT_OK;
return 0;
}
int APS5_VABI scePlayGoDialogGetStatus(void) {
return g_status.load();
}
}