⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pkmsgprc.c

📁 PGP8.0源码 请认真阅读您的文件包然后写出其具体功能
💻 C
📖 第 1 页 / 共 5 页
字号:
				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 + -