📄 pkmsgprc.c
字号:
IDS_KEYRINGFILECAPTION, szTitle, sizeof(szTitle));
ofn.Flags |= OFN_FILEMUSTEXIST;
if (GetOpenFileName (&ofn))
bReturn = TRUE;
}
lstrcpy (szInitDir, szPath);
p = strrchr (szInitDir, '\\');
if (p)
*p = '\0';
if (bReturn)
lstrcpy (pszFile, szPath);
return bReturn;
}
// ____________________________________
//
// check if file is locked by someone else
static BOOL
sFileIsNotLocked (
HWND hwnd,
LPSTR pszFile)
{
HANDLE hFile;
DWORD dwErr;
hFile = CreateFile (pszFile, GENERIC_READ, 0, NULL,
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
if (hFile != INVALID_HANDLE_VALUE)
{
CloseHandle (hFile);
return TRUE;
}
dwErr = GetLastError ();
if (dwErr == ERROR_SHARING_VIOLATION)
{
PKMessageBox (hwnd, IDS_CAPTIONALERT,
IDS_KEYRINGFILELOCKED, MB_OK|MB_ICONEXCLAMATION);
return FALSE;
}
return TRUE;
}
// ____________________________________
//
// open file pair dialog procedure
static BOOL CALLBACK
sOpenFilesDlgProc (
HWND hwnd,
UINT uMsg,
WPARAM wParam,
LPARAM lParam)
{
PPKOPENFILESTRUCT ppofs;
switch (uMsg) {
case WM_INITDIALOG :
SetWindowLong (hwnd, GWL_USERDATA, lParam);
ppofs = (PPKOPENFILESTRUCT)lParam;
if (ppofs->bNew)
{
CHAR sz[128];
LoadString (g_hinst, IDS_NEWKEYRINGFILES, sz, sizeof(sz));
SetDlgItemText (hwnd, IDC_PROMPT, sz);
}
SetDlgItemText (hwnd, IDC_PUBRING, ppofs->szPub);
SetDlgItemText (hwnd, IDC_SECRING, ppofs->szSec);
if (ppofs->bHavePub)
{
SendDlgItemMessage (hwnd, IDC_SECRING, EM_SETSEL, 0x1000, 0x1000);
SetFocus (GetDlgItem (hwnd, IDC_SECRING));
}
else
{
SendDlgItemMessage (hwnd, IDC_PUBRING, EM_SETSEL, 0x1000, 0x1000);
SetFocus (GetDlgItem (hwnd, IDC_PUBRING));
}
return FALSE;
case WM_HELP :
case WM_CONTEXTMENU :
return PGPclHtmlHelp (hwnd, uMsg, wParam, lParam,
(char*)kPGPclHelpFile, aOpenFilesIds);
case WM_COMMAND:
ppofs = (PPKOPENFILESTRUCT)GetWindowLong (hwnd, GWL_USERDATA);
switch (LOWORD(wParam)) {
case IDCANCEL:
EndDialog (hwnd, 0);
break;
case IDOK:
GetDlgItemText (hwnd, IDC_PUBRING,
ppofs->szPub, sizeof(ppofs->szPub));
GetDlgItemText (hwnd, IDC_SECRING,
ppofs->szSec, sizeof(ppofs->szSec));
if (sFileIsNotLocked (hwnd, ppofs->szPub))
{
if (sFileIsNotLocked (hwnd, ppofs->szSec))
EndDialog (hwnd, 1);
}
break;
case IDC_BROWSEPUBRING :
if (sGetKeyringFileName (hwnd, ppofs->szPub, FALSE, ppofs->bNew))
{
ppofs->bHavePub = TRUE;
SetDlgItemText (hwnd, IDC_PUBRING, ppofs->szPub);
if (!ppofs->bHaveSec)
{
if (sGuessMatchingKeyringFile (ppofs, TRUE, ppofs->bNew) &&
ppofs->bNew)
{
ppofs->szSec[0] = '\0';
}
SetDlgItemText (hwnd, IDC_SECRING, ppofs->szSec);
}
}
break;
case IDC_BROWSESECRING :
if (sGetKeyringFileName (hwnd, ppofs->szSec, TRUE, ppofs->bNew))
{
ppofs->bHaveSec = TRUE;
SetDlgItemText (hwnd, IDC_SECRING, ppofs->szSec);
if (!ppofs->bHavePub)
{
if (sGuessMatchingKeyringFile (ppofs, FALSE, ppofs->bNew) &&
ppofs->bNew)
{
ppofs->szPub[0] = '\0';
}
SetDlgItemText (hwnd, IDC_PUBRING, ppofs->szPub);
}
}
break;
case IDC_PUBRING :
case IDC_SECRING :
if ((GetWindowTextLength (GetDlgItem (hwnd, IDC_PUBRING)) > 0) &&
(GetWindowTextLength (GetDlgItem (hwnd, IDC_SECRING)) > 0))
{
EnableWindow (GetDlgItem (hwnd, IDOK), TRUE);
}
else
EnableWindow (GetDlgItem (hwnd, IDOK), FALSE);
break;
}
return TRUE;
}
return FALSE;
}
// ____________________________________
//
// create a new window for the specified file
BOOL
PKNewWindowForFile (
HWND hwnd,
PGPKEYSSTRUCT* ppks,
BOOL bNew,
LPSTR pszPath)
{
PGPError err = kPGPError_UserAbort;
BOOL bReadOnly = FALSE;
PGPKeyDBRef keydb;
UINT ulen;
PKOPENFILESTRUCT pofs;
pofs.bNew = bNew;
pofs.bHavePub = FALSE;
pofs.bHaveSec = FALSE;
pofs.szPub[0] = '\0';
pofs.szSec[0] = '\0';
if (IsntNull (pszPath))
{
ulen = lstrlen (pszPath);
if (ulen >= 5)
{
if (lstrcmpi (&pszPath[ulen-4], ".skr") == 0)
{
lstrcpy (pofs.szSec, pszPath);
pofs.bHaveSec = TRUE;
sGuessMatchingKeyringFile (&pofs, FALSE, FALSE);
}
}
if (!pofs.bHaveSec)
{
lstrcpy (pofs.szPub, pszPath);
pofs.bHavePub = TRUE;
sGuessMatchingKeyringFile (&pofs, TRUE, FALSE);
}
}
if (DialogBoxParam (g_hinst, MAKEINTRESOURCE(IDD_OPENFILES), hwnd,
sOpenFilesDlgProc, (LPARAM)&pofs))
{
if (bNew)
{
if (pofs.bHavePub)
DeleteFile (pofs.szPub);
if (pofs.bHaveSec)
DeleteFile (pofs.szSec);
}
err = PGPclOpenKeyrings (g_context,
pofs.szPub, pofs.szSec,
kPGPOpenKeyDBFileOptions_Mutable |
kPGPOpenKeyDBFileOptions_Create,
&keydb);
if (err == kPGPError_FilePermissions)
{
err = PGPclOpenKeyrings (g_context,
pofs.szPub, pofs.szSec, 0,
&keydb);
if (IsntPGPError (err))
{
bReadOnly = TRUE;
PKReadOnlyWarning (ppks->hwndMain);
}
}
if (IsntPGPError (err))
{
sNewPGPkeysWindow (hwnd, ppks,
FALSE, FALSE, bReadOnly, pofs.szPub, keydb);
return TRUE;
}
}
PGPclErrorBox (hwnd, err);
return FALSE;
}
// ____________________________________
//
// see if any tokens are available
static void
sCheckForTokens (
HWND hwnd)
{
PGPUInt32 uTokens;
PGPCountTokens (g_context, &uTokens);
if (uTokens != g_uNumTokens)
{
g_uNumTokens = uTokens;
PKReloadTokenProperties (FALSE);
PostMessage (hwnd, WM_SIZE, 0, 0);
}
}
// ____________________________________
//
// callback function called by SDK when keydb changes
static void
sSDKNotificationCallback (
PGPUserValue userval,
PGPNotificationReason reason,
PGPUInt32 uParam1,
PGPUInt32 uParam2)
{
if (reason == kPGPNotification_KeyDBChanged)
{
sCheckForTokens ((HWND)userval);
PostMessage ((HWND)userval, PK_M_RELOADKEYRINGS, 0, 0);
}
}
// ____________________________________
//
// Main PGPkeys Window Message procedure
LONG APIENTRY
PGPkeysWndProc (
HWND hwnd,
UINT uMsg,
WPARAM wParam,
LPARAM lParam)
{
PGPKEYSSTRUCT* ppks;
switch (uMsg) {
case WM_CREATE :
{
RECT rc;
INT iWidths[3];
ppks = (PGPKEYSSTRUCT*)pkAlloc (sizeof (PGPKEYSSTRUCT));
if (!ppks)
return -1;
SetWindowLong (hwnd, GWL_USERDATA, (LPARAM)ppks);
PGPclEnsureWindowIsOnMonitor (hwnd, NULL);
GetClientRect (hwnd, &rc);
// if lpCreateParams is NULL, this is the main window
if (((LPCREATESTRUCT)lParam)->lpCreateParams == NULL)
{
sRestoreWindowPos (hwnd);
ppks->hwndMain = hwnd;
ppks->uFlags = PK_MAINWINDOW;
ppks->iToolHeight = g_iToolHeight;
ppks->iKeysHeight =
rc.bottom-rc.top-ppks->iToolHeight-s_uStatusBarHeight;
ppks->bGroupsVisible = FALSE;
ppks->iGroupsPercent = g_iGroupsPercent;
ppks->iGroupsHeight = 0;
ppks->bLocalKeySet = TRUE;
ppks->keydbMain = NULL;
ppks->keysetDisp = NULL;
ppks->klConfig.uOptions =
kPGPclKeyList_EnableDragOut | kPGPclKeyList_EnableDropIn |
kPGPclKeyList_EnableReloads;
if (!g_bExpertMode)
ppks->klConfig.uOptions |= kPGPclKeyList_GreenDotMode;
if (g_bMarginalAsInvalid)
ppks->klConfig.uOptions |= kPGPclKeyList_MarginalIsInvalid;
ppks->hmenuKeyserver = NULL;
ppks->hmenuKeyMan = GetMenu (hwnd);
PKInitMenuKeyMan (ppks->hmenuKeyMan, ppks->uFlags);
// setup group manager
ppks->hGM = PGPgmCreateGroupManager (g_context, g_tlscontext,
hwnd, IDC_TREELISTGROUP,
0,
(rc.bottom-rc.top)-ppks->iGroupsHeight-
s_uStatusBarHeight,
(rc.right-rc.left),
ppks->iGroupsHeight);
ppks->hwndTreeListGroups = PGPgmGetManagerWindow (ppks->hGM);
ppks->gmConfig.uOptions = 0;
if (!g_bExpertMode)
ppks->gmConfig.uOptions |= GMF_NOVICEMODE;
ppks->gmConfig.keydbMain = NULL;
ppks->hwndToolBar = PKCreateToolbar (hwnd);
}
// otherwise this is a search or file window and lpCreateParams is
// a pointer to a PKWINDOWSTRUCT
else
{
PPKWINDOWSTRUCT ppkws;
ppkws = (PPKWINDOWSTRUCT)(((LPCREATESTRUCT)lParam)->lpCreateParams);
ppks->bGroupsVisible = FALSE;
ppks->iGroupsHeight = 0;
ppks->iGroupsPercent = 0;
ppks->bLocalKeySet = TRUE;
ppks->keydbMain = ppkws->keydbMain;
ppks->pGroupFile = NULL;
if (ppkws->bSearch)
{
ppks->hwndMain = hwnd;
ppks->uFlags = PK_SEARCHWINDOW;
s_hwndOpenSearch = hwnd;
ppks->iToolHeight = SEARCHCONTROLHEIGHT;
ppks->keysetDisp = NULL;
ppks->klConfig.uOptions =
kPGPclKeyList_EnableDragOut;
ppks->hmenuKeyserver = NULL;
ppks->hmenuKeyMan = NULL;
ppks->hwndToolBar = NULL;
}
else
{
ppks->hwndMain = hwnd;
if (ppkws->bPda)
ppks->uFlags = PK_PDAWINDOW;
else
ppks->uFlags = PK_FILEWINDOW;
ppks->iToolHeight = g_iToolHeight;
ppks->keysetDisp = PGPPeekKeyDBRootKeySet (ppkws->keydbMain);
ppks->klConfig.uOptions =
kPGPclKeyList_EnableDragOut |
kPGPclKeyList_EnableDropIn;
if (ppkws->bReadOnly)
{
ppks->bReadOnly = TRUE;
ppks->klConfig.uOptions |= kPGPclKeyList_ReadOnly;
}
ppks->hmenuKeyserver = NULL;
ppks->hmenuKeyMan = GetMenu (hwnd);
PKInitMenuKeyMan (ppks->hmenuKeyMan, ppks->uFlags);
ppks->hwndToolBar = PKCreateToolbar (hwnd);
}
ppks->iKeysHeight =
rc.bottom-rc.top-ppks->iToolHeight-s_uStatusBarHeight;
if (!g_bExpertMode)
ppks->klConfig.uOptions |= kPGPclKeyList_GreenDotMode;
if (g_bMarginalAsInvalid)
ppks->klConfig.uOptions |= kPGPclKeyList_MarginalIsInvalid;
if (ppkws->bSearch && InitSearch ())
{
ppks->hwndSearchControl = CreateSearch (g_hinst, hwnd);
SendMessage (ppks->hwndSearchControl, SEARCH_SET_MAIN_KEYDB,
0, (LPARAM)(ppks->keydbMain));
SendMessage (ppks->hwndSearchControl, SEARCH_SET_LOCAL_KEYSET,
0, (LPARAM)(PGPPeekKeyDBRootKeySet (ppks->keydbMain)));
GetWindowRect (ppks->hwndSearchControl, &rc);
ppks->iToolHeight = rc.bottom-rc.top;
}
}
PKAddRemoveWindowList (hwnd,
TRUE, (ppks->uFlags & PK_SEARCHWINDOW), FALSE);
ppks->bGroupsFocused = FALSE;
ppks->uKeySelectionFlags = 0;
ppks->uGroupSelectionFlags = 0;
ppks->hCursorOld = NULL;
ppks->bGrabEnabled = FALSE;
ppks->bGrabbed = FALSE;
ppks->pSplitKeyDlgList = NULL;
ppks->hKL = PGPclKeyListCreate (g_context, g_tlscontext,
hwnd, IDC_TREELISTKEYS,
0, ppks->iToolHeight,
rc.right-rc.left,
ppks->iKeysHeight, 0,
&ppks->hwndTreeList);
ppks->klConfig.keyserver.protocol = kPGPKeyServerProtocol_Invalid;
ppks->klConfig.uShowColumns = 0;
// initialize drag/drop
ppks->pDropTarget =
PKCreateDropTarget (ppks->hwndTreeList, PK_IDROP_KEYLIST, ppks);
CoLockObjectExternal ((IUnknown*)ppks->pDropTarget, TRUE, TRUE);
RegisterDragDrop (ppks->hwndTreeList, ppks->pDropTarget);
PKEnableDropTarget (ppks->pDropTarget, FALSE);
// create status bar
ppks->bSearchInProgress = FALSE;
ppks->iStatusValue = -2;
ppks->iStatusDirection = 1;
ppks->klConfig.hwndStatusBar = CreateWindow (
STATUSCLASSNAME, NULL,
WS_CHILD|WS_VISIBLE|SBS_SIZEGRIP|SBT_TOOLTIPS,
0, 0, 0, 0,
hwnd, (HMENU)IDC_STATUSBAR, g_hinst, NULL);
GetWindowRect (ppks->klConfig.hwndStatusBar, &rc);
s_uStatusBarHeight = rc.bottom - rc.top;
// setup status bar
if (ppks->uFlags & PK_KEYWINDOW)
iWidths[0] = 0;
else
iWidths[0] = ICONWIDTH;
iWidths[1] = rc.right-TOTALLEDWIDTH-16;
iWidths[2] = rc.right-16;
SendMessage (ppks->klConfig.hwndStatusBar,
SB_SETPARTS, 3, (LPARAM)iWidths);
SendMessage (ppks->klConfig.hwndStatusBar,
SB_SETTEXT, PROGRESS_PANE|SBT_OWNERDRAW, 0);
// initialize TLS info
ppks->iTLSstatus = TLS_NOSEARCHYET;
ppks->szTLSserver[0] = '\0';
ppks->keyAuth = kInvalidPGPKeyDBObjRef;
// set initial configuration of keymanager
ppks->klConfig.uMask = kPGPclKeyList_ConfigureAll;
PGPclKeyListConfigure (ppks->hKL, &(ppks->klConfig));
if (ppks->uFlags & PK_MAINWINDOW)
{
CHAR sz[64];
LoadString (g_hinst, IDS_TOKENTOOLTIP, sz, sizeof(sz));
SendMessage (ppks->klConfig.hwndStatusBar,
SB_SETTIPTEXT, ICON_PANE, (LPARAM)sz);
SendMessage (ppks->klConfig.hwndStatusBar,
SB_SETICON, ICON_PANE, (LPARAM)g_hiconToken);
PGPclKeyListGetSelectedColumns (ppks->hKL, &s_ulColumns);
ppks->gmConfig.ppks = ppks;
ppks->gmConfig.hKL = ppks->hKL;
ppks->gmConfig.hwndStatusBar = ppks->klConfig.hwndStatusBar;
PGPgmConfigure (ppks->hGM, &(ppks->gmConfig));
PostMessage (hwnd, PK_M_RELOADKEYRINGS, 0, 0);
PGPSetNotificationCallback (sSDKNotificationCallback, hwnd);
}
else if (ppks->uFlags & PK_KEYWINDOW)
{
PGPclKeyListLoadKeys (ppks->hKL, ppks->keydbMain, ppks->keysetDisp);
PKEnableDropTarget (ppks->pDropTarget, !ppks->bReadOnly);
}
// must be a search window
else
{
CHAR sz[64];
LoadString (g_hinst, IDS_SEARCHAUTHTOOLTIP, sz, sizeof(sz));
SendMessage (ppks->klConfig.hwndStatusBar,
SB_SETTIPTEXT, ICON_PANE, (LPARAM)sz);
SendMessage (ppks->klConfig.hwndStatusBar,
SB_SETICON, ICON_PANE, (LPARAM)g_hiconOpenLock);
PGPclKeyListLoadKeys (ppks->hKL, ppks->keydbMain, ppks->keysetDisp);
PKEnableDropTarget (ppks->pDropTarget, FALSE);
ppks->iStatusValue = -1;
InvalidateRect (ppks->klConfig.hwndStatusBar, NULL, FALSE);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -