void ScoreLoopThread::RequestUserCompletionCallback(void *userData, SC_Error_t completionStatus) {
	/* Get the application from userData argument */
	AppData_t *app = (AppData_t *) userData;

	/* Check completion status */
	if (completionStatus != SC_OK) {
		SC_UserController_Release(app->userController); /* Cleanup Controller */
		HandleError(app, completionStatus);
		return;
	}
	qDebug() << "Done requesting User";

	/* Get the session from the client. */
	SC_Session_h session = SC_Client_GetSession(app->client);

	/* Get the session user from the session. */
	SC_User_h user = SC_Session_GetUser(session);

	/* Write out some user data */
	SC_String_h login = SC_User_GetLogin(user);
	qDebug() << "  User's login:"******"<unknown>");
	SC_String_h email = SC_User_GetEmail(user);
	qDebug() << " User's email: " << (email ? SC_String_GetData(email) : "<unknown>");

	/* We don't need the UserController anymore, so release it */
	SC_UserController_Release(app->userController);

	/* send this to the app so we can save it for future requests */
	emit(instance()->ScoreLoopUserReady(app));

	/* normal signal for emitting the username */
	emit(instance()->RequestUserCompleted(login ? SC_String_GetData(login) : "<unknown>"));
}
void OnlineService::connect()
{
	//printf("onlineservice connect\n"); fflush(stdout);
	assert(has_user_controller == false);
	assert(state == DISCONNECTED);

	SC_Error_t createUserControllerResult = SC_Client_CreateUserController(scoreloop_client, &scoreloop_user_controller, RequestUserControllerCompleted, 0);
	if (createUserControllerResult != SC_OK)
	{
		//printf("SC_Client_CreateUserController failed with code %i\n", createUserControllerResult); fflush(stdout);
		return; // handle error
	}

	has_user_controller = true;

	SC_Error_t loadUserResult = SC_UserController_LoadUser(scoreloop_user_controller);
	if (loadUserResult == SC_OK)
	{
		state = LOAD_USER;
	}
	else
	{
		//printf("SC_UserController_LoadUser failed with code %i\n", loadUserResult); fflush(stdout);
		SC_UserController_Release(scoreloop_user_controller);
		state = DISCONNECTED;
		return; // handle error
	}
	printf("online connect done\n"); fflush(stdout);
}
void OnlineService::disconnect()
{
	if (has_user_controller)
		SC_UserController_Release(scoreloop_user_controller);
	has_user_controller = false;
	state = DISCONNECTED;
}
void OnlineService::userContextLoaded(SC_Error_t status)
{
	//printf("online userContextLoaded\n"); fflush(stdout);
	assert(state == LOAD_USER_CONTEXT);
	if (status != SC_OK)
	{
		if (has_user_controller)
		{
			SC_UserController_Release(scoreloop_user_controller);
			has_user_controller = false;
		}
		state = DISCONNECTED;
		printf("SC_UserController_LoadUserContext failed with code %i\n", status); fflush(stdout);
		return; // handle error
	}

	SC_Session_h session = SC_Client_GetSession(scoreloop_client);

	scoreloop_user = SC_Session_GetUser(session);
	has_user = true;

	SC_Context_h user_context = SC_User_GetContext(scoreloop_user);

	for (int i = 0; i < 5; i++)
	{
		const size_t keysize = 255;
		char key[keysize];
		snprintf(key, keysize, "save000%i.spe", i + 1);
		downloadSaveGame(key);
	}

	// fetch & decode autosave & resume file

	state = CONNECTED;
}
예제 #5
0
CScores::~CScores()
{
	UnLoad();
	if (m_scoresController)
		SC_ScoresController_Release(m_scoresController);
	if (m_scoreController)
		SC_ScoreController_Release(m_scoreController);
	if (m_rankingController)
		SC_RankingController_Release(m_rankingController);
	if (m_userController)
		SC_UserController_Release(m_userController);
}
OnlineService::~OnlineService()
{
	SC_Client_Release(scoreloop_client);
	SCUI_Client_Release(scoreloop_ui_client);

	if (has_user_controller)
		SC_UserController_Release(scoreloop_user_controller);
	has_user_controller = false;

	if (has_user)
		SC_User_Release(scoreloop_user);
	has_user = false;
}
void OnlineService::userLoaded(SC_Error_t status)
{
	//printf("online userLoaded\n"); fflush(stdout);
	assert(state == LOAD_USER);

	if (status != SC_OK)
	{
		if (has_user_controller)
		{
			SC_UserController_Release(scoreloop_user_controller);
			has_user_controller = false;
		}
		state = DISCONNECTED;
		//printf("SC_UserController_LoadUser failed with code %i\n", status); fflush(stdout);
		return; // handle error
	}

	assert(has_user_controller);

	SC_Error_t loadUserContextResult = SC_UserController_LoadUserContext(scoreloop_user_controller);
	if (loadUserContextResult == SC_OK)
	{
		state = LOAD_USER_CONTEXT;
	}
	else
	{
		// handle
		if (has_user_controller)
		{
			SC_UserController_Release(scoreloop_user_controller);
			has_user_controller = false;
		}
		state = DISCONNECTED;
		//printf("SC_UserController_LoadUserContext failed with code %i\n", loadUserContextResult); fflush(stdout);
		return;
	}
}
void ScoreLoopThread::RequestUser(AppData_t *app) {
	/* Create a UserController */
	SC_Error_t rc = SC_Client_CreateUserController(app->client, &app->userController, RequestUserCompletionCallback, app);
	if (rc != SC_OK) {
		HandleError(app, rc);
		return;
	}

	/* Make the asynchronous request */
	rc = SC_UserController_LoadUser(app->userController);
	if (rc != SC_OK) {
		SC_UserController_Release(app->userController);
		HandleError(app, rc);
		return;
	}
	qDebug() << "Requesting User...";
}