#include "stdafx.h" #include "Orbis_NPToolkit.h" #include "Orbis\ps4__np_conf.h" #include "Orbis/Network/SonyCommerce_Orbis.h" // #define NP_TITLE_ID "CUSA00265_00" // #define NP_TITLE_SECRET_HEX "c37e30fa1f7fd29e3534834d62781143ae29aa7b51d02320e7aa0b45116ad600e4d309e8431bc37977d98b8db480e721876e7d736e11fd906778c0033bbb6370903477b1dc1e65106afc62007a5feee3158844d721b88c3f4bff2e56417b6910cedfdec78b130d2e0dd35a35a9e2ae31d5889f9398c1d62b52a3630bb03faa5b" // #define CLIENT_ID_FOR_SAMPLE "c8c483e7-f0b4-420b-877b-307fcb4c3cdc" //#define _USE_STANDARD_ALLOC // Singleton OrbisNPToolkit NPToolkit; sce::Toolkit::NP::Utilities::Future< sce::Toolkit::NP::NpSessionInformation > OrbisNPToolkit::sm_createJoinFuture; sce::Toolkit::NP::NpSessionInformation OrbisNPToolkit::m_currentSessionInfo; sce::Toolkit::NP::Utilities::Future OrbisNPToolkit::m_messageData; void OrbisNPToolkit::presenceCallback( const sce::Toolkit::NP::Event& event ) { switch(event.event) { case sce::Toolkit::NP::Event::presenceSet: app.DebugPrintf("presenceSet Successfully\n"); break; case sce::Toolkit::NP::Event::presenceSetFailed: app.DebugPrintf("presenceSetFailed event received = 0x%x\n", event.returnCode); SQRNetworkManager_Orbis::SetPresenceFailedCallback(); break; default: break; } } void OrbisNPToolkit::coreCallback( const sce::Toolkit::NP::Event& event ) { switch (event.event) { case sce::Toolkit::NP::Event::enetDown: app.DebugPrintf("Online: Received core callback: Network down \n"); ProfileManager.SetNetworkStatus(false); break; case sce::Toolkit::NP::Event::enetUp: app.DebugPrintf("Online: Received core callback: Network up \n"); ProfileManager.SetNetworkStatus(true); break; case sce::Toolkit::NP::Event::loggedIn: app.DebugPrintf("Online: Received core callback: PSN sign in \n"); assert(event.userInformation.state == SCE_NP_STATE_SIGNED_IN); ProfileManager.SignedInPSNStateCallback(event.userInformation.userId, event.userInformation.state, &event.userInformation.npId); break; case sce::Toolkit::NP::Event::loggedOut: app.DebugPrintf("Online: Received core callback: PSN sign out \n"); assert(event.userInformation.state == SCE_NP_STATE_SIGNED_OUT); ProfileManager.SignedInPSNStateCallback(event.userInformation.userId, event.userInformation.state, &event.userInformation.npId); break; default: app.DebugPrintf("Online: Received core callback: event Num: %d \n", event.event); break; } } void OrbisNPToolkit::sceNpToolkitCallback( const sce::Toolkit::NP::Event& event) { switch(event.service) { case sce::Toolkit::NP::ServiceType::core: coreCallback(event); break; // case sce::Toolkit::NP::ServiceType::netInfo: // Menu::NetInfo::sceNpToolkitCallback(event); // break; case sce::Toolkit::NP::ServiceType::sessions: sessionsCallback(event); break; // case sce::Toolkit::NP::ServiceType::tss: // Menu::Tss::sceNpToolkitCallback(event); // break; // case sce::Toolkit::NP::ServiceType::ranking: // Menu::Ranking::sceNpToolkitCallback(event); // break; // case sce::Toolkit::NP::ServiceType::tus: // Menu::Tus::sceNpToolkitCallback(event); // break; // case sce::Toolkit::NP::ServiceType::profile: // Menu::Profile::sceNpToolkitCallback(event); // break; // case sce::Toolkit::NP::ServiceType::friends: // Menu::Friends::sceNpToolkitCallback(event); // break; // case sce::Toolkit::NP::ServiceType::auth: // Menu::Auth::sceNpToolkitCallback(event); // break; case sce::Toolkit::NP::ServiceType::trophy: ProfileManager.trophySystemCallback(event); break; case sce::Toolkit::NP::ServiceType::messaging: messagingCallback(event); break; // case sce::Toolkit::NP::ServiceType::inGameMessage: // Menu::Messaging::sceNpToolkitCallback(event); // break; case sce::Toolkit::NP::ServiceType::commerce: SonyCommerce_Orbis::commerce2Handler(event); break; case sce::Toolkit::NP::ServiceType::presence: presenceCallback(event); break; // case sce::Toolkit::NP::ServiceType::wordFilter: // Menu::WordFilter::sceNpToolkitCallback(event); // break; // case sce::Toolkit::NP::ServiceType::sns: // Menu::Sns::sceNpToolkitCallback(event); // break; case sce::Toolkit::NP::ServiceType::gameCustomData: gameCustomDataCallback(event); default: break; } } void OrbisNPToolkit::sessionsCallback( const sce::Toolkit::NP::Event& event) { switch(event.event) { case sce::Toolkit::NP::Event::npSessionCreateResult: ///< An event generated when the %Np session creation process has been completed. app.DebugPrintf("npSessionCreateResult"); if(sm_createJoinFuture.hasResult()) { app.DebugPrintf("Session Created Successfully\n"); m_currentSessionInfo = *sm_createJoinFuture.get(); } else { app.DebugPrintf("Session Creation Failed 0x%x\n",sm_createJoinFuture.getError()); } sm_createJoinFuture.reset(); break; case sce::Toolkit::NP::Event::npSessionJoinResult: ///< An event generated when the join %Np session process has been completed. app.DebugPrintf("npSessionJoinResult"); if(sm_createJoinFuture.hasResult()) { app.DebugPrintf("Session joined successfully\n"); m_currentSessionInfo = *sm_createJoinFuture.get(); } else { app.DebugPrintf("Session join Failed 0x%x\n",sm_createJoinFuture.getError()); } sm_createJoinFuture.reset(); break; case sce::Toolkit::NP::Event::npSessionError: ///< An event generated when there was error performing the current %Np session process. app.DebugPrintf("npSessionError"); break; case sce::Toolkit::NP::Event::npSessionLeaveResult: ///< An event generated when the user has left the current %Np session. app.DebugPrintf("npSessionLeaveResult"); break; case sce::Toolkit::NP::Event::npSessionModified: ///< An event generated when the %Np session has been modified. app.DebugPrintf("npSessionModified"); break; case sce::Toolkit::NP::Event::npSessionUpdateResult: ///< An event generated when the %Np session has been updated. app.DebugPrintf("npSessionUpdateResult"); break; case sce::Toolkit::NP::Event::npSessionGetInfoResult: ///< An event generated when the %Np session info has been retrieved. app.DebugPrintf("npSessionGetInfoResult"); break; case sce::Toolkit::NP::Event::npSessionGetInfoListResult: ///< An event generated when the %Np session info has been retrieved. app.DebugPrintf("npSessionGetInfoListResult"); break; case sce::Toolkit::NP::Event::npSessionGetSessionDataResult: ///< An event generated when the %Np session data has been retrieved. app.DebugPrintf("npSessionGetSessionDataResult"); break; case sce::Toolkit::NP::Event::npSessionSearchResult: ///< An event generated when the %Np session search request has been completed. app.DebugPrintf("npSessionSearchResult"); break; case sce::Toolkit::NP::Event::npSessionInviteNotification: ///< An event generated when the %Np session push notification is received. app.DebugPrintf("npSessionInviteNotification"); break; case sce::Toolkit::NP::Event::npSessionInviteGetInfoResult: ///< An event generated when the %Np session info has been retrieved. app.DebugPrintf("npSessionInviteGetInfoResult"); break; case sce::Toolkit::NP::Event::npSessionInviteGetInfoListResult: ///< An event generated when the %Np session info has been retrieved. app.DebugPrintf("npSessionInviteGetInfoListResult"); break; case sce::Toolkit::NP::Event::npSessionInviteGetDataResult: ///< An event generated when the %Np session data has been retrieved. app.DebugPrintf("npSessionInviteGetDataResult"); break; default: assert(0); break; } } void OrbisNPToolkit::gameCustomDataCallback( const sce::Toolkit::NP::Event& event) { switch(event.event) { case sce::Toolkit::NP::Event::gameCustomDataItemListResult: app.DebugPrintf("gameCustomDataItemListResult"); break; case sce::Toolkit::NP::Event::gameCustomDataGameDataResult: app.DebugPrintf("gameCustomDataGameDataResult"); if(m_messageData.hasResult()) { SQRNetworkManager_Orbis::GetInviteDataAndProcess(m_messageData.get()); } else { app.DebugPrintf("gameCustomDataMessageResult error 0x%08x\n", m_messageData.getError()); UINT uiIDA[1] = { IDS_OK }; switch(m_messageData.getError()) { case SCE_NP_ERROR_LATEST_PATCH_PKG_EXIST: case SCE_NP_ERROR_LATEST_PATCH_PKG_DOWNLOADED: app.ShowPatchAvailableError(); break; case SCE_NP_ERROR_AGE_RESTRICTION: default: ui.RequestMessageBox(IDS_ONLINE_SERVICE_TITLE, IDS_CONTENT_RESTRICTION, uiIDA, 1); break; } } break; case sce::Toolkit::NP::Event::gameCustomDataMessageResult: app.DebugPrintf("gameCustomDataMessageResult"); break; case sce::Toolkit::NP::Event::gameCustomDataSetUseFlagResult: app.DebugPrintf("gameCustomDataSetUseFlagResult"); break; case sce::Toolkit::NP::Event::gameCustomDataGameThumbnailResult: app.DebugPrintf("gameCustomDataGameThumbnailResult"); break; case sce::Toolkit::NP::Event::messageError: app.DebugPrintf("messageError : 0x%08x\n", event.returnCode); assert(0); break; default: assert(0); break; } } void OrbisNPToolkit::messagingCallback( const sce::Toolkit::NP::Event& event) { switch(event.event) { case sce::Toolkit::NP::Event::messageSent: ///< An event generated when a message has been sent. app.DebugPrintf("sce::Toolkit::NP::Event::messageSent\n"); SQRNetworkManager_Orbis::s_bInviteDialogRunning = false; break; case sce::Toolkit::NP::Event::messageError: ///< An event generated when a message failed to be received or sent. app.DebugPrintf("sce::Toolkit::NP::Event::messageError\n"); SQRNetworkManager_Orbis::s_bInviteDialogRunning = false; break; case sce::Toolkit::NP::Event::messageDialogTerminated: ///< An event generated when a message dialog box is terminated. app.DebugPrintf("sce::Toolkit::NP::Event::messageDialogTerminated\n"); SQRNetworkManager_Orbis::s_bInviteDialogRunning = false; break; //case sce::Toolkit::NP::Event::messageRetrieved: ///< An event generated when a message attachment has been retrieved. //case sce::Toolkit::NP::Event::messageInGameDataReceived: ///< An event generated when in-game data is received. //case sce::Toolkit::NP::Event::messageInGameDataRetrievalDone: ///< An event generated when in-game data retrieval is complete. // case sce::Toolkit::NP::Event::messageAttachmentReceived: ///< An event generated when a message with a data attachment has been received. // case sce::Toolkit::NP::Event::messageAttachmentOpened: ///< An event generated when a message with a data attachment has been opened (and the sysutil GUI is closed). // case sce::Toolkit::NP::Event::messageInviteReceived: ///< An event generated when a message with an invite has been received. // case sce::Toolkit::NP::Event::messageInviteAccepted: ///< An event generated when a message with an invite has been accepted via ToolkitNp (and the sysutil GUI is closed). } } static uint8_t hexCharToUint(char ch) { uint8_t val = 0; if ( isdigit(ch) ){ val = (ch - '0'); } else if ( isupper(ch) ){ val = (ch - 'A' + 10); } else{ val = (ch - 'a' + 10); } return val; } void hexStrToBin( const char *pHexStr, uint8_t *pBinBuf, size_t binBufSize ) { uint8_t val = 0; int hexStrLen = strlen(pHexStr); int binOffset = 0; for (int i = 0; i < hexStrLen; i++) { val |= hexCharToUint(*(pHexStr + i)); if (i % 2 == 0) { val <<= 4; } else { if (pBinBuf != NULL && binOffset < binBufSize) { memcpy(pBinBuf + binOffset, &val, 1); val = 0; } binOffset++; } } if (val != 0 && pBinBuf != NULL && binOffset < binBufSize) { memcpy(pBinBuf + binOffset, &val, 1); } return; } void OrbisNPToolkit::init() { // MenuApp menuApp; sce::Toolkit::NP::NpTitleId nptTitleId; nptTitleId.setTitleSecret(*SQRNetworkManager_Orbis::GetSceNpTitleId(), *SQRNetworkManager_Orbis::GetSceNpTitleSecret()); sce::Toolkit::NP::CommunicationId commsIds(s_npCommunicationId, s_npCommunicationPassphrase, s_npCommunicationSignature); sce::Toolkit::NP::Parameters params(sceNpToolkitCallback,nptTitleId); int ret = sce::Toolkit::NP::Interface::init(params); if (ret != SCE_OK) { app.DebugPrintf("Failed to initialize NP Toolkit Library : 0x%x\n", ret); assert(0); } ret = sce::Toolkit::NP::Interface::registerNpCommsId(commsIds, sce::Toolkit::NP::matching); if (ret < 0) { app.DebugPrintf("Failed to register TSS Comms ID : 0x%x\n", ret); assert(0); } // Get network status and inform library sce::Toolkit::NP::Utilities::Future netStateFuture = sce::Toolkit::NP::Utilities::Future(); sce::Toolkit::NP::NetInfo::Interface::getNetInfo(&netStateFuture); // Wait for the net state (< 5ms) while (netStateFuture.isBusy()) { Sleep(1); } if (netStateFuture.hasResult()) { sce::Toolkit::NP::NetStateBasic *netState = netStateFuture.get(); ProfileManager.SetNetworkStatus(netState->connectionStatus == SCE_NET_CTL_STATE_IPOBTAINED); } else { // Error message means we're disconnected ProfileManager.SetNetworkStatus(false); } // // Register Client ID for Auth // ret = sce::Toolkit::NP::Interface::registerClientId(CLIENT_ID_FOR_SAMPLE); // if (ret < 0) // { // app.DebugPrintf("Failed to register Auth Client ID : 0x%x\n", ret); // assert(0); // } } void OrbisNPToolkit::createNPSession() { #define CURRENT_SESSION_ATTR_NUMS 5 #define SESSION_IMAGE_PATH "/app0/orbis/session_image.png" #define SESSION_STATUS "Minecraft online game (this text needs defined and localised)" #define SESSION_NAME "Minecraft(this text needs defined and localised)" static const int maxSlots = 8; SceUserServiceUserId userId = SCE_USER_SERVICE_USER_ID_INVALID; int ret = sceUserServiceGetInitialUser(&userId); if( ret < 0 ) { app.DebugPrintf("Couldn't retrieve user ID 0x%x ...\n",ret); } sce::Toolkit::NP::CreateNpSessionRequest createSessionRequest; memset(&createSessionRequest,0,sizeof(createSessionRequest)); strncpy(createSessionRequest.sessionName,SESSION_NAME,strlen(SESSION_NAME)); createSessionRequest.sessionTypeFlag = SCE_TOOLKIT_NP_CREATE_SESSION_TYPE_PUBLIC; createSessionRequest.maxSlots = maxSlots; strncpy(createSessionRequest.sessionImgPath,SESSION_IMAGE_PATH,strlen(SESSION_IMAGE_PATH)); strncpy(createSessionRequest.sessionStatus,SESSION_STATUS,strlen(SESSION_STATUS)); createSessionRequest.userInfo.userId = userId; char test[3] = {'R','K','B'}; createSessionRequest.sessionData= test; createSessionRequest.sessionDataSize = 3; ret = sce::Toolkit::NP::Sessions::Interface::create(&createSessionRequest,&sm_createJoinFuture); } void OrbisNPToolkit::joinNPSession() { SceUserServiceUserId userId = SCE_USER_SERVICE_USER_ID_INVALID; int ret = sceUserServiceGetInitialUser(&userId); if( ret < 0 ) { app.DebugPrintf("Couldn't retrieve user ID 0x%x ...\n",ret); } sce::Toolkit::NP::JoinNpSessionRequest joinSessionRequest; memset(&joinSessionRequest,0,sizeof(joinSessionRequest)); // still to sort this out ORBIS_STUBBED; } void OrbisNPToolkit::leaveNPSession() { } void OrbisNPToolkit::getMessageData(SceNpGameCustomDataEventParam* paramData) { sce::Toolkit::NP::GameCustomDataGameDataRequest req; SceUserServiceUserId userId = SCE_USER_SERVICE_USER_ID_INVALID; int ret = sceUserServiceGetInitialUser(&userId); if( ret < 0 ) { //Error handling } req.itemId = paramData->itemId; req.userInfo.userId = userId; ret = sce::Toolkit::NP::GameCustomData::Interface::getGameData(&req, &m_messageData); if( ret < 0 ) { //Error handling } else { //Error handling } // // // sce::Toolkit::NP::GameDataRequest req; // SceUserServiceUserId userId = SCE_USER_SERVICE_USER_ID_INVALID; // int ret = sceUserServiceGetInitialUser(&userId); // if( ret < 0 ) { // //Error handling // } // // req.itemId = ItemID ; // req.userInfo.userId = userId; // sce::Toolkit::NP::Utilities::Future actualMessage; // ret = sce::Toolkit::NP::GameCustomData::Interface::getGameData(&req,&actualMessage,false); // if( ret < 0 ) { // //Error handling // } else { // //Error handling // } // // // // // // // // // app.DebugPrintf("Session Invitation \n"); // sce::Toolkit::NP::ReceiveMessageRequest request; // request.eventParamData = paramData; // request.msgType = SCE_TOOLKIT_NP_MESSAGE_TYPE_CUSTOM_DATA; // sceUserServiceGetInitialUser(&request.userInfo.userId); // sce::Toolkit::NP::Messaging::Interface::retrieveMessageAttachmentFromEvent(&request,&m_messageData); }