From e33c01131ec52de8bef9ca4f74fbd7b925ec67d7 Mon Sep 17 00:00:00 2001 From: scribam Date: Mon, 1 May 2017 20:35:49 +0200 Subject: [PATCH] Update sceNpSns (#2732) --- rpcs3/Emu/Cell/Modules/sceNpSns.cpp | 110 +++++++++++++++++++++++++--- rpcs3/Emu/Cell/Modules/sceNpSns.h | 65 ++++++++++------ 2 files changed, 144 insertions(+), 31 deletions(-) diff --git a/rpcs3/Emu/Cell/Modules/sceNpSns.cpp b/rpcs3/Emu/Cell/Modules/sceNpSns.cpp index 092539a53c..70526a5dce 100644 --- a/rpcs3/Emu/Cell/Modules/sceNpSns.cpp +++ b/rpcs3/Emu/Cell/Modules/sceNpSns.cpp @@ -1,47 +1,137 @@ #include "stdafx.h" +#include "Emu/IdManager.h" #include "Emu/Cell/PPUModule.h" #include "sceNpSns.h" logs::channel sceNpSns("sceNpSns", logs::level::notice); -s32 sceNpSnsFbInit(vm::ptr params) +template<> +void fmt_class_string::format(std::string& out, u64 arg) +{ + format_enum(out, arg, [](auto error) + { + switch (error) + { + STR_CASE(SCE_NP_SNS_ERROR_UNKNOWN); + STR_CASE(SCE_NP_SNS_ERROR_NOT_SIGN_IN); + STR_CASE(SCE_NP_SNS_ERROR_INVALID_ARGUMENT); + STR_CASE(SCE_NP_SNS_ERROR_OUT_OF_MEMORY); + STR_CASE(SCE_NP_SNS_ERROR_SHUTDOWN); + STR_CASE(SCE_NP_SNS_ERROR_BUSY); + STR_CASE(SCE_NP_SNS_FB_ERROR_ALREADY_INITIALIZED); + STR_CASE(SCE_NP_SNS_FB_ERROR_NOT_INITIALIZED); + STR_CASE(SCE_NP_SNS_FB_ERROR_EXCEEDS_MAX); + STR_CASE(SCE_NP_SNS_FB_ERROR_UNKNOWN_HANDLE); + STR_CASE(SCE_NP_SNS_FB_ERROR_ABORTED); + STR_CASE(SCE_NP_SNS_FB_ERROR_ALREADY_ABORTED); + STR_CASE(SCE_NP_SNS_FB_ERROR_CONFIG_DISABLED); + STR_CASE(SCE_NP_SNS_FB_ERROR_FBSERVER_ERROR_RESPONSE); + STR_CASE(SCE_NP_SNS_FB_ERROR_THROTTLE_CLOSED); + STR_CASE(SCE_NP_SNS_FB_ERROR_OPERATION_INTERVAL_VIOLATION); + STR_CASE(SCE_NP_SNS_FB_ERROR_UNLOADED_THROTTLE); + STR_CASE(SCE_NP_SNS_FB_ERROR_ACCESS_NOT_ALLOWED); + } + + return unknown; + }); +} + +error_code sceNpSnsFbInit(vm::cptr params) { sceNpSns.todo("sceNpSnsFbInit(params=*0x%x)", params); + if (!params) + { + return SCE_NP_SNS_ERROR_INVALID_ARGUMENT; + } + // TODO: Use the initialization parameters somewhere return CELL_OK; } -s32 sceNpSnsFbTerm() +error_code sceNpSnsFbTerm() { sceNpSns.warning("sceNpSnsFbTerm()"); return CELL_OK; } -s32 sceNpSnsFbCreateHandle() +error_code sceNpSnsFbCreateHandle(vm::ptr handle) { - UNIMPLEMENTED_FUNC(sceNpSns); + sceNpSns.warning("sceNpSnsFbCreateHandle(handle=*0x%x)", handle); + + if (!handle) + { + return SCE_NP_SNS_FB_ERROR_NOT_INITIALIZED; + } + + *handle = idm::make(); + return CELL_OK; } -s32 sceNpSnsFbDestroyHandle() +error_code sceNpSnsFbDestroyHandle(u32 handle) { - UNIMPLEMENTED_FUNC(sceNpSns); + sceNpSns.warning("sceNpSnsFbDestroyHandle(handle=%d)", handle); + + if (handle == SCE_NP_SNS_FB_INVALID_HANDLE || handle > SCE_NP_SNS_FB_HANDLE_SLOT_MAX) + { + return SCE_NP_SNS_ERROR_INVALID_ARGUMENT; + } + + const auto sfh = idm::get(handle); + + if (!sfh) + { + return SCE_NP_SNS_FB_ERROR_UNKNOWN_HANDLE; + } + + idm::remove(handle); + return CELL_OK; } -s32 sceNpSnsFbAbortHandle() +error_code sceNpSnsFbAbortHandle(u32 handle) { - UNIMPLEMENTED_FUNC(sceNpSns); + sceNpSns.todo("sceNpSnsFbAbortHandle(handle=%d)", handle); + + if (handle == SCE_NP_SNS_FB_INVALID_HANDLE || handle > SCE_NP_SNS_FB_HANDLE_SLOT_MAX) + { + return SCE_NP_SNS_ERROR_INVALID_ARGUMENT; + } + + const auto sfh = idm::get(handle); + + if (!sfh) + { + return SCE_NP_SNS_FB_ERROR_UNKNOWN_HANDLE; + } + + // TODO + return CELL_OK; } -s32 sceNpSnsFbGetAccessToken() +error_code sceNpSnsFbGetAccessToken(u32 handle, vm::cptr param, vm::ptr result) { - UNIMPLEMENTED_FUNC(sceNpSns); + sceNpSns.todo("sceNpSnsFbGetAccessToken(handle=%d, param=*0x%x, result=*0x%x)", handle, param, result); + + if (handle == SCE_NP_SNS_FB_INVALID_HANDLE || handle > SCE_NP_SNS_FB_HANDLE_SLOT_MAX || !param || !result || !param->fb_app_id) + { + return SCE_NP_SNS_ERROR_INVALID_ARGUMENT; + } + + const auto sfh = idm::get(handle); + + if (!sfh) + { + return SCE_NP_SNS_FB_ERROR_UNKNOWN_HANDLE; + } + + // TODO + return CELL_OK; } diff --git a/rpcs3/Emu/Cell/Modules/sceNpSns.h b/rpcs3/Emu/Cell/Modules/sceNpSns.h index b8510669d0..84c924bb92 100644 --- a/rpcs3/Emu/Cell/Modules/sceNpSns.h +++ b/rpcs3/Emu/Cell/Modules/sceNpSns.h @@ -3,38 +3,61 @@ namespace vm { using namespace ps3; } // Return codes -enum +enum sceNpSnsError : u32 { - SCE_NP_SNS_ERROR_UNKNOWN = 0x80024501, - SCE_NP_SNS_ERROR_NOT_SIGN_IN = 0x80024502, - SCE_NP_SNS_ERROR_INVALID_ARGUMENT = 0x80024503, - SCE_NP_SNS_ERROR_OUT_OF_MEMORY = 0x80024504, - SCE_NP_SNS_ERROR_SHUTDOWN = 0x80024505, - SCE_NP_SNS_ERROR_BUSY = 0x80024506, - SCE_NP_SNS_FB_ERROR_ALREADY_INITIALIZED = 0x80024511, - SCE_NP_SNS_FB_ERROR_NOT_INITIALIZED = 0x80024512, - SCE_NP_SNS_FB_ERROR_EXCEEDS_MAX = 0x80024513, - SCE_NP_SNS_FB_ERROR_UNKNOWN_HANDLE = 0x80024514, - SCE_NP_SNS_FB_ERROR_ABORTED = 0x80024515, - SCE_NP_SNS_FB_ERROR_ALREADY_ABORTED = 0x80024516, - SCE_NP_SNS_FB_ERROR_CONFIG_DISABLED = 0x80024517, - SCE_NP_SNS_FB_ERROR_FBSERVER_ERROR_RESPONSE = 0x80024518, - SCE_NP_SNS_FB_ERROR_THROTTLE_CLOSED = 0x80024519, + SCE_NP_SNS_ERROR_UNKNOWN = 0x80024501, + SCE_NP_SNS_ERROR_NOT_SIGN_IN = 0x80024502, + SCE_NP_SNS_ERROR_INVALID_ARGUMENT = 0x80024503, + SCE_NP_SNS_ERROR_OUT_OF_MEMORY = 0x80024504, + SCE_NP_SNS_ERROR_SHUTDOWN = 0x80024505, + SCE_NP_SNS_ERROR_BUSY = 0x80024506, + SCE_NP_SNS_FB_ERROR_ALREADY_INITIALIZED = 0x80024511, + SCE_NP_SNS_FB_ERROR_NOT_INITIALIZED = 0x80024512, + SCE_NP_SNS_FB_ERROR_EXCEEDS_MAX = 0x80024513, + SCE_NP_SNS_FB_ERROR_UNKNOWN_HANDLE = 0x80024514, + SCE_NP_SNS_FB_ERROR_ABORTED = 0x80024515, + SCE_NP_SNS_FB_ERROR_ALREADY_ABORTED = 0x80024516, + SCE_NP_SNS_FB_ERROR_CONFIG_DISABLED = 0x80024517, + SCE_NP_SNS_FB_ERROR_FBSERVER_ERROR_RESPONSE = 0x80024518, + SCE_NP_SNS_FB_ERROR_THROTTLE_CLOSED = 0x80024519, SCE_NP_SNS_FB_ERROR_OPERATION_INTERVAL_VIOLATION = 0x8002451a, - SCE_NP_SNS_FB_ERROR_UNLOADED_THROTTLE = 0x8002451b, - SCE_NP_SNS_FB_ERROR_ACCESS_NOT_ALLOWED = 0x8002451c, + SCE_NP_SNS_FB_ERROR_UNLOADED_THROTTLE = 0x8002451b, + SCE_NP_SNS_FB_ERROR_ACCESS_NOT_ALLOWED = 0x8002451c, }; // Constants for SNS functions enum { - SCE_NP_SNS_FB_INVALID_HANDLE = 0, - SCE_NP_SNS_FB_HANDLE_SLOT_MAX = 4, + SCE_NP_SNS_FB_INVALID_HANDLE = 0, + SCE_NP_SNS_FB_HANDLE_SLOT_MAX = 4, + SCE_NP_SNS_FB_PERMISSIONS_LENGTH_MAX = 255, + SCE_NP_SNS_FB_ACCESS_TOKEN_LENGTH_MAX = 255 }; -// Intilization parameters for functionalities coordinated with Facebook +struct sns_fb_handle_t +{ + static const u32 id_base = 1; + static const u32 id_step = 1; + static const u32 id_count = SCE_NP_SNS_FB_HANDLE_SLOT_MAX + 1; + static const u32 invalid = SCE_NP_SNS_FB_INVALID_HANDLE; +}; + +// Initialization parameters for functionalities coordinated with Facebook struct SceNpSnsFbInitParams { vm::bptr pool; be_t poolSize; }; + +struct SceNpSnsFbAccessTokenParam +{ + be_t fb_app_id; + char permissions[SCE_NP_SNS_FB_PERMISSIONS_LENGTH_MAX + 1]; + be_t options; +}; + +struct SceNpSnsFbAccessTokenResult +{ + be_t expiration; + char access_token[SCE_NP_SNS_FB_ACCESS_TOKEN_LENGTH_MAX + 1]; +};