bool CRichPresence::SetRichPresence(ERichPresenceState state) { // don't set rich presence if we don't have a controller yet if(!g_pGame->HasExclusiveControllerIndex()) { CryLog("[Rich Presence] not setting rich presence, no player set"); return true; } CrySessionID sessionID = CrySessionInvalidID; if((m_currentState == state) && GameNetworkUtils::CompareCrySessionId(sessionID, m_currentSessionID)) { if(state != eRPS_InGame || !gEnv->bMultiplayer) { CryLog("[Rich Presence] not setting rich presence state %d multiplayer %d", state, gEnv->bMultiplayer); return true; } } // we are already setting rich presence, so wait until that task has finished if (m_taskID != CryLobbyInvalidTaskID) { CryLog(" already setting rich presence, setting desired state to %d", state); m_desiredState = state; return false; } ICryLobby *pLobby = gEnv->pNetwork->GetLobby(); ICryLobbyService *pLobbyService = pLobby ? pLobby->GetLobbyService(eCLS_Online) : NULL; ICryLobbyUI *pLobbyUI = pLobbyService ? pLobbyService->GetLobbyUI() : NULL; ECryLobbyError error = eCLE_Success; m_pendingSessionID = sessionID; if(pLobbyUI) { uint32 userIndex = g_pGame->GetExclusiveControllerDeviceIndex(); CryLog("[Rich Presence] SetRichPresence %d userIndex %d", state, userIndex); switch(state) { case eRPS_Idle: { SCryLobbyUserData data; data.m_id = RICHPRESENCE_ID; data.m_type = eCLUDT_Int32; data.m_int32 = RICHPRESENCE_IDLE; error = pLobbyUI->SetRichPresence(userIndex, &data, 1, &m_taskID, CRichPresence::SetRichPresenceCallback, this); break; } case eRPS_FrontEnd: { SCryLobbyUserData data; data.m_id = RICHPRESENCE_ID; data.m_type = eCLUDT_Int32; data.m_int32 = RICHPRESENCE_FRONTEND; error = pLobbyUI->SetRichPresence(userIndex, &data, 1, &m_taskID, CRichPresence::SetRichPresenceCallback, this); break; } case eRPS_Lobby: { SCryLobbyUserData data; data.m_id = RICHPRESENCE_ID; data.m_type = eCLUDT_Int32; data.m_int32 = RICHPRESENCE_LOBBY; error = pLobbyUI->SetRichPresence(userIndex, &data, 1, &m_taskID, CRichPresence::SetRichPresenceCallback, this); break; } case eRPS_InGame: { if(gEnv->bMultiplayer) { CGameRules *pGameRules = g_pGame->GetGameRules(); IGameFramework *pGameFramework = g_pGame->GetIGameFramework(); const char *levelName = pGameFramework ? pGameFramework->GetLevelName() : NULL; const char *gameRulesName = pGameRules ? pGameRules->GetEntity()->GetClass()->GetName() : NULL; int32 gameMode = 0; int32 map = 0; if(levelName) { levelName = PathUtil::GetFileName(levelName); TRichPresenceMap::const_iterator iter = m_richPresence.find(levelName); map = (iter == m_richPresence.end()) ? 0 : iter->second; } if(gameRulesName) { TRichPresenceMap::const_iterator iter = m_richPresence.find(gameRulesName); gameMode = (iter == m_richPresence.end()) ? 0 : iter->second; } SCryLobbyUserData data[eRPT_Max]; data[eRPT_String].m_id = RICHPRESENCE_ID; data[eRPT_String].m_type = eCLUDT_Int32; data[eRPT_String].m_int32 = RICHPRESENCE_GAMEPLAY; data[eRPT_Param1].m_id = RICHPRESENCE_GAMEMODES; data[eRPT_Param1].m_type = eCLUDT_Int32; data[eRPT_Param1].m_int32 = gameMode; data[eRPT_Param2].m_id = RICHPRESENCE_MAPS; data[eRPT_Param2].m_type = eCLUDT_Int32; data[eRPT_Param2].m_int32 = map; error = pLobbyUI->SetRichPresence(userIndex, data, 3, &m_taskID, CRichPresence::SetRichPresenceCallback, this); } else { SCryLobbyUserData data; data.m_id = RICHPRESENCE_ID; data.m_type = eCLUDT_Int32; data.m_int32 = RICHPRESENCE_SINGLEPLAYER; error = pLobbyUI->SetRichPresence(userIndex, &data, 1, &m_taskID, CRichPresence::SetRichPresenceCallback, this); } break; } default: CryLog("[RichPresence] SetRichPresence - unknown rich presence %d", state); break; } if(error != eCLE_Success) { // failed to set rich presence, possibly because of too many lobby tasks, store it and try again later m_desiredState = state; m_pendingSessionID = CrySessionInvalidID; CryLog("[Rich Presence] SetRichPresence - Rich presence %s with error code %d", error == eCLE_Success ? "succeeded" : "failed", error); } else { m_pendingState = state; m_desiredState = eRPS_None; CryLog("[Rich Presence] SetRichPresence - Rich presence has been successfully started"); } } #if !defined(_RELEASE) else { error = eCLE_InternalError; CryLog("[Rich Presence] SetRichPresence called but we have no lobby, tried to set state to %d", state); } #endif return (error == eCLE_Success); }
void CAutoTester::WriteResults(TBitfield flags, const string * additionalTestSuiteName, const XmlNodeRef * additionalTestCase) { const int& autotest_enabled = g_pGameCVars->autotest_enabled; if (!autotest_enabled) { return; } //If result generation is skipped, exit early if (autotest_enabled == 2) { if (m_quitWhenDone) { gEnv->pConsole->ExecuteString("quit"); } return; } // test workaround //DesignerWarning(0, "test warning"); // test workaround const char * mapName; string gameRulesName; const char * serverText = ""; const char * dedicatedText = gEnv->IsDedicated() ? "_Dedicated" : ""; CGameRules * rules = g_pGame ? g_pGame->GetGameRules() : NULL; if (rules) { gameRulesName = rules->GetEntity()->GetClass()->GetName(); serverText = gEnv->bServer ? "_Server" : "_Client"; } else { gameRulesName = "FrontEnd"; } if (g_pGame && g_pGame->GetIGameFramework()->GetILevelSystem()->GetCurrentLevel()) { mapName = g_pGame->GetIGameFramework()->GetILevelSystem()->GetCurrentLevel()->GetLevelInfo()->GetName(); } else { mapName = "NoMapLoaded"; } #ifndef _RELEASE CryLogAlways ("CAutoTester::WriteResults(%s): map is '%s', game mode is '%s'", AutoEnum_GetStringFromBitfield(flags, s_writeResultsFlagNames, WriteResultsFlagList_numBits).c_str(), mapName, gameRulesName.c_str()); #endif XmlNodeRef testSuites = GetISystem()->CreateXmlNode("testSuites"); testSuites->setTag("testsuites"); for (TTestSuites::const_iterator it=m_testSuites.begin(); it!=m_testSuites.end(); ++it) { const STestSuite &testSuiteStruct = it->second; int numTests = testSuiteStruct.m_testCases.size(); int numFails = testSuiteStruct.m_numTestCasesFailed; XmlNodeRef testSuite = GetISystem()->CreateXmlNode("AutoTest"); testSuite->setTag("testsuite"); testSuite->setAttr("name", it->first); testSuite->setAttr("LevelName", mapName); testSuite->setAttr("GameRulesName", gameRulesName); if (additionalTestSuiteName && it->first == *additionalTestSuiteName) { CryLog ("Writing additional test case to existing '%s' suite", additionalTestSuiteName->c_str()); ++ numFails; // Assumption here that any additional test data provided is a failure... [TF] ++ numTests; testSuite->addChild(*additionalTestCase); additionalTestSuiteName = NULL; } testSuite->setAttr("tests", numTests); testSuite->setAttr("failures", numFails); testSuite->setAttr("errors", 0); testSuite->setAttr("time", 0); for (size_t i = 0; i < testSuiteStruct.m_testCases.size(); i++) { testSuite->addChild(testSuiteStruct.m_testCases[i]); } testSuites->addChild(testSuite); } if (additionalTestSuiteName) // Still haven't written our additional test case because the suite name didn't match any existing suite... { CryLog ("CAutoTester writing additional test case to unique '%s' suite", additionalTestSuiteName->c_str()); XmlNodeRef testSuite = GetISystem()->CreateXmlNode("AutoTest"); testSuite->setTag("testsuite"); testSuite->setAttr("name", *additionalTestSuiteName); testSuite->setAttr("LevelName", mapName); testSuite->setAttr("GameRulesName", gameRulesName); testSuite->setAttr("tests", 1); testSuite->setAttr("failures", 1); testSuite->setAttr("errors", 0); testSuite->setAttr("time", 0); testSuite->addChild(*additionalTestCase); testSuites->addChild(testSuite); } char mapNameChrs[256]; char gameRulesNameChrs[256]; cry_strncpy(mapNameChrs, mapName, sizeof(mapNameChrs)); cry_strncpy(gameRulesNameChrs, gameRulesName, sizeof(gameRulesNameChrs)); for (int i=0; mapNameChrs[i]; i++) { if (mapNameChrs[i] == '/' || mapNameChrs[i] == ' ') { mapNameChrs[i] = '_'; } } for (int i=0; gameRulesNameChrs[i]; i++) { if (gameRulesNameChrs[i] == '/' || gameRulesNameChrs[i] == ' ') { gameRulesNameChrs[i] = '_'; } } const char * resultsCompleteFailMessage = NULL; if (flags & kWriteResultsFlag_unfinished) { resultsCompleteFailMessage = "Didn't finish all tests!"; } else if (m_testSuites.size() == 0) { resultsCompleteFailMessage = "Ran zero tests!"; } if (resultsCompleteFailMessage || m_writeResultsCompleteTestCasePass) { int numFailures = 0; XmlNodeRef testSuite = GetISystem()->CreateXmlNode("testsuite"); testSuite->setAttr("name", "Are results complete?"); XmlNodeRef unfinishedFailure = GetISystem()->CreateXmlNode("testcase"); if (m_createVerboseFilename) { unfinishedFailure->setAttr("name", string().Format("%s_%s_%s%s%s", m_includeThisInFileName, mapNameChrs, gameRulesNameChrs, dedicatedText, serverText)); } else { unfinishedFailure->setAttr("name", string().Format("%s%s", m_includeThisInFileName, dedicatedText)); } if (resultsCompleteFailMessage) { XmlNodeRef failedCase = GetISystem()->CreateXmlNode("failure"); failedCase->setAttr("type", "Unfinished"); failedCase->setAttr("message", resultsCompleteFailMessage); unfinishedFailure->addChild(failedCase); ++ numFailures; } else { unfinishedFailure->setAttr("status", "run"); } testSuite->setAttr("tests", 1); testSuite->setAttr("errors", 0); testSuite->setAttr("time", 0); testSuite->setAttr("failures", numFailures); testSuite->addChild(unfinishedFailure); testSuites->addChild(testSuite); } string justTheFilename; if (m_createVerboseFilename) { justTheFilename.Format("autotest_%s_%s_%s%s%s.xml", m_includeThisInFileName, mapNameChrs, gameRulesNameChrs, dedicatedText, serverText); // TODO add datestamp if needed } else { // If m_createVerboseFilename is false, then only include things in the filename which WON'T CHANGE between the test starting and ending [TF] justTheFilename.Format("autotest_%s%s.xml", m_includeThisInFileName, dedicatedText); } m_outputPath.Format("../Xml-Reports/%s", justTheFilename.c_str()); #ifndef _RELEASE CryLogAlways ("Outputting test to %s", m_outputPath.c_str()); #endif SaveToValidXmlFile(testSuites, m_outputPath.c_str()); if (flags & kWriteResultsFlag_writeDoneMarkerFile) { XmlNodeRef finished = GetISystem()->CreateXmlNode("Finished"); SaveToValidXmlFile(finished, m_outputPath + ".done"); if (m_quitWhenDone) { gEnv->pConsole->ExecuteString("unload"); gEnv->pConsole->ExecuteString("quit"); } } }