Module: wine Branch: master Commit: 7e1372387411bcaacf1cd11868a78a60c3011c55 URL: http://source.winehq.org/git/wine.git/?a=commit;h=7e1372387411bcaacf1cd11868...
Author: Detlef Riekenberg wine.dev@web.de Date: Mon Jun 22 00:39:11 2009 +0200
urlmon: Implement ZoneManager_GetZoneAttributes.
---
dlls/urlmon/sec_mgr.c | 91 +++++++++++++++++++++++++++++++++++++++++++++++- 1 files changed, 89 insertions(+), 2 deletions(-)
diff --git a/dlls/urlmon/sec_mgr.c b/dlls/urlmon/sec_mgr.c index 943b6dd..19286b1 100644 --- a/dlls/urlmon/sec_mgr.c +++ b/dlls/urlmon/sec_mgr.c @@ -29,7 +29,67 @@
WINE_DEFAULT_DEBUG_CHANNEL(urlmon);
+static const WCHAR currentlevelW[] = {'C','u','r','r','e','n','t','L','e','v','e','l',0}; +static const WCHAR descriptionW[] = {'D','e','s','c','r','i','p','t','i','o','n',0}; +static const WCHAR displaynameW[] = {'D','i','s','p','l','a','y','N','a','m','e',0}; static const WCHAR fileW[] = {'f','i','l','e',0}; +static const WCHAR flagsW[] = {'F','l','a','g','s',0}; +static const WCHAR iconW[] = {'I','c','o','n',0}; +static const WCHAR minlevelW[] = {'M','i','n','L','e','v','e','l',0}; +static const WCHAR recommendedlevelW[] = {'R','e','c','o','m','m','e','n','d','e','d', + 'L','e','v','e','l',0}; + +/******************************************************************** + * get_string_from_reg [internal] + * + * helper to get a string from the reg. + * + */ +static void get_string_from_reg(HKEY hcu, HKEY hklm, LPCWSTR name, LPWSTR out, DWORD maxlen) +{ + DWORD type = REG_SZ; + DWORD len = maxlen * sizeof(WCHAR); + DWORD res; + + res = RegQueryValueExW(hcu, name, NULL, &type, (LPBYTE) out, &len); + + if (res && hklm) { + len = maxlen * sizeof(WCHAR); + type = REG_SZ; + res = RegQueryValueExW(hklm, name, NULL, &type, (LPBYTE) out, &len); + } + + if (res) { + TRACE("%s failed: %d\n", debugstr_w(name), res); + *out = '\0'; + } +} + +/******************************************************************** + * get_dword_from_reg [internal] + * + * helper to get a dword from the reg. + * + */ +static void get_dword_from_reg(HKEY hcu, HKEY hklm, LPCWSTR name, LPDWORD out) +{ + DWORD type = REG_DWORD; + DWORD len = sizeof(DWORD); + DWORD res; + + res = RegQueryValueExW(hcu, name, NULL, &type, (LPBYTE) out, &len); + + if (res && hklm) { + len = sizeof(DWORD); + type = REG_DWORD; + res = RegQueryValueExW(hklm, name, NULL, &type, (LPBYTE) out, &len); + } + + if (res) { + TRACE("%s failed: %d\n", debugstr_w(name), res); + *out = 0; + } +}
static HRESULT get_zone_from_reg(LPCWSTR schema, DWORD *zone) { @@ -677,8 +737,35 @@ static HRESULT WINAPI ZoneMgrImpl_GetZoneAttributes(IInternetZoneManager* iface, DWORD dwZone, ZONEATTRIBUTES* pZoneAttributes) { - FIXME("(%p)->(%d %p) stub\n", iface, dwZone, pZoneAttributes); - return E_NOTIMPL; + ZoneMgrImpl* This = (ZoneMgrImpl*)iface; + HRESULT hr; + HKEY hcu; + HKEY hklm = NULL; + + TRACE("(%p)->(%d %p)\n", This, dwZone, pZoneAttributes); + + if (!pZoneAttributes) + return E_INVALIDARG; + + hr = open_zone_key(HKEY_CURRENT_USER, dwZone, &hcu); + if (FAILED(hr)) + return S_OK; /* IE6 and older returned E_FAIL here */ + + hr = open_zone_key(HKEY_LOCAL_MACHINE, dwZone, &hklm); + if (FAILED(hr)) + TRACE("Zone %d not in HKLM\n", dwZone); + + get_string_from_reg(hcu, hklm, displaynameW, pZoneAttributes->szDisplayName, MAX_ZONE_PATH); + get_string_from_reg(hcu, hklm, descriptionW, pZoneAttributes->szDescription, MAX_ZONE_DESCRIPTION); + get_string_from_reg(hcu, hklm, iconW, pZoneAttributes->szIconPath, MAX_ZONE_PATH); + get_dword_from_reg(hcu, hklm, minlevelW, &pZoneAttributes->dwTemplateMinLevel); + get_dword_from_reg(hcu, hklm, currentlevelW, &pZoneAttributes->dwTemplateCurrentLevel); + get_dword_from_reg(hcu, hklm, recommendedlevelW, &pZoneAttributes->dwTemplateRecommended); + get_dword_from_reg(hcu, hklm, flagsW, &pZoneAttributes->dwFlags); + + RegCloseKey(hklm); + RegCloseKey(hcu); + return S_OK; }
/********************************************************************