Module: wine Branch: master Commit: 25a1d80725db5318b949b23533b80e915122a322 URL: http://source.winehq.org/git/wine.git/?a=commit;h=25a1d80725db5318b949b23533...
Author: Detlef Riekenberg wine.dev@web.de Date: Wed Apr 13 05:33:48 2011 +0200
inetcpl: Fill the security listview with zones.
---
dlls/inetcpl.cpl/security.c | 131 +++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 131 insertions(+), 0 deletions(-)
diff --git a/dlls/inetcpl.cpl/security.c b/dlls/inetcpl.cpl/security.c index e853dd0..1aa29a5 100644 --- a/dlls/inetcpl.cpl/security.c +++ b/dlls/inetcpl.cpl/security.c @@ -48,9 +48,90 @@ typedef struct secdlg_data_s { IInternetZoneManager *zone_mgr; DWORD zone_enumerator; DWORD num_zones; + ZONEATTRIBUTES *zone_attr; + DWORD *zones; + HIMAGELIST himages; } secdlg_data;
/********************************************************************* + * add_zone_to_listview [internal] + * + */ +static void add_zone_to_listview(secdlg_data *sd, DWORD *pindex, DWORD zone) +{ + DWORD lv_index = *pindex; + ZONEATTRIBUTES *za = &sd->zone_attr[lv_index]; + LVITEMW lvitem; + HRESULT hr; + INT iconid = 0; + HMODULE hdll = NULL; + WCHAR * ptr; + HICON icon; + + TRACE("item %d (zone %d)\n", lv_index, zone); + + sd->zones[lv_index] = zone; + + memset(&lvitem, 0, sizeof(LVITEMW)); + memset(za, 0, sizeof(ZONEATTRIBUTES)); + za->cbSize = sizeof(ZONEATTRIBUTES); + hr = IInternetZoneManager_GetZoneAttributes(sd->zone_mgr, zone, za); + if (SUCCEEDED(hr)) { + TRACE("displayname: %s\n", debugstr_w(za->szDisplayName)); + TRACE("description: %s\n", debugstr_w(za->szDescription)); + TRACE("minlevel: 0x%x, recommended: 0x%x, current: 0x%x (flags: 0x%x)\n", za->dwTemplateMinLevel, + za->dwTemplateRecommended, za->dwTemplateCurrentLevel, za->dwFlags); + + if (za->dwFlags & ZAFLAGS_NO_UI ) { + TRACE("item %d (zone %d): UI disabled for %s\n", lv_index, zone, debugstr_w(za->szDisplayName)); + return; + } + + lvitem.mask = LVIF_TEXT | LVIF_IMAGE | LVIF_PARAM; + lvitem.iItem = lv_index; + lvitem.iSubItem = 0; + lvitem.pszText = za->szDisplayName; + lvitem.lParam = (LPARAM) zone; + + /* format is "filename.ext#iconid" */ + ptr = StrChrW(za->szIconPath, '#'); + if (ptr) { + *ptr = 0; + ptr++; + iconid = StrToIntW(ptr); + hdll = LoadLibraryExW(za->szIconPath, NULL, LOAD_LIBRARY_AS_DATAFILE); + TRACE("%p: icon #%d from %s\n", hdll, iconid, debugstr_w(za->szIconPath)); + + icon = LoadImageW(hdll, MAKEINTRESOURCEW(iconid), IMAGE_ICON, GetSystemMetrics(SM_CXICON), + GetSystemMetrics(SM_CYICON), LR_SHARED); + + if (!icon) { + FIXME("item %d (zone %d): missing icon #%d in %s\n", lv_index, zone, iconid, debugstr_w(za->szIconPath)); + } + + /* the failure result (NULL) from LoadImageW let ImageList_AddIcon fail + with -1, which is reused in ListView_InsertItemW to disable the image */ + lvitem.iImage = ImageList_AddIcon(sd->himages, icon); + } + else + FIXME("item %d (zone %d): malformed szIconPath %s\n", lv_index, zone, debugstr_w(za->szIconPath)); + + if (ListView_InsertItemW(sd->hlv, &lvitem) >= 0) { + /* activate first item in the listview */ + if (! lv_index) { + lvitem.state = LVIS_FOCUSED | LVIS_SELECTED; + lvitem.stateMask = LVIS_FOCUSED | LVIS_SELECTED; + SendMessageW(sd->hlv, LVM_SETITEMSTATE, 0, (LPARAM) &lvitem); + } + (*pindex)++; + } + FreeLibrary(hdll); + } + else + FIXME("item %d (zone %d): GetZoneAttributes failed with 0x%x\n", lv_index, zone, hr); +} + +/********************************************************************* * security_cleanup_zones [internal] * */ @@ -97,6 +178,13 @@ static INT_PTR security_on_destroy(secdlg_data * sd) { TRACE("(%p)\n", sd);
+ heap_free(sd->zone_attr); + heap_free(sd->zones); + if (sd->himages) { + SendMessageW(sd->hlv, LVM_SETIMAGELIST, LVSIL_NORMAL, 0); + ImageList_Destroy(sd->himages); + } + security_cleanup_zones(sd); SetWindowLongPtrW(sd->hsec, DWLP_USER, 0); heap_free(sd); @@ -113,6 +201,9 @@ static INT_PTR security_on_initdialog(HWND hsec) { secdlg_data *sd; HRESULT hr; + DWORD current_zone; + DWORD lv_index = 0; + DWORD i;
sd = heap_alloc_zero(sizeof(secdlg_data)); SetWindowLongPtrW(hsec, DWLP_USER, (LONG_PTR) sd); @@ -123,6 +214,16 @@ static INT_PTR security_on_initdialog(HWND hsec) sd->hsec = hsec; sd->hlv = GetDlgItem(hsec, IDC_SEC_LISTVIEW);
+ /* Create the image lists for the listview */ + sd->himages = ImageList_Create(GetSystemMetrics(SM_CXICON), GetSystemMetrics(SM_CYICON), ILC_COLOR32 | ILC_MASK, 1, 1); + + TRACE("using imagelist: %p\n", sd->himages); + if (!sd->himages) { + ERR("ImageList_Create failed!\n"); + return FALSE; + } + SendMessageW(sd->hlv, LVM_SETIMAGELIST, LVSIL_NORMAL, (LPARAM)sd->himages); + hr = security_enum_zones(sd); if (FAILED(hr)) { ERR("got 0x%x\n", hr); @@ -131,6 +232,36 @@ static INT_PTR security_on_initdialog(HWND hsec) }
TRACE("found %d zones\n", sd->num_zones); + + /* remember ZONEATTRIBUTES for a listview entry */ + sd->zone_attr = heap_alloc(sizeof(ZONEATTRIBUTES) * sd->num_zones); + if (!sd->zone_attr) { + security_on_destroy(sd); + return FALSE; + } + + /* remember zone number for a listview entry */ + sd->zones = heap_alloc(sizeof(DWORD) * sd->num_zones); + if (!sd->zones) { + security_on_destroy(sd); + return FALSE; + } + + /* use the same order as visible with native inetcpl.cpl */ + add_zone_to_listview(sd, &lv_index, URLZONE_INTERNET); + add_zone_to_listview(sd, &lv_index, URLZONE_INTRANET); + add_zone_to_listview(sd, &lv_index, URLZONE_TRUSTED); + add_zone_to_listview(sd, &lv_index, URLZONE_UNTRUSTED); + + for (i = 0; i < sd->num_zones; i++) + { + hr = IInternetZoneManager_GetZoneAt(sd->zone_mgr, sd->zone_enumerator, i, ¤t_zone); + if (SUCCEEDED(hr) && (current_zone != (DWORD)URLZONE_INVALID)) { + if (!current_zone || (current_zone > URLZONE_UNTRUSTED)) { + add_zone_to_listview(sd, &lv_index, current_zone); + } + } + } return TRUE; }