📄 kmprops.c
字号:
switch (uMsg) {
case WM_INITDIALOG:
// store pointer to data structure
SetWindowLong (hDlg, GWL_USERDATA, ((PROPSHEETPAGE*)lParam)->lParam);
pkmpss = (KMPROPSHEETSTRUCT*)GetWindowLong (hDlg, GWL_USERDATA);
// create tree view window
GetClientRect (GetDlgItem (hDlg, IDC_FRAME), &rc);
rc.left += 8;
rc.right -= 8;
rc.top += 16;
rc.bottom -= 8;
pkmpss->hwndADKs = CreateWindowEx (WS_EX_CLIENTEDGE, WC_TREELIST, "",
WS_VISIBLE | WS_CHILD | WS_BORDER | WS_TABSTOP | WS_GROUP |
TLS_AUTOSCROLL | TLS_SINGLESELECT,
rc.left, rc.top, rc.right-rc.left, rc.bottom-rc.top,
GetDlgItem (hDlg, IDC_FRAME),
(HMENU)IDC_ADKTREELIST, g_hInst, NULL);
// create image list
sCreateImageList (pkmpss);
TreeList_SetImageList (pkmpss->hwndADKs, pkmpss->hIml);
sAddADKColumns (pkmpss->hwndADKs, rc.right-rc.left);
// initialize all controls
PostMessage (hDlg, WM_APP, SERIALIZE, 0);
return TRUE;
case WM_APP :
if (wParam == SERIALIZE)
KMRequestSDKAccess (pkmpss->pKM);
TreeList_DeleteTree (pkmpss->hwndADKs, TRUE);
sInsertADKsIntoTree (pkmpss->pKM, pkmpss->hwndADKs, pkmpss->key,
pkmpss->keyset, pkmpss->uNumberADKs);
if (wParam == SERIALIZE)
KMReleaseSDKAccess (pkmpss->pKM);
break;
case WM_HELP:
WinHelp (((LPHELPINFO) lParam)->hItemHandle, pkmpss->pKM->szHelpFile,
HELP_WM_HELP, (DWORD) (LPSTR) aADKIds);
break;
case WM_CONTEXTMENU:
WinHelp ((HWND) wParam, pkmpss->pKM->szHelpFile, HELP_CONTEXTMENU,
(DWORD) (LPVOID) aADKIds);
break;
case WM_NOTIFY :
switch (((NMHDR FAR *) lParam)->code) {
case PSN_HELP :
WinHelp (hDlg, pkmpss->pKM->szHelpFile, HELP_CONTEXT,
IDH_PGPKM_PROPDIALOG);
break;
}
}
return FALSE;
}
// ___________________________________________________
//
// Populate ListView with Designated Revokers
static VOID
sInsertRevokersIntoTree (
PKEYMAN pKM,
HWND hwndTree,
PGPKeyRef key,
PGPKeySetRef keyset,
UINT uNumberRevokers)
{
TL_TREEITEM tlI;
TL_INSERTSTRUCT tlIns;
HTLITEM hTNew;
PGPKeyRef keyRevoker;
PGPKeyID keyidRevoker;
CHAR szName[256];
PGPError err;
CHAR szID[kPGPMaxKeyIDStringSize];
UINT u;
BOOL bItalics;
tlI.hItem = NULL;
tlI.mask = TLIF_TEXT | TLIF_IMAGE | TLIF_STATE;
tlI.stateMask = TLIS_ITALICS;
tlI.pszText = szName;
for (u=0; u<uNumberRevokers; u++) {
tlI.iImage = IDX_DSAPUBDISKEY;
tlI.state = 0;
err = PGPGetIndexedRevocationKey (key,
keyset, u, &keyRevoker, &keyidRevoker);
if (IsntPGPError (err)) {
if (!PGPKeyRefIsValid (keyRevoker)) {
// currently only DH/DSS designated revokers are allowed
// so we assume that's what it is
err = PGPGetKeyByKeyID (pKM->KeySetMain, &keyidRevoker,
kPGPPublicKeyAlgorithm_DSA, &keyRevoker);
}
if (PGPKeyRefIsValid (keyRevoker)) {
KMGetKeyName (keyRevoker, szName, sizeof(szName));
tlI.iImage = KMDetermineKeyIcon (pKM, keyRevoker, &bItalics);
if (bItalics) tlI.state = TLIS_ITALICS;
}
else {
tlI.state = TLIS_ITALICS;
LoadString (g_hInst, IDS_UNKNOWNADK,
szName, sizeof(szName));
err = PGPGetKeyIDString (&keyidRevoker,
kPGPKeyIDString_Abbreviated, szID);
if (IsntPGPError (err)) {
LoadString (g_hInst, IDS_UNKNOWNADKID,
szName, sizeof(szName));
lstrcat (szName, szID);
}
}
}
else {
LoadString (g_hInst, IDS_ERRONEOUSREVOKER,
szName, sizeof(szName));
}
tlI.cchTextMax = lstrlen (szName);
tlIns.hInsertAfter = (HTLITEM)TLI_SORT;
tlIns.item = tlI;
tlIns.hParent = NULL;
hTNew = TreeList_InsertItem (hwndTree, &tlIns);
}
}
// _____________________________________________________
//
// add columns to treelist
static BOOL
sAddRevokerColumns (HWND hWndTree, INT iWidth) {
TL_COLUMN tlc;
CHAR sz[64];
TreeList_DeleteAllColumns (hWndTree);
tlc.mask = TLCF_FMT | TLCF_WIDTH | TLCF_TEXT |
TLCF_SUBITEM | TLCF_DATATYPE | TLCF_DATAMAX;
tlc.pszText = sz;
tlc.iSubItem = 0;
tlc.fmt = TLCFMT_LEFT;
tlc.iDataType = TLC_DATASTRING;
tlc.cx = iWidth - 8;
tlc.bMouseNotify = FALSE;
LoadString (g_hInst, IDS_NAMEFIELD, sz, sizeof(sz));
TreeList_InsertColumn (hWndTree, 0, &tlc);
return TRUE;
}
// ___________________________________________________
//
// Key Properties Dialog Message procedure - Revokers panel
static BOOL CALLBACK
sKeyPropDlgProcRevokers (
HWND hDlg,
UINT uMsg,
WPARAM wParam,
LPARAM lParam)
{
KMPROPSHEETSTRUCT* pkmpss;
RECT rc;
pkmpss = (KMPROPSHEETSTRUCT*)GetWindowLong (hDlg, GWL_USERDATA);
switch (uMsg) {
case WM_INITDIALOG:
// store pointer to data structure
SetWindowLong (hDlg, GWL_USERDATA, ((PROPSHEETPAGE*)lParam)->lParam);
pkmpss = (KMPROPSHEETSTRUCT*)GetWindowLong (hDlg, GWL_USERDATA);
pkmpss->hwndRevokerDlg = hDlg;
// create tree view window
GetClientRect (GetDlgItem (hDlg, IDC_FRAME), &rc);
rc.left += 8;
rc.right -= 8;
rc.top += 16;
rc.bottom -= 8;
pkmpss->hwndRevokers = CreateWindowEx (WS_EX_CLIENTEDGE, WC_TREELIST,
"", WS_VISIBLE | WS_CHILD | WS_BORDER | WS_TABSTOP | WS_GROUP |
TLS_AUTOSCROLL | TLS_SINGLESELECT,
rc.left, rc.top, rc.right-rc.left, rc.bottom-rc.top,
GetDlgItem (hDlg, IDC_FRAME),
(HMENU)IDC_REVOKERTREELIST, g_hInst, NULL);
// create image list
sCreateImageList (pkmpss);
TreeList_SetImageList (pkmpss->hwndRevokers, pkmpss->hIml);
sAddRevokerColumns (pkmpss->hwndRevokers, rc.right-rc.left);
// initialize all controls
PostMessage (hDlg, WM_APP, SERIALIZE, 0);
return TRUE;
case WM_APP :
if (wParam == SERIALIZE)
KMRequestSDKAccess (pkmpss->pKM);
TreeList_DeleteTree (pkmpss->hwndRevokers, TRUE);
PGPCountRevocationKeys (pkmpss->key, &pkmpss->uNumberRevokers);
sInsertRevokersIntoTree (pkmpss->pKM, pkmpss->hwndRevokers,
pkmpss->key, pkmpss->keyset, pkmpss->uNumberRevokers);
if (wParam == SERIALIZE)
KMReleaseSDKAccess (pkmpss->pKM);
break;
case WM_HELP:
WinHelp (((LPHELPINFO) lParam)->hItemHandle, pkmpss->pKM->szHelpFile,
HELP_WM_HELP, (DWORD) (LPSTR) aRevokerIds);
break;
case WM_CONTEXTMENU:
WinHelp ((HWND) wParam, pkmpss->pKM->szHelpFile, HELP_CONTEXTMENU,
(DWORD) (LPVOID) aRevokerIds);
break;
case WM_NOTIFY :
switch (((NMHDR FAR *) lParam)->code) {
case PSN_HELP :
WinHelp (hDlg, pkmpss->pKM->szHelpFile, HELP_CONTEXT,
IDH_PGPKM_PROPDIALOG);
break;
}
}
return FALSE;
}
// ___________________________________________________
//
// update controls dealing with validity
static VOID
sSetValidityControls (HWND hwnd, KMPROPSHEETSTRUCT* pkmpss, UINT uVal)
{
UINT u;
u = KMConvertFromPGPValidity (uVal);
SendMessage (pkmpss->hwndValidity, PBM_SETPOS, u, 0);
if (u < (UINT)pkmpss->pKM->iValidityThreshold)
pkmpss->bInvalid = TRUE;
else
pkmpss->bInvalid = FALSE;
InvalidateRect (hwnd, NULL, FALSE);
}
// ___________________________________________________
//
// convert slider control values
static UINT
sConvertFromPGPTrust (UINT u)
{
#if 0 // vertical trust slider
return (KMConvertFromPGPTrust (kPGPKeyTrust_Complete) -
KMConvertFromPGPTrust (u));
#else // horizontal trust slider
return (KMConvertFromPGPTrust (u));
#endif
}
static UINT
sConvertToPGPTrust (UINT u)
{
#if 0 // vertical trust slider
return KMConvertToPGPTrust (
KMConvertFromPGPTrust (kPGPKeyTrust_Complete) - u);
#else // horizontal trust slider
return KMConvertToPGPTrust (u);
#endif
}
// ___________________________________________________
//
// update controls dealing with trust
static VOID
sSetTrustControls (HWND hDlg, KMPROPSHEETSTRUCT* pkmpss, UINT uTrust)
{
INT i;
i = sConvertFromPGPTrust (uTrust);
SendDlgItemMessage (hDlg, IDC_TRUSTSLIDER, TBM_SETPOS, (WPARAM)TRUE, i);
}
// ___________________________________________________
//
// display photo userID with appropriate overwriting
static VOID
sPaintPhotoID (
HWND hWnd,
HBITMAP hbitmapID,
HPALETTE hpaletteID,
INT iwidthBM,
INT iheightBM,
BOOL bInvalid,
BOOL bRevoked,
BOOL bExpired)
{
HPALETTE hpaletteOld = NULL;
HDC hdc;
HDC hdcMem;
HDC hdcMask;
HBITMAP hbitmap;
PAINTSTRUCT ps;
RECT rc;
INT icent;
INT ileft, itop, iwidth, iheight;
BITMAP bm;
hdc = BeginPaint (hWnd, &ps);
GetWindowRect (GetDlgItem (hWnd, IDC_PHOTOID), &rc);
rc.left += 2;
rc.top += 2;
rc.right -= 2;
rc.bottom -= 2;
MapWindowPoints (NULL, hWnd, (LPPOINT)&rc, 2);
FillRect (hdc, &rc, (HBRUSH)(COLOR_3DFACE+1));
// if photoid is available ... draw it
if (hbitmapID) {
// check if bitmap needs shrinking
if ((iheightBM > (rc.bottom-rc.top-2)) ||
(iwidthBM > (rc.right-rc.left-2)))
{
if (iheightBM > (iwidthBM * 1.25)) {
itop = rc.top +1;
iheight = rc.bottom-rc.top -2;
icent = (rc.right+rc.left) / 2;
iwidth = ((rc.bottom-rc.top) * iwidthBM) / iheightBM;
ileft = icent -(iwidth/2);
}
else {
ileft = rc.left +1;
iwidth = rc.right-rc.left -2;
icent = (rc.bottom+rc.top) / 2;
iheight = ((rc.right-rc.left) * iheightBM) / iwidthBM;
itop = icent - (iheight/2);
}
}
// otherwise draw it at its real size
else {
iwidth = iwidthBM;
iheight = iheightBM;
icent = (rc.right+rc.left) / 2;
ileft = icent - (iwidth/2);
icent = (rc.bottom+rc.top) / 2;
itop = icent - (iheight/2);
}
hdcMem = CreateCompatibleDC (hdc);
if (hpaletteID) {
hpaletteOld = SelectPalette (hdc, hpaletteID, FALSE);
RealizePalette (hdc);
}
SetStretchBltMode (hdc, COLORONCOLOR);
SelectObject (hdcMem, hbitmapID);
StretchBlt (hdc, ileft, itop, iwidth, iheight,
hdcMem, 0, 0, iwidthBM, iheightBM, SRCCOPY);
// overlay the question mark
if (bInvalid && !bRevoked && !bExpired) {
hdcMask = CreateCompatibleDC (hdc);
hbitmap =
LoadBitmap (g_hInst, MAKEINTRESOURCE (IDB_QUESTIONMARK));
GetObject (hbitmap, sizeof(BITMAP), (LPSTR)&bm);
SelectObject (hdcMask, hbitmap);
SetTextColor(hdc, RGB (255,0,0));
SetBkColor(hdc, RGB (0,0,0));
StretchBlt (hdc, rc.left, rc.top,
rc.right-rc.left-2, rc.bottom-rc.top-2,
hdcMask, 0, 0, bm.bmWidth, bm.bmHeight, SRCINVERT);
SetTextColor(hdc, RGB (0,0,0));
SetBkColor(hdc, RGB (255,255,255));
StretchBlt (hdc, rc.left, rc.top,
rc.right-rc.left-2, rc.bottom-rc.top-2,
hdcMask, 0, 0, bm.bmWidth, bm.bmHeight, SRCAND);
SetTextColor(hdc, RGB (255,0,0));
SetBkColor(hdc, RGB (0,0,0));
StretchBlt (hdc, rc.left, rc.top,
rc.right-rc.left-2, rc.bottom-rc.top-2,
hdcMask, 0, 0, bm.bmWidth, bm.bmHeight, SRCINVERT);
DeleteDC (hdcMask);
}
if (hpaletteOld) {
SelectPalette (hdc, hpaletteOld, TRUE);
RealizePalette (hdc);
}
DeleteDC (hdcMem);
}
// overlay the text
if (bRevoked) {
hdcMask = CreateCompatibleDC (hdc);
hbitmap = LoadBitmap (g_hInst, MAKEINTRESOURCE (IDB_REVOKED));
GetObject (hbitmap, sizeof(BITMAP), (LPSTR)&bm);
SelectObject (hdcMask, hbitmap);
SetTextColor(hdc, RGB (255,0,0));
SetBkColor(hdc, RGB (0,0,0));
StretchBlt (hdc, rc.left, rc.top,
rc.right-rc.left-2, rc.bottom-rc.top-2,
hdcMask, 0, 0, bm.bmWidth, bm.bmHeight, SRCINVERT);
SetTextColor(hdc, RGB (0,0,0));
SetBkColor(hdc, RGB (255,255,255));
StretchBlt (hdc, rc.left, rc.top,
rc.right-rc.left-2, rc.bottom-rc.top-2,
hdcMask, 0, 0, bm.bmWidth, bm.bmHeight, SRCAND);
SetTextColor(hdc, RGB (255,0,0));
SetBkColor(hdc, RGB (0,0,0));
StretchBlt (hdc, rc.left, rc.top,
rc.right-rc.left-2, rc.bottom-rc.top-2,
hdcMask, 0, 0, bm.bmWidth, bm.bmHeight, SRCINVERT);
DeleteDC (hdcMask);
}
else if (bExpired) {
hdcMask = CreateCompatibleDC (hdc);
hbitmap = LoadBitmap (g_hInst, MAKEINTRESOURCE (IDB_EXPIRED));
GetObject (hbitmap, sizeof(BITMAP), (LPSTR)&bm);
SelectObject (hdcMask, hbitmap);
SetTextColor(hdc, RGB (255,0,0));
SetBkColor(hdc, RGB (0,0,0));
StretchBlt (hdc, rc.left, rc.top,
rc.right-rc.left-2, rc.bottom-rc.top-2,
hdcMask, 0, 0, bm.bmWidth, bm.bmHeight, SRCINVERT);
SetTextColor(hdc, RGB (0,0,0));
SetBkColor(hdc, RGB (255,255,255));
StretchBlt (hdc, rc.left, rc.top,
rc.right-rc.left-2, rc.bottom-rc.top-2,
hdcMask, 0, 0, bm.bmWidth, bm.bmHeight, SRCAND);
SetTextColor(hdc, RGB (255,0,0));
SetBkColor(hdc, RGB (0,0,0));
StretchBlt (hdc, rc.left, rc.top,
rc.right-rc.left-2, rc.bottom-rc.top-2,
hdcMask, 0, 0, bm.bmWidth, bm.bmHeight, SRCINVERT);
DeleteDC (hdcMask);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -