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