From 356596561c3ef3cf94fe86a01e512a0665c0b870 Mon Sep 17 00:00:00 2001 From: Juan Lang Date: Thu, 18 Dec 2008 14:04:30 -0800 Subject: [PATCH] cryptui: Add an add purpose dialog. --- dlls/cryptui/cryptui_En.rc | 11 +++++++ dlls/cryptui/cryptuires.h | 3 ++ dlls/cryptui/main.c | 59 ++++++++++++++++++++++++++++++++++++++ 3 files changed, 73 insertions(+) diff --git a/dlls/cryptui/cryptui_En.rc b/dlls/cryptui/cryptui_En.rc index 70ed0f1c611..5dcb98a5fa3 100644 --- a/dlls/cryptui/cryptui_En.rc +++ b/dlls/cryptui/cryptui_En.rc @@ -170,3 +170,14 @@ BEGIN 24,100,220,90 PUSHBUTTON "Add &Purpose...", IDC_ADD_PURPOSE,184,194,60,14 END + +IDD_ADD_CERT_PURPOSE DIALOG DISCARDABLE 0,0,200,68 +CAPTION "Add Purpose" +FONT 8, "MS Shell Dlg" +BEGIN + LTEXT "Add the object identifier (OID) for the certificate purpose you wish to add:", + stc1, 6,6,190,28 + EDITTEXT IDC_NEW_PURPOSE, 6,28,190,14, ES_AUTOVSCROLL|ES_MULTILINE|WS_TABSTOP|WS_VSCROLL + PUSHBUTTON "OK", IDOK, 33,48,60,14 + PUSHBUTTON "Cancel", IDCANCEL, 100,48,60,14 +END diff --git a/dlls/cryptui/cryptuires.h b/dlls/cryptui/cryptuires.h index eb26e1506ee..a31153184d5 100644 --- a/dlls/cryptui/cryptuires.h +++ b/dlls/cryptui/cryptuires.h @@ -89,6 +89,7 @@ #define IDD_HIERARCHY 102 #define IDD_USERNOTICE 103 #define IDD_CERT_PROPERTIES_GENERAL 104 +#define IDD_ADD_CERT_PURPOSE 105 #define IDB_SMALL_ICONS 200 #define IDB_CERT 201 @@ -126,4 +127,6 @@ #define IDC_CERTIFICATE_USAGES 2405 #define IDC_ADD_PURPOSE 2406 +#define IDC_NEW_PURPOSE 2500 + #endif /* ndef __CRYPTUIRES_H_ */ diff --git a/dlls/cryptui/main.c b/dlls/cryptui/main.c index dc1c807c784..e26bf558605 100644 --- a/dlls/cryptui/main.c +++ b/dlls/cryptui/main.c @@ -1593,6 +1593,59 @@ static void add_purpose(HWND hwnd, LPCSTR oid) } } +#define MAX_PURPOSE 255 + +static LRESULT CALLBACK add_purpose_dlg_proc(HWND hwnd, UINT msg, + WPARAM wp, LPARAM lp) +{ + LRESULT ret = 0; + char buf[MAX_PURPOSE + 1]; + + switch (msg) + { + case WM_INITDIALOG: + SendMessageW(GetDlgItem(hwnd, IDC_NEW_PURPOSE), EM_SETLIMITTEXT, + MAX_PURPOSE, 0); + ShowScrollBar(GetDlgItem(hwnd, IDC_NEW_PURPOSE), SB_VERT, FALSE); + SetWindowLongPtrW(hwnd, DWLP_USER, lp); + break; + case WM_COMMAND: + switch (HIWORD(wp)) + { + case BN_CLICKED: + switch (LOWORD(wp)) + { + case IDOK: + SendMessageA(GetDlgItem(hwnd, IDC_NEW_PURPOSE), WM_GETTEXT, + sizeof(buf) / sizeof(buf[0]), (LPARAM)buf); + if (!buf[0]) + { + /* An empty purpose is the same as cancelling */ + EndDialog(hwnd, IDCANCEL); + ret = TRUE; + } + else + { + HWND parent = (HWND)GetWindowLongPtrW(hwnd, DWLP_USER); + + FIXME("validate %s\n", debugstr_a(buf)); + add_purpose(parent, buf); + EndDialog(hwnd, wp); + ret = TRUE; + } + break; + case IDCANCEL: + EndDialog(hwnd, wp); + ret = TRUE; + break; + } + break; + } + break; + } + return ret; +} + static WCHAR *get_cert_property_as_string(PCCERT_CONTEXT cert, DWORD prop) { WCHAR *name = NULL; @@ -1862,6 +1915,12 @@ static LRESULT CALLBACK cert_properties_general_dlg_proc(HWND hwnd, UINT msg, case BN_CLICKED: switch (LOWORD(wp)) { + case IDC_ADD_PURPOSE: + if (DialogBoxParamW(hInstance, + MAKEINTRESOURCEW(IDD_ADD_CERT_PURPOSE), hwnd, + add_purpose_dlg_proc, (LPARAM)hwnd) == IDOK) + SendMessageW(GetParent(hwnd), PSM_CHANGED, (WPARAM)hwnd, 0); + break; case IDC_ENABLE_ALL_PURPOSES: case IDC_DISABLE_ALL_PURPOSES: case IDC_ENABLE_SELECTED_PURPOSES: