📄 kmprops.c
字号:
}
EndPaint (hWnd, &ps);
}
// ___________________________________________________
//
// PhotoID subclass procedure
static LRESULT APIENTRY
sPhotoIDSubclassProc (
HWND hWnd,
UINT uMsg,
WPARAM wParam,
LPARAM lParam)
{
KMPROPSHEETSTRUCT* pkmpss;
pkmpss =
(KMPROPSHEETSTRUCT*)GetWindowLong (GetParent (hWnd), GWL_USERDATA);
switch (uMsg) {
case WM_CONTEXTMENU :
{
HMENU hMC;
HMENU hMenuTrackPopup;
hMC = LoadMenu (g_hInst, MAKEINTRESOURCE (IDR_MENUPHOTOID));
if (pkmpss->hbitmapPhotoID)
EnableMenuItem (hMC, IDM_COPYBITMAP,
MF_BYCOMMAND|MF_ENABLED);
else
EnableMenuItem (hMC, IDM_COPYBITMAP,
MF_BYCOMMAND|MF_GRAYED);
hMenuTrackPopup = GetSubMenu (hMC, 0);
TrackPopupMenu (hMenuTrackPopup, TPM_LEFTALIGN|TPM_RIGHTBUTTON,
LOWORD(lParam), HIWORD(lParam), 0, GetParent (hWnd), NULL);
DestroyMenu (hMC);
}
break;
default :
return CallWindowProc (pkmpss->wpOrigPhotoIDProc, hWnd, uMsg,
wParam, lParam);
}
return TRUE;
}
// ___________________________________________________
//
// update system palette
static BOOL
sUpdatePalette (
HWND hwnd,
KMPROPSHEETSTRUCT* pkmpss)
{
BOOL bretval = FALSE;
HDC hdc;
HPALETTE hpaletteOld;
if (pkmpss->hpalettePhotoID == NULL) return FALSE;
hdc = GetDC (hwnd);
hpaletteOld = SelectPalette (hdc, pkmpss->hpalettePhotoID, FALSE);
if (RealizePalette (hdc)) {
InvalidateRect (hwnd, NULL, TRUE);
bretval = TRUE;
}
SelectPalette (hdc, hpaletteOld, TRUE);
RealizePalette (hdc);
ReleaseDC (hwnd, hdc);
return bretval;
}
// ___________________________________________________
//
// Key Properties Dialog Message procedure - General panel
static BOOL CALLBACK
sKeyPropDlgProcGeneral (
HWND hDlg,
UINT uMsg,
WPARAM wParam,
LPARAM lParam)
{
KMPROPSHEETSTRUCT* pkmpss;
CHAR sz[kPGPMaxUserIDSize];
INT i;
UINT u, uTrust;
PGPUInt32 prefAlg[6];
PGPTime tm;
PGPUserIDRef userid;
HWND hwndParent;
RECT rc;
LPBITMAPINFO lpbmi;
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);
// save HWND to table
pkmpss->pKM->hWndTable[pkmpss->iIndex] = hDlg;
// center dialog on screen
hwndParent = GetParent (hDlg);
if (pkmpss->pKM->iNumberSheets == 1) {
GetWindowRect (hwndParent, &rc);
SetWindowPos (hwndParent, NULL,
(GetSystemMetrics(SM_CXSCREEN) - (rc.right - rc.left)) / 2,
(GetSystemMetrics(SM_CYSCREEN) - (rc.bottom - rc.top)) / 3,
0, 0, SWP_NOSIZE | SWP_NOZORDER);
}
// subclass photoID control to handle dropping, dragging
pkmpss->wpOrigPhotoIDProc =
(WNDPROC) SetWindowLong(GetDlgItem (hDlg, IDC_PHOTOID),
GWL_WNDPROC, (LONG) sPhotoIDSubclassProc);
// create smooth progress bar
GetWindowRect (GetDlgItem (hDlg, IDC_VALIDITYBAR), &rc);
MapWindowPoints (NULL, hDlg, (LPPOINT)&rc, 2);
pkmpss->hwndValidity =
CreateWindowEx (0, PROGRESS_CLASS, (LPSTR) NULL,
WS_CHILD|WS_VISIBLE|PBS_SMOOTH,
rc.left, rc.top,
rc.right-rc.left, rc.bottom-rc.top,
hDlg, (HMENU) 0, g_hInst, NULL);
// disable and hide cancel button; and move "OK" button over
SendMessage (hwndParent, PSM_CANCELTOCLOSE, 0, 0);
GetWindowRect (GetDlgItem (hwndParent, IDCANCEL), &rc);
MapWindowPoints (NULL, hwndParent, (LPPOINT)&rc, 2);
SetWindowPos (GetDlgItem (hwndParent, IDOK), NULL, rc.left,
rc.top, rc.right-rc.left, rc.bottom-rc.top,
SWP_NOZORDER);
ShowWindow (GetDlgItem (hwndParent, IDCANCEL), SW_HIDE);
// initialize all controls
PostMessage (hDlg, WM_APP, SERIALIZE, 0);
return TRUE;
case WM_APP :
if (wParam == SERIALIZE)
KMRequestSDKAccess (pkmpss->pKM);
PGPGetKeyBoolean (pkmpss->key, kPGPKeyPropIsSecret,
&pkmpss->bSecret);
PGPGetKeyBoolean (pkmpss->key, kPGPKeyPropIsSecretShared,
&pkmpss->bSplit);
PGPGetKeyBoolean (pkmpss->key, kPGPKeyPropIsRevoked,
&pkmpss->bRevoked);
PGPGetKeyBoolean (pkmpss->key, kPGPKeyPropIsExpired,
&pkmpss->bExpired);
PGPGetKeyBoolean (pkmpss->key, kPGPKeyPropIsAxiomatic,
&pkmpss->bAxiomatic);
// initialize key id edit control
KMGetKeyIDFromKey (pkmpss->key, sz, sizeof(sz));
SetDlgItemText (hDlg, IDC_KEYID, sz);
// initialize key type edit control
switch (pkmpss->algKey) {
case kPGPPublicKeyAlgorithm_RSA :
LoadString (g_hInst, IDS_RSA, sz, sizeof (sz));
break;
case kPGPPublicKeyAlgorithm_DSA :
LoadString (g_hInst, IDS_DSA_ELGAMAL, sz, sizeof (sz));
break;
default :
LoadString (g_hInst, IDS_UNKNOWN, sz, sizeof (sz));
break;
}
SetDlgItemText (hDlg, IDC_KEYTYPE, sz);
// initialize key size edit control
KMGetKeyBitsString (pkmpss->keyset,
pkmpss->key, sz, sizeof(sz));
SetDlgItemText (hDlg, IDC_KEYSIZE, sz);
// initialize key creation date edit control
PGPGetKeyTime (pkmpss->key, kPGPKeyPropCreation, &tm);
KMConvertTimeToString (tm, sz, sizeof (sz));
SetDlgItemText (hDlg, IDC_CREATEDATE, sz);
// initialize key expiration date edit control
PGPGetKeyTime (pkmpss->key, kPGPKeyPropExpiration, &tm);
if (tm == kPGPExpirationTime_Never) {
LoadString (g_hInst, IDS_NEVER, sz, sizeof (sz));
pkmpss->iExpireDays = -1;
}
else {
KMConvertTimeToDays (tm, &pkmpss->iExpireDays);
KMConvertTimeToString (tm, sz, sizeof (sz));
}
SetDlgItemText (hDlg, IDC_EXPIREDATE, sz);
// initialize preferred cipher edit control
PGPGetKeyPropertyBuffer (pkmpss->key, kPGPKeyPropPreferredAlgorithms,
sizeof(prefAlg), (PGPByte*)&prefAlg[0], &u);
if (u < sizeof(PGPCipherAlgorithm))
prefAlg[0] = kPGPCipherAlgorithm_IDEA;
switch (prefAlg[0]) {
case kPGPCipherAlgorithm_CAST5 :
LoadString (g_hInst, IDS_CAST, sz, sizeof(sz));
break;
case kPGPCipherAlgorithm_3DES :
LoadString (g_hInst, IDS_3DES, sz, sizeof(sz));
break;
default :
LoadString (g_hInst, IDS_IDEA, sz, sizeof(sz));
break;
}
SetDlgItemText (hDlg, IDC_CIPHER, sz);
// initialize fingerprint edit control
if (pkmpss->bShowHexFingerprint)
CheckDlgButton (hDlg, IDC_USEHEXFINGERPRINT, BST_CHECKED);
else
CheckDlgButton (hDlg, IDC_USEHEXFINGERPRINT, BST_UNCHECKED);
sSetFingerprintControls (hDlg,
pkmpss->bShowHexFingerprint,
pkmpss->key, pkmpss->algKey);
// initialize validity edit and bar controls
i = KMConvertFromPGPValidity (kPGPValidity_Complete);
SendMessage (pkmpss->hwndValidity, PBM_SETRANGE,
0, MAKELPARAM (0,i));
PGPGetKeyNumber (pkmpss->key, kPGPKeyPropValidity,
&pkmpss->uValidity);
sSetValidityControls (hDlg, pkmpss, pkmpss->uValidity);
// initialize "Axiomatic" checkbox control
if (pkmpss->bAxiomatic)
CheckDlgButton (hDlg, IDC_AXIOMATIC, BST_CHECKED);
else
CheckDlgButton (hDlg, IDC_AXIOMATIC, BST_UNCHECKED);
if (pkmpss->bRevoked || pkmpss->bExpired || pkmpss->bReadOnly)
EnableWindow (GetDlgItem (hDlg, IDC_AXIOMATIC), FALSE);
else
EnableWindow (GetDlgItem (hDlg, IDC_AXIOMATIC), TRUE);
if (!pkmpss->bSecret && !pkmpss->bAxiomatic)
ShowWindow (GetDlgItem (hDlg, IDC_AXIOMATIC), SW_HIDE);
else
ShowWindow (GetDlgItem (hDlg, IDC_AXIOMATIC), SW_SHOW);
// initialize trust edit and slider controls
i = KMConvertFromPGPTrust (kPGPKeyTrust_Complete);
SendDlgItemMessage (hDlg, IDC_TRUSTSLIDER, TBM_SETRANGE,
0, MAKELPARAM (0, i));
PGPGetKeyNumber (pkmpss->key, kPGPKeyPropTrust, &pkmpss->uTrust);
sSetTrustControls (hDlg, pkmpss, pkmpss->uTrust);
if (pkmpss->bAxiomatic || pkmpss->bRevoked || pkmpss->bReadOnly)
{
EnableWindow (GetDlgItem (hDlg, IDC_TRUSTSLIDER), FALSE);
EnableWindow (GetDlgItem (hDlg, IDC_TRUSTTEXT1), FALSE);
EnableWindow (GetDlgItem (hDlg, IDC_TRUSTTEXT2), FALSE);
}
else
{
EnableWindow (GetDlgItem (hDlg, IDC_TRUSTSLIDER), TRUE);
EnableWindow (GetDlgItem (hDlg, IDC_TRUSTTEXT1), TRUE);
EnableWindow (GetDlgItem (hDlg, IDC_TRUSTTEXT2), TRUE);
}
// initialize enable/disable checkbox
PGPGetKeyBoolean (pkmpss->key, kPGPKeyPropIsDisabled,
&pkmpss->bDisabled);
if (pkmpss->bDisabled)
CheckDlgButton (hDlg, IDC_ENABLED, BST_UNCHECKED);
else
CheckDlgButton (hDlg, IDC_ENABLED, BST_CHECKED);
if (pkmpss->bRevoked || pkmpss->bExpired || pkmpss->bReadOnly)
EnableWindow (GetDlgItem (hDlg, IDC_ENABLED), FALSE);
else
EnableWindow (GetDlgItem (hDlg, IDC_ENABLED), TRUE);
if (pkmpss->bSecret) {
if (pkmpss->bAxiomatic)
EnableWindow (GetDlgItem (hDlg, IDC_ENABLED), FALSE);
else
EnableWindow (GetDlgItem (hDlg, IDC_ENABLED), TRUE);
}
// initialize change passphrase button
if (pkmpss->bSplit) {
aKeyPropIds[1] = IDH_PGPKM_JOINKEY;
LoadString (g_hInst, IDS_RECONSTITUTEKEY, sz, sizeof(sz));
}
else {
aKeyPropIds[1] = IDH_PGPKM_CHANGEPHRASE;
LoadString (g_hInst, IDS_CHANGEPHRASE, sz, sizeof(sz));
}
SetDlgItemText (hDlg, IDC_CHANGEPHRASE, sz);
if (!pkmpss->bSecret)
ShowWindow (GetDlgItem (hDlg, IDC_CHANGEPHRASE), SW_HIDE);
if (pkmpss->bReadOnly)
EnableWindow (GetDlgItem (hDlg, IDC_CHANGEPHRASE), FALSE);
else
EnableWindow (GetDlgItem (hDlg, IDC_CHANGEPHRASE), TRUE);
// display photo ID
if (pkmpss->hbitmapPhotoID) {
DeleteObject (pkmpss->hbitmapPhotoID);
pkmpss->hbitmapPhotoID = NULL;
}
if (pkmpss->pPhotoBuffer) {
KMFree (pkmpss->pPhotoBuffer);
pkmpss->pPhotoBuffer = NULL;
}
if (pkmpss->hbitmapPhotoID) {
DeleteObject (pkmpss->hbitmapPhotoID);
pkmpss->hbitmapPhotoID = NULL;
}
if (pkmpss->hpalettePhotoID) {
DeleteObject (pkmpss->hpalettePhotoID);
pkmpss->hpalettePhotoID = NULL;
}
PGPGetPrimaryAttributeUserID (pkmpss->key,
kPGPAttribute_Image, &userid);
if (userid == NULL) {
ShowWindow (GetDlgItem (hDlg, IDC_PHOTOSCROLLBAR), SW_HIDE);
pkmpss->iImageIndex = -1;
}
else {
PGPKeyListRef keylist;
PGPKeyIterRef keyiter;
INT iNumPhotoID;
PGPUInt32 iType;
PGPBoolean bAttrib;
SCROLLINFO si;
if (pkmpss->iImageIndex < 0)
pkmpss->iImageIndex = 0;
// get number of Photo IDs
PGPOrderKeySet (pkmpss->pKM->KeySetDisp,
kPGPAnyOrdering, &keylist);
PGPNewKeyIter (keylist, &keyiter);
PGPKeyIterSeek (keyiter, pkmpss->key);
PGPKeyIterNextUserID (keyiter, &userid);
iNumPhotoID = 0;
while (userid) {
PGPGetUserIDBoolean (userid,
kPGPUserIDPropIsAttribute, &bAttrib);
if (userid == pkmpss->userid)
pkmpss->iImageIndex = iNumPhotoID;
if (bAttrib) {
PGPGetUserIDNumber (userid,
kPGPUserIDPropAttributeType, &iType);
if (iType == kPGPAttribute_Image)
iNumPhotoID++;
}
PGPKeyIterNextUserID (keyiter, &userid);
}
pkmpss->iNumPhotoIDs = iNumPhotoID;
// setup photoid scrollbar
if (iNumPhotoID <= 1)
ShowWindow (GetDlgItem (hDlg, IDC_PHOTOSCROLLBAR), SW_HIDE);
else {
si.cbSize = sizeof(SCROLLINFO);
si.fMask = SIF_ALL;
si.nMin = 0;
si.nMax = iNumPhotoID-1;
si.nPage = 1;
si.nPos = pkmpss->iImageIndex;
SetScrollInfo (GetDlgItem (hDlg, IDC_PHOTOSCROLLBAR), SB_CTL,
&si, TRUE);
ShowWindow (GetDlgItem (hDlg, IDC_PHOTOSCROLLBAR), SW_SHOW);
}
// reset userid to selected one
PGPKeyIterSeek (keyiter, pkmpss->key);
PGPKeyIterNextUserID (keyiter, &userid);
iNumPhotoID = -1;
while (userid) {
PGPGetUserIDBoolean (userid,
kPGPUserIDPropIsAttribute, &bAttrib);
if (bAttrib) {
PGPGetUserIDNumber (userid,
kPGPUserIDPropAttributeType, &iType);
if (iType == kPGPAttribute_Image)
iNumPhotoID++;
}
if (pkmpss->iImageIndex == iNumPhotoID) {
PGPGetUserIDNumber (userid,
kPGPUserIDPropValidity, &u);
u = KMConvertFromPGPValidity (u);
if (u < (UINT)pkmpss->pKM->iValidityThreshold)
pkmpss->bPhotoInvalid = TRUE;
else
pkmpss->bPhotoInvalid = FALSE;
break;
}
PGPKeyIterNextUserID (keyiter, &userid);
}
PGPFreeKeyIter (keyiter);
PGPFreeKeyList (keylist);
// get length of photo id buffer
PGPGetUserIDStringBuffer (userid, kPGPUserIDPropAttributeData,
1, NULL, &(pkmpss->iPhotoBufferLength));
if (pkmpss->iPhotoBufferLength > 0) {
// now actually get the buffer data
pkmpss->pPhotoBuffer = KMAlloc (pkmpss->iPhotoBufferLength);
PGPGetUserIDStringBuffer (userid, kPGPUserIDPropAttributeData,
pkmpss->iPhotoBufferLength, pkmpss->pPhotoBuffer,
&(pkmpss->iPhotoBufferLength));
// no more SDK calls, release to avoid palette-related lockup
if (wParam == SERIALIZE) {
wParam = NOSERIALIZE;
KMReleaseSDKAccess (pkmpss->pKM);
}
if (IsntPGPError (KMDIBfromPhoto (pkmpss->pPhotoBuffer,
pkmpss->iPhotoBufferLength, TRUE, &lpbmi))) {
if (lpbmi) {
KMGetDIBSize (lpbmi, &(pkmpss->iwidthPhotoID),
&(pkmpss->iheightPhotoID));
pkmpss->hbitmapPhotoID = KMDDBfromDIB (lpbmi,
&(pkmpss->hpalettePhotoID));
KMFree (lpbmi);
}
}
}
}
if (wParam == SERIALIZE)
KMReleaseSDKAccess (pkmpss->pKM);
if (pkmpss->hwndRevokerDlg) {
SendMessage (pkmpss->hwndRevokerDlg, WM_APP, wParam, 0);
InvalidateRect (pkmpss->hwndRevokers, NULL, TRUE);
UpdateWindow (pkmpss->hwndRevokers);
}
pkmpss->bReadyToPaint = TRUE;
InvalidateRect (hDlg, NULL, FALSE);
break;
case WM_APP+1 :
EnableWindow (GetDlgItem (hDlg, IDC_TRUSTSLIDER), FALSE);
EnableWindow (GetDlgItem (hDlg, IDC_TRUSTTEXT1), FALSE);
EnableWindow (GetDlgItem (hDlg, IDC_TRUSTTEXT2), FALSE);
EnableWindow (GetDlgItem (hDlg, IDC_AXIOMATIC), FALSE);
EnableWindow (GetDlgItem (hDlg, IDC_ENABLED), FALSE);
EnableWindow (GetDlgItem (hDlg, IDC_CHANGEPHRASE), FALSE);
EnableWindow (GetDlgItem (GetParent(hDlg), IDOK), FALSE);
break;
case WM_APP+2 :
pkmpss->userid = (PGPUserIDRef)lParam;
PostMessage (hDlg, WM_APP, 0, 0);
break;
case WM_PAINT :
if (pkmpss->bReadyToPaint)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -