shlwapi/tests: Make the shlwapi tests load on systems < Vista by providing a private implementation of RegDeleteTreeW.
Nicolas Le Cam
niko.lecam at gmail.com
Mon Oct 20 04:43:32 CDT 2008
---
dlls/shlwapi/tests/assoc.c | 79 ++++++++++++++++++++++++++++++++++++++++---
1 files changed, 73 insertions(+), 6 deletions(-)
diff --git a/dlls/shlwapi/tests/assoc.c b/dlls/shlwapi/tests/assoc.c
index 2e383bb..044c890 100644
--- a/dlls/shlwapi/tests/assoc.c
+++ b/dlls/shlwapi/tests/assoc.c
@@ -140,6 +140,73 @@ static void test_getstring_basic(void)
HeapFree(GetProcessHeap(), 0, friendlyName);
}
+/* RegDeleteTreeW from dlls/advapi32/registry.c */
+LSTATUS WINAPI assoc_RegDeleteTreeW(HKEY hKey, LPCWSTR lpszSubKey)
+{
+ LONG ret;
+ DWORD dwMaxSubkeyLen, dwMaxValueLen;
+ DWORD dwMaxLen, dwSize;
+ WCHAR szNameBuf[MAX_PATH], *lpszName = szNameBuf;
+ HKEY hSubKey = hKey;
+
+ if(lpszSubKey)
+ {
+ ret = RegOpenKeyExW(hKey, lpszSubKey, 0, KEY_READ, &hSubKey);
+ if (ret) return ret;
+ }
+
+ /* Get highest length for keys, values */
+ ret = RegQueryInfoKeyW(hSubKey, NULL, NULL, NULL, NULL,
+ &dwMaxSubkeyLen, NULL, NULL, &dwMaxValueLen, NULL, NULL, NULL);
+ if (ret) goto cleanup;
+
+ dwMaxSubkeyLen++;
+ dwMaxValueLen++;
+ dwMaxLen = max(dwMaxSubkeyLen, dwMaxValueLen);
+ if (dwMaxLen > sizeof(szNameBuf)/sizeof(WCHAR))
+ {
+ /* Name too big: alloc a buffer for it */
+ if (!(lpszName = HeapAlloc( GetProcessHeap(), 0, dwMaxLen*sizeof(WCHAR))))
+ {
+ ret = ERROR_NOT_ENOUGH_MEMORY;
+ goto cleanup;
+ }
+ }
+
+
+ /* Recursively delete all the subkeys */
+ while (TRUE)
+ {
+ dwSize = dwMaxLen;
+ if (RegEnumKeyExW(hSubKey, 0, lpszName, &dwSize, NULL,
+ NULL, NULL, NULL)) break;
+
+ ret = assoc_RegDeleteTreeW(hSubKey, lpszName);
+ if (ret) goto cleanup;
+ }
+
+ if (lpszSubKey)
+ ret = RegDeleteKeyW(hKey, lpszSubKey);
+ else
+ while (TRUE)
+ {
+ dwSize = dwMaxLen;
+ if (RegEnumValueW(hKey, 0, lpszName, &dwSize,
+ NULL, NULL, NULL, NULL)) break;
+
+ ret = RegDeleteValueW(hKey, lpszName);
+ if (ret) goto cleanup;
+ }
+
+cleanup:
+ /* Free buffer if allocated */
+ if (lpszName != szNameBuf)
+ HeapFree( GetProcessHeap(), 0, lpszName);
+ if(lpszSubKey)
+ RegCloseKey(hSubKey);
+ return ret;
+}
+
static void test_getstring_no_extra(void)
{
LONG ret;
@@ -171,22 +238,22 @@ static void test_getstring_no_extra(void)
RegCloseKey(hkey);
if (ret != ERROR_SUCCESS)
{
- RegDeleteTreeW(HKEY_CLASSES_ROOT, dotWinetest);
+ assoc_RegDeleteTreeW(HKEY_CLASSES_ROOT, dotWinetest);
skip("failed to set dotWinetest key\n");
}
ret = RegCreateKeyW(HKEY_CLASSES_ROOT, winetestfileAction, &hkey);
if (ret != ERROR_SUCCESS)
{
- RegDeleteTreeW(HKEY_CLASSES_ROOT, dotWinetest);
+ assoc_RegDeleteTreeW(HKEY_CLASSES_ROOT, dotWinetest);
skip("failed to create winetestfileAction key\n");
}
ret = RegSetValueW(hkey, NULL, REG_SZ, action, lstrlenW(action));
RegCloseKey(hkey);
if (ret != ERROR_SUCCESS)
{
- RegDeleteTreeW(HKEY_CLASSES_ROOT, dotWinetest);
- RegDeleteTreeW(HKEY_CLASSES_ROOT, winetestfile);
+ assoc_RegDeleteTreeW(HKEY_CLASSES_ROOT, dotWinetest);
+ assoc_RegDeleteTreeW(HKEY_CLASSES_ROOT, winetestfile);
skip("failed to set winetestfileAction key\n");
}
@@ -194,8 +261,8 @@ static void test_getstring_no_extra(void)
buf, &len);
expect_hr(S_OK, hr);
ok(strstrW(buf, action) != NULL, "exe path does not contain notepad\n");
- RegDeleteTreeW(HKEY_CLASSES_ROOT, dotWinetest);
- RegDeleteTreeW(HKEY_CLASSES_ROOT, winetestfile);
+ assoc_RegDeleteTreeW(HKEY_CLASSES_ROOT, dotWinetest);
+ assoc_RegDeleteTreeW(HKEY_CLASSES_ROOT, winetestfile);
}
START_TEST(assoc)
--
1.5.4.3
--=-J6hehVgwvrGugDEE1C4E--
More information about the wine-patches
mailing list