URLMON: Added GetZoneActionPolicy implementation

Jacek Caban jack at itma.pwr.wroc.pl
Thu Sep 29 13:54:36 CDT 2005


Changelog:
    Added GetZoneActionPolicy implementation
-------------- next part --------------
Index: dlls/urlmon/sec_mgr.c
===================================================================
RCS file: /home/wine/wine/dlls/urlmon/sec_mgr.c,v
retrieving revision 1.10
diff -u -p -r1.10 sec_mgr.c
--- dlls/urlmon/sec_mgr.c	29 Sep 2005 10:30:04 -0000	1.10
+++ dlls/urlmon/sec_mgr.c	29 Sep 2005 18:49:28 -0000
@@ -420,6 +420,46 @@ typedef struct {
     LONG ref;
 } ZoneMgrImpl;
 
+static HRESULT open_zone_key(DWORD zone, HKEY *hkey, URLZONEREG zone_reg)
+{
+    static const WCHAR wszZonesKey[] =
+        {'S','o','f','t','w','a','r','e','\\',
+            'M','i','c','r','o','s','o','f','t','\\',
+            'W','i','n','d','o','w','s','\\',
+            'C','u','r','r','e','n','t','V','e','r','s','i','o','n','\\',
+            'I','n','t','e','r','n','e','t',' ','S','e','t','t','i','n','g','s','\\',
+            'Z','o','n','e','s','\\',0};
+    static const WCHAR wszFormat[] = {'%','s','%','l','d',0};
+
+    WCHAR key_name[sizeof(wszZonesKey)/sizeof(WCHAR)+8];
+    HKEY parent_key;
+    DWORD res;
+
+    switch(zone_reg) {
+    case URLZONEREG_DEFAULT: /* FIXME: TEST */
+    case URLZONEREG_HKCU:
+        parent_key = HKEY_CURRENT_USER;
+        break;
+    case URLZONEREG_HKLM:
+        parent_key = HKEY_LOCAL_MACHINE;
+        break;
+    default:
+        WARN("Unknown URLZONEREG: %d\n", zone_reg);
+        return E_FAIL;
+    };
+
+    wsprintfW(key_name, wszFormat, wszZonesKey, zone);
+
+    res = RegOpenKeyW(parent_key, key_name, hkey);
+
+    if(res != ERROR_SUCCESS) {
+        WARN("RegOpenKey failed\n");
+        return E_INVALIDARG;
+    }
+
+    return S_OK;
+}
+
 /********************************************************************
  *      IInternetZoneManager_QueryInterface
  */
@@ -531,15 +571,41 @@ static HRESULT WINAPI ZoneMgrImpl_SetZon
  *      IInternetZoneManager_GetZoneActionPolicy
  */
 static HRESULT WINAPI ZoneMgrImpl_GetZoneActionPolicy(IInternetZoneManager* iface,
-                                                      DWORD dwZone,
-                                                      DWORD dwAction,
-                                                      BYTE* pPolicy,
-                                                      DWORD cbPolicy,
-                                                      URLZONEREG urlZoneReg)
+        DWORD dwZone, DWORD dwAction, BYTE* pPolicy, DWORD cbPolicy, URLZONEREG urlZoneReg)
 {
-    FIXME("(%p)->(%08lx %08lx %p %08lx %08x) stub\n", iface, dwZone, dwAction, pPolicy,
-                                                       cbPolicy, urlZoneReg);
-    return E_NOTIMPL;
+    WCHAR action[16];
+    HKEY hkey;
+    LONG res;
+    DWORD size = cbPolicy;
+    HRESULT hres;
+
+    static const WCHAR wszFormat[] = {'%','l','X',0};
+
+    TRACE("(%p)->(%ld %08lx %p %ld %d)\n", iface, dwZone, dwAction, pPolicy,
+            cbPolicy, urlZoneReg);
+
+    if(!pPolicy)
+        return E_INVALIDARG;
+
+    hres = open_zone_key(dwZone, &hkey, urlZoneReg);
+    if(FAILED(hres))
+        return hres;
+
+    wsprintfW(action, wszFormat, dwAction);
+
+    res = RegQueryValueExW(hkey, action, NULL, NULL, pPolicy, &size);
+    if(res == ERROR_MORE_DATA) {
+        hres = E_INVALIDARG;
+    }else if(res == ERROR_FILE_NOT_FOUND) {
+        hres = E_FAIL;
+    }else if(res != ERROR_SUCCESS) {
+        ERR("RegQueryValue failed: %ld\n", res);
+        hres = E_UNEXPECTED;
+    }
+
+    RegCloseKey(hkey);
+
+    return hres;
 }
 
 /********************************************************************
Index: dlls/urlmon/tests/misc.c
===================================================================
RCS file: /home/wine/wine/dlls/urlmon/tests/misc.c,v
retrieving revision 1.7
diff -u -p -r1.7 misc.c
--- dlls/urlmon/tests/misc.c	29 Sep 2005 10:30:04 -0000	1.7
+++ dlls/urlmon/tests/misc.c	29 Sep 2005 18:49:28 -0000
@@ -451,6 +451,41 @@ static void test_SecurityManager(void)
     IInternetSecurityManager_Release(secmgr);
 }
 
+static void test_ZoneManager(void)
+{
+    IInternetZoneManager *zonemgr = NULL;
+    BYTE buf[32];
+    HRESULT hres;
+
+    hres = CoInternetCreateZoneManager(NULL, &zonemgr, 0);
+    ok(hres == S_OK, "CoInternetCreateZoneManager failed: %08lx\n", hres);
+    if(FAILED(hres))
+        return;
+
+    hres = IInternetZoneManager_GetZoneActionPolicy(zonemgr, 3, 0x1a10, buf,
+            sizeof(DWORD), URLZONEREG_DEFAULT);
+    ok(hres == S_OK, "GetZoneActionPolicy failed: %08lx\n", hres);
+    ok(*(DWORD*)buf == 1, "policy=%ld, expected 1\n", *(DWORD*)buf);
+
+    hres = IInternetZoneManager_GetZoneActionPolicy(zonemgr, 3, 0x1a10, NULL,
+            sizeof(DWORD), URLZONEREG_DEFAULT);
+    ok(hres == E_INVALIDARG, "GetZoneActionPolicy failed: %08lx, expected E_INVALIDARG\n", hres);
+
+    hres = IInternetZoneManager_GetZoneActionPolicy(zonemgr, 3, 0x1a10, buf,
+            2, URLZONEREG_DEFAULT);
+    ok(hres == E_INVALIDARG, "GetZoneActionPolicy failed: %08lx, expected E_INVALIDARG\n", hres);
+
+    hres = IInternetZoneManager_GetZoneActionPolicy(zonemgr, 3, 0x1fff, buf,
+            sizeof(DWORD), URLZONEREG_DEFAULT);
+    ok(hres == E_FAIL, "GetZoneActionPolicy failed: %08lx, expected E_FAIL\n", hres);
+
+    hres = IInternetZoneManager_GetZoneActionPolicy(zonemgr, 13, 0x1a10, buf,
+            sizeof(DWORD), URLZONEREG_DEFAULT);
+    ok(hres == E_INVALIDARG, "GetZoneActionPolicy failed: %08lx, expected E_INVALIDARG\n", hres);
+
+    IInternetZoneManager_Release(zonemgr);
+}
+
 START_TEST(misc)
 {
     test_CreateFormatEnum();
@@ -458,4 +493,5 @@ START_TEST(misc)
     test_CoInternetParseUrl();
     test_FindMimeFromData();
     test_SecurityManager();
+    test_ZoneManager();
 }


More information about the wine-patches mailing list