From f97afb03fcd8ace5c51ecd464a451d29ecae591e Mon Sep 17 00:00:00 2001 From: georgemoralis Date: Tue, 7 Apr 2026 10:49:05 +0300 Subject: [PATCH] better transaction handling --- src/core/libraries/np/np_profile_dialog.cpp | 57 ++++++++++++++----- src/core/libraries/np/np_profile_dialog.h | 13 +++-- .../web_browser_dialog/webbrowserdialog.cpp | 27 ++++++--- .../web_browser_dialog/webbrowserdialog.h | 4 +- 4 files changed, 70 insertions(+), 31 deletions(-) diff --git a/src/core/libraries/np/np_profile_dialog.cpp b/src/core/libraries/np/np_profile_dialog.cpp index 6ae1ed26c..11dad6992 100644 --- a/src/core/libraries/np/np_profile_dialog.cpp +++ b/src/core/libraries/np/np_profile_dialog.cpp @@ -1,16 +1,25 @@ -// SPDX-FileCopyrightText: Copyright 2025 shadPS4 Emulator Project +// SPDX-FileCopyrightText: Copyright 2025-2026 shadPS4 Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later +#include #include "common/logging/log.h" #include "core/libraries/error_codes.h" #include "core/libraries/libs.h" #include "core/libraries/np/np_profile_dialog.h" +#include "magic_enum/magic_enum.hpp" namespace Libraries::Np::NpProfileDialog { -s32 PS4_SYSV_ABI sceNpProfileDialogOpen() { +static auto g_status = Libraries::CommonDialog::Status::NONE; + +Libraries::CommonDialog::Error PS4_SYSV_ABI sceNpProfileDialogOpen() { + if (g_status != Libraries::CommonDialog::Status::INITIALIZED && + g_status != Libraries::CommonDialog::Status::FINISHED) { + LOG_INFO(Lib_MsgDlg, "called without initialize"); + return Libraries::CommonDialog::Error::INVALID_STATE; + } LOG_ERROR(Lib_NpProfileDialog, "(STUBBED) called"); - return ORBIS_OK; + return Libraries::CommonDialog::Error::OK; } s32 PS4_SYSV_ABI sceNpProfileDialogClose() { @@ -23,14 +32,25 @@ s32 PS4_SYSV_ABI sceNpProfileDialogGetResult() { return ORBIS_OK; } -s32 PS4_SYSV_ABI sceNpProfileDialogGetStatus() { - LOG_ERROR(Lib_NpProfileDialog, "(STUBBED) called"); - return ORBIS_OK; +Libraries::CommonDialog::Status PS4_SYSV_ABI sceNpProfileDialogGetStatus() { + LOG_TRACE(Lib_MsgDlg, "called status={}", magic_enum::enum_name(g_status)); + return g_status; } -s32 PS4_SYSV_ABI sceNpProfileDialogInitialize() { - LOG_ERROR(Lib_NpProfileDialog, "(STUBBED) called"); - return ORBIS_OK; +Libraries::CommonDialog::Error PS4_SYSV_ABI sceNpProfileDialogInitialize() { + if (!CommonDialog::g_isInitialized) { + return Libraries::CommonDialog::Error::NOT_SYSTEM_INITIALIZED; + } + if (g_status != Libraries::CommonDialog::Status::NONE) { + LOG_INFO(Lib_NpProfileDialog, "already initialized"); + return Libraries::CommonDialog::Error::ALREADY_INITIALIZED; + } + if (CommonDialog::g_isUsed) { + return Libraries::CommonDialog::Error::BUSY; + } + g_status = Libraries::CommonDialog::Status::INITIALIZED; + CommonDialog::g_isUsed = true; + return Libraries::CommonDialog::Error::OK; } s32 PS4_SYSV_ABI sceNpProfileDialogOpenA() { @@ -38,14 +58,21 @@ s32 PS4_SYSV_ABI sceNpProfileDialogOpenA() { return ORBIS_OK; } -s32 PS4_SYSV_ABI sceNpProfileDialogTerminate() { - LOG_ERROR(Lib_NpProfileDialog, "(STUBBED) called"); - return ORBIS_OK; +Libraries::CommonDialog::Error sceNpProfileDialogTerminate() { + if (g_status == Libraries::CommonDialog::Status::RUNNING) { + LOG_ERROR(Lib_NpProfileDialog, "CloseProfile Dialog unimplemented"); + } + if (g_status == Libraries::CommonDialog::Status::NONE) { + return Libraries::CommonDialog::Error::NOT_INITIALIZED; + } + g_status = Libraries::CommonDialog::Status::NONE; + CommonDialog::g_isUsed = false; + return Libraries::CommonDialog::Error::OK; } -s32 PS4_SYSV_ABI sceNpProfileDialogUpdateStatus() { - LOG_DEBUG(Lib_NpProfileDialog, "(STUBBED) called"); - return ORBIS_OK; +Libraries::CommonDialog::Status PS4_SYSV_ABI sceNpProfileDialogUpdateStatus() { + LOG_TRACE(Lib_MsgDlg, "called status={}", magic_enum::enum_name(g_status)); + return g_status; } void RegisterLib(Core::Loader::SymbolsResolver* sym) { diff --git a/src/core/libraries/np/np_profile_dialog.h b/src/core/libraries/np/np_profile_dialog.h index ca1126d57..775549a47 100644 --- a/src/core/libraries/np/np_profile_dialog.h +++ b/src/core/libraries/np/np_profile_dialog.h @@ -1,8 +1,9 @@ -// SPDX-FileCopyrightText: Copyright 2025 shadPS4 Emulator Project +// SPDX-FileCopyrightText: Copyright 2025-2026 shadPS4 Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #pragma once +#include #include "common/types.h" namespace Core::Loader { @@ -11,14 +12,14 @@ class SymbolsResolver; namespace Libraries::Np::NpProfileDialog { -s32 PS4_SYSV_ABI sceNpProfileDialogOpen(); +Libraries::CommonDialog::Error PS4_SYSV_ABI sceNpProfileDialogOpen(); s32 PS4_SYSV_ABI sceNpProfileDialogClose(); s32 PS4_SYSV_ABI sceNpProfileDialogGetResult(); -s32 PS4_SYSV_ABI sceNpProfileDialogGetStatus(); -s32 PS4_SYSV_ABI sceNpProfileDialogInitialize(); +Libraries::CommonDialog::Status PS4_SYSV_ABI sceNpProfileDialogGetStatus(); +Libraries::CommonDialog::Error PS4_SYSV_ABI sceNpProfileDialogInitialize(); s32 PS4_SYSV_ABI sceNpProfileDialogOpenA(); -s32 PS4_SYSV_ABI sceNpProfileDialogTerminate(); -s32 PS4_SYSV_ABI sceNpProfileDialogUpdateStatus(); +Libraries::CommonDialog::Error PS4_SYSV_ABI sceNpProfileDialogTerminate(); +Libraries::CommonDialog::Status PS4_SYSV_ABI sceNpProfileDialogUpdateStatus(); void RegisterLib(Core::Loader::SymbolsResolver* sym); } // namespace Libraries::Np::NpProfileDialog \ No newline at end of file diff --git a/src/core/libraries/web_browser_dialog/webbrowserdialog.cpp b/src/core/libraries/web_browser_dialog/webbrowserdialog.cpp index 5844affa2..ce15aed46 100644 --- a/src/core/libraries/web_browser_dialog/webbrowserdialog.cpp +++ b/src/core/libraries/web_browser_dialog/webbrowserdialog.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project +// SPDX-FileCopyrightText: Copyright 2024-2026 shadPS4 Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #include "common/logging/log.h" @@ -32,12 +32,18 @@ Libraries::CommonDialog::Status PS4_SYSV_ABI sceWebBrowserDialogGetStatus() { } Libraries::CommonDialog::Error PS4_SYSV_ABI sceWebBrowserDialogInitialize() { - if (CommonDialog::g_isInitialized) { - LOG_INFO(Lib_WebBrowserDialog, "already initialized"); - return Libraries::CommonDialog::Error::ALREADY_SYSTEM_INITIALIZED; + if (!CommonDialog::g_isInitialized) { + return Libraries::CommonDialog::Error::NOT_SYSTEM_INITIALIZED; } - LOG_DEBUG(Lib_WebBrowserDialog, "initialized"); - CommonDialog::g_isInitialized = true; + if (g_status != Libraries::CommonDialog::Status::NONE) { + LOG_ERROR(Lib_WebBrowserDialog, "already initialized"); + return Libraries::CommonDialog::Error::ALREADY_INITIALIZED; + } + if (CommonDialog::g_isUsed) { + return Libraries::CommonDialog::Error::BUSY; + } + g_status = Libraries::CommonDialog::Status::INITIALIZED; + CommonDialog::g_isUsed = true; return Libraries::CommonDialog::Error::OK; } @@ -46,9 +52,14 @@ s32 PS4_SYSV_ABI sceWebBrowserDialogNavigate() { return ORBIS_OK; } -s32 PS4_SYSV_ABI sceWebBrowserDialogOpen() { +Libraries::CommonDialog::Error PS4_SYSV_ABI sceWebBrowserDialogOpen() { + if (g_status != Libraries::CommonDialog::Status::INITIALIZED && + g_status != Libraries::CommonDialog::Status::FINISHED) { + LOG_INFO(Lib_MsgDlg, "called without initialize"); + return Libraries::CommonDialog::Error::INVALID_STATE; + } LOG_ERROR(Lib_WebBrowserDialog, "(STUBBED) called"); - return ORBIS_OK; + return Libraries::CommonDialog::Error::OK; } s32 PS4_SYSV_ABI sceWebBrowserDialogOpenForPredeterminedContent() { diff --git a/src/core/libraries/web_browser_dialog/webbrowserdialog.h b/src/core/libraries/web_browser_dialog/webbrowserdialog.h index 3dad7e1e9..b836ba39c 100644 --- a/src/core/libraries/web_browser_dialog/webbrowserdialog.h +++ b/src/core/libraries/web_browser_dialog/webbrowserdialog.h @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project +// SPDX-FileCopyrightText: Copyright 2024-2026 shadPS4 Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #pragma once @@ -18,7 +18,7 @@ s32 PS4_SYSV_ABI sceWebBrowserDialogGetResult(); Libraries::CommonDialog::Status PS4_SYSV_ABI sceWebBrowserDialogGetStatus(); Libraries::CommonDialog::Error PS4_SYSV_ABI sceWebBrowserDialogInitialize(); s32 PS4_SYSV_ABI sceWebBrowserDialogNavigate(); -s32 PS4_SYSV_ABI sceWebBrowserDialogOpen(); +Libraries::CommonDialog::Error PS4_SYSV_ABI sceWebBrowserDialogOpen(); s32 PS4_SYSV_ABI sceWebBrowserDialogOpenForPredeterminedContent(); s32 PS4_SYSV_ABI sceWebBrowserDialogResetCookie(); s32 PS4_SYSV_ABI sceWebBrowserDialogSetCookie();