gameux: Add partial implementation of IGameStatisticsMgr::GetGameStatistics.

This commit is contained in:
Mariusz Pluciński 2010-09-23 15:37:42 +02:00 committed by Alexandre Julliard
parent 7c798a4a7d
commit 23efe79289
3 changed files with 103 additions and 37 deletions

View File

@ -69,29 +69,9 @@ void GAMEUX_uninitGameData(struct GAMEUX_GAME_DATA *GameData)
/******************************************************************************* /*******************************************************************************
* GAMEUX_buildGameRegistryPath * GAMEUX_buildGameRegistryPath
* *
* Helper function, builds registry path to key, where game's data are stored * Internal helper function. Description available in gameux_private.h file
*
* Parameters:
* installScope [I] the scope which was used in AddGame/InstallGame call
* gameInstanceId [I] game instance GUID. If NULL, then only
* path to scope will be returned
* lpRegistryPath [O] pointer which will receive address to string
* containing expected registry path. Path
* is relative to HKLM registry key. It
* must be freed by calling HeapFree(GetProcessHeap(), 0, ...)
*
* Name of game's registry key always follows patterns below:
* When game is installed for current user only (installScope is GIS_CURRENT_USER):
* HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\
* GameUX\[user's security ID]\[game instance ID]
*
* When game is installed for all users (installScope is GIS_ALL_USERS):
* HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\
* GameUX\Games\[game instance ID]
*
*
*/ */
static HRESULT GAMEUX_buildGameRegistryPath(GAME_INSTALL_SCOPE installScope, HRESULT GAMEUX_buildGameRegistryPath(GAME_INSTALL_SCOPE installScope,
LPCGUID gameInstanceId, LPCGUID gameInstanceId,
LPWSTR* lpRegistryPath) LPWSTR* lpRegistryPath)
{ {
@ -697,20 +677,9 @@ static HRESULT GAMEUX_UpdateGame(LPGUID InstanceID) {
/******************************************************************************* /*******************************************************************************
* GAMEUX_FindGameInstanceId * GAMEUX_FindGameInstanceId
* *
* Helper funtion. Searches for instance identifier of given game in given * Internal helper function. Description available in gameux_private.h file
* installation scope.
*
* Parameters:
* sGDFBinaryPath [I] path to binary containing GDF
* installScope [I] game install scope to search in
* pInstanceId [O] instance identifier of given game
*
* Returns:
* S_OK id was returned properly
* S_FALSE id was not found in the registry
* E_OUTOFMEMORY problem while memory allocation
*/ */
static HRESULT GAMEUX_FindGameInstanceId( HRESULT GAMEUX_FindGameInstanceId(
LPCWSTR sGDFBinaryPath, LPCWSTR sGDFBinaryPath,
GAME_INSTALL_SCOPE installScope, GAME_INSTALL_SCOPE installScope,
GUID* pInstanceId) GUID* pInstanceId)

View File

@ -22,6 +22,7 @@
#include "config.h" #include "config.h"
#include "ole2.h" #include "ole2.h"
#include "winreg.h"
#include "gameux.h" #include "gameux.h"
#include "gameux_private.h" #include "gameux_private.h"
@ -107,8 +108,55 @@ static HRESULT STDMETHODCALLTYPE GameStatisticsMgrImpl_GetGameStatistics(
GAMESTATS_OPEN_RESULT *pOpenResult, GAMESTATS_OPEN_RESULT *pOpenResult,
IGameStatistics **ppiStats) IGameStatistics **ppiStats)
{ {
FIXME("stub (%p, %s, 0x%x, %p, %p)\n", iface, debugstr_w(GDFBinaryPath), openType, pOpenResult, ppiStats); static const WCHAR sApplicationId[] =
return E_NOTIMPL; {'A','p','p','l','i','c','a','t','i','o','n','I','d',0};
HRESULT hr;
GUID instanceId;
LPWSTR lpRegistryPath = NULL;
WCHAR lpApplicationId[49];
DWORD dwLength = sizeof(lpApplicationId);
GAME_INSTALL_SCOPE installScope;
TRACE("(%p, %s, 0x%x, %p, %p)\n", iface, debugstr_w(GDFBinaryPath), openType, pOpenResult, ppiStats);
if(!GDFBinaryPath)
return E_INVALIDARG;
installScope = GIS_CURRENT_USER;
hr = GAMEUX_FindGameInstanceId(GDFBinaryPath, installScope, &instanceId);
if(hr == S_FALSE)
{
installScope = GIS_ALL_USERS;
hr = GAMEUX_FindGameInstanceId(GDFBinaryPath, installScope, &instanceId);
}
if(hr == S_FALSE)
/* game not registered, so statistics cannot be used */
hr = E_FAIL;
if(SUCCEEDED(hr))
/* game is registered, let's read it's application id from registry */
hr = GAMEUX_buildGameRegistryPath(installScope, &instanceId, &lpRegistryPath);
if(SUCCEEDED(hr))
{
hr = HRESULT_FROM_WIN32(RegGetValueW(HKEY_LOCAL_MACHINE,
lpRegistryPath, sApplicationId, RRF_RT_REG_SZ,
NULL, lpApplicationId, &dwLength));
}
if(SUCCEEDED(hr))
{
TRACE("found app id: %s\n", debugstr_w(lpApplicationId));
FIXME("creating instance of IGameStatistics not yet implemented\n");
hr = E_NOTIMPL;
}
HeapFree(GetProcessHeap(), 0, lpRegistryPath);
return hr;
} }
static HRESULT STDMETHODCALLTYPE GameStatisticsMgrImpl_RemoveGameStatistics( static HRESULT STDMETHODCALLTYPE GameStatisticsMgrImpl_RemoveGameStatistics(

View File

@ -86,3 +86,52 @@ HRESULT WINAPI GAMEUX_RegisterGame(LPCWSTR sGDFBinaryPath,
LPCWSTR sGameInstallDirectory, LPCWSTR sGameInstallDirectory,
GAME_INSTALL_SCOPE installScope, GAME_INSTALL_SCOPE installScope,
GUID *pInstanceID); GUID *pInstanceID);
/*******************************************************************************
* GAMEUX_FindGameInstanceId
*
* Helper funtion. Searches for instance identifier of given game in given
* installation scope. Implemented in gameexplorer.c
*
* Parameters:
* sGDFBinaryPath [I] path to binary containing GDF
* installScope [I] game install scope to search in
* pInstanceId [O] instance identifier of given game
*
* Returns:
* S_OK id was returned properly
* S_FALSE id was not found in the registry
* E_OUTOFMEMORY problem while memory allocation
*/
HRESULT GAMEUX_FindGameInstanceId(
LPCWSTR sGDFBinaryPath,
GAME_INSTALL_SCOPE installScope,
GUID* pInstanceId);
/*******************************************************************************
* GAMEUX_buildGameRegistryPath
*
* Helper function, builds registry path to key, where game's data are stored.
* Implemented in gameexplorer.c
*
* Parameters:
* installScope [I] the scope which was used in AddGame/InstallGame call
* gameInstanceId [I] game instance GUID. If NULL, then only
* path to scope will be returned
* lpRegistryPath [O] pointer which will receive address to string
* containing expected registry path. Path
* is relative to HKLM registry key. It
* must be freed by calling HeapFree(GetProcessHeap(), 0, ...)
*
* Name of game's registry key always follows patterns below:
* When game is installed for current user only (installScope is GIS_CURRENT_USER):
* HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\
* GameUX\[user's security ID]\[game instance ID]
*
* When game is installed for all users (installScope is GIS_ALL_USERS):
* HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\
* GameUX\Games\[game instance ID]
*
*
*/
HRESULT GAMEUX_buildGameRegistryPath(GAME_INSTALL_SCOPE installScope,
LPCGUID gameInstanceId,
LPWSTR* lpRegistryPath);