Juan Lang : cryptui: Show certificate status for selected certificate in hierarchy page.

Alexandre Julliard julliard at winehq.org
Thu Dec 18 08:08:43 CST 2008


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

Author: Juan Lang <juan.lang at gmail.com>
Date:   Wed Dec 17 09:01:32 2008 -0800

cryptui: Show certificate status for selected certificate in hierarchy page.

---

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

diff --git a/dlls/cryptui/main.c b/dlls/cryptui/main.c
index 76273a2..cc585f8 100644
--- a/dlls/cryptui/main.c
+++ b/dlls/cryptui/main.c
@@ -1748,6 +1748,59 @@ struct hierarchy_data
     DWORD selectedCert;
 };
 
+static LPARAM index_to_lparam(struct hierarchy_data *data, DWORD index)
+{
+    CRYPT_PROVIDER_SGNR *provSigner = WTHelperGetProvSignerFromChain(
+     (CRYPT_PROVIDER_DATA *)data->pCertViewInfo->u.pCryptProviderData,
+     data->pCertViewInfo->idxSigner, data->pCertViewInfo->fCounterSigner,
+     data->pCertViewInfo->idxCounterSigner);
+
+    /* Takes advantage of the fact that a pointer is 32-bit aligned, and
+     * therefore always even.
+     */
+    if (index == provSigner->csCertChain - 1)
+        return (LPARAM)data;
+    return index << 1 | 1;
+}
+
+static inline DWORD lparam_to_index(struct hierarchy_data *data, LPARAM lp)
+{
+    CRYPT_PROVIDER_SGNR *provSigner = WTHelperGetProvSignerFromChain(
+     (CRYPT_PROVIDER_DATA *)data->pCertViewInfo->u.pCryptProviderData,
+     data->pCertViewInfo->idxSigner, data->pCertViewInfo->fCounterSigner,
+     data->pCertViewInfo->idxCounterSigner);
+
+    if (!(lp & 1))
+        return provSigner->csCertChain - 1;
+    return lp >> 1;
+}
+
+static struct hierarchy_data *get_hierarchy_data_from_tree_item(HWND tree,
+ HTREEITEM hItem)
+{
+    struct hierarchy_data *data = NULL;
+    HTREEITEM root = NULL;
+
+    do {
+        HTREEITEM parent = (HTREEITEM)SendMessageW(tree, TVM_GETNEXTITEM,
+         TVGN_PARENT, (LPARAM)hItem);
+
+        if (!parent)
+            root = hItem;
+        hItem = parent;
+    } while (hItem);
+    if (root)
+    {
+        TVITEMW item;
+
+        item.mask = TVIF_PARAM;
+        item.hItem = root;
+        SendMessageW(tree, TVM_GETITEMW, 0, (LPARAM)&item);
+        data = (struct hierarchy_data *)item.lParam;
+    }
+    return data;
+}
+
 static WCHAR *get_cert_property_as_string(PCCERT_CONTEXT cert, DWORD prop)
 {
     WCHAR *name = NULL;
@@ -1801,7 +1854,7 @@ static void show_cert_chain(HWND hwnd, struct hierarchy_data *data)
             tvis.hParent = parent;
             tvis.hInsertAfter = TVI_LAST;
             tvis.u.item.mask = TVIF_TEXT | TVIF_STATE | TVIF_IMAGE |
-             TVIF_SELECTEDIMAGE;
+             TVIF_SELECTEDIMAGE | TVIF_PARAM;
             tvis.u.item.pszText = name;
             tvis.u.item.state = TVIS_EXPANDED;
             tvis.u.item.stateMask = TVIS_EXPANDED;
@@ -1821,6 +1874,7 @@ static void show_cert_chain(HWND hwnd, struct hierarchy_data *data)
             else
                 tvis.u.item.iImage = 1;
             tvis.u.item.iSelectedImage = tvis.u.item.iImage;
+            tvis.u.item.lParam = index_to_lparam(data, i - 1);
             parent = (HTREEITEM)SendMessageW(tree, TVM_INSERTITEMW, 0,
              (LPARAM)&tvis);
             HeapFree(GetProcessHeap(), 0, name);
@@ -1872,6 +1926,8 @@ static LRESULT CALLBACK hierarchy_dlg_proc(HWND hwnd, UINT msg, WPARAM wp,
 {
     PROPSHEETPAGEW *page;
     struct hierarchy_data *data;
+    HWND tree = GetDlgItem(hwnd, IDC_CERTPATH);
+    DWORD selection;
 
     TRACE("(%p, %08x, %08lx, %08lx)\n", hwnd, msg, wp, lp);
 
@@ -1882,6 +1938,28 @@ static LRESULT CALLBACK hierarchy_dlg_proc(HWND hwnd, UINT msg, WPARAM wp,
         data = (struct hierarchy_data *)page->lParam;
         show_cert_hierarchy(hwnd, data);
         break;
+    case WM_NOTIFY:
+    {
+        NMTREEVIEWW *nm;
+        CRYPT_PROVIDER_SGNR *provSigner;
+
+        nm = (NMTREEVIEWW*)lp;
+        switch (nm->hdr.code)
+        {
+        case TVN_SELCHANGEDW:
+            data = get_hierarchy_data_from_tree_item(tree, nm->itemNew.hItem);
+            selection = lparam_to_index(data, nm->itemNew.lParam);
+            provSigner = WTHelperGetProvSignerFromChain(
+             (CRYPT_PROVIDER_DATA *)data->pCertViewInfo->u.pCryptProviderData,
+             data->pCertViewInfo->idxSigner,
+             data->pCertViewInfo->fCounterSigner,
+             data->pCertViewInfo->idxCounterSigner);
+            set_certificate_status(GetDlgItem(hwnd, IDC_CERTIFICATESTATUSTEXT),
+             &provSigner->pasCertChain[selection]);
+            break;
+        }
+        break;
+    }
     }
     return 0;
 }




More information about the wine-cvs mailing list