Skip to content

Commit e33c011

Browse files
scribamNekotekina
authored andcommitted
Update sceNpSns (RPCS3#2732)
1 parent 2845617 commit e33c011

File tree

2 files changed

+144
-31
lines changed

2 files changed

+144
-31
lines changed

rpcs3/Emu/Cell/Modules/sceNpSns.cpp

+100-10
Original file line numberDiff line numberDiff line change
@@ -1,47 +1,137 @@
11
#include "stdafx.h"
2+
#include "Emu/IdManager.h"
23
#include "Emu/Cell/PPUModule.h"
34

45
#include "sceNpSns.h"
56

67
logs::channel sceNpSns("sceNpSns", logs::level::notice);
78

8-
s32 sceNpSnsFbInit(vm::ptr<const SceNpSnsFbInitParams> params)
9+
template<>
10+
void fmt_class_string<sceNpSnsError>::format(std::string& out, u64 arg)
11+
{
12+
format_enum(out, arg, [](auto error)
13+
{
14+
switch (error)
15+
{
16+
STR_CASE(SCE_NP_SNS_ERROR_UNKNOWN);
17+
STR_CASE(SCE_NP_SNS_ERROR_NOT_SIGN_IN);
18+
STR_CASE(SCE_NP_SNS_ERROR_INVALID_ARGUMENT);
19+
STR_CASE(SCE_NP_SNS_ERROR_OUT_OF_MEMORY);
20+
STR_CASE(SCE_NP_SNS_ERROR_SHUTDOWN);
21+
STR_CASE(SCE_NP_SNS_ERROR_BUSY);
22+
STR_CASE(SCE_NP_SNS_FB_ERROR_ALREADY_INITIALIZED);
23+
STR_CASE(SCE_NP_SNS_FB_ERROR_NOT_INITIALIZED);
24+
STR_CASE(SCE_NP_SNS_FB_ERROR_EXCEEDS_MAX);
25+
STR_CASE(SCE_NP_SNS_FB_ERROR_UNKNOWN_HANDLE);
26+
STR_CASE(SCE_NP_SNS_FB_ERROR_ABORTED);
27+
STR_CASE(SCE_NP_SNS_FB_ERROR_ALREADY_ABORTED);
28+
STR_CASE(SCE_NP_SNS_FB_ERROR_CONFIG_DISABLED);
29+
STR_CASE(SCE_NP_SNS_FB_ERROR_FBSERVER_ERROR_RESPONSE);
30+
STR_CASE(SCE_NP_SNS_FB_ERROR_THROTTLE_CLOSED);
31+
STR_CASE(SCE_NP_SNS_FB_ERROR_OPERATION_INTERVAL_VIOLATION);
32+
STR_CASE(SCE_NP_SNS_FB_ERROR_UNLOADED_THROTTLE);
33+
STR_CASE(SCE_NP_SNS_FB_ERROR_ACCESS_NOT_ALLOWED);
34+
}
35+
36+
return unknown;
37+
});
38+
}
39+
40+
error_code sceNpSnsFbInit(vm::cptr<SceNpSnsFbInitParams> params)
941
{
1042
sceNpSns.todo("sceNpSnsFbInit(params=*0x%x)", params);
1143

44+
if (!params)
45+
{
46+
return SCE_NP_SNS_ERROR_INVALID_ARGUMENT;
47+
}
48+
1249
// TODO: Use the initialization parameters somewhere
1350

1451
return CELL_OK;
1552
}
1653

17-
s32 sceNpSnsFbTerm()
54+
error_code sceNpSnsFbTerm()
1855
{
1956
sceNpSns.warning("sceNpSnsFbTerm()");
2057

2158
return CELL_OK;
2259
}
2360

24-
s32 sceNpSnsFbCreateHandle()
61+
error_code sceNpSnsFbCreateHandle(vm::ptr<u32> handle)
2562
{
26-
UNIMPLEMENTED_FUNC(sceNpSns);
63+
sceNpSns.warning("sceNpSnsFbCreateHandle(handle=*0x%x)", handle);
64+
65+
if (!handle)
66+
{
67+
return SCE_NP_SNS_FB_ERROR_NOT_INITIALIZED;
68+
}
69+
70+
*handle = idm::make<sns_fb_handle_t>();
71+
2772
return CELL_OK;
2873
}
2974

30-
s32 sceNpSnsFbDestroyHandle()
75+
error_code sceNpSnsFbDestroyHandle(u32 handle)
3176
{
32-
UNIMPLEMENTED_FUNC(sceNpSns);
77+
sceNpSns.warning("sceNpSnsFbDestroyHandle(handle=%d)", handle);
78+
79+
if (handle == SCE_NP_SNS_FB_INVALID_HANDLE || handle > SCE_NP_SNS_FB_HANDLE_SLOT_MAX)
80+
{
81+
return SCE_NP_SNS_ERROR_INVALID_ARGUMENT;
82+
}
83+
84+
const auto sfh = idm::get<sns_fb_handle_t>(handle);
85+
86+
if (!sfh)
87+
{
88+
return SCE_NP_SNS_FB_ERROR_UNKNOWN_HANDLE;
89+
}
90+
91+
idm::remove<sns_fb_handle_t>(handle);
92+
3393
return CELL_OK;
3494
}
3595

36-
s32 sceNpSnsFbAbortHandle()
96+
error_code sceNpSnsFbAbortHandle(u32 handle)
3797
{
38-
UNIMPLEMENTED_FUNC(sceNpSns);
98+
sceNpSns.todo("sceNpSnsFbAbortHandle(handle=%d)", handle);
99+
100+
if (handle == SCE_NP_SNS_FB_INVALID_HANDLE || handle > SCE_NP_SNS_FB_HANDLE_SLOT_MAX)
101+
{
102+
return SCE_NP_SNS_ERROR_INVALID_ARGUMENT;
103+
}
104+
105+
const auto sfh = idm::get<sns_fb_handle_t>(handle);
106+
107+
if (!sfh)
108+
{
109+
return SCE_NP_SNS_FB_ERROR_UNKNOWN_HANDLE;
110+
}
111+
112+
// TODO
113+
39114
return CELL_OK;
40115
}
41116

42-
s32 sceNpSnsFbGetAccessToken()
117+
error_code sceNpSnsFbGetAccessToken(u32 handle, vm::cptr<SceNpSnsFbAccessTokenParam> param, vm::ptr<SceNpSnsFbAccessTokenResult> result)
43118
{
44-
UNIMPLEMENTED_FUNC(sceNpSns);
119+
sceNpSns.todo("sceNpSnsFbGetAccessToken(handle=%d, param=*0x%x, result=*0x%x)", handle, param, result);
120+
121+
if (handle == SCE_NP_SNS_FB_INVALID_HANDLE || handle > SCE_NP_SNS_FB_HANDLE_SLOT_MAX || !param || !result || !param->fb_app_id)
122+
{
123+
return SCE_NP_SNS_ERROR_INVALID_ARGUMENT;
124+
}
125+
126+
const auto sfh = idm::get<sns_fb_handle_t>(handle);
127+
128+
if (!sfh)
129+
{
130+
return SCE_NP_SNS_FB_ERROR_UNKNOWN_HANDLE;
131+
}
132+
133+
// TODO
134+
45135
return CELL_OK;
46136
}
47137

rpcs3/Emu/Cell/Modules/sceNpSns.h

+44-21
Original file line numberDiff line numberDiff line change
@@ -3,38 +3,61 @@
33
namespace vm { using namespace ps3; }
44

55
// Return codes
6-
enum
6+
enum sceNpSnsError : u32
77
{
8-
SCE_NP_SNS_ERROR_UNKNOWN = 0x80024501,
9-
SCE_NP_SNS_ERROR_NOT_SIGN_IN = 0x80024502,
10-
SCE_NP_SNS_ERROR_INVALID_ARGUMENT = 0x80024503,
11-
SCE_NP_SNS_ERROR_OUT_OF_MEMORY = 0x80024504,
12-
SCE_NP_SNS_ERROR_SHUTDOWN = 0x80024505,
13-
SCE_NP_SNS_ERROR_BUSY = 0x80024506,
14-
SCE_NP_SNS_FB_ERROR_ALREADY_INITIALIZED = 0x80024511,
15-
SCE_NP_SNS_FB_ERROR_NOT_INITIALIZED = 0x80024512,
16-
SCE_NP_SNS_FB_ERROR_EXCEEDS_MAX = 0x80024513,
17-
SCE_NP_SNS_FB_ERROR_UNKNOWN_HANDLE = 0x80024514,
18-
SCE_NP_SNS_FB_ERROR_ABORTED = 0x80024515,
19-
SCE_NP_SNS_FB_ERROR_ALREADY_ABORTED = 0x80024516,
20-
SCE_NP_SNS_FB_ERROR_CONFIG_DISABLED = 0x80024517,
21-
SCE_NP_SNS_FB_ERROR_FBSERVER_ERROR_RESPONSE = 0x80024518,
22-
SCE_NP_SNS_FB_ERROR_THROTTLE_CLOSED = 0x80024519,
8+
SCE_NP_SNS_ERROR_UNKNOWN = 0x80024501,
9+
SCE_NP_SNS_ERROR_NOT_SIGN_IN = 0x80024502,
10+
SCE_NP_SNS_ERROR_INVALID_ARGUMENT = 0x80024503,
11+
SCE_NP_SNS_ERROR_OUT_OF_MEMORY = 0x80024504,
12+
SCE_NP_SNS_ERROR_SHUTDOWN = 0x80024505,
13+
SCE_NP_SNS_ERROR_BUSY = 0x80024506,
14+
SCE_NP_SNS_FB_ERROR_ALREADY_INITIALIZED = 0x80024511,
15+
SCE_NP_SNS_FB_ERROR_NOT_INITIALIZED = 0x80024512,
16+
SCE_NP_SNS_FB_ERROR_EXCEEDS_MAX = 0x80024513,
17+
SCE_NP_SNS_FB_ERROR_UNKNOWN_HANDLE = 0x80024514,
18+
SCE_NP_SNS_FB_ERROR_ABORTED = 0x80024515,
19+
SCE_NP_SNS_FB_ERROR_ALREADY_ABORTED = 0x80024516,
20+
SCE_NP_SNS_FB_ERROR_CONFIG_DISABLED = 0x80024517,
21+
SCE_NP_SNS_FB_ERROR_FBSERVER_ERROR_RESPONSE = 0x80024518,
22+
SCE_NP_SNS_FB_ERROR_THROTTLE_CLOSED = 0x80024519,
2323
SCE_NP_SNS_FB_ERROR_OPERATION_INTERVAL_VIOLATION = 0x8002451a,
24-
SCE_NP_SNS_FB_ERROR_UNLOADED_THROTTLE = 0x8002451b,
25-
SCE_NP_SNS_FB_ERROR_ACCESS_NOT_ALLOWED = 0x8002451c,
24+
SCE_NP_SNS_FB_ERROR_UNLOADED_THROTTLE = 0x8002451b,
25+
SCE_NP_SNS_FB_ERROR_ACCESS_NOT_ALLOWED = 0x8002451c,
2626
};
2727

2828
// Constants for SNS functions
2929
enum
3030
{
31-
SCE_NP_SNS_FB_INVALID_HANDLE = 0,
32-
SCE_NP_SNS_FB_HANDLE_SLOT_MAX = 4,
31+
SCE_NP_SNS_FB_INVALID_HANDLE = 0,
32+
SCE_NP_SNS_FB_HANDLE_SLOT_MAX = 4,
33+
SCE_NP_SNS_FB_PERMISSIONS_LENGTH_MAX = 255,
34+
SCE_NP_SNS_FB_ACCESS_TOKEN_LENGTH_MAX = 255
3335
};
3436

35-
// Intilization parameters for functionalities coordinated with Facebook
37+
struct sns_fb_handle_t
38+
{
39+
static const u32 id_base = 1;
40+
static const u32 id_step = 1;
41+
static const u32 id_count = SCE_NP_SNS_FB_HANDLE_SLOT_MAX + 1;
42+
static const u32 invalid = SCE_NP_SNS_FB_INVALID_HANDLE;
43+
};
44+
45+
// Initialization parameters for functionalities coordinated with Facebook
3646
struct SceNpSnsFbInitParams
3747
{
3848
vm::bptr<void> pool;
3949
be_t<u32> poolSize;
4050
};
51+
52+
struct SceNpSnsFbAccessTokenParam
53+
{
54+
be_t<u64> fb_app_id;
55+
char permissions[SCE_NP_SNS_FB_PERMISSIONS_LENGTH_MAX + 1];
56+
be_t<u32> options;
57+
};
58+
59+
struct SceNpSnsFbAccessTokenResult
60+
{
61+
be_t<u64> expiration;
62+
char access_token[SCE_NP_SNS_FB_ACCESS_TOKEN_LENGTH_MAX + 1];
63+
};

0 commit comments

Comments
 (0)