Mariusz Pluciński : gameux: IGameExplorer:: UpdateGame implementation.
Alexandre Julliard
julliard at winehq.org
Wed Sep 15 18:18:38 CDT 2010
Module: wine
Branch: master
Commit: d02a6ab2b156ea84aeefc7f155acadb3d986d8fe
URL: http://source.winehq.org/git/wine.git/?a=commit;h=d02a6ab2b156ea84aeefc7f155acadb3d986d8fe
Author: Mariusz Pluciński <vshader at gmail.com>
Date: Wed Sep 15 00:51:54 2010 +0200
gameux: IGameExplorer::UpdateGame implementation.
---
dlls/gameux/gameexplorer.c | 143 +++++++++++++++++++++++++++++++++++++++++++-
1 files changed, 141 insertions(+), 2 deletions(-)
diff --git a/dlls/gameux/gameexplorer.c b/dlls/gameux/gameexplorer.c
index aabadcd..2619857 100644
--- a/dlls/gameux/gameexplorer.c
+++ b/dlls/gameux/gameexplorer.c
@@ -110,6 +110,9 @@ static HRESULT GAMEUX_buildGameRegistryPath(GAME_INSTALL_SCOPE installScope,
TRACE("(0x%x, %s, %p)\n", installScope, debugstr_guid(gameInstanceId), lpRegistryPath);
+ /* this will make freeing it easier for user */
+ *lpRegistryPath = NULL;
+
lstrcpyW(sRegistryPath, sGameUxRegistryPath);
lstrcatW(sRegistryPath, sBackslash);
@@ -551,6 +554,143 @@ HRESULT WINAPI GAMEUX_RegisterGame(LPCWSTR sGDFBinaryPath,
return hr;
}
/*******************************************************************************
+ * GAMEUX_IsGameKeyExist
+ *
+ * Helper function, checks if game's registry ath exists in given scope
+ *
+ * Parameters:
+ * installScope [I] scope to search game in
+ * InstanceID [I] game instance identifier
+ * lpRegistryPath [O] place to store address of registry path to
+ * the game. It is filled only if key exists.
+ * It must be freed by HeapFree(GetProcessHeap(), 0, ...)
+ *
+ * Returns:
+ * S_OK key was found properly
+ * S_FALSE key does not exists
+ *
+ */
+static HRESULT GAMEUX_IsGameKeyExist(GAME_INSTALL_SCOPE installScope,
+ LPCGUID InstanceID,
+ LPWSTR* lpRegistryPath) {
+
+ HRESULT hr;
+ HKEY hKey;
+
+ hr = GAMEUX_buildGameRegistryPath(installScope, InstanceID, lpRegistryPath);
+
+ if(SUCCEEDED(hr))
+ hr = HRESULT_FROM_WIN32(RegOpenKeyExW(HKEY_LOCAL_MACHINE, *lpRegistryPath,
+ 0, KEY_WOW64_64KEY, &hKey));
+
+ if(hr == HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND))
+ hr = S_FALSE;
+
+ if(hr == S_OK)
+ RegCloseKey(hKey);
+ else
+ {
+ /* if key does not exist or other error occured, do not return the path */
+ HeapFree(GetProcessHeap(), 0, *lpRegistryPath);
+ *lpRegistryPath = NULL;
+ }
+
+ return hr;
+}
+/*******************************************************************************
+ * GAMEUX_LoadRegistryString
+ *
+ * Helper function, loads string from registry value and allocates buffer for it
+ */
+static HRESULT GAMEUX_LoadRegistryString(HKEY hRootKey,
+ LPCWSTR lpRegistryKey,
+ LPCWSTR lpRegistryValue,
+ LPWSTR* lpValue)
+{
+ HRESULT hr;
+ DWORD dwSize;
+
+ *lpValue = NULL;
+
+ hr = HRESULT_FROM_WIN32(RegGetValueW(hRootKey, lpRegistryKey, lpRegistryValue,
+ RRF_RT_REG_SZ, NULL, NULL, &dwSize));
+
+ if(SUCCEEDED(hr))
+ {
+ *lpValue = HeapAlloc(GetProcessHeap(), 0, dwSize);
+ if(!*lpValue)
+ hr = E_OUTOFMEMORY;
+ }
+
+ if(SUCCEEDED(hr))
+ hr = HRESULT_FROM_WIN32(RegGetValueW(hRootKey, lpRegistryKey, lpRegistryValue,
+ RRF_RT_REG_SZ, NULL, *lpValue, &dwSize));
+
+ return hr;
+}
+/*******************************************************************************
+ * GAMEUX_UpdateGame
+ *
+ * Helper function, updates stored data about game with given InstanceID
+ */
+static HRESULT GAMEUX_UpdateGame(LPGUID InstanceID) {
+ static const WCHAR sConfigGDFBinaryPath[] = {'C','o','n','f','i','g','G','D','F','B','i','n','a','r','y','P','a','t','h',0};
+ static const WCHAR sConfigApplicationPath[] = {'C','o','n','f','i','g','A','p','p','l','i','c','a','t','i','o','n','P','a','t','h',0};
+
+ HRESULT hr;
+ GAME_INSTALL_SCOPE installScope;
+ LPWSTR lpRegistryPath;
+ LPWSTR lpGDFBinaryPath, lpGameInstallDirectory;
+
+ TRACE("(%p)\n", debugstr_guid(InstanceID));
+
+ /* first, check is game exists in CURRENT_USER scope */
+ installScope = GIS_CURRENT_USER;
+ hr = GAMEUX_IsGameKeyExist(installScope, InstanceID, &lpRegistryPath);
+
+ if(hr == S_FALSE)
+ {
+ /* game not found in CURRENT_USER scope, let's check in ALL_USERS */
+ installScope = GIS_ALL_USERS;
+ hr = GAMEUX_IsGameKeyExist(installScope, InstanceID, &lpRegistryPath);
+ }
+
+ if(hr == S_FALSE)
+ /* still not found? let's inform user that game does not exists */
+ hr = HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND);
+
+ if(SUCCEEDED(hr))
+ {
+ /* game found, it's registry path is in lpRegistryPath and install
+ * scope in installScope */
+ TRACE("game found in registry (path %s), updating\n", debugstr_w(lpRegistryPath));
+
+ /* first, read required data about game */
+ hr = GAMEUX_LoadRegistryString(HKEY_LOCAL_MACHINE, lpRegistryPath,
+ sConfigGDFBinaryPath, &lpGDFBinaryPath);
+
+ if(SUCCEEDED(hr))
+ hr = GAMEUX_LoadRegistryString(HKEY_LOCAL_MACHINE, lpRegistryPath,
+ sConfigApplicationPath, &lpGameInstallDirectory);
+
+ /* now remove currently existing registry key */
+ if(SUCCEEDED(hr))
+ hr = GAMEUX_RemoveRegistryRecord(InstanceID);
+
+ /* and add it again, it will cause in reparsing of whole GDF */
+ if(SUCCEEDED(hr))
+ hr = GAMEUX_RegisterGame(lpGDFBinaryPath, lpGameInstallDirectory,
+ installScope, InstanceID);
+
+ HeapFree(GetProcessHeap(), 0, lpGDFBinaryPath);
+ HeapFree(GetProcessHeap(), 0, lpGameInstallDirectory);
+ }
+
+ HeapFree(GetProcessHeap(), 0, lpRegistryPath);
+ TRACE("returning 0x%x\n", hr);
+ return hr;
+}
+/*******************************************************************************
* GameExplorer implementation
*/
@@ -668,8 +808,7 @@ static HRESULT WINAPI GameExplorerImpl_UpdateGame(
GameExplorerImpl *This = impl_from_IGameExplorer(iface);
TRACE("(%p, %s)\n", This, debugstr_guid(&instanceID));
- FIXME("stub\n");
- return E_NOTIMPL;
+ return GAMEUX_UpdateGame(&instanceID);
}
static HRESULT WINAPI GameExplorerImpl_VerifyAccess(
More information about the wine-cvs
mailing list