Juan Lang : cryptui: Show detailed value of a field when it' s selected in the details page.
Alexandre Julliard
julliard at winehq.org
Thu Dec 18 08:08:42 CST 2008
Module: wine
Branch: master
Commit: bac337e68b561f277606ea01dc833f0a1937e0fc
URL: http://source.winehq.org/git/wine.git/?a=commit;h=bac337e68b561f277606ea01dc833f0a1937e0fc
Author: Juan Lang <juan.lang at gmail.com>
Date: Wed Dec 17 08:54:11 2008 -0800
cryptui: Show detailed value of a field when it's selected in the details page.
---
dlls/cryptui/main.c | 118 +++++++++++++++++++++++++++++++++++++++++++++------
1 files changed, 105 insertions(+), 13 deletions(-)
diff --git a/dlls/cryptui/main.c b/dlls/cryptui/main.c
index 820f501..fbc2b99 100644
--- a/dlls/cryptui/main.c
+++ b/dlls/cryptui/main.c
@@ -1042,11 +1042,37 @@ static WCHAR *field_format_issuer(PCCERT_CONTEXT cert)
CERT_NAME_ISSUER_FLAG);
}
+static WCHAR *field_format_detailed_cert_name(PCERT_NAME_BLOB name)
+{
+ WCHAR *str = NULL;
+ DWORD len = CertNameToStrW(X509_ASN_ENCODING, name,
+ CERT_X500_NAME_STR | CERT_NAME_STR_CRLF_FLAG, NULL, 0);
+
+ if (len)
+ {
+ str = HeapAlloc(GetProcessHeap(), 0, len * sizeof(WCHAR));
+ if (str)
+ CertNameToStrW(X509_ASN_ENCODING, name,
+ CERT_X500_NAME_STR | CERT_NAME_STR_CRLF_FLAG, str, len);
+ }
+ return str;
+}
+
+static WCHAR *field_format_detailed_issuer(PCCERT_CONTEXT cert, void *param)
+{
+ return field_format_detailed_cert_name(&cert->pCertInfo->Issuer);
+}
+
static WCHAR *field_format_subject(PCCERT_CONTEXT cert)
{
return get_cert_name_string(cert, CERT_NAME_SIMPLE_DISPLAY_TYPE, 0);
}
+static WCHAR *field_format_detailed_subject(PCCERT_CONTEXT cert, void *param)
+{
+ return field_format_detailed_cert_name(&cert->pCertInfo->Subject);
+}
+
static WCHAR *format_long_date(const FILETIME *fileTime)
{
WCHAR dateFmt[80]; /* long enough for LOCALE_SLONGDATE */
@@ -1115,6 +1141,13 @@ static WCHAR *field_format_public_key(PCCERT_CONTEXT cert)
return buf;
}
+static WCHAR *field_format_detailed_public_key(PCCERT_CONTEXT cert, void *param)
+{
+ return format_hex_string(
+ cert->pCertInfo->SubjectPublicKeyInfo.PublicKey.pbData,
+ cert->pCertInfo->SubjectPublicKeyInfo.PublicKey.cbData);
+}
+
struct field_value_data;
struct detail_data
{
@@ -1126,12 +1159,17 @@ struct detail_data
typedef void (*add_fields_func)(HWND hwnd, struct detail_data *data);
+typedef WCHAR *(*create_detailed_value_func)(PCCERT_CONTEXT cert, void *param);
+
struct field_value_data
{
+ create_detailed_value_func create;
+ LPWSTR detailed_value;
void *param;
};
-static void add_field_value_data(struct detail_data *data, void *param)
+static void add_field_value_data(struct detail_data *data,
+ create_detailed_value_func create, void *param)
{
if (data->cFields)
data->fields = HeapReAlloc(GetProcessHeap(), 0, data->fields,
@@ -1141,13 +1179,15 @@ static void add_field_value_data(struct detail_data *data, void *param)
sizeof(struct field_value_data));
if (data->fields)
{
+ data->fields[data->cFields].create = create;
+ data->fields[data->cFields].detailed_value = NULL;
data->fields[data->cFields].param = param;
data->cFields++;
}
}
static void add_field_and_value_to_list(HWND hwnd, struct detail_data *data,
- LPWSTR field, LPWSTR value, void *param)
+ LPWSTR field, LPWSTR value, create_detailed_value_func create, void *param)
{
LVITEMW item;
int iItem = SendMessageW(hwnd, LVM_GETITEMCOUNT, 0, 0);
@@ -1164,22 +1204,23 @@ static void add_field_and_value_to_list(HWND hwnd, struct detail_data *data,
item.iSubItem = 1;
SendMessageW(hwnd, LVM_SETITEMTEXTW, iItem, (LPARAM)&item);
}
- add_field_value_data(data, param);
+ add_field_value_data(data, create, param);
}
static void add_string_id_and_value_to_list(HWND hwnd, struct detail_data *data,
- int id, LPWSTR value, void *param)
+ int id, LPWSTR value, create_detailed_value_func create, void *param)
{
WCHAR buf[MAX_STRING_LEN];
LoadStringW(hInstance, id, buf, sizeof(buf) / sizeof(buf[0]));
- add_field_and_value_to_list(hwnd, data, buf, value, param);
+ add_field_and_value_to_list(hwnd, data, buf, value, create, param);
}
struct v1_field
{
int id;
field_format_func format;
+ create_detailed_value_func create_detailed_value;
};
static void add_v1_field(HWND hwnd, struct detail_data *data,
@@ -1189,19 +1230,21 @@ static void add_v1_field(HWND hwnd, struct detail_data *data,
if (val)
{
- add_string_id_and_value_to_list(hwnd, data, field->id, val, NULL);
+ add_string_id_and_value_to_list(hwnd, data, field->id, val,
+ field->create_detailed_value, NULL);
HeapFree(GetProcessHeap(), 0, val);
}
}
static const struct v1_field v1_fields[] = {
- { IDS_FIELD_VERSION, field_format_version },
- { IDS_FIELD_SERIAL_NUMBER, field_format_serial_number },
- { IDS_FIELD_ISSUER, field_format_issuer },
- { IDS_FIELD_VALID_FROM, field_format_from_date },
- { IDS_FIELD_VALID_TO, field_format_to_date },
- { IDS_FIELD_SUBJECT, field_format_subject },
- { IDS_FIELD_PUBLIC_KEY, field_format_public_key }
+ { IDS_FIELD_VERSION, field_format_version, NULL },
+ { IDS_FIELD_SERIAL_NUMBER, field_format_serial_number, NULL },
+ { IDS_FIELD_ISSUER, field_format_issuer, field_format_detailed_issuer },
+ { IDS_FIELD_VALID_FROM, field_format_from_date, NULL },
+ { IDS_FIELD_VALID_TO, field_format_to_date, NULL },
+ { IDS_FIELD_SUBJECT, field_format_subject, field_format_detailed_subject },
+ { IDS_FIELD_PUBLIC_KEY, field_format_public_key,
+ field_format_detailed_public_key }
};
static void add_v1_fields(HWND hwnd, struct detail_data *data)
@@ -1295,6 +1338,10 @@ static void create_cert_details_list(HWND hwnd, struct detail_data *data)
static void free_detail_fields(struct detail_data *data)
{
+ DWORD i;
+
+ for (i = 0; i < data->cFields; i++)
+ HeapFree(GetProcessHeap(), 0, data->fields[i].detailed_value);
HeapFree(GetProcessHeap(), 0, data->fields);
data->fields = NULL;
data->cFields = 0;
@@ -1332,6 +1379,51 @@ static LRESULT CALLBACK detail_dlg_proc(HWND hwnd, UINT msg, WPARAM wp,
if (data->pCertViewInfo->dwFlags & CRYPTUI_DISABLE_EXPORT)
EnableWindow(GetDlgItem(hwnd, IDC_EXPORT), FALSE);
break;
+ case WM_NOTIFY:
+ {
+ NMITEMACTIVATE *nm;
+ HWND list = GetDlgItem(hwnd, IDC_DETAIL_LIST);
+
+ nm = (NMITEMACTIVATE*)lp;
+ if (nm->hdr.hwndFrom == list && nm->uNewState & LVN_ITEMACTIVATE
+ && nm->hdr.code == LVN_ITEMCHANGED)
+ {
+ data = (struct detail_data *)nm->lParam;
+ if (nm->iItem >= 0 && data && nm->iItem < data->cFields)
+ {
+ WCHAR buf[MAX_STRING_LEN], *val = NULL;
+ HWND valueCtl = GetDlgItem(hwnd, IDC_DETAIL_VALUE);
+
+ if (data->fields[nm->iItem].create)
+ val = data->fields[nm->iItem].create(
+ data->pCertViewInfo->pCertContext,
+ data->fields[nm->iItem].param);
+ else
+ {
+ LVITEMW item;
+ int res;
+
+ item.cchTextMax = sizeof(buf) / sizeof(buf[0]);
+ item.mask = LVIF_TEXT;
+ item.pszText = buf;
+ item.iItem = nm->iItem;
+ item.iSubItem = 1;
+ res = SendMessageW(list, LVM_GETITEMW, 0, (LPARAM)&item);
+ if (res)
+ val = buf;
+ }
+ /* Select all the text in the control, the next update will
+ * replace it
+ */
+ SendMessageW(valueCtl, EM_SETSEL, 0, -1);
+ add_unformatted_text_to_control(valueCtl, val,
+ val ? strlenW(val) : 0);
+ if (val != buf)
+ HeapFree(GetProcessHeap(), 0, val);
+ }
+ }
+ break;
+ }
case WM_COMMAND:
switch (wp)
{
More information about the wine-cvs
mailing list