Commit bac337e6 authored by Juan Lang's avatar Juan Lang Committed by Alexandre Julliard

cryptui: Show detailed value of a field when it's selected in the details page.

parent d1b8b80c
...@@ -1042,11 +1042,37 @@ static WCHAR *field_format_issuer(PCCERT_CONTEXT cert) ...@@ -1042,11 +1042,37 @@ static WCHAR *field_format_issuer(PCCERT_CONTEXT cert)
CERT_NAME_ISSUER_FLAG); 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) static WCHAR *field_format_subject(PCCERT_CONTEXT cert)
{ {
return get_cert_name_string(cert, CERT_NAME_SIMPLE_DISPLAY_TYPE, 0); 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) static WCHAR *format_long_date(const FILETIME *fileTime)
{ {
WCHAR dateFmt[80]; /* long enough for LOCALE_SLONGDATE */ WCHAR dateFmt[80]; /* long enough for LOCALE_SLONGDATE */
...@@ -1115,6 +1141,13 @@ static WCHAR *field_format_public_key(PCCERT_CONTEXT cert) ...@@ -1115,6 +1141,13 @@ static WCHAR *field_format_public_key(PCCERT_CONTEXT cert)
return buf; 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 field_value_data;
struct detail_data struct detail_data
{ {
...@@ -1126,12 +1159,17 @@ struct detail_data ...@@ -1126,12 +1159,17 @@ struct detail_data
typedef void (*add_fields_func)(HWND hwnd, struct detail_data *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 struct field_value_data
{ {
create_detailed_value_func create;
LPWSTR detailed_value;
void *param; 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) if (data->cFields)
data->fields = HeapReAlloc(GetProcessHeap(), 0, data->fields, data->fields = HeapReAlloc(GetProcessHeap(), 0, data->fields,
...@@ -1141,13 +1179,15 @@ static void add_field_value_data(struct detail_data *data, void *param) ...@@ -1141,13 +1179,15 @@ static void add_field_value_data(struct detail_data *data, void *param)
sizeof(struct field_value_data)); sizeof(struct field_value_data));
if (data->fields) if (data->fields)
{ {
data->fields[data->cFields].create = create;
data->fields[data->cFields].detailed_value = NULL;
data->fields[data->cFields].param = param; data->fields[data->cFields].param = param;
data->cFields++; data->cFields++;
} }
} }
static void add_field_and_value_to_list(HWND hwnd, struct detail_data *data, 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; LVITEMW item;
int iItem = SendMessageW(hwnd, LVM_GETITEMCOUNT, 0, 0); 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, ...@@ -1164,22 +1204,23 @@ static void add_field_and_value_to_list(HWND hwnd, struct detail_data *data,
item.iSubItem = 1; item.iSubItem = 1;
SendMessageW(hwnd, LVM_SETITEMTEXTW, iItem, (LPARAM)&item); 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, 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]; WCHAR buf[MAX_STRING_LEN];
LoadStringW(hInstance, id, buf, sizeof(buf) / sizeof(buf[0])); 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 struct v1_field
{ {
int id; int id;
field_format_func format; field_format_func format;
create_detailed_value_func create_detailed_value;
}; };
static void add_v1_field(HWND hwnd, struct detail_data *data, 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, ...@@ -1189,19 +1230,21 @@ static void add_v1_field(HWND hwnd, struct detail_data *data,
if (val) 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); HeapFree(GetProcessHeap(), 0, val);
} }
} }
static const struct v1_field v1_fields[] = { static const struct v1_field v1_fields[] = {
{ IDS_FIELD_VERSION, field_format_version }, { IDS_FIELD_VERSION, field_format_version, NULL },
{ IDS_FIELD_SERIAL_NUMBER, field_format_serial_number }, { IDS_FIELD_SERIAL_NUMBER, field_format_serial_number, NULL },
{ IDS_FIELD_ISSUER, field_format_issuer }, { IDS_FIELD_ISSUER, field_format_issuer, field_format_detailed_issuer },
{ IDS_FIELD_VALID_FROM, field_format_from_date }, { IDS_FIELD_VALID_FROM, field_format_from_date, NULL },
{ IDS_FIELD_VALID_TO, field_format_to_date }, { IDS_FIELD_VALID_TO, field_format_to_date, NULL },
{ IDS_FIELD_SUBJECT, field_format_subject }, { IDS_FIELD_SUBJECT, field_format_subject, field_format_detailed_subject },
{ IDS_FIELD_PUBLIC_KEY, field_format_public_key } { IDS_FIELD_PUBLIC_KEY, field_format_public_key,
field_format_detailed_public_key }
}; };
static void add_v1_fields(HWND hwnd, struct detail_data *data) 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) ...@@ -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) 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); HeapFree(GetProcessHeap(), 0, data->fields);
data->fields = NULL; data->fields = NULL;
data->cFields = 0; data->cFields = 0;
...@@ -1332,6 +1379,51 @@ static LRESULT CALLBACK detail_dlg_proc(HWND hwnd, UINT msg, WPARAM wp, ...@@ -1332,6 +1379,51 @@ static LRESULT CALLBACK detail_dlg_proc(HWND hwnd, UINT msg, WPARAM wp,
if (data->pCertViewInfo->dwFlags & CRYPTUI_DISABLE_EXPORT) if (data->pCertViewInfo->dwFlags & CRYPTUI_DISABLE_EXPORT)
EnableWindow(GetDlgItem(hwnd, IDC_EXPORT), FALSE); EnableWindow(GetDlgItem(hwnd, IDC_EXPORT), FALSE);
break; 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: case WM_COMMAND:
switch (wp) switch (wp)
{ {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment