!I 1937152 from //dev_game_hunt/consoles_candidate: !B Remove allocations of unnecess...
[CRYENGINE.git] / Code / CryPlugins / CryLobby / Module / PSNOrbis / CryPSN2LobbyUI.cpp
blob338e07fa2536a5a4cd17101f09c87c2b650534ee
1 // Copyright 2001-2018 Crytek GmbH / Crytek Group. All rights reserved.
3 #include "StdAfx.h"
5 #if CRY_PLATFORM_ORBIS
7 #include "CryPSN2Lobby.h"
9 #if USE_PSN
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);
51 switch (ecb)
53 case eCE_WebApiEvent:
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;
80 break;
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;
96 break;
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;
112 break;
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);
122 else
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;
131 break;
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);
141 else
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;
150 break;
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);
160 else
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;
169 break;
174 break;
176 case eCE_ErrorEvent:
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));
188 break;
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();
213 if (pLobby != NULL)
215 ICryLobbyService* pLobbyService = pLobby->GetLobbyService(eCLS_Online);
216 if (pLobbyService != NULL)
218 pLobbyUI = pLobbyService->GetLobbyUI();
222 if (pLobbyUI)
224 if (!strcmp(pArgs->GetArg(1), "presence"))
226 // send idle presence
227 SCryLobbyUserData data;
228 data.m_id = 1;
229 data.m_type = eCLUDT_Int32;
230 data.m_int32 = 4;
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"))
266 TStoreOfferID offer;
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";
278 uint32 quantity = 1;
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)
290 int ret;
292 ret = sceSysmoduleLoadModule(SCE_SYSMODULE_NP_PROFILE_DIALOG);
293 if (ret < PSN_OK)
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);
299 if (ret < PSN_OK)
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);
305 if (ret < PSN_OK)
307 NetLog("sceSysmoduleLoadModule(SCE_SYSMODULE_INVITATION_DIALOG) failed. ret = 0x%x\n", ret);
308 return eCLE_InternalError;
310 ret = sceSysmoduleLoadModule(SCE_SYSMODULE_NP_COMMERCE);
311 if (ret < PSN_OK)
313 NetLog("sceSysmoduleLoadModule(SCE_SYSMODULE_NP_COMMERCE) failed. ret = 0x%x\n", ret);
314 return eCLE_InternalError;
317 ret = sceCommonDialogInitialize();
318 if (ret < PSN_OK)
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");
327 return error;
330 ECryLobbyError CCryPSNLobbyUI::Terminate()
332 sceInvitationDialogTerminate();
333 sceNpFriendListDialogTerminate();
334 sceNpProfileDialogTerminate();
335 sceNpCommerceDialogTerminate();
337 int ret = sceSysmoduleUnloadModule(SCE_SYSMODULE_NP_COMMERCE);
338 if (ret < PSN_OK)
340 NetLog("sceSysmoduleUnloadModule(SCE_SYSMODULE_NP_COMMERCE) failed. ret = 0x%x\n", ret);
342 ret = sceSysmoduleUnloadModule(SCE_SYSMODULE_INVITATION_DIALOG);
343 if (ret < PSN_OK)
345 NetLog("sceSysmoduleUnloadModule(SCE_SYSMODULE_INVITATION_DIALOG) failed. ret = 0x%x\n", ret);
347 ret = sceSysmoduleUnloadModule(SCE_SYSMODULE_NP_FRIEND_LIST_DIALOG);
348 if (ret < PSN_OK)
350 NetLog("sceSysmoduleUnloadModule(SCE_SYSMODULE_NP_FRIEND_LIST_DIALOG) failed. ret = 0x%x\n", ret);
352 ret = sceSysmoduleUnloadModule(SCE_SYSMODULE_NP_PROFILE_DIALOG);
353 if (ret < PSN_OK)
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);
373 break;
374 case eT_ShowGameInvite:
375 TickShowGameInvite(i);
376 break;
377 case eT_ShowFriends:
378 TickShowFriends(i);
379 break;
380 case eT_SetRichPresence:
381 TickSetRichPresence(i);
382 break;
383 case eT_AddRecentPlayers:
384 TickAddRecentPlayers(i);
385 break;
386 case eT_AddActivityFeed:
387 TickAddActivityFeed(i);
388 break;
389 case eT_GetConsumableOffers:
390 TickGetConsumableOffers(i);
391 break;
392 case eT_GetConsumableAssets:
393 TickGetConsumableAssets(i);
394 break;
395 case eT_ConsumeAsset:
396 TickConsumeAsset(i);
397 break;
398 case eT_ShowDownloadOffer:
399 TickShowDownloadOffer(i);
400 break;
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);
411 return error;
414 void CCryPSNLobbyUI::StartSubTask(ETask etask, CryLobbyUITaskID sTaskID)
416 STask* pTask = &m_task[sTaskID];
418 pTask->subTask = etask;
421 void CCryPSNLobbyUI::StartTaskRunning(CryLobbyUITaskID uiTaskID)
423 LOBBY_AUTO_LOCK;
425 STask* pTask = &m_task[uiTaskID];
427 if (pTask->used)
429 pTask->running = true;
431 switch (pTask->startedTask)
433 case eT_ShowGamerCard:
434 StartShowGamerCard(uiTaskID);
435 break;
437 case eT_ShowGameInvite:
438 StartShowGameInvite(uiTaskID);
439 break;
441 case eT_ShowFriends:
442 StartShowFriends(uiTaskID);
443 break;
445 case eT_ShowFriendRequest:
446 StartShowFriendRequest(uiTaskID);
447 break;
449 case eT_SetRichPresence:
450 StartSetRichPresence(uiTaskID);
451 break;
453 case eT_ShowOnlineRetailBrowser:
454 StartShowOnlineRetailBrowser(uiTaskID);
455 break;
457 case eT_JoinFriendsGame:
458 StartJoinFriendGame(uiTaskID);
459 break;
461 case eT_ShowMessageList:
462 StartShowMessageList(uiTaskID);
463 break;
465 case eT_AddRecentPlayers:
466 StartAddRecentPlayers(uiTaskID);
467 break;
469 case eT_AddActivityFeed:
470 StartAddActivityFeed(uiTaskID);
471 break;
473 case eT_GetConsumableOffers:
474 StartGetConsumableOffers(uiTaskID);
475 break;
476 case eT_GetConsumableAssets:
477 StartGetConsumableAssets(uiTaskID);
478 break;
479 case eT_ConsumeAsset:
480 StartConsumeAsset(uiTaskID);
481 break;
483 case eT_ShowDownloadOffer:
484 StartShowDownloadOffer(uiTaskID);
485 break;
490 void CCryPSNLobbyUI::EndTask(CryLobbyUITaskID uiTaskID)
492 LOBBY_AUTO_LOCK;
494 STask* pTask = &m_task[uiTaskID];
496 if (pTask->used)
498 if (pTask->pCb)
500 switch (pTask->startedTask)
502 case eT_ShowGamerCard:
503 EndShowGamerCard(uiTaskID);
504 break;
505 case eT_ShowFriends:
506 EndShowFriends(uiTaskID);
507 break;
508 case eT_ShowGameInvite:
509 EndShowGameInvite(uiTaskID);
510 break;
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);
520 break;
522 case eT_CheckOnlineRetailStatus:
523 EndCheckOnlineRetailStatus(uiTaskID);
524 break;
526 case eT_GetConsumableOffers:
527 EndGetConsumableOffers(uiTaskID);
528 break;
529 case eT_GetConsumableAssets:
530 EndGetConsumableAssets(uiTaskID);
531 break;
532 case eT_ConsumeAsset:
533 EndConsumeAsset(uiTaskID);
534 break;
536 case eT_ShowDownloadOffer:
537 EndShowDownloadOffer(uiTaskID);
538 break;
542 if (pTask->error != eCLE_Success)
544 NetLog("[Lobby] LobbyUI EndTask %d (%d) Result %d", pTask->startedTask, pTask->subTask, pTask->error);
547 FreeTask(uiTaskID);
551 void CCryPSNLobbyUI::StopTaskRunning(CryLobbyUITaskID uiTaskID)
553 STask* pTask = &m_task[uiTaskID];
555 if (pTask->used)
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)
564 LOBBY_AUTO_LOCK;
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);
584 else
586 FreeTask(uiTaskID);
590 else
592 error = eCLE_InvalidUser;
595 return error;
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);
605 if (ret == PSN_OK)
607 ret = sceNpProfileDialogInitialize();
608 if ((ret == PSN_OK) || (ret == SCE_COMMON_DIALOG_ERROR_ALREADY_INITIALIZED))
610 SceNpProfileDialogParam param;
611 sceNpProfileDialogParamInitialize(&param);
612 param.mode = SCE_NP_PROFILE_DIALOG_MODE_NORMAL;
613 param.userId = userId;
614 param.targetOnlineId = pNpId->handle;
616 ret = sceNpProfileDialogOpen(&param);
617 if (ret == PSN_OK)
619 UpdateTaskError(uiTaskID, eCLE_Success);
621 else
623 NetLog("sceNpProfileDialogOpen failed. ret = 0x%x\n", ret);
624 UpdateTaskError(uiTaskID, eCLE_InternalError);
627 else
629 NetLog("sceNpProfileDialogInitialize failed. ret = 0x%x\n", ret);
630 UpdateTaskError(uiTaskID, eCLE_InternalError);
631 StopTaskRunning(uiTaskID);
634 else
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];
650 if (pTask->canceled)
652 sceNpProfileDialogTerminate();
653 UpdateTaskError(uiTaskID, eCLE_Success);
654 StopTaskRunning(uiTaskID);
655 return;
658 int ret = sceNpProfileDialogUpdateStatus();
659 if (ret == SCE_COMMON_DIALOG_STATUS_FINISHED)
661 // completed.
662 SceNpProfileDialogResult result;
663 memset(&result, 0, sizeof(result));
665 ret = sceNpProfileDialogGetResult(&result);
666 if (ret == PSN_OK)
668 if (result.result == PSN_OK)
670 UpdateTaskError(uiTaskID, eCLE_Success);
672 else
674 UpdateTaskError(uiTaskID, eCLE_InternalError);
677 else
679 // Error handling
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
698 LOBBY_AUTO_LOCK;
700 ECryLobbyError error = eCLE_Success;
701 CCryMatchMaking* pMatchMaking = (CCryMatchMaking*)m_pLobby->GetMatchMaking();
703 if (pMatchMaking)
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;
719 if (numUserIDs > 0)
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));
732 else
734 error = eCLE_InvalidUser;
735 break;
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);
748 if (id != NULL)
750 memcpy(pSessionId, &(((SCryPSNSessionID*)id.get())->m_sessionId), sizeof(SceNpSessionId));
752 else
754 error = eCLE_InvalidSession;
759 if (error == eCLE_Success)
761 FROM_GAME_TO_LOBBY(&CCryPSNLobbyUI::StartTaskRunning, this, uiTaskID);
763 else
765 FreeTask(uiTaskID);
769 else
771 error = eCLE_InvalidSession;
774 else
776 error = eCLE_ServiceNotSupported;
779 return error;
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;
791 if (numUserIDs > 0)
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);
819 if (ret == PSN_OK)
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(&param);
834 param.userId = userId;
835 param.mode = SCE_INVITATION_DIALOG_MODE_SEND;
836 param.dataParam = &dataParam;
838 ret = sceInvitationDialogOpen(&param);
839 if (ret == PSN_OK)
841 //-- success!
842 NetLog("INVITE OPEN: session %s", pSessionId->data);
843 UpdateTaskError(uiTaskID, eCLE_Success);
845 else
847 UpdateTaskError(uiTaskID, eCLE_InternalError);
850 else
852 NetLog("sceInvitationDialogInitialize failed. ret = 0x%x\n", ret);
853 UpdateTaskError(uiTaskID, eCLE_InternalError);
856 else
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)
871 int ret;
872 STask* pTask = &m_task[uiTaskID];
874 if (pTask->canceled)
876 sceInvitationDialogTerminate();
877 UpdateTaskError(uiTaskID, eCLE_Success);
878 StopTaskRunning(uiTaskID);
879 return;
882 ret = sceInvitationDialogUpdateStatus();
883 if (ret == SCE_COMMON_DIALOG_STATUS_FINISHED)
885 // completed.
886 SceInvitationDialogResult result;
887 memset(&result, 0, sizeof(result));
889 ret = sceInvitationDialogGetResult(&result);
890 if (ret == PSN_OK)
892 if (result.errorCode == PSN_OK)
894 if (result.result == SCE_COMMON_DIALOG_RESULT_OK)
896 NetLog("INVITE SENT");
898 else
900 NetLog("INVITE CANCELLED");
903 else
905 UpdateTaskError(uiTaskID, eCLE_InternalError);
908 else
910 // Error handling
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)
928 LOBBY_AUTO_LOCK;
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);
938 return error;
941 void CCryPSNLobbyUI::StartShowFriends(CryLobbyUITaskID uiTaskID)
943 STask* pTask = &m_task[uiTaskID];
945 SceUserServiceUserId userId;
946 int ret = sceUserServiceGetInitialUser(&userId);
947 if (ret == PSN_OK)
949 ret = sceNpFriendListDialogInitialize();
950 if ((ret == PSN_OK) || (ret == SCE_COMMON_DIALOG_ERROR_ALREADY_INITIALIZED))
952 SceNpFriendListDialogParam param;
953 sceNpFriendListDialogParamInitialize(&param);
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(&param);
959 if (ret == PSN_OK)
961 UpdateTaskError(uiTaskID, eCLE_Success);
963 else
965 NetLog("sceNpFriendListDialogOpen failed. ret = 0x%x\n", ret);
966 UpdateTaskError(uiTaskID, eCLE_InternalError);
969 else
971 NetLog("sceNpFriendListDialogInitialize failed. ret = 0x%x\n", ret);
972 UpdateTaskError(uiTaskID, eCLE_InternalError);
973 StopTaskRunning(uiTaskID);
976 else
978 UpdateTaskError(uiTaskID, eCLE_InternalError);
981 if (pTask->error != eCLE_Success)
983 sceNpFriendListDialogTerminate();
984 StopTaskRunning(uiTaskID);
988 void CCryPSNLobbyUI::TickShowFriends(CryLobbyUITaskID uiTaskID)
990 int ret;
991 STask* pTask = &m_task[uiTaskID];
993 if (pTask->canceled)
995 sceNpFriendListDialogTerminate();
996 UpdateTaskError(uiTaskID, eCLE_Success);
997 StopTaskRunning(uiTaskID);
998 return;
1001 ret = sceNpFriendListDialogUpdateStatus();
1002 if (ret == SCE_COMMON_DIALOG_STATUS_FINISHED)
1004 // completed.
1005 SceNpFriendListDialogResult result;
1006 memset(&result, 0, sizeof(result));
1008 ret = sceNpFriendListDialogGetResult(&result);
1009 if (ret == PSN_OK)
1011 if (result.result == PSN_OK)
1013 UpdateTaskError(uiTaskID, eCLE_Success);
1015 else
1017 UpdateTaskError(uiTaskID, eCLE_InternalError);
1020 else
1022 // Error handling
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)
1040 LOBBY_AUTO_LOCK;
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);
1058 else
1060 FreeTask(uiTaskID);
1064 else
1066 error = eCLE_InvalidUser;
1069 return error;
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;
1112 msg.npids = pNpId;
1113 msg.count = 1;
1114 msg.subject = subject;
1115 msg.body = body;
1116 msg.data = NULL;
1117 msg.size = 0;
1119 int ret = sceNpBasicSendMessageGui(&msg, SYS_MEMORY_CONTAINER_ID_INVALID);
1120 if (ret == 0)
1122 //-- success!
1123 UpdateTaskError(uiTaskID, eCLE_Success);
1125 else
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)
1136 LOBBY_AUTO_LOCK;
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);
1175 else
1177 error = eCLE_InvalidRequest;
1178 FreeTask(uiTaskID);
1181 else
1183 FreeTask(uiTaskID);
1187 else
1189 error = eCLE_InvalidParam;
1192 return error;
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);
1207 else
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);
1230 else
1232 UpdateTaskError(uiTaskID, eCLE_InternalError);
1233 StopTaskRunning(uiTaskID);
1236 else
1238 UpdateTaskError(uiTaskID, eCLE_OutOfMemory);
1239 StopTaskRunning(uiTaskID);
1242 else
1244 UpdateTaskError(uiTaskID, eCLE_Success);
1245 StopTaskRunning(uiTaskID);
1249 ECryLobbyError CCryPSNLobbyUI::ShowOnlineRetailBrowser(uint32 user, CryLobbyTaskID* pTaskID, CryLobbyUICallback cb, void* pCbArg)
1251 LOBBY_AUTO_LOCK;
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);
1260 return error;
1263 void CCryPSNLobbyUI::StartShowOnlineRetailBrowser(CryLobbyUITaskID uiTaskID)
1265 StopTaskRunning(uiTaskID);
1268 ECryLobbyError CCryPSNLobbyUI::CheckOnlineRetailStatus(uint32 user, CryLobbyTaskID* pTaskID, CryLobbyUIOnlineRetailStatusCallback cb, void* pCbArg)
1270 LOBBY_AUTO_LOCK;
1272 ECryLobbyError error = eCLE_InternalError;
1273 return error;
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
1288 LOBBY_AUTO_LOCK;
1290 ECryLobbyError error = eCLE_Success;
1291 CryLobbyUITaskID uiTaskID;
1293 if (pNpId)
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);
1303 else
1305 FreeTask(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);
1327 if (ret == 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;
1336 if (pSessionInfo)
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);
1344 else
1346 error = eCLE_OutOfMemory;
1349 else
1351 error = eCLE_InvalidJoinFriendData;
1354 else
1356 NetLog("Friend Presence details: error 0x%x returned.", ret);
1357 if (ret == SCE_NP_BASIC_ERROR_BUSY)
1359 error = eCLE_SystemIsBusy;
1361 else
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)
1377 LOBBY_AUTO_LOCK;
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);
1386 return error;
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);
1393 if (ret == 0)
1395 //-- success!
1396 UpdateTaskError(uiTaskID, eCLE_Success);
1398 else
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)
1414 LOBBY_AUTO_LOCK;
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;
1466 jsonRoot.clear();
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);
1479 else
1481 FreeTask(uiTaskID);
1485 return error;
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);
1500 else
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);
1520 else
1522 UpdateTaskError(uiTaskID, eCLE_InternalError);
1523 StopTaskRunning(uiTaskID);
1526 else
1528 UpdateTaskError(uiTaskID, eCLE_OutOfMemory);
1529 StopTaskRunning(uiTaskID);
1532 else
1534 UpdateTaskError(uiTaskID, eCLE_Success);
1535 StopTaskRunning(uiTaskID);
1539 ECryLobbyError CCryPSNLobbyUI::AddActivityFeed(uint32 user, CryLobbyTaskID* pTaskID, CryLobbyUICallback cb, void* pCbArg)
1541 LOBBY_AUTO_LOCK;
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);
1568 else
1570 FreeTask(uiTaskID);
1574 return error;
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);
1589 else
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);
1609 else
1611 UpdateTaskError(uiTaskID, eCLE_InternalError);
1612 StopTaskRunning(uiTaskID);
1615 else
1617 UpdateTaskError(uiTaskID, eCLE_OutOfMemory);
1618 StopTaskRunning(uiTaskID);
1621 else
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)
1630 LOBBY_AUTO_LOCK;
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)
1654 bFound = true;
1655 break;
1658 if (!bFound)
1660 pData->products[pData->numProducts++].productId = pOfferIDs[i].productId;
1665 if (error == eCLE_Success)
1667 FROM_GAME_TO_LOBBY(&CCryPSNLobbyUI::StartTaskRunning, this, uiTaskID);
1669 else
1671 FreeTask(uiTaskID);
1675 return error;
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);
1686 else
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);
1707 else
1709 UpdateTaskError(uiTaskID, eCLE_InternalError);
1710 StopTaskRunning(uiTaskID);
1713 else
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;
1739 if (offercount > 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);
1822 return;
1825 // nothing in array
1827 // not an array - fail.
1829 // response data not json
1831 // response error
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)
1855 LOBBY_AUTO_LOCK;
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);
1868 return error;
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);
1888 else
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);
1958 return;
1961 // nothing in array
1963 // not an array - fail.
1965 // response data not json
1967 // response error
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)
1991 LOBBY_AUTO_LOCK;
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);
2007 else
2009 FreeTask(uiTaskID);
2013 return error;
2016 void CCryPSNLobbyUI::StartShowDownloadOffer(CryLobbyUITaskID uiTaskID)
2018 STask* pTask = &m_task[uiTaskID];
2020 SceUserServiceUserId userId;
2021 int ret = sceUserServiceGetInitialUser(&userId);
2022 if (ret == PSN_OK)
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(&param);
2031 param.mode = SCE_NP_COMMERCE_DIALOG_MODE_CHECKOUT;
2032 param.userId = userId;
2033 param.targets = &pOffer;
2034 param.numTargets = 1;
2036 ret = sceNpCommerceDialogOpen(&param);
2037 if (ret == PSN_OK)
2039 UpdateTaskError(uiTaskID, eCLE_Success);
2041 else
2043 NetLog("sceNpCommerceDialogOpen failed. ret = 0x%x\n", ret);
2044 UpdateTaskError(uiTaskID, eCLE_InternalError);
2047 else
2049 NetLog("sceNpCommerceDialogInitialize failed. ret = 0x%x\n", ret);
2050 UpdateTaskError(uiTaskID, eCLE_InternalError);
2051 StopTaskRunning(uiTaskID);
2054 else
2056 UpdateTaskError(uiTaskID, eCLE_InternalError);
2059 if (pTask->error != eCLE_Success)
2061 sceNpCommerceDialogTerminate();
2062 StopTaskRunning(uiTaskID);
2066 void CCryPSNLobbyUI::TickShowDownloadOffer(CryLobbyUITaskID uiTaskID)
2068 int ret;
2069 STask* pTask = &m_task[uiTaskID];
2071 if (pTask->canceled)
2073 sceNpCommerceDialogTerminate();
2074 UpdateTaskError(uiTaskID, eCLE_Success);
2075 StopTaskRunning(uiTaskID);
2076 return;
2079 ret = sceNpCommerceDialogUpdateStatus();
2080 if (ret == SCE_COMMON_DIALOG_STATUS_FINISHED)
2082 // completed.
2083 SceNpCommerceDialogResult result;
2084 memset(&result, 0, sizeof(result));
2086 ret = sceNpCommerceDialogGetResult(&result);
2087 switch (ret)
2089 case SCE_COMMON_DIALOG_RESULT_OK:
2090 case SCE_NP_COMMERCE_DIALOG_RESULT_PURCHASED:
2092 UpdateTaskError(uiTaskID, eCLE_Success);
2094 break;
2095 case SCE_COMMON_DIALOG_RESULT_USER_CANCELED:
2097 UpdateTaskError(uiTaskID, eCLE_Cancelled);
2099 break;
2100 default:
2102 UpdateTaskError(uiTaskID, eCLE_InternalError);
2104 break;
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)
2121 LOBBY_AUTO_LOCK;
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);
2142 else
2144 FreeTask(uiTaskID);
2148 return error;
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);
2159 else
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);
2180 else
2182 UpdateTaskError(uiTaskID, eCLE_InternalError);
2183 StopTaskRunning(uiTaskID);
2186 else
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);
2217 return;
2219 // not an object - fail.
2221 // response data not json
2223 // response error
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);
2239 #endif // USE_PSN
2240 #endif // CRY_PLATFORM_ORBIS