Juan Lang : cryptui: Fix problem with usage checkbox bitmap not being visible after the first time the edit cert properties dialog is shown .

Alexandre Julliard julliard at winehq.org
Sat Dec 20 06:35:00 CST 2008


Module: wine
Branch: master
Commit: dd4e05e3ab834aa7cfebaf00ff29e8583f8fe1b4
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=dd4e05e3ab834aa7cfebaf00ff29e8583f8fe1b4

Author: Juan Lang <juan.lang at gmail.com>
Date:   Fri Dec 19 09:32:25 2008 -0800

cryptui: Fix problem with usage checkbox bitmap not being visible after the first time the edit cert properties dialog is shown.

---

 dlls/cryptui/main.c |   79 +++++++++++++++++++++++++++++++-------------------
 1 files changed, 49 insertions(+), 30 deletions(-)

diff --git a/dlls/cryptui/main.c b/dlls/cryptui/main.c
index 169d0cd..82a877f 100644
--- a/dlls/cryptui/main.c
+++ b/dlls/cryptui/main.c
@@ -1157,7 +1157,6 @@ struct detail_data
     BOOL *pfPropertiesChanged;
     int cFields;
     struct field_value_data *fields;
-    HIMAGELIST imageList;
 };
 
 typedef void (*add_fields_func)(HWND hwnd, struct detail_data *data);
@@ -1860,9 +1859,16 @@ static void add_known_usage(HWND lv, PCCRYPT_OID_INFO info)
     SendMessageW(lv, LVM_INSERTITEMW, 0, (LPARAM)&item);
 }
 
-static void show_cert_usages(HWND hwnd, struct detail_data *data)
+struct edit_cert_data
 {
-    PCCERT_CONTEXT cert = data->pCertViewInfo->pCertContext;
+    PCCERT_CONTEXT cert;
+    BOOL *pfPropertiesChanged;
+    HIMAGELIST imageList;
+};
+
+static void show_cert_usages(HWND hwnd, struct edit_cert_data *data)
+{
+    PCCERT_CONTEXT cert = data->cert;
     HWND lv = GetDlgItem(hwnd, IDC_CERTIFICATE_USAGES);
     PCERT_ENHKEY_USAGE usage;
     DWORD size;
@@ -1949,9 +1955,9 @@ static void show_cert_usages(HWND hwnd, struct detail_data *data)
      BM_CLICK, 0, 0);
 }
 
-static void set_general_cert_properties(HWND hwnd, struct detail_data *data)
+static void set_general_cert_properties(HWND hwnd, struct edit_cert_data *data)
 {
-    PCCERT_CONTEXT cert = data->pCertViewInfo->pCertContext;
+    PCCERT_CONTEXT cert = data->cert;
     WCHAR *str;
 
     if ((str = get_cert_property_as_string(cert, CERT_FRIENDLY_NAME_PROP_ID)))
@@ -2021,27 +2027,25 @@ static BOOL CALLBACK refresh_propsheet_pages(HWND hwnd, LPARAM lParam)
 static void apply_general_changes(HWND hwnd)
 {
     WCHAR buf[MAX_DESCRIPTION + 1];
-    struct detail_data *data =
-     (struct detail_data *)GetWindowLongPtrW(hwnd, DWLP_USER);
+    struct edit_cert_data *data =
+     (struct edit_cert_data *)GetWindowLongPtrW(hwnd, DWLP_USER);
 
     SendMessageW(GetDlgItem(hwnd, IDC_FRIENDLY_NAME), WM_GETTEXT,
      sizeof(buf) / sizeof(buf[0]), (LPARAM)buf);
-    set_cert_string_property(data->pCertViewInfo->pCertContext,
-     CERT_FRIENDLY_NAME_PROP_ID, buf);
+    set_cert_string_property(data->cert, CERT_FRIENDLY_NAME_PROP_ID, buf);
     SendMessageW(GetDlgItem(hwnd, IDC_DESCRIPTION), WM_GETTEXT,
      sizeof(buf) / sizeof(buf[0]), (LPARAM)buf);
-    set_cert_string_property(data->pCertViewInfo->pCertContext,
-     CERT_DESCRIPTION_PROP_ID, buf);
+    set_cert_string_property(data->cert, CERT_DESCRIPTION_PROP_ID, buf);
     if (IsDlgButtonChecked(hwnd, IDC_ENABLE_ALL_PURPOSES))
     {
         /* Setting a NULL usage removes the enhanced key usage property. */
-        CertSetEnhancedKeyUsage(data->pCertViewInfo->pCertContext, NULL);
+        CertSetEnhancedKeyUsage(data->cert, NULL);
     }
     else if (IsDlgButtonChecked(hwnd, IDC_DISABLE_ALL_PURPOSES))
     {
         CERT_ENHKEY_USAGE usage = { 0, NULL };
 
-        CertSetEnhancedKeyUsage(data->pCertViewInfo->pCertContext, &usage);
+        CertSetEnhancedKeyUsage(data->cert, &usage);
     }
     else if (IsDlgButtonChecked(hwnd, IDC_ENABLE_SELECTED_PURPOSES))
     {
@@ -2078,7 +2082,7 @@ static void apply_general_changes(HWND hwnd)
                 }
             }
         }
-        CertSetEnhancedKeyUsage(data->pCertViewInfo->pCertContext, &usage);
+        CertSetEnhancedKeyUsage(data->cert, &usage);
         HeapFree(GetProcessHeap(), 0, usage.rgpszUsageIdentifier);
     }
     EnumChildWindows(GetParent(GetParent(hwnd)), refresh_propsheet_pages, 0);
@@ -2090,7 +2094,6 @@ static LRESULT CALLBACK cert_properties_general_dlg_proc(HWND hwnd, UINT msg,
  WPARAM wp, LPARAM lp)
 {
     PROPSHEETPAGEW *page;
-    struct detail_data *data;
 
     TRACE("(%p, %08x, %08lx, %08lx)\n", hwnd, msg, wp, lp);
 
@@ -2099,15 +2102,36 @@ static LRESULT CALLBACK cert_properties_general_dlg_proc(HWND hwnd, UINT msg,
     case WM_INITDIALOG:
     {
         HWND description = GetDlgItem(hwnd, IDC_DESCRIPTION);
+        struct detail_data *detailData;
+        struct edit_cert_data *editData;
 
         page = (PROPSHEETPAGEW *)lp;
-        data = (struct detail_data *)page->lParam;
+        detailData = (struct detail_data *)page->lParam;
         SendMessageW(GetDlgItem(hwnd, IDC_FRIENDLY_NAME), EM_SETLIMITTEXT,
          MAX_FRIENDLY_NAME, 0);
         SendMessageW(description, EM_SETLIMITTEXT, MAX_DESCRIPTION, 0);
         ShowScrollBar(description, SB_VERT, FALSE);
-        set_general_cert_properties(hwnd, data);
-        SetWindowLongPtrW(hwnd, DWLP_USER, (LPARAM)data);
+        editData = HeapAlloc(GetProcessHeap(), 0,
+         sizeof(struct edit_cert_data));
+        if (editData)
+        {
+            editData->imageList = ImageList_Create(16, 16,
+             ILC_COLOR4 | ILC_MASK, 4, 0);
+            if (editData->imageList)
+            {
+                HBITMAP bmp;
+                COLORREF backColor = RGB(255, 0, 255);
+
+                bmp = LoadBitmapW(hInstance, MAKEINTRESOURCEW(IDB_CHECKS));
+                ImageList_AddMasked(editData->imageList, bmp, backColor);
+                DeleteObject(bmp);
+                ImageList_SetBkColor(editData->imageList, CLR_NONE);
+            }
+            editData->cert = detailData->pCertViewInfo->pCertContext;
+            editData->pfPropertiesChanged = detailData->pfPropertiesChanged;
+            SetWindowLongPtrW(hwnd, DWLP_USER, (LPARAM)editData);
+            set_general_cert_properties(hwnd, editData);
+        }
         break;
     }
     case WM_NOTIFY:
@@ -2172,6 +2196,7 @@ static UINT CALLBACK cert_properties_general_callback(HWND hwnd, UINT msg,
 {
     HWND lv;
     int cItem, i;
+    struct edit_cert_data *data;
 
     switch (msg)
     {
@@ -2196,6 +2221,12 @@ static UINT CALLBACK cert_properties_general_callback(HWND hwnd, UINT msg,
                 }
             }
         }
+        data = (struct edit_cert_data *)GetWindowLongPtrW(hwnd, DWLP_USER);
+        if (data)
+        {
+            ImageList_Destroy(data->imageList);
+            HeapFree(GetProcessHeap(), 0, data);
+        }
         break;
     }
     return 1;
@@ -2359,7 +2390,6 @@ static UINT CALLBACK detail_callback(HWND hwnd, UINT msg,
     case PSPCB_RELEASE:
         data = (struct detail_data *)page->lParam;
         free_detail_fields(data);
-        ImageList_Destroy(data->imageList);
         HeapFree(GetProcessHeap(), 0, data);
         break;
     }
@@ -2379,17 +2409,6 @@ static BOOL init_detail_page(PCCRYPTUI_VIEWCERTIFICATE_STRUCTW pCertViewInfo,
         data->pfPropertiesChanged = pfPropertiesChanged;
         data->cFields = 0;
         data->fields = NULL;
-        data->imageList = ImageList_Create(16, 16, ILC_COLOR4 | ILC_MASK, 4, 0);
-        if (data->imageList)
-        {
-            HBITMAP bmp;
-            COLORREF backColor = RGB(255, 0, 255);
-
-            bmp = LoadBitmapW(hInstance, MAKEINTRESOURCEW(IDB_CHECKS));
-            ImageList_AddMasked(data->imageList, bmp, backColor);
-            DeleteObject(bmp);
-            ImageList_SetBkColor(data->imageList, CLR_NONE);
-        }
         memset(page, 0, sizeof(PROPSHEETPAGEW));
         page->dwSize = sizeof(PROPSHEETPAGEW);
         page->dwFlags = PSP_USECALLBACK;




More information about the wine-cvs mailing list