1 // Copyright 2001-2018 Crytek GmbH / Crytek Group. All rights reserved.
7 #include "CryPSN2Lobby.h"
11 #include <libsysmodule.h>
12 #include <CryString/StringUtils.h>
13 #include <invitation_dialog.h>
14 #include <np_profile_dialog.h>
15 #include <np_friendlist_dialog.h>
16 #include <np_commerce_dialog.h>
18 #include "CryPSN2WebApi_Presence.h"
19 #include "CryPSN2WebApi_RecentPlayers.h"
20 #include "CryPSN2WebApi_FriendsList.h"
21 #include "CryPSN2WebApi_ActivityFeed.h"
22 #include "CryPSN2WebApi_Store.h"
24 #define LOBBYUI_PARAM_NPID_LIST 0 //-- mem
25 #define LOBBYUI_PARAM_ONLINEID_LIST 0 //-- mem
26 #define LOBBYUI_PARAM_SESSION_ID 1 //-- mem
28 #define LOBBYUI_PARAM_NUM_NPIDS 0 //-- num
30 #define LOBBYUI_PARAM_RICHPRESENCE 0 //-- ptr and id
32 #define LOBBYUI_PARAM_ADDRECENTPLAYERS 0 //-- ptr and id
34 #define LOBBYUI_PARAM_ADDACTIVITYFEED 0 //-- ptr and id
36 #define LOBBYUI_PARAM_GETCONSUMABLEOFFERS_REQUEST 0 //-- ptr and id
37 #define LOBBYUI_PARAM_GETCONSUMABLEOFFERS_RESULTS 1 //-- ptr and id
39 #define LOBBYUI_PARAM_GETCONSUMABLEASSETS_REQUEST 0 //-- id only
40 #define LOBBYUI_PARAM_GETCONSUMABLEASSETS_RESULTS 1 //-- ptr and id
42 #define LOBBYUI_PARAM_CONSUMEASSET_REQUEST 0 //-- ptr and id
43 #define LOBBYUI_PARAM_CONSUMEASSET_RESULTS 1 //-- number
45 #define LOBBYUI_PARAM_SHOWDOWNLOADOFFER_ID 0 //-- ptr
47 void CCryPSNLobbyUI::SupportCallback(ECryPSNSupportCallbackEvent ecb
, SCryPSNSupportCallbackEventData
& data
, void* pArg
)
49 CCryPSNLobbyUI
* _this
= static_cast<CCryPSNLobbyUI
*>(pArg
);
55 // A WebAPI request completed. Chances are it was triggered by a task in LobbyUI.
56 // Check to see if any running task matches the WebApiJobId.
57 for (uint32 i
= 0; i
< MAX_LOBBYUI_TASKS
; i
++)
59 STask
* pTask
= &_this
->m_task
[i
];
61 if (pTask
->used
&& pTask
->running
)
63 switch (pTask
->subTask
)
65 case eST_WaitingForRichPresenceCallback
:
67 // running set rich presence task
68 if (data
.m_webApiEvent
.m_id
== pTask
->paramsNum
[LOBBYUI_PARAM_RICHPRESENCE
])
70 // match! Update the task error state and stop the task running
71 if (data
.m_webApiEvent
.m_error
!= PSN_OK
)
73 // some kind of error occurred, but we don't care for rich presence
74 _this
->UpdateTaskError(i
, eCLE_Success
);
76 _this
->StopTaskRunning(i
);
77 data
.m_webApiEvent
.m_returnFlags
|= SCryPSNSupportCallbackEventData::SWebApiEvent::WEBAPI_EVENT_HANDLED
;
81 case eST_WaitingForAddRecentPlayersCallback
:
83 // running add recent players task
84 if (data
.m_webApiEvent
.m_id
== pTask
->paramsNum
[LOBBYUI_PARAM_ADDRECENTPLAYERS
])
86 // match! Update the task error state and stop the task running
87 if (data
.m_webApiEvent
.m_error
!= PSN_OK
)
89 // some kind of error occurred.
90 _this
->UpdateTaskError(i
, eCLE_InternalError
);
92 _this
->StopTaskRunning(i
);
93 data
.m_webApiEvent
.m_returnFlags
|= SCryPSNSupportCallbackEventData::SWebApiEvent::WEBAPI_EVENT_HANDLED
;
97 case eST_WaitingForAddActivityFeedCallback
:
99 // running add activity feed task
100 if (data
.m_webApiEvent
.m_id
== pTask
->paramsNum
[LOBBYUI_PARAM_ADDACTIVITYFEED
])
102 // match! Update the task error state and stop the task running
103 if (data
.m_webApiEvent
.m_error
!= PSN_OK
)
105 // some kind of error occurred.
106 _this
->UpdateTaskError(i
, eCLE_InternalError
);
108 _this
->StopTaskRunning(i
);
109 data
.m_webApiEvent
.m_returnFlags
|= SCryPSNSupportCallbackEventData::SWebApiEvent::WEBAPI_EVENT_HANDLED
;
113 case eST_WaitingForConsumableOffersCallback
:
115 if (data
.m_webApiEvent
.m_id
== pTask
->paramsNum
[LOBBYUI_PARAM_GETCONSUMABLEOFFERS_REQUEST
])
117 // match! Update the task error state and stop the task running
118 if (data
.m_webApiEvent
.m_error
== PSN_OK
)
120 _this
->EventWebApiGetConsumableOffers(i
, data
);
124 // some kind of error occurred.
125 _this
->UpdateTaskError(i
, eCLE_InternalError
);
127 _this
->StopTaskRunning(i
);
128 data
.m_webApiEvent
.m_returnFlags
|= SCryPSNSupportCallbackEventData::SWebApiEvent::WEBAPI_EVENT_HANDLED
;
132 case eST_WaitingForConsumableAssetsCallback
:
134 if (data
.m_webApiEvent
.m_id
== pTask
->paramsNum
[LOBBYUI_PARAM_GETCONSUMABLEASSETS_REQUEST
])
136 // match! Update the task error state and stop the task running
137 if (data
.m_webApiEvent
.m_error
== PSN_OK
)
139 _this
->EventWebApiGetConsumableAssets(i
, data
);
143 // some kind of error occurred.
144 _this
->UpdateTaskError(i
, eCLE_InternalError
);
146 _this
->StopTaskRunning(i
);
147 data
.m_webApiEvent
.m_returnFlags
|= SCryPSNSupportCallbackEventData::SWebApiEvent::WEBAPI_EVENT_HANDLED
;
151 case eST_WaitingForConsumeAssetCallback
:
153 if (data
.m_webApiEvent
.m_id
== pTask
->paramsNum
[LOBBYUI_PARAM_CONSUMEASSET_REQUEST
])
155 // match! Update the task error state and stop the task running
156 if (data
.m_webApiEvent
.m_error
== PSN_OK
)
158 _this
->EventWebApiConsumeAsset(i
, data
);
162 // some kind of error occurred.
163 _this
->UpdateTaskError(i
, eCLE_InternalError
);
165 _this
->StopTaskRunning(i
);
166 data
.m_webApiEvent
.m_returnFlags
|= SCryPSNSupportCallbackEventData::SWebApiEvent::WEBAPI_EVENT_HANDLED
;
178 for (uint32 i
= 0; i
< MAX_LOBBYUI_TASKS
; i
++)
180 STask
* pTask
= &_this
->m_task
[i
];
182 if (pTask
->used
&& pTask
->running
)
184 _this
->UpdateTaskError(i
, MapSupportErrorToLobbyError(data
.m_errorEvent
.m_error
));
192 CCryPSNLobbyUI::CCryPSNLobbyUI(CCryLobby
* pLobby
, CCryLobbyService
* pService
, CCryPSNSupport
* pSupport
) : CCryLobbyUI(pLobby
, pService
)
194 m_pPSNSupport
= pSupport
;
196 // Make the CCryLobbyUI base pointers point to our data so we can use the common code in CCryLobbyUI
197 for (uint32 i
= 0; i
< MAX_LOBBYUI_TASKS
; i
++)
199 CCryLobbyUI::m_pTask
[i
] = &m_task
[i
];
203 // TODO: These are for internal tests only during development! Need to be removed later!
204 void TestWebAPIFeature(IConsoleCmdArgs
* pArgs
)
206 if (pArgs
->GetArgCount() == 2)
208 INetwork
* pNetwork
= gEnv
->pNetwork
;
209 ICryLobbyUI
* pLobbyUI
= NULL
;
210 if (pNetwork
!= NULL
)
212 ICryLobby
* pLobby
= pNetwork
->GetLobby();
215 ICryLobbyService
* pLobbyService
= pLobby
->GetLobbyService(eCLS_Online
);
216 if (pLobbyService
!= NULL
)
218 pLobbyUI
= pLobbyService
->GetLobbyUI();
224 if (!strcmp(pArgs
->GetArg(1), "presence"))
226 // send idle presence
227 SCryLobbyUserData data
;
229 data
.m_type
= eCLUDT_Int32
;
231 ECryLobbyError error
= pLobbyUI
->SetRichPresence(0, &data
, 1, NULL
, NULL
, NULL
);
233 else if (!strcmp(pArgs
->GetArg(1), "activity"))
235 ECryLobbyError error
= pLobbyUI
->AddActivityFeed(0, NULL
, NULL
, NULL
);
237 else if (!strcmp(pArgs
->GetArg(1), "friendslist"))
239 ((CCryPSNLobbyService
*)(gEnv
->pNetwork
->GetLobby()->GetLobbyService(eCLS_Online
)))->GetFriends()->FriendsGetFriendsList(0, 0, 20, NULL
, NULL
, NULL
);
241 else if (!strcmp(pArgs
->GetArg(1), "showfriends"))
243 ECryLobbyError error
= pLobbyUI
->ShowFriends(0, NULL
, NULL
, NULL
);
245 else if (!strcmp(pArgs
->GetArg(1), "recentplayers"))
247 CryUserID id
= new SCryPSNUserID
;
248 cry_sprintf(((SCryPSNUserID
*)id
.get())->npId
.handle
.data
, "CryDerpy");
249 ECryLobbyError error
= pLobbyUI
->AddRecentPlayers(0, &id
, 1, "TestRecentPlayers", NULL
, NULL
, NULL
);
251 else if (!strcmp(pArgs
->GetArg(1), "gamercard"))
253 CryUserID id
= new SCryPSNUserID
;
254 cry_sprintf(((SCryPSNUserID
*)id
.get())->npId
.handle
.data
, "CryDerpy");
255 ECryLobbyError error
= pLobbyUI
->ShowGamerCard(0, id
, NULL
, NULL
, NULL
);
257 else if (!strcmp(pArgs
->GetArg(1), "storeproducts"))
259 TStoreOfferID offers
[2];
260 offers
[0].productId
= "500CUK0000000000";
261 offers
[1].productId
= "100CUK0000000000";
262 ECryLobbyError error
= pLobbyUI
->GetConsumableOffers(0, NULL
, offers
, 2, NULL
, NULL
);
264 else if (!strcmp(pArgs
->GetArg(1), "downloadoffer"))
267 offer
.productId
= "500CUK0000000000";
268 offer
.skuId
= "E003";
269 ECryLobbyError error
= pLobbyUI
->ShowDownloadOffer(0, offer
, NULL
, NULL
, NULL
);
271 else if (!strcmp(pArgs
->GetArg(1), "storeassets"))
273 ECryLobbyError error
= pLobbyUI
->GetConsumableAssets(0, NULL
, NULL
, NULL
);
275 else if (!strcmp(pArgs
->GetArg(1), "consumeasset"))
277 TStoreAssetID assetId
= "500CUK";
279 ECryLobbyError error
= pLobbyUI
->ConsumeAsset(0, assetId
, quantity
, NULL
, NULL
, NULL
);
285 ECryLobbyError
CCryPSNLobbyUI::Initialise()
287 ECryLobbyError error
= CCryLobbyUI::Initialise();
288 if (error
== eCLE_Success
)
292 ret
= sceSysmoduleLoadModule(SCE_SYSMODULE_NP_PROFILE_DIALOG
);
295 NetLog("sceSysmoduleLoadModule(SCE_SYSMODULE_NP_PROFILE_DIALOG) failed. ret = 0x%x\n", ret
);
296 return eCLE_InternalError
;
298 ret
= sceSysmoduleLoadModule(SCE_SYSMODULE_NP_FRIEND_LIST_DIALOG
);
301 NetLog("sceSysmoduleLoadModule(SCE_SYSMODULE_NP_FRIEND_LIST_DIALOG) failed. ret = 0x%x\n", ret
);
302 return eCLE_InternalError
;
304 ret
= sceSysmoduleLoadModule(SCE_SYSMODULE_INVITATION_DIALOG
);
307 NetLog("sceSysmoduleLoadModule(SCE_SYSMODULE_INVITATION_DIALOG) failed. ret = 0x%x\n", ret
);
308 return eCLE_InternalError
;
310 ret
= sceSysmoduleLoadModule(SCE_SYSMODULE_NP_COMMERCE
);
313 NetLog("sceSysmoduleLoadModule(SCE_SYSMODULE_NP_COMMERCE) failed. ret = 0x%x\n", ret
);
314 return eCLE_InternalError
;
317 ret
= sceCommonDialogInitialize();
320 NetLog("sceCommonDialogInitialize failed. ret = 0x%x\n", ret
);
321 return eCLE_InternalError
;
325 REGISTER_COMMAND("webapi", TestWebAPIFeature
, VF_CHEAT
, "Debug test a PSN WebAPI feature");
330 ECryLobbyError
CCryPSNLobbyUI::Terminate()
332 sceInvitationDialogTerminate();
333 sceNpFriendListDialogTerminate();
334 sceNpProfileDialogTerminate();
335 sceNpCommerceDialogTerminate();
337 int ret
= sceSysmoduleUnloadModule(SCE_SYSMODULE_NP_COMMERCE
);
340 NetLog("sceSysmoduleUnloadModule(SCE_SYSMODULE_NP_COMMERCE) failed. ret = 0x%x\n", ret
);
342 ret
= sceSysmoduleUnloadModule(SCE_SYSMODULE_INVITATION_DIALOG
);
345 NetLog("sceSysmoduleUnloadModule(SCE_SYSMODULE_INVITATION_DIALOG) failed. ret = 0x%x\n", ret
);
347 ret
= sceSysmoduleUnloadModule(SCE_SYSMODULE_NP_FRIEND_LIST_DIALOG
);
350 NetLog("sceSysmoduleUnloadModule(SCE_SYSMODULE_NP_FRIEND_LIST_DIALOG) failed. ret = 0x%x\n", ret
);
352 ret
= sceSysmoduleUnloadModule(SCE_SYSMODULE_NP_PROFILE_DIALOG
);
355 NetLog("sceSysmoduleUnloadModule(SCE_SYSMODULE_NP_PROFILE_DIALOG) failed. ret = 0x%x\n", ret
);
358 return CCryLobbyUI::Terminate();
361 void CCryPSNLobbyUI::Tick(CTimeValue tv
)
363 for (uint32 i
= 0; i
< MAX_LOBBYUI_TASKS
; i
++)
365 STask
* pTask
= &m_task
[i
];
367 if (pTask
->used
&& pTask
->running
)
369 switch (pTask
->subTask
)
371 case eT_ShowGamerCard
:
372 TickShowGamerCard(i
);
374 case eT_ShowGameInvite
:
375 TickShowGameInvite(i
);
380 case eT_SetRichPresence
:
381 TickSetRichPresence(i
);
383 case eT_AddRecentPlayers
:
384 TickAddRecentPlayers(i
);
386 case eT_AddActivityFeed
:
387 TickAddActivityFeed(i
);
389 case eT_GetConsumableOffers
:
390 TickGetConsumableOffers(i
);
392 case eT_GetConsumableAssets
:
393 TickGetConsumableAssets(i
);
395 case eT_ConsumeAsset
:
398 case eT_ShowDownloadOffer
:
399 TickShowDownloadOffer(i
);
406 ECryLobbyError
CCryPSNLobbyUI::StartTask(ETask etask
, bool startRunning
, uint32 user
, CryLobbyUITaskID
* pUITaskID
, CryLobbyTaskID
* pLTaskID
, CryLobbySessionHandle h
, void* pCb
, void* pCbArg
)
408 CryLobbyUITaskID tmpUITaskID
;
409 CryLobbyUITaskID
* pUseUITaskID
= pUITaskID
? pUITaskID
: &tmpUITaskID
;
410 ECryLobbyError error
= CCryLobbyUI::StartTask(etask
, startRunning
, pUseUITaskID
, pLTaskID
, h
, pCb
, pCbArg
);
414 void CCryPSNLobbyUI::StartSubTask(ETask etask
, CryLobbyUITaskID sTaskID
)
416 STask
* pTask
= &m_task
[sTaskID
];
418 pTask
->subTask
= etask
;
421 void CCryPSNLobbyUI::StartTaskRunning(CryLobbyUITaskID uiTaskID
)
425 STask
* pTask
= &m_task
[uiTaskID
];
429 pTask
->running
= true;
431 switch (pTask
->startedTask
)
433 case eT_ShowGamerCard
:
434 StartShowGamerCard(uiTaskID
);
437 case eT_ShowGameInvite
:
438 StartShowGameInvite(uiTaskID
);
442 StartShowFriends(uiTaskID
);
445 case eT_ShowFriendRequest
:
446 StartShowFriendRequest(uiTaskID
);
449 case eT_SetRichPresence
:
450 StartSetRichPresence(uiTaskID
);
453 case eT_ShowOnlineRetailBrowser
:
454 StartShowOnlineRetailBrowser(uiTaskID
);
457 case eT_JoinFriendsGame
:
458 StartJoinFriendGame(uiTaskID
);
461 case eT_ShowMessageList
:
462 StartShowMessageList(uiTaskID
);
465 case eT_AddRecentPlayers
:
466 StartAddRecentPlayers(uiTaskID
);
469 case eT_AddActivityFeed
:
470 StartAddActivityFeed(uiTaskID
);
473 case eT_GetConsumableOffers
:
474 StartGetConsumableOffers(uiTaskID
);
476 case eT_GetConsumableAssets
:
477 StartGetConsumableAssets(uiTaskID
);
479 case eT_ConsumeAsset
:
480 StartConsumeAsset(uiTaskID
);
483 case eT_ShowDownloadOffer
:
484 StartShowDownloadOffer(uiTaskID
);
490 void CCryPSNLobbyUI::EndTask(CryLobbyUITaskID uiTaskID
)
494 STask
* pTask
= &m_task
[uiTaskID
];
500 switch (pTask
->startedTask
)
502 case eT_ShowGamerCard
:
503 EndShowGamerCard(uiTaskID
);
506 EndShowFriends(uiTaskID
);
508 case eT_ShowGameInvite
:
509 EndShowGameInvite(uiTaskID
);
512 case eT_ShowFriendRequest
:
513 case eT_SetRichPresence
:
514 case eT_ShowOnlineRetailBrowser
:
515 case eT_JoinFriendsGame
:
516 case eT_ShowMessageList
:
517 case eT_AddRecentPlayers
:
518 case eT_AddActivityFeed
:
519 ((CryLobbyUICallback
)pTask
->pCb
)(pTask
->lTaskID
, pTask
->error
, pTask
->pCbArg
);
522 case eT_CheckOnlineRetailStatus
:
523 EndCheckOnlineRetailStatus(uiTaskID
);
526 case eT_GetConsumableOffers
:
527 EndGetConsumableOffers(uiTaskID
);
529 case eT_GetConsumableAssets
:
530 EndGetConsumableAssets(uiTaskID
);
532 case eT_ConsumeAsset
:
533 EndConsumeAsset(uiTaskID
);
536 case eT_ShowDownloadOffer
:
537 EndShowDownloadOffer(uiTaskID
);
542 if (pTask
->error
!= eCLE_Success
)
544 NetLog("[Lobby] LobbyUI EndTask %d (%d) Result %d", pTask
->startedTask
, pTask
->subTask
, pTask
->error
);
551 void CCryPSNLobbyUI::StopTaskRunning(CryLobbyUITaskID uiTaskID
)
553 STask
* pTask
= &m_task
[uiTaskID
];
557 pTask
->running
= false;
558 TO_GAME_FROM_LOBBY(&CCryPSNLobbyUI::EndTask
, this, uiTaskID
);
562 ECryLobbyError
CCryPSNLobbyUI::ShowGamerCard(uint32 user
, CryUserID userID
, CryLobbyTaskID
* pTaskID
, CryLobbyUICallback cb
, void* pCbArg
)
566 ECryLobbyError error
= eCLE_Success
;
568 if (userID
.IsValid())
570 CryLobbyUITaskID uiTaskID
;
572 error
= StartTask(eT_ShowGamerCard
, false, user
, &uiTaskID
, pTaskID
, CryLobbyInvalidSessionHandle
, (void*)cb
, pCbArg
);
574 if (error
== eCLE_Success
)
576 SceNpId npId
= ((SCryPSNUserID
*)userID
.get())->npId
;
578 error
= CreateTaskParamMem(uiTaskID
, LOBBYUI_PARAM_NPID_LIST
, &npId
, sizeof(npId
));
580 if (error
== eCLE_Success
)
582 FROM_GAME_TO_LOBBY(&CCryPSNLobbyUI::StartTaskRunning
, this, uiTaskID
);
592 error
= eCLE_InvalidUser
;
598 void CCryPSNLobbyUI::StartShowGamerCard(CryLobbyUITaskID uiTaskID
)
600 STask
* pTask
= &m_task
[uiTaskID
];
601 SceNpId
* pNpId
= (SceNpId
*)m_pLobby
->MemGetPtr(pTask
->paramsMem
[LOBBYUI_PARAM_NPID_LIST
]);
603 SceUserServiceUserId userId
;
604 int ret
= sceUserServiceGetInitialUser(&userId
);
607 ret
= sceNpProfileDialogInitialize();
608 if ((ret
== PSN_OK
) || (ret
== SCE_COMMON_DIALOG_ERROR_ALREADY_INITIALIZED
))
610 SceNpProfileDialogParam param
;
611 sceNpProfileDialogParamInitialize(¶m
);
612 param
.mode
= SCE_NP_PROFILE_DIALOG_MODE_NORMAL
;
613 param
.userId
= userId
;
614 param
.targetOnlineId
= pNpId
->handle
;
616 ret
= sceNpProfileDialogOpen(¶m
);
619 UpdateTaskError(uiTaskID
, eCLE_Success
);
623 NetLog("sceNpProfileDialogOpen failed. ret = 0x%x\n", ret
);
624 UpdateTaskError(uiTaskID
, eCLE_InternalError
);
629 NetLog("sceNpProfileDialogInitialize failed. ret = 0x%x\n", ret
);
630 UpdateTaskError(uiTaskID
, eCLE_InternalError
);
631 StopTaskRunning(uiTaskID
);
636 UpdateTaskError(uiTaskID
, eCLE_InternalError
);
639 if (pTask
->error
!= eCLE_Success
)
641 sceNpProfileDialogTerminate();
642 StopTaskRunning(uiTaskID
);
646 void CCryPSNLobbyUI::TickShowGamerCard(CryLobbyUITaskID uiTaskID
)
648 STask
* pTask
= &m_task
[uiTaskID
];
652 sceNpProfileDialogTerminate();
653 UpdateTaskError(uiTaskID
, eCLE_Success
);
654 StopTaskRunning(uiTaskID
);
658 int ret
= sceNpProfileDialogUpdateStatus();
659 if (ret
== SCE_COMMON_DIALOG_STATUS_FINISHED
)
662 SceNpProfileDialogResult result
;
663 memset(&result
, 0, sizeof(result
));
665 ret
= sceNpProfileDialogGetResult(&result
);
668 if (result
.result
== PSN_OK
)
670 UpdateTaskError(uiTaskID
, eCLE_Success
);
674 UpdateTaskError(uiTaskID
, eCLE_InternalError
);
680 UpdateTaskError(uiTaskID
, eCLE_InternalError
);
683 sceNpProfileDialogTerminate();
685 StopTaskRunning(uiTaskID
);
689 void CCryPSNLobbyUI::EndShowGamerCard(CryLobbyUITaskID uiTaskID
)
691 STask
* pTask
= &m_task
[uiTaskID
];
692 ((CryLobbyUICallback
)pTask
->pCb
)(pTask
->lTaskID
, pTask
->error
, pTask
->pCbArg
);
695 ECryLobbyError
CCryPSNLobbyUI::ShowGameInvite(uint32 user
, CrySessionHandle gh
, CryUserID
* pUserIDs
, uint32 numUserIDs
, CryLobbyTaskID
* pTaskID
, CryLobbyUICallback cb
, void* pCbArg
)
697 #if USE_CRY_MATCHMAKING
700 ECryLobbyError error
= eCLE_Success
;
701 CCryMatchMaking
* pMatchMaking
= (CCryMatchMaking
*)m_pLobby
->GetMatchMaking();
705 CryLobbySessionHandle h
= pMatchMaking
->GetSessionHandleFromGameSessionHandle(gh
);
707 if (h
!= CryLobbyInvalidSessionHandle
)
709 CryLobbyUITaskID uiTaskID
;
711 error
= StartTask(eT_ShowGameInvite
, false, user
, &uiTaskID
, pTaskID
, h
, (void*)cb
, pCbArg
);
713 if (error
== eCLE_Success
)
715 STask
* pTask
= &m_task
[uiTaskID
];
717 pTask
->paramsNum
[LOBBYUI_PARAM_NUM_NPIDS
] = numUserIDs
;
721 error
= CreateTaskParamMem(uiTaskID
, LOBBYUI_PARAM_ONLINEID_LIST
, NULL
, numUserIDs
* sizeof(SceNpOnlineId
));
722 if (error
== eCLE_Success
)
724 SceNpOnlineId
* pOnlineIds
= (SceNpOnlineId
*)m_pLobby
->MemGetPtr(pTask
->paramsMem
[LOBBYUI_PARAM_ONLINEID_LIST
]);
726 for (uint32 i
= 0; i
< numUserIDs
; i
++)
728 if (pUserIDs
[i
].IsValid())
730 memcpy(&pOnlineIds
[i
], &(((SCryPSNUserID
*)pUserIDs
[i
].get())->npId
.handle
), sizeof(SceNpOnlineId
));
734 error
= eCLE_InvalidUser
;
741 if (error
== eCLE_Success
)
743 error
= CreateTaskParamMem(uiTaskID
, LOBBYUI_PARAM_SESSION_ID
, NULL
, sizeof(SceNpSessionId
));
744 if (error
== eCLE_Success
)
746 SceNpSessionId
* pSessionId
= (SceNpSessionId
*)m_pLobby
->MemGetPtr(pTask
->paramsMem
[LOBBYUI_PARAM_SESSION_ID
]);
747 CrySessionID id
= pMatchMaking
->SessionGetCrySessionIDFromCrySessionHandle(gh
);
750 memcpy(pSessionId
, &(((SCryPSNSessionID
*)id
.get())->m_sessionId
), sizeof(SceNpSessionId
));
754 error
= eCLE_InvalidSession
;
759 if (error
== eCLE_Success
)
761 FROM_GAME_TO_LOBBY(&CCryPSNLobbyUI::StartTaskRunning
, this, uiTaskID
);
771 error
= eCLE_InvalidSession
;
776 error
= eCLE_ServiceNotSupported
;
780 #else // USE_CRY_MATCHMAKING
781 return eCLE_ServiceNotSupported
;
782 #endif // USE_CRY_MATCHMAKING
785 void CCryPSNLobbyUI::StartShowGameInvite(CryLobbyUITaskID uiTaskID
)
787 #if USE_CRY_MATCHMAKING
788 STask
* pTask
= &m_task
[uiTaskID
];
789 uint32 numUserIDs
= pTask
->paramsNum
[LOBBYUI_PARAM_NUM_NPIDS
];
790 SceNpOnlineId
* pOnlineIds
= NULL
;
793 pOnlineIds
= (SceNpOnlineId
*)m_pLobby
->MemGetPtr(pTask
->paramsMem
[LOBBYUI_PARAM_ONLINEID_LIST
]);
795 SceNpSessionId
* pSessionId
= (SceNpSessionId
*)m_pLobby
->MemGetPtr(pTask
->paramsMem
[LOBBYUI_PARAM_SESSION_ID
]);
797 char body
[SCE_INVITATION_DIALOG_MAX_USER_MSG_SIZE
] = "Undefined";
799 SCryLobbyXMBString data
;
800 data
.m_pStringBuffer
= (uint8
*)body
;
801 data
.m_sizeOfStringBuffer
= SCE_INVITATION_DIALOG_MAX_USER_MSG_SIZE
- 1;
803 SConfigurationParams neededInfo
= {
804 CLCC_PSN_INVITE_BODY_STRING
, { NULL
}
806 neededInfo
.m_pData
= &data
;
808 m_pLobby
->GetConfigurationInformation(&neededInfo
, 1);
810 if (data
.m_sizeOfStringBuffer
>= SCE_INVITATION_DIALOG_MAX_USER_MSG_SIZE
)
812 cry_sprintf(body
, "Error: Body text is too long!");
815 body
[SCE_INVITATION_DIALOG_MAX_USER_MSG_SIZE
- 1] = 0;
817 SceUserServiceUserId userId
;
818 int ret
= sceUserServiceGetInitialUser(&userId
);
821 ret
= sceInvitationDialogInitialize();
822 if ((ret
== PSN_OK
) || (ret
== SCE_COMMON_DIALOG_ERROR_ALREADY_INITIALIZED
))
824 SceInvitationDialogDataParam dataParam
;
825 memset(&dataParam
, 0, sizeof(dataParam
));
826 dataParam
.SendInfo
.sessionId
= pSessionId
;
827 dataParam
.SendInfo
.userMessage
= body
;
828 dataParam
.SendInfo
.addressParam
.addressType
= SCE_INVITATION_DIALOG_ADDRESS_TYPE_USERDISABLE
;
829 dataParam
.SendInfo
.addressParam
.addressInfo
.UserSelectDisableAddress
.onlineIdsCount
= numUserIDs
;
830 dataParam
.SendInfo
.addressParam
.addressInfo
.UserSelectDisableAddress
.onlineIds
= pOnlineIds
;
832 SceInvitationDialogParam param
;
833 sceInvitationDialogParamInitialize(¶m
);
834 param
.userId
= userId
;
835 param
.mode
= SCE_INVITATION_DIALOG_MODE_SEND
;
836 param
.dataParam
= &dataParam
;
838 ret
= sceInvitationDialogOpen(¶m
);
842 NetLog("INVITE OPEN: session %s", pSessionId
->data
);
843 UpdateTaskError(uiTaskID
, eCLE_Success
);
847 UpdateTaskError(uiTaskID
, eCLE_InternalError
);
852 NetLog("sceInvitationDialogInitialize failed. ret = 0x%x\n", ret
);
853 UpdateTaskError(uiTaskID
, eCLE_InternalError
);
858 UpdateTaskError(uiTaskID
, eCLE_InternalError
);
861 if (pTask
->error
!= eCLE_Success
)
863 sceInvitationDialogTerminate();
864 StopTaskRunning(uiTaskID
);
866 #endif // USE_CRY_MATCHMAKING
869 void CCryPSNLobbyUI::TickShowGameInvite(CryLobbyUITaskID uiTaskID
)
872 STask
* pTask
= &m_task
[uiTaskID
];
876 sceInvitationDialogTerminate();
877 UpdateTaskError(uiTaskID
, eCLE_Success
);
878 StopTaskRunning(uiTaskID
);
882 ret
= sceInvitationDialogUpdateStatus();
883 if (ret
== SCE_COMMON_DIALOG_STATUS_FINISHED
)
886 SceInvitationDialogResult result
;
887 memset(&result
, 0, sizeof(result
));
889 ret
= sceInvitationDialogGetResult(&result
);
892 if (result
.errorCode
== PSN_OK
)
894 if (result
.result
== SCE_COMMON_DIALOG_RESULT_OK
)
896 NetLog("INVITE SENT");
900 NetLog("INVITE CANCELLED");
905 UpdateTaskError(uiTaskID
, eCLE_InternalError
);
911 UpdateTaskError(uiTaskID
, eCLE_InternalError
);
914 sceInvitationDialogTerminate();
916 StopTaskRunning(uiTaskID
);
920 void CCryPSNLobbyUI::EndShowGameInvite(CryLobbyUITaskID uiTaskID
)
922 STask
* pTask
= &m_task
[uiTaskID
];
923 ((CryLobbyUICallback
)pTask
->pCb
)(pTask
->lTaskID
, pTask
->error
, pTask
->pCbArg
);
926 ECryLobbyError
CCryPSNLobbyUI::ShowFriends(uint32 user
, CryLobbyTaskID
* pTaskID
, CryLobbyUICallback cb
, void* pCbArg
)
929 CryLobbyUITaskID uiTaskID
;
931 ECryLobbyError error
= StartTask(eT_ShowFriends
, false, user
, &uiTaskID
, pTaskID
, CryLobbyInvalidSessionHandle
, (void*)cb
, pCbArg
);
933 if (error
== eCLE_Success
)
935 FROM_GAME_TO_LOBBY(&CCryPSNLobbyUI::StartTaskRunning
, this, uiTaskID
);
941 void CCryPSNLobbyUI::StartShowFriends(CryLobbyUITaskID uiTaskID
)
943 STask
* pTask
= &m_task
[uiTaskID
];
945 SceUserServiceUserId userId
;
946 int ret
= sceUserServiceGetInitialUser(&userId
);
949 ret
= sceNpFriendListDialogInitialize();
950 if ((ret
== PSN_OK
) || (ret
== SCE_COMMON_DIALOG_ERROR_ALREADY_INITIALIZED
))
952 SceNpFriendListDialogParam param
;
953 sceNpFriendListDialogParamInitialize(¶m
);
954 param
.mode
= SCE_NP_FRIEND_LIST_DIALOG_MODE_FRIEND_LIST
;
955 param
.userId
= userId
;
956 param
.menuItems
= SCE_NP_FRIEND_LIST_DIALOG_MENU_ITEM_ONLINE
| SCE_NP_FRIEND_LIST_DIALOG_MENU_ITEM_ALL_FRIENDS
;
958 ret
= sceNpFriendListDialogOpen(¶m
);
961 UpdateTaskError(uiTaskID
, eCLE_Success
);
965 NetLog("sceNpFriendListDialogOpen failed. ret = 0x%x\n", ret
);
966 UpdateTaskError(uiTaskID
, eCLE_InternalError
);
971 NetLog("sceNpFriendListDialogInitialize failed. ret = 0x%x\n", ret
);
972 UpdateTaskError(uiTaskID
, eCLE_InternalError
);
973 StopTaskRunning(uiTaskID
);
978 UpdateTaskError(uiTaskID
, eCLE_InternalError
);
981 if (pTask
->error
!= eCLE_Success
)
983 sceNpFriendListDialogTerminate();
984 StopTaskRunning(uiTaskID
);
988 void CCryPSNLobbyUI::TickShowFriends(CryLobbyUITaskID uiTaskID
)
991 STask
* pTask
= &m_task
[uiTaskID
];
995 sceNpFriendListDialogTerminate();
996 UpdateTaskError(uiTaskID
, eCLE_Success
);
997 StopTaskRunning(uiTaskID
);
1001 ret
= sceNpFriendListDialogUpdateStatus();
1002 if (ret
== SCE_COMMON_DIALOG_STATUS_FINISHED
)
1005 SceNpFriendListDialogResult result
;
1006 memset(&result
, 0, sizeof(result
));
1008 ret
= sceNpFriendListDialogGetResult(&result
);
1011 if (result
.result
== PSN_OK
)
1013 UpdateTaskError(uiTaskID
, eCLE_Success
);
1017 UpdateTaskError(uiTaskID
, eCLE_InternalError
);
1023 UpdateTaskError(uiTaskID
, eCLE_InternalError
);
1026 sceNpFriendListDialogTerminate();
1028 StopTaskRunning(uiTaskID
);
1032 void CCryPSNLobbyUI::EndShowFriends(CryLobbyUITaskID uiTaskID
)
1034 STask
* pTask
= &m_task
[uiTaskID
];
1035 ((CryLobbyUICallback
)pTask
->pCb
)(pTask
->lTaskID
, pTask
->error
, pTask
->pCbArg
);
1038 ECryLobbyError
CCryPSNLobbyUI::ShowFriendRequest(uint32 user
, CryUserID userID
, CryLobbyTaskID
* pTaskID
, CryLobbyUICallback cb
, void* pCbArg
)
1042 ECryLobbyError error
= eCLE_Success
;
1044 if (userID.IsValid())
1046 CryLobbyUITaskID uiTaskID;
1048 error = StartTask(eT_ShowFriendRequest, false, user, &uiTaskID, pTaskID, CryLobbyInvalidSessionHandle, (void*)cb, pCbArg);
1049 if (error == eCLE_Success)
1051 SceNpId npId = ((SCryPSNUserID*)userID.get())->npId;
1053 error = CreateTaskParamMem(uiTaskID, LOBBYUI_PARAM_NPID_LIST, &npId, sizeof(npId));
1054 if (error == eCLE_Success)
1056 FROM_GAME_TO_LOBBY(&CCryPSNLobbyUI::StartTaskRunning, this, uiTaskID);
1066 error = eCLE_InvalidUser;
1072 void CCryPSNLobbyUI::StartShowFriendRequest(CryLobbyUITaskID uiTaskID
)
1075 STask* pTask = &m_task[uiTaskID];
1076 SceNpId* pNpId = (SceNpId*)m_pLobby->MemGetPtr(pTask->paramsMem[LOBBYUI_PARAM_NPID_LIST]);
1078 char subject[SCE_NP_BASIC_SUBJECT_CHARACTER_MAX] = "Undefined";
1079 char body[SCE_NP_BASIC_BODY_CHARACTER_MAX] = "Undefined";
1081 SCryLobbyXMBString data[2];
1082 data[0].m_pStringBuffer = (uint8*)subject;
1083 data[0].m_sizeOfStringBuffer = SCE_NP_BASIC_SUBJECT_CHARACTER_MAX;
1084 data[1].m_pStringBuffer = (uint8*)body;
1085 data[1].m_sizeOfStringBuffer = SCE_NP_BASIC_BODY_CHARACTER_MAX;
1087 SConfigurationParams neededInfo[2] = {{CLCC_PSN_FRIEND_REQUEST_SUBJECT_STRING, {NULL}},
1088 {CLCC_PSN_FRIEND_REQUEST_BODY_STRING, {NULL}}};
1089 neededInfo[0].m_pData = &data[0];
1090 neededInfo[1].m_pData = &data[1];
1092 m_pLobby->GetConfigurationInformation(neededInfo, 2);
1094 if (data[0].m_sizeOfStringBuffer >= SCE_NP_BASIC_SUBJECT_CHARACTER_MAX)
1096 cry_sprintf(subject, "E 0x%x", SCE_NP_BASIC_ERROR_EXCEEDS_MAX);
1098 if (data[1].m_sizeOfStringBuffer >= SCE_NP_BASIC_BODY_CHARACTER_MAX)
1100 cry_sprintf(body, "E 0x%x", SCE_NP_BASIC_ERROR_EXCEEDS_MAX);
1103 subject[SCE_NP_BASIC_SUBJECT_CHARACTER_MAX-1] = 0;
1104 body[SCE_NP_BASIC_BODY_CHARACTER_MAX-1] = 0;
1106 SceNpBasicMessageDetails msg;
1107 memset(&msg, 0, sizeof(msg));
1109 msg.mainType = SCE_NP_BASIC_MESSAGE_MAIN_TYPE_ADD_FRIEND;
1110 msg.subType = SCE_NP_BASIC_MESSAGE_ADD_FRIEND_SUBTYPE_NONE;
1111 msg.msgFeatures = SCE_NP_BASIC_MESSAGE_FEATURES_MULTI_RECEIPIENTS;
1114 msg.subject = subject;
1119 int ret = sceNpBasicSendMessageGui(&msg, SYS_MEMORY_CONTAINER_ID_INVALID);
1123 UpdateTaskError(uiTaskID, eCLE_Success);
1127 UpdateTaskError(uiTaskID, eCLE_InternalError);
1130 UpdateTaskError(uiTaskID
, eCLE_ServiceNotSupported
);
1131 StopTaskRunning(uiTaskID
);
1134 ECryLobbyError
CCryPSNLobbyUI::SetRichPresence(uint32 user
, SCryLobbyUserData
* pData
, uint32 numData
, CryLobbyTaskID
* pTaskID
, CryLobbyUICallback cb
, void* pCbArg
)
1138 ECryLobbyError error
= eCLE_Success
;
1139 CryLobbyUITaskID uiTaskID
;
1141 if ((numData
> 0) && pData
)
1143 error
= StartTask(eT_SetRichPresence
, false, user
, &uiTaskID
, pTaskID
, CryLobbyInvalidSessionHandle
, (void*)cb
, pCbArg
);
1145 if (error
== eCLE_Success
)
1147 STask
* pTask
= &m_task
[uiTaskID
];
1149 pTask
->paramsNum
[LOBBYUI_PARAM_RICHPRESENCE
] = INVALID_WEBAPI_JOB_ID
;
1150 error
= CreateTaskParamMem(uiTaskID
, LOBBYUI_PARAM_RICHPRESENCE
, 0, sizeof(SCryPSNOrbisWebApiSetPresenceInput
));
1151 if (error
== eCLE_Success
)
1153 SCryPSNOrbisWebApiSetPresenceInput
* pPresenceData
= (SCryPSNOrbisWebApiSetPresenceInput
*)m_pLobby
->MemGetPtr(pTask
->paramsMem
[LOBBYUI_PARAM_RICHPRESENCE
]);
1154 memset(pPresenceData
, 0, sizeof(SCryPSNOrbisWebApiSetPresenceInput
));
1156 SCryLobbyPresenceConverter convert
;
1157 convert
.m_pData
= pData
;
1158 convert
.m_numData
= numData
;
1159 convert
.m_pStringBuffer
= (uint8
*)pPresenceData
->presence
;
1160 convert
.m_sizeOfStringBuffer
= CRY_WEBAPI_SETPRESENCE_MAX_SIZE
;
1161 convert
.m_sessionId
= CrySessionInvalidID
;
1163 SConfigurationParams presenceItem
= {
1164 CLCC_CRYLOBBY_PRESENCE_CONVERTER
, { NULL
}
1166 presenceItem
.m_pData
= &convert
;
1168 m_pLobby
->GetConfigurationInformation(&presenceItem
, 1);
1170 if ((convert
.m_sizeOfStringBuffer
> 0) && (convert
.m_sizeOfStringBuffer
< CRY_WEBAPI_SETPRESENCE_MAX_SIZE
))
1172 pPresenceData
->presence
[CRY_WEBAPI_SETPRESENCE_MAX_SIZE
- 1] = 0;
1173 FROM_GAME_TO_LOBBY(&CCryPSNLobbyUI::StartTaskRunning
, this, uiTaskID
);
1177 error
= eCLE_InvalidRequest
;
1189 error
= eCLE_InvalidParam
;
1195 void CCryPSNLobbyUI::StartSetRichPresence(CryLobbyUITaskID uiTaskID
)
1197 STask
* pTask
= &m_task
[uiTaskID
];
1199 if (pTask
->paramsMem
[LOBBYUI_PARAM_RICHPRESENCE
] != TMemInvalidHdl
)
1201 if (!m_pPSNSupport
->HasTransitioningReachedState(ePSNOS_Online
))
1203 UpdateTaskError(uiTaskID
, eCLE_Success
);
1204 StopTaskRunning(uiTaskID
);
1209 UpdateTaskError(uiTaskID
, eCLE_OutOfMemory
);
1210 StopTaskRunning(uiTaskID
);
1214 void CCryPSNLobbyUI::TickSetRichPresence(CryLobbyUITaskID uiTaskID
)
1216 if (m_pPSNSupport
->HasTransitioningReachedState(ePSNOS_Online
))
1218 STask
* pTask
= &m_task
[uiTaskID
];
1220 if (pTask
->paramsMem
[LOBBYUI_PARAM_RICHPRESENCE
] != TMemInvalidHdl
)
1222 SCryPSNOrbisWebApiSetPresenceInput
* pPresenceData
= (SCryPSNOrbisWebApiSetPresenceInput
*)m_pLobby
->MemGetPtr(pTask
->paramsMem
[LOBBYUI_PARAM_RICHPRESENCE
]);
1223 memcpy(&pPresenceData
->id
, &m_pPSNSupport
->GetLocalNpId()->handle
, sizeof(SceNpOnlineId
));
1225 pTask
->paramsNum
[LOBBYUI_PARAM_RICHPRESENCE
] = m_pPSNSupport
->GetWebApiInterface().AddJob(CCryPSNOrbisWebApiThread::SetPresence
, pTask
->paramsMem
[LOBBYUI_PARAM_RICHPRESENCE
]);
1226 if (pTask
->paramsNum
[LOBBYUI_PARAM_RICHPRESENCE
] != INVALID_WEBAPI_JOB_ID
)
1228 StartSubTask(eST_WaitingForRichPresenceCallback
, uiTaskID
);
1232 UpdateTaskError(uiTaskID
, eCLE_InternalError
);
1233 StopTaskRunning(uiTaskID
);
1238 UpdateTaskError(uiTaskID
, eCLE_OutOfMemory
);
1239 StopTaskRunning(uiTaskID
);
1244 UpdateTaskError(uiTaskID
, eCLE_Success
);
1245 StopTaskRunning(uiTaskID
);
1249 ECryLobbyError
CCryPSNLobbyUI::ShowOnlineRetailBrowser(uint32 user
, CryLobbyTaskID
* pTaskID
, CryLobbyUICallback cb
, void* pCbArg
)
1252 CryLobbyUITaskID uiTaskID
;
1254 ECryLobbyError error
= StartTask(eT_ShowOnlineRetailBrowser
, false, user
, &uiTaskID
, pTaskID
, CryLobbyInvalidSessionHandle
, (void*)cb
, pCbArg
);
1255 if (error
== eCLE_Success
)
1257 FROM_GAME_TO_LOBBY(&CCryPSNLobbyUI::StartTaskRunning
, this, uiTaskID
);
1263 void CCryPSNLobbyUI::StartShowOnlineRetailBrowser(CryLobbyUITaskID uiTaskID
)
1265 StopTaskRunning(uiTaskID
);
1268 ECryLobbyError
CCryPSNLobbyUI::CheckOnlineRetailStatus(uint32 user
, CryLobbyTaskID
* pTaskID
, CryLobbyUIOnlineRetailStatusCallback cb
, void* pCbArg
)
1272 ECryLobbyError error
= eCLE_InternalError
;
1276 void CCryPSNLobbyUI::EndCheckOnlineRetailStatus(CryLobbyUITaskID uiTaskID
)
1278 STask
* pTask
= &m_task
[uiTaskID
];
1280 SCryLobbyUIOnlineRetailCounts counts
;
1282 ((CryLobbyUIOnlineRetailStatusCallback
)pTask
->pCb
)(pTask
->lTaskID
, pTask
->error
, &counts
, pTask
->pCbArg
);
1285 void CCryPSNLobbyUI::JoinFriendGame(const SceNpId
* pNpId
)
1287 #if USE_CRY_MATCHMAKING
1290 ECryLobbyError error
= eCLE_Success
;
1291 CryLobbyUITaskID uiTaskID
;
1295 error
= StartTask(eT_JoinFriendsGame
, false, 0, &uiTaskID
, NULL
, CryLobbyInvalidSessionHandle
, NULL
, NULL
);
1296 if (error
== eCLE_Success
)
1298 error
= CreateTaskParamMem(uiTaskID
, LOBBYUI_PARAM_NPID_LIST
, pNpId
, sizeof(SceNpId
));
1299 if (error
== eCLE_Success
)
1301 FROM_GAME_TO_LOBBY(&CCryPSNLobbyUI::StartTaskRunning
, this, uiTaskID
);
1309 #endif // USE_CRY_MATCHMAKING
1312 void CCryPSNLobbyUI::StartJoinFriendGame(CryLobbyUITaskID uiTaskID
)
1314 #if USE_CRY_MATCHMAKING
1316 STask* pTask = &m_task[uiTaskID];
1317 ECryLobbyError error = eCLE_Success;
1318 SceNpBasicPresenceDetails2 details;
1319 SCryPSNSessionID* pSessionInfo = NULL;
1321 memset(&details, 0x00, sizeof(details));
1322 details.struct_size = sizeof(details);
1324 SceNpId* pNpId = (SceNpId*)m_pLobby->MemGetPtr(pTask->paramsMem[LOBBYUI_PARAM_NPID_LIST]);
1326 int ret = sceNpBasicGetFriendPresenceByNpId2(pNpId, &details, 0);
1329 details.status[SCE_NP_BASIC_PRESENCE_EXTENDED_STATUS_SIZE_MAX-1] = 0;
1330 NetLog("Friend Presence details: %s", details.status);
1331 NetLog("Friend Presence details: looking for %d bytes for session data, got %d bytes.", sizeof(SSynchronisedSessionID), details.size);
1332 if (details.size == sizeof(SSynchronisedSessionID))
1334 //-- we should have the sessionId for the invite in our buffer now.
1335 pSessionInfo = new SCryPSNSessionID;
1338 memcpy(&pSessionInfo->m_sessionInfo, details.data, details.size);
1339 pSessionInfo->m_sessionInfo.m_fromInvite = false;
1340 m_pPSNSupport->PrepareForInviteOrJoin(pSessionInfo);
1342 NetLog("JOIN RECV: server=0x%x, world=0x%x, room=0x%llx", pSessionInfo->m_sessionInfo.m_serverId, pSessionInfo->m_sessionInfo.m_worldId, (uint64)pSessionInfo->m_sessionInfo.m_roomId);
1346 error = eCLE_OutOfMemory;
1351 error = eCLE_InvalidJoinFriendData;
1356 NetLog("Friend Presence details: error 0x%x returned.", ret);
1357 if (ret == SCE_NP_BASIC_ERROR_BUSY)
1359 error = eCLE_SystemIsBusy;
1363 error = eCLE_InvalidJoinFriendData;
1367 TO_GAME_FROM_LOBBY(&CCryPSNLobbyUI::DispatchJoinEvent, this, CrySessionID(pSessionInfo), error);
1369 UpdateTaskError(uiTaskID, error);
1370 StopTaskRunning(uiTaskID);
1372 #endif // USE_CRY_MATCHMAKING
1375 ECryLobbyError
CCryPSNLobbyUI::ShowMessageList(uint32 user
, CryLobbyTaskID
* pTaskID
, CryLobbyUICallback cb
, void* pCbArg
)
1378 CryLobbyUITaskID uiTaskID
;
1380 ECryLobbyError error
= StartTask(eT_ShowMessageList
, false, user
, &uiTaskID
, pTaskID
, CryLobbyInvalidSessionHandle
, (void*)cb
, pCbArg
);
1381 if (error
== eCLE_Success
)
1383 FROM_GAME_TO_LOBBY(&CCryPSNLobbyUI::StartTaskRunning
, this, uiTaskID
);
1389 void CCryPSNLobbyUI::StartShowMessageList(CryLobbyUITaskID uiTaskID
)
1392 int ret = sceNpBasicRecvMessageCustom(SCE_NP_BASIC_MESSAGE_MAIN_TYPE_INVITE, SCE_NP_BASIC_RECV_MESSAGE_OPTIONS_INCLUDE_BOOTABLE, SYS_MEMORY_CONTAINER_ID_INVALID);
1396 UpdateTaskError(uiTaskID, eCLE_Success);
1400 UpdateTaskError(uiTaskID, eCLE_InternalError);
1404 UpdateTaskError(uiTaskID
, eCLE_ServiceNotSupported
);
1405 StopTaskRunning(uiTaskID
);
1408 void CCryPSNLobbyUI::PostLocalizationChecks()
1412 ECryLobbyError
CCryPSNLobbyUI::AddRecentPlayers(uint32 user
, CryUserID
* pUserIDs
, uint32 numUserIDs
, const char* gameModeStr
, CryLobbyTaskID
* pTaskID
, CryLobbyUICallback cb
, void* pCbArg
)
1415 CryLobbyUITaskID uiTaskID
;
1417 ECryLobbyError error
= StartTask(eT_AddRecentPlayers
, false, user
, &uiTaskID
, pTaskID
, CryLobbyInvalidSessionHandle
, (void*)cb
, pCbArg
);
1418 if (error
== eCLE_Success
)
1420 STask
* pTask
= &m_task
[uiTaskID
];
1421 pTask
->paramsNum
[LOBBYUI_PARAM_ADDRECENTPLAYERS
] = INVALID_WEBAPI_JOB_ID
;
1423 error
= CreateTaskParamMem(uiTaskID
, LOBBYUI_PARAM_ADDRECENTPLAYERS
, NULL
, sizeof(SCryPSNOrbisWebApiAddRecentPlayersInput
));
1424 if (error
== eCLE_Success
)
1426 SCryPSNOrbisWebApiAddRecentPlayersInput
* pRecentPlayersData
= (SCryPSNOrbisWebApiAddRecentPlayersInput
*)m_pLobby
->MemGetPtr(pTask
->paramsMem
[LOBBYUI_PARAM_ADDRECENTPLAYERS
]);
1428 sce::Json::Object source
;
1429 source
["meta"] = sce::Json::String(m_pPSNSupport
->GetLocalUserName());
1430 source
["type"] = sce::Json::String("ONLINE_ID");
1432 sce::Json::String storyType
= sce::Json::String("PLAYED_WITH");
1434 sce::Json::Array targets
;
1435 for (uint32 i
= 0; i
< numUserIDs
; ++i
)
1437 if (pUserIDs
[i
].IsValid())
1439 SceNpOnlineId
* pOID
= &((SCryPSNUserID
*)pUserIDs
[i
].get())->npId
.handle
;
1440 sce::Json::Object itarget
;
1441 itarget
["meta"] = sce::Json::String(pOID
->data
);
1442 itarget
["type"] = sce::Json::String("ONLINE_ID");
1443 targets
.push_back(itarget
);
1446 SConfigurationParams titleInfo
[1] = {
1447 { CLCC_PSN_TITLE_ID
, { NULL
}
1450 m_pPSNSupport
->GetLobby()->GetConfigurationInformation(titleInfo
, 1);
1451 sce::Json::Object titletarget
;
1452 titletarget
["meta"] = sce::Json::String((const char*)titleInfo
[0].m_pData
);
1453 titletarget
["type"] = sce::Json::String("TITLE_ID");
1454 targets
.push_back(titletarget
);
1455 sce::Json::Object desctarget
;
1456 desctarget
["meta"] = sce::Json::String(gameModeStr
);
1457 desctarget
["type"] = sce::Json::String("PLAYED_DESCRIPTION");
1458 targets
.push_back(desctarget
);
1460 sce::Json::Object jsonDoc
;
1461 jsonDoc
["source"] = source
;
1462 jsonDoc
["storyType"] = storyType
;
1463 jsonDoc
["targets"] = targets
;
1465 sce::Json::Value jsonRoot
;
1467 jsonRoot
.set(jsonDoc
);
1469 sce::Json::String jsonString
;
1470 jsonRoot
.serialize(jsonString
);
1472 cry_sprintf(pRecentPlayersData
->feed
, jsonString
.c_str(), jsonString
.length());
1475 if (error
== eCLE_Success
)
1477 FROM_GAME_TO_LOBBY(&CCryPSNLobbyUI::StartTaskRunning
, this, uiTaskID
);
1488 void CCryPSNLobbyUI::StartAddRecentPlayers(CryLobbyUITaskID uiTaskID
)
1490 STask
* pTask
= &m_task
[uiTaskID
];
1492 if (pTask
->paramsMem
[LOBBYUI_PARAM_ADDRECENTPLAYERS
] != TMemInvalidHdl
)
1494 if (!m_pPSNSupport
->HasTransitioningReachedState(ePSNOS_Online
))
1496 UpdateTaskError(uiTaskID
, eCLE_Success
);
1497 StopTaskRunning(uiTaskID
);
1502 UpdateTaskError(uiTaskID
, eCLE_OutOfMemory
);
1503 StopTaskRunning(uiTaskID
);
1507 void CCryPSNLobbyUI::TickAddRecentPlayers(CryLobbyUITaskID uiTaskID
)
1509 if (m_pPSNSupport
->HasTransitioningReachedState(ePSNOS_Online
))
1511 STask
* pTask
= &m_task
[uiTaskID
];
1513 if (pTask
->paramsMem
[LOBBYUI_PARAM_ADDRECENTPLAYERS
] != TMemInvalidHdl
)
1515 pTask
->paramsNum
[LOBBYUI_PARAM_ADDRECENTPLAYERS
] = m_pPSNSupport
->GetWebApiInterface().AddJob(CCryPSNOrbisWebApiThread::AddRecentPlayers
, pTask
->paramsMem
[LOBBYUI_PARAM_ADDRECENTPLAYERS
]);
1516 if (pTask
->paramsNum
[LOBBYUI_PARAM_ADDRECENTPLAYERS
] != INVALID_WEBAPI_JOB_ID
)
1518 StartSubTask(eST_WaitingForAddRecentPlayersCallback
, uiTaskID
);
1522 UpdateTaskError(uiTaskID
, eCLE_InternalError
);
1523 StopTaskRunning(uiTaskID
);
1528 UpdateTaskError(uiTaskID
, eCLE_OutOfMemory
);
1529 StopTaskRunning(uiTaskID
);
1534 UpdateTaskError(uiTaskID
, eCLE_Success
);
1535 StopTaskRunning(uiTaskID
);
1539 ECryLobbyError
CCryPSNLobbyUI::AddActivityFeed(uint32 user
, CryLobbyTaskID
* pTaskID
, CryLobbyUICallback cb
, void* pCbArg
)
1542 CryLobbyUITaskID uiTaskID
;
1544 ECryLobbyError error
= StartTask(eT_AddActivityFeed
, false, user
, &uiTaskID
, pTaskID
, CryLobbyInvalidSessionHandle
, (void*)cb
, pCbArg
);
1545 if (error
== eCLE_Success
)
1547 STask
* pTask
= &m_task
[uiTaskID
];
1548 pTask
->paramsNum
[LOBBYUI_PARAM_ADDACTIVITYFEED
] = INVALID_WEBAPI_JOB_ID
;
1550 error
= CreateTaskParamMem(uiTaskID
, LOBBYUI_PARAM_ADDACTIVITYFEED
, NULL
, sizeof(SCryPSNOrbisWebApiAddActivityFeedInput
));
1551 if (error
== eCLE_Success
)
1553 SCryPSNOrbisWebApiAddActivityFeedInput
* pActivityData
= (SCryPSNOrbisWebApiAddActivityFeedInput
*)m_pLobby
->MemGetPtr(pTask
->paramsMem
[LOBBYUI_PARAM_ADDACTIVITYFEED
]);
1555 SConfigurationParams titleInfo
[1] = {
1556 { CLCC_PSN_TITLE_ID
, { NULL
}
1559 m_pPSNSupport
->GetLobby()->GetConfigurationInformation(titleInfo
, 1);
1561 cry_sprintf(pActivityData
->feed
, CRY_WEBAPI_ACTIVITYFEED_INGAME_POST_BODY_SAMPLE
, m_pPSNSupport
->GetLocalUserName(), titleInfo
[0].m_pData
);
1564 if (error
== eCLE_Success
)
1566 FROM_GAME_TO_LOBBY(&CCryPSNLobbyUI::StartTaskRunning
, this, uiTaskID
);
1577 void CCryPSNLobbyUI::StartAddActivityFeed(CryLobbyUITaskID uiTaskID
)
1579 STask
* pTask
= &m_task
[uiTaskID
];
1581 if (pTask
->paramsMem
[LOBBYUI_PARAM_ADDACTIVITYFEED
] != TMemInvalidHdl
)
1583 if (!m_pPSNSupport
->HasTransitioningReachedState(ePSNOS_Online
))
1585 UpdateTaskError(uiTaskID
, eCLE_Success
);
1586 StopTaskRunning(uiTaskID
);
1591 UpdateTaskError(uiTaskID
, eCLE_OutOfMemory
);
1592 StopTaskRunning(uiTaskID
);
1596 void CCryPSNLobbyUI::TickAddActivityFeed(CryLobbyUITaskID uiTaskID
)
1598 if (m_pPSNSupport
->HasTransitioningReachedState(ePSNOS_Online
))
1600 STask
* pTask
= &m_task
[uiTaskID
];
1602 if (pTask
->paramsMem
[LOBBYUI_PARAM_ADDACTIVITYFEED
] != TMemInvalidHdl
)
1604 pTask
->paramsNum
[LOBBYUI_PARAM_ADDACTIVITYFEED
] = m_pPSNSupport
->GetWebApiInterface().AddJob(CCryPSNOrbisWebApiThread::PostActivity
, pTask
->paramsMem
[LOBBYUI_PARAM_ADDACTIVITYFEED
]);
1605 if (pTask
->paramsNum
[LOBBYUI_PARAM_ADDACTIVITYFEED
] != INVALID_WEBAPI_JOB_ID
)
1607 StartSubTask(eST_WaitingForAddActivityFeedCallback
, uiTaskID
);
1611 UpdateTaskError(uiTaskID
, eCLE_InternalError
);
1612 StopTaskRunning(uiTaskID
);
1617 UpdateTaskError(uiTaskID
, eCLE_OutOfMemory
);
1618 StopTaskRunning(uiTaskID
);
1623 UpdateTaskError(uiTaskID
, eCLE_Success
);
1624 StopTaskRunning(uiTaskID
);
1628 ECryLobbyError
CCryPSNLobbyUI::GetConsumableOffers(uint32 user
, CryLobbyTaskID
* pTaskID
, const TStoreOfferID
* pOfferIDs
, uint32 offerIdCount
, CryLobbyUIGetConsumableOffersCallback cb
, void* pCbArg
)
1631 CryLobbyUITaskID uiTaskID
;
1633 ECryLobbyError error
= StartTask(eT_GetConsumableOffers
, false, user
, &uiTaskID
, pTaskID
, CryLobbyInvalidSessionHandle
, (void*)cb
, pCbArg
);
1634 if (error
== eCLE_Success
)
1636 STask
* pTask
= &m_task
[uiTaskID
];
1637 pTask
->paramsNum
[LOBBYUI_PARAM_GETCONSUMABLEOFFERS_REQUEST
] = INVALID_WEBAPI_JOB_ID
;
1638 pTask
->paramsNum
[LOBBYUI_PARAM_GETCONSUMABLEOFFERS_RESULTS
] = 0;
1640 error
= CreateTaskParamMem(uiTaskID
, LOBBYUI_PARAM_GETCONSUMABLEOFFERS_REQUEST
, NULL
, sizeof(SCryPSNOrbisWebApiGetCommerceInput
));
1641 if (error
== eCLE_Success
)
1643 SCryPSNOrbisWebApiGetCommerceInput
* pData
= (SCryPSNOrbisWebApiGetCommerceInput
*)m_pLobby
->MemGetPtr(pTask
->paramsMem
[LOBBYUI_PARAM_GETCONSUMABLEOFFERS_REQUEST
]);
1644 new(pData
) SCryPSNOrbisWebApiGetCommerceInput();
1646 pData
->numProducts
= 0;
1647 for (uint32 i
= 0; (i
< offerIdCount
) && (pData
->numProducts
< CRY_WEBAPI_COMMERCE_MAX_PRODUCTS
); ++i
)
1649 bool bFound
= false;
1650 for (uint32 f
= 0; f
< pData
->numProducts
; ++f
)
1652 if (pData
->products
[f
].productId
== pOfferIDs
[i
].productId
)
1660 pData
->products
[pData
->numProducts
++].productId
= pOfferIDs
[i
].productId
;
1665 if (error
== eCLE_Success
)
1667 FROM_GAME_TO_LOBBY(&CCryPSNLobbyUI::StartTaskRunning
, this, uiTaskID
);
1678 void CCryPSNLobbyUI::StartGetConsumableOffers(CryLobbyUITaskID uiTaskID
)
1680 STask
* pTask
= &m_task
[uiTaskID
];
1682 if (pTask
->paramsMem
[LOBBYUI_PARAM_GETCONSUMABLEOFFERS_REQUEST
] != TMemInvalidHdl
)
1684 m_pPSNSupport
->ResumeTransitioning(ePSNOS_Online
);
1688 UpdateTaskError(uiTaskID
, eCLE_OutOfMemory
);
1689 StopTaskRunning(uiTaskID
);
1693 void CCryPSNLobbyUI::TickGetConsumableOffers(CryLobbyUITaskID uiTaskID
)
1695 m_pPSNSupport
->ResumeTransitioning(ePSNOS_Online
);
1696 if (m_pPSNSupport
->HasTransitioningReachedState(ePSNOS_Online
))
1698 STask
* pTask
= &m_task
[uiTaskID
];
1700 if (pTask
->paramsMem
[LOBBYUI_PARAM_GETCONSUMABLEOFFERS_REQUEST
] != TMemInvalidHdl
)
1702 pTask
->paramsNum
[LOBBYUI_PARAM_GETCONSUMABLEOFFERS_REQUEST
] = m_pPSNSupport
->GetWebApiInterface().AddJob(CCryPSNOrbisWebApiThread::GetCommerceList
, pTask
->paramsMem
[LOBBYUI_PARAM_GETCONSUMABLEOFFERS_REQUEST
]);
1703 if (pTask
->paramsNum
[LOBBYUI_PARAM_GETCONSUMABLEOFFERS_REQUEST
] != INVALID_WEBAPI_JOB_ID
)
1705 StartSubTask(eST_WaitingForConsumableOffersCallback
, uiTaskID
);
1709 UpdateTaskError(uiTaskID
, eCLE_InternalError
);
1710 StopTaskRunning(uiTaskID
);
1715 UpdateTaskError(uiTaskID
, eCLE_OutOfMemory
);
1716 StopTaskRunning(uiTaskID
);
1721 void CCryPSNLobbyUI::EventWebApiGetConsumableOffers(CryLobbyUITaskID uiTaskID
, SCryPSNSupportCallbackEventData
& data
)
1723 STask
* pTask
= &m_task
[uiTaskID
];
1724 pTask
->paramsNum
[LOBBYUI_PARAM_GETCONSUMABLEOFFERS_RESULTS
] = 0;
1726 if (data
.m_webApiEvent
.m_error
== PSN_OK
)
1728 if (data
.m_webApiEvent
.m_pResponseBody
)
1730 if (data
.m_webApiEvent
.m_pResponseBody
->eType
== SCryPSNWebApiResponseBody::E_JSON
)
1732 // count json items - annoyingly the "total_results" field in the json document always seems to be 0.
1733 const sce::Json::Value
& root
= data
.m_webApiEvent
.m_pResponseBody
->jsonTreeRoot
;
1734 if (root
.getType() == sce::Json::kValueTypeArray
)
1736 const sce::Json::Array
& rootArray
= root
.getArray();
1737 uint32 offercount
= (uint32
)rootArray
.size();
1738 uint32 skucount
= 0;
1741 for (uint32 i
= 0; i
< offercount
; ++i
)
1743 const sce::Json::Value
& offerObj
= root
[i
];
1744 if (offerObj
.getType() == sce::Json::kValueTypeObject
)
1746 const sce::Json::Value
& skus
= offerObj
["skus"];
1747 if (skus
.getType() == sce::Json::kValueTypeArray
)
1749 const sce::Json::Array
& skusArray
= skus
.getArray();
1750 skucount
+= skusArray
.size();
1755 ECryLobbyError error
= CreateTaskParamMem(uiTaskID
, LOBBYUI_PARAM_GETCONSUMABLEOFFERS_RESULTS
, NULL
, sizeof(SCryLobbyConsumableOfferData
) * skucount
);
1756 if (error
== eCLE_Success
)
1758 SCryLobbyConsumableOfferData
* pOffers
= (SCryLobbyConsumableOfferData
*)m_pLobby
->MemGetPtr(pTask
->paramsMem
[LOBBYUI_PARAM_GETCONSUMABLEOFFERS_RESULTS
]);
1760 for (uint32 i
= 0; i
< offercount
; ++i
)
1762 const sce::Json::Value
& offerObj
= root
[i
];
1763 if (offerObj
.getType() == sce::Json::kValueTypeObject
)
1765 const sce::Json::Value
& offerId
= offerObj
["label"];
1766 const sce::Json::Value
& offerName
= offerObj
["name"];
1767 const sce::Json::Value
& offerDesc
= offerObj
["long_desc"];
1769 const sce::Json::Value
& skus
= offerObj
["skus"];
1770 if (skus
.getType() == sce::Json::kValueTypeArray
)
1772 const sce::Json::Array
& skusArray
= skus
.getArray();
1773 for (uint32 j
= 0; j
< (uint32
)skusArray
.size(); ++j
)
1775 const sce::Json::Value
& skuObj
= skus
[j
];
1776 if (skuObj
.getType() == sce::Json::kValueTypeObject
)
1778 SCryLobbyConsumableOfferData
* pCurrentOffer
= &pOffers
[pTask
->paramsNum
[LOBBYUI_PARAM_GETCONSUMABLEOFFERS_RESULTS
]];
1779 new(pCurrentOffer
) SCryLobbyConsumableOfferData();
1780 pCurrentOffer
->Clear();
1782 if (offerId
.getType() == sce::Json::kValueTypeString
)
1784 pCurrentOffer
->offerID
.productId
= offerId
.toString().c_str();
1786 if (offerName
.getType() == sce::Json::kValueTypeString
)
1788 pCurrentOffer
->name
= CryStringUtils::UTF8ToWStr(offerName
.toString().c_str());
1790 if (offerDesc
.getType() == sce::Json::kValueTypeString
)
1792 pCurrentOffer
->description
= CryStringUtils::UTF8ToWStr(offerDesc
.toString().c_str());
1795 const sce::Json::Value
& assetId
= skuObj
["label"];
1796 if (assetId
.getType() == sce::Json::kValueTypeString
)
1798 pCurrentOffer
->assetID
= assetId
.toString().c_str();
1799 pCurrentOffer
->offerID
.skuId
= assetId
.toString().c_str();
1801 const sce::Json::Value
& price
= skuObj
["display_price"];
1802 if (price
.getType() == sce::Json::kValueTypeString
)
1804 pCurrentOffer
->price
= CryStringUtils::UTF8ToWStr(price
.toString().c_str());
1806 const sce::Json::Value
& usecount
= skuObj
["use_count"];
1807 if (usecount
.getType() == sce::Json::kValueTypeUInteger
)
1809 pCurrentOffer
->purchaseQuantity
= usecount
.getUInteger();
1812 pTask
->paramsNum
[LOBBYUI_PARAM_GETCONSUMABLEOFFERS_RESULTS
]++;
1819 // All finished - success!
1820 UpdateTaskError(uiTaskID
, eCLE_Success
);
1821 StopTaskRunning(uiTaskID
);
1827 // not an array - fail.
1829 // response data not json
1834 // if we reach here, the json is bad, or we have failed for some uncaught reason
1835 UpdateTaskError(uiTaskID
, eCLE_InternalError
);
1836 StopTaskRunning(uiTaskID
);
1839 void CCryPSNLobbyUI::EndGetConsumableOffers(CryLobbyUITaskID uiTaskID
)
1841 STask
* pTask
= &m_task
[uiTaskID
];
1842 SCryLobbyConsumableOfferData
* pOffers
= NULL
;
1844 if ((pTask
->paramsNum
[LOBBYUI_PARAM_GETCONSUMABLEOFFERS_RESULTS
] > 0) &&
1845 (pTask
->paramsMem
[LOBBYUI_PARAM_GETCONSUMABLEOFFERS_RESULTS
] != TMemInvalidHdl
))
1847 pOffers
= (SCryLobbyConsumableOfferData
*)m_pLobby
->MemGetPtr(pTask
->paramsMem
[LOBBYUI_PARAM_GETCONSUMABLEOFFERS_RESULTS
]);
1850 ((CryLobbyUIGetConsumableOffersCallback
)pTask
->pCb
)(pTask
->lTaskID
, pTask
->error
, pTask
->paramsNum
[LOBBYUI_PARAM_GETCONSUMABLEOFFERS_RESULTS
], pOffers
, pTask
->pCbArg
);
1853 ECryLobbyError
CCryPSNLobbyUI::GetConsumableAssets(uint32 user
, CryLobbyTaskID
* pTaskID
, CryLobbyUIGetConsumableAssetsCallback cb
, void* pCbArg
)
1856 CryLobbyUITaskID uiTaskID
;
1858 ECryLobbyError error
= StartTask(eT_GetConsumableAssets
, false, user
, &uiTaskID
, pTaskID
, CryLobbyInvalidSessionHandle
, (void*)cb
, pCbArg
);
1859 if (error
== eCLE_Success
)
1861 STask
* pTask
= &m_task
[uiTaskID
];
1862 pTask
->paramsNum
[LOBBYUI_PARAM_GETCONSUMABLEASSETS_REQUEST
] = INVALID_WEBAPI_JOB_ID
;
1863 pTask
->paramsNum
[LOBBYUI_PARAM_GETCONSUMABLEASSETS_RESULTS
] = 0;
1865 FROM_GAME_TO_LOBBY(&CCryPSNLobbyUI::StartTaskRunning
, this, uiTaskID
);
1871 void CCryPSNLobbyUI::StartGetConsumableAssets(CryLobbyUITaskID uiTaskID
)
1873 m_pPSNSupport
->ResumeTransitioning(ePSNOS_Online
);
1876 void CCryPSNLobbyUI::TickGetConsumableAssets(CryLobbyUITaskID uiTaskID
)
1878 m_pPSNSupport
->ResumeTransitioning(ePSNOS_Online
);
1879 if (m_pPSNSupport
->HasTransitioningReachedState(ePSNOS_Online
))
1881 STask
* pTask
= &m_task
[uiTaskID
];
1883 pTask
->paramsNum
[LOBBYUI_PARAM_GETCONSUMABLEASSETS_REQUEST
] = m_pPSNSupport
->GetWebApiInterface().AddJob(CCryPSNOrbisWebApiThread::GetEntitlementList
, NULL
);
1884 if (pTask
->paramsNum
[LOBBYUI_PARAM_GETCONSUMABLEASSETS_REQUEST
] != INVALID_WEBAPI_JOB_ID
)
1886 StartSubTask(eST_WaitingForConsumableAssetsCallback
, uiTaskID
);
1890 UpdateTaskError(uiTaskID
, eCLE_InternalError
);
1891 StopTaskRunning(uiTaskID
);
1896 void CCryPSNLobbyUI::EventWebApiGetConsumableAssets(CryLobbyUITaskID uiTaskID
, SCryPSNSupportCallbackEventData
& data
)
1898 STask
* pTask
= &m_task
[uiTaskID
];
1899 pTask
->paramsNum
[LOBBYUI_PARAM_GETCONSUMABLEASSETS_RESULTS
] = 0;
1901 if (data
.m_webApiEvent
.m_error
== PSN_OK
)
1903 if (data
.m_webApiEvent
.m_pResponseBody
)
1905 if (data
.m_webApiEvent
.m_pResponseBody
->eType
== SCryPSNWebApiResponseBody::E_JSON
)
1907 const sce::Json::Value
& num_entitlements
= data
.m_webApiEvent
.m_pResponseBody
->jsonTreeRoot
["total_results"];
1908 if (num_entitlements
.getType() == sce::Json::kValueTypeUInteger
)
1910 uint32 entitlementCount
= num_entitlements
.getUInteger();
1911 if (entitlementCount
> 0)
1913 const sce::Json::Value
& entitlements
= data
.m_webApiEvent
.m_pResponseBody
->jsonTreeRoot
["entitlements"];
1914 if (entitlements
.getType() == sce::Json::kValueTypeArray
)
1916 const sce::Json::Array
& entitlementArray
= entitlements
.getArray();
1917 uint32 numAssets
= entitlementArray
.size();
1919 ECryLobbyError error
= CreateTaskParamMem(uiTaskID
, LOBBYUI_PARAM_GETCONSUMABLEASSETS_RESULTS
, NULL
, sizeof(SCryLobbyConsumableAssetData
) * numAssets
);
1920 if (error
== eCLE_Success
)
1922 SCryLobbyConsumableAssetData
* pAssets
= (SCryLobbyConsumableAssetData
*)m_pLobby
->MemGetPtr(pTask
->paramsMem
[LOBBYUI_PARAM_GETCONSUMABLEASSETS_RESULTS
]);
1924 for (uint32 i
= 0; i
< numAssets
; ++i
)
1926 SCryLobbyConsumableAssetData
* pCurrentAsset
= &pAssets
[pTask
->paramsNum
[LOBBYUI_PARAM_GETCONSUMABLEASSETS_RESULTS
]];
1927 new(pCurrentAsset
) SCryLobbyConsumableAssetData();
1929 const sce::Json::Value
& assetObj
= entitlements
[i
];
1930 if (assetObj
.getType() == sce::Json::kValueTypeObject
)
1932 const sce::Json::Value
& assetConsumable
= assetObj
["is_consumable"];
1933 if (assetConsumable
.getType() == sce::Json::kValueTypeBoolean
)
1935 if (assetConsumable
.getBoolean() == true)
1937 const sce::Json::Value
& assetlabel
= assetObj
["id"];
1938 if (assetlabel
.getType() == sce::Json::kValueTypeString
)
1940 pCurrentAsset
->assetID
= assetlabel
.getString().c_str();
1942 const sce::Json::Value
& assetUseLimit
= assetObj
["use_limit"];
1943 if (assetUseLimit
.getType() == sce::Json::kValueTypeUInteger
)
1945 pCurrentAsset
->assetQuantity
= assetUseLimit
.getUInteger();
1948 pTask
->paramsNum
[LOBBYUI_PARAM_GETCONSUMABLEASSETS_RESULTS
]++;
1955 // All finished - success!
1956 UpdateTaskError(uiTaskID
, eCLE_Success
);
1957 StopTaskRunning(uiTaskID
);
1963 // not an array - fail.
1965 // response data not json
1970 // if we reach here, the json is bad, or we have failed for some uncaught reason
1971 UpdateTaskError(uiTaskID
, eCLE_InternalError
);
1972 StopTaskRunning(uiTaskID
);
1975 void CCryPSNLobbyUI::EndGetConsumableAssets(CryLobbyUITaskID uiTaskID
)
1977 STask
* pTask
= &m_task
[uiTaskID
];
1978 SCryLobbyConsumableAssetData
* pAssets
= NULL
;
1980 if ((pTask
->paramsNum
[LOBBYUI_PARAM_GETCONSUMABLEASSETS_RESULTS
] > 0) &&
1981 (pTask
->paramsMem
[LOBBYUI_PARAM_GETCONSUMABLEASSETS_RESULTS
] != TMemInvalidHdl
))
1983 pAssets
= (SCryLobbyConsumableAssetData
*)m_pLobby
->MemGetPtr(pTask
->paramsMem
[LOBBYUI_PARAM_GETCONSUMABLEASSETS_RESULTS
]);
1986 ((CryLobbyUIGetConsumableAssetsCallback
)pTask
->pCb
)(pTask
->lTaskID
, pTask
->error
, pTask
->paramsNum
[LOBBYUI_PARAM_GETCONSUMABLEASSETS_RESULTS
], pAssets
, pTask
->pCbArg
);
1989 ECryLobbyError
CCryPSNLobbyUI::ShowDownloadOffer(uint32 user
, TStoreOfferID offerId
, CryLobbyTaskID
* pTaskID
, CryLobbyUICallback cb
, void* pCbArg
)
1992 CryLobbyUITaskID uiTaskID
;
1994 ECryLobbyError error
= StartTask(eT_ShowDownloadOffer
, false, user
, &uiTaskID
, pTaskID
, CryLobbyInvalidSessionHandle
, (void*)cb
, pCbArg
);
1995 if (error
== eCLE_Success
)
1997 STask
* pTask
= &m_task
[uiTaskID
];
1999 error
= CreateTaskParamMem(uiTaskID
, LOBBYUI_PARAM_SHOWDOWNLOADOFFER_ID
, NULL
, (CRY_LOBBYUI_CONSUMABLE_OFFER_ID_LENGTH
+ 1 + CRY_LOBBYUI_CONSUMABLE_OFFER_SKU_LENGTH
+ 1));
2000 if (error
== eCLE_Success
)
2002 char* pOfferString
= (char*)m_pLobby
->MemGetPtr(pTask
->paramsMem
[LOBBYUI_PARAM_SHOWDOWNLOADOFFER_ID
]);
2003 sprintf(pOfferString
, "%s-%s", offerId
.productId
.c_str(), offerId
.skuId
.c_str());
2005 FROM_GAME_TO_LOBBY(&CCryPSNLobbyUI::StartTaskRunning
, this, uiTaskID
);
2016 void CCryPSNLobbyUI::StartShowDownloadOffer(CryLobbyUITaskID uiTaskID
)
2018 STask
* pTask
= &m_task
[uiTaskID
];
2020 SceUserServiceUserId userId
;
2021 int ret
= sceUserServiceGetInitialUser(&userId
);
2024 ret
= sceNpCommerceDialogInitialize();
2025 if ((ret
== PSN_OK
) || (ret
== SCE_COMMON_DIALOG_ERROR_ALREADY_INITIALIZED
))
2027 const char* pOffer
= (const char*)m_pLobby
->MemGetPtr(pTask
->paramsMem
[LOBBYUI_PARAM_SHOWDOWNLOADOFFER_ID
]);
2029 SceNpCommerceDialogParam param
;
2030 sceNpCommerceDialogParamInitialize(¶m
);
2031 param
.mode
= SCE_NP_COMMERCE_DIALOG_MODE_CHECKOUT
;
2032 param
.userId
= userId
;
2033 param
.targets
= &pOffer
;
2034 param
.numTargets
= 1;
2036 ret
= sceNpCommerceDialogOpen(¶m
);
2039 UpdateTaskError(uiTaskID
, eCLE_Success
);
2043 NetLog("sceNpCommerceDialogOpen failed. ret = 0x%x\n", ret
);
2044 UpdateTaskError(uiTaskID
, eCLE_InternalError
);
2049 NetLog("sceNpCommerceDialogInitialize failed. ret = 0x%x\n", ret
);
2050 UpdateTaskError(uiTaskID
, eCLE_InternalError
);
2051 StopTaskRunning(uiTaskID
);
2056 UpdateTaskError(uiTaskID
, eCLE_InternalError
);
2059 if (pTask
->error
!= eCLE_Success
)
2061 sceNpCommerceDialogTerminate();
2062 StopTaskRunning(uiTaskID
);
2066 void CCryPSNLobbyUI::TickShowDownloadOffer(CryLobbyUITaskID uiTaskID
)
2069 STask
* pTask
= &m_task
[uiTaskID
];
2071 if (pTask
->canceled
)
2073 sceNpCommerceDialogTerminate();
2074 UpdateTaskError(uiTaskID
, eCLE_Success
);
2075 StopTaskRunning(uiTaskID
);
2079 ret
= sceNpCommerceDialogUpdateStatus();
2080 if (ret
== SCE_COMMON_DIALOG_STATUS_FINISHED
)
2083 SceNpCommerceDialogResult result
;
2084 memset(&result
, 0, sizeof(result
));
2086 ret
= sceNpCommerceDialogGetResult(&result
);
2089 case SCE_COMMON_DIALOG_RESULT_OK
:
2090 case SCE_NP_COMMERCE_DIALOG_RESULT_PURCHASED
:
2092 UpdateTaskError(uiTaskID
, eCLE_Success
);
2095 case SCE_COMMON_DIALOG_RESULT_USER_CANCELED
:
2097 UpdateTaskError(uiTaskID
, eCLE_Cancelled
);
2102 UpdateTaskError(uiTaskID
, eCLE_InternalError
);
2107 sceNpCommerceDialogTerminate();
2109 StopTaskRunning(uiTaskID
);
2113 void CCryPSNLobbyUI::EndShowDownloadOffer(CryLobbyUITaskID uiTaskID
)
2115 STask
* pTask
= &m_task
[uiTaskID
];
2116 ((CryLobbyUICallback
)pTask
->pCb
)(pTask
->lTaskID
, pTask
->error
, pTask
->pCbArg
);
2119 ECryLobbyError
CCryPSNLobbyUI::ConsumeAsset(uint32 user
, TStoreAssetID assetID
, uint32 quantity
, CryLobbyTaskID
* pTaskID
, CryLobbyUICallback cb
, void* pCbArg
)
2122 CryLobbyUITaskID uiTaskID
;
2124 ECryLobbyError error
= StartTask(eT_ConsumeAsset
, false, user
, &uiTaskID
, pTaskID
, CryLobbyInvalidSessionHandle
, (void*)cb
, pCbArg
);
2125 if (error
== eCLE_Success
)
2127 STask
* pTask
= &m_task
[uiTaskID
];
2128 pTask
->paramsNum
[LOBBYUI_PARAM_CONSUMEASSET_REQUEST
] = INVALID_WEBAPI_JOB_ID
;
2129 pTask
->paramsNum
[LOBBYUI_PARAM_CONSUMEASSET_RESULTS
] = 0;
2131 error
= CreateTaskParamMem(uiTaskID
, LOBBYUI_PARAM_CONSUMEASSET_REQUEST
, NULL
, sizeof(SCryPSNOrbisWebApiConsumeEntitlementInput
));
2132 if (error
== eCLE_Success
)
2134 SCryPSNOrbisWebApiConsumeEntitlementInput
* pData
= (SCryPSNOrbisWebApiConsumeEntitlementInput
*)m_pLobby
->MemGetPtr(pTask
->paramsMem
[LOBBYUI_PARAM_CONSUMEASSET_REQUEST
]);
2135 new(pData
) SCryPSNOrbisWebApiConsumeEntitlementInput();
2137 pData
->entitlementLabel
= assetID
;
2138 pData
->consumption
= quantity
;
2140 FROM_GAME_TO_LOBBY(&CCryPSNLobbyUI::StartTaskRunning
, this, uiTaskID
);
2151 void CCryPSNLobbyUI::StartConsumeAsset(CryLobbyUITaskID uiTaskID
)
2153 STask
* pTask
= &m_task
[uiTaskID
];
2155 if (pTask
->paramsMem
[LOBBYUI_PARAM_CONSUMEASSET_REQUEST
] != TMemInvalidHdl
)
2157 m_pPSNSupport
->ResumeTransitioning(ePSNOS_Online
);
2161 UpdateTaskError(uiTaskID
, eCLE_OutOfMemory
);
2162 StopTaskRunning(uiTaskID
);
2166 void CCryPSNLobbyUI::TickConsumeAsset(CryLobbyUITaskID uiTaskID
)
2168 m_pPSNSupport
->ResumeTransitioning(ePSNOS_Online
);
2169 if (m_pPSNSupport
->HasTransitioningReachedState(ePSNOS_Online
))
2171 STask
* pTask
= &m_task
[uiTaskID
];
2173 if (pTask
->paramsMem
[LOBBYUI_PARAM_CONSUMEASSET_REQUEST
] != TMemInvalidHdl
)
2175 pTask
->paramsNum
[LOBBYUI_PARAM_CONSUMEASSET_REQUEST
] = m_pPSNSupport
->GetWebApiInterface().AddJob(CCryPSNOrbisWebApiThread::ConsumeEntitlement
, pTask
->paramsMem
[LOBBYUI_PARAM_CONSUMEASSET_REQUEST
]);
2176 if (pTask
->paramsNum
[LOBBYUI_PARAM_CONSUMEASSET_REQUEST
] != INVALID_WEBAPI_JOB_ID
)
2178 StartSubTask(eST_WaitingForConsumeAssetCallback
, uiTaskID
);
2182 UpdateTaskError(uiTaskID
, eCLE_InternalError
);
2183 StopTaskRunning(uiTaskID
);
2188 UpdateTaskError(uiTaskID
, eCLE_OutOfMemory
);
2189 StopTaskRunning(uiTaskID
);
2194 void CCryPSNLobbyUI::EventWebApiConsumeAsset(CryLobbyUITaskID uiTaskID
, SCryPSNSupportCallbackEventData
& data
)
2196 STask
* pTask
= &m_task
[uiTaskID
];
2197 pTask
->paramsNum
[LOBBYUI_PARAM_CONSUMEASSET_RESULTS
] = 0;
2199 if (data
.m_webApiEvent
.m_error
== PSN_OK
)
2201 if (data
.m_webApiEvent
.m_pResponseBody
)
2203 if (data
.m_webApiEvent
.m_pResponseBody
->eType
== SCryPSNWebApiResponseBody::E_JSON
)
2205 const sce::Json::Value
& root
= data
.m_webApiEvent
.m_pResponseBody
->jsonTreeRoot
;
2206 if (root
.getType() == sce::Json::kValueTypeObject
)
2208 const sce::Json::Value
& consumed
= root
["use_limit"];
2209 if (consumed
.getType() == sce::Json::kValueTypeUInteger
)
2211 pTask
->paramsNum
[LOBBYUI_PARAM_CONSUMEASSET_RESULTS
] = consumed
.getUInteger();
2214 // All finished - success!
2215 UpdateTaskError(uiTaskID
, eCLE_Success
);
2216 StopTaskRunning(uiTaskID
);
2219 // not an object - fail.
2221 // response data not json
2226 // if we reach here, the json is bad, or we have failed for some uncaught reason
2227 UpdateTaskError(uiTaskID
, eCLE_InternalError
);
2228 StopTaskRunning(uiTaskID
);
2231 void CCryPSNLobbyUI::EndConsumeAsset(CryLobbyUITaskID uiTaskID
)
2233 STask
* pTask
= &m_task
[uiTaskID
];
2234 SCryLobbyConsumableOfferData
* pOffers
= NULL
;
2236 ((CryLobbyUICallback
)pTask
->pCb
)(pTask
->lTaskID
, pTask
->error
, pTask
->pCbArg
);
2240 #endif // CRY_PLATFORM_ORBIS