clprefsgeneral.c

来自「PGP8.0源码 请认真阅读您的文件包然后写出其具体功能」· C语言 代码 · 共 397 行

C
397
字号
/*____________________________________________________________________________
	Copyright (C) 2002 PGP Corporation
	All rights reserved.
	
	CLprefsGeneral.c - handle general PGP preferences dialogs

	$Id: CLprefsGeneral.c,v 1.18 2002/08/06 20:09:19 dallen Exp $
____________________________________________________________________________*/
#include "pgpPFLConfig.h"

// project header files
#include "PGPclx.h"
#include "CLprefs.h"

#define MAXCACHETIMELIMIT				360000
#define MAXWIPEPASSES					32
#define MAXWIPEPASSESDIGITS				2
#define COMMENTBLOCK_MAX_LENGTH			60

// external globals
extern HINSTANCE	g_hInst;

static DWORD aGeneralIds[] = {			// Help IDs
    IDC_ENCRYPTTOSELF,		IDH_PGPCLPREF_ENCRYPTTOSELF,
	IDC_USEFASTKEYGEN,		IDH_PGPCLPREF_USEFASTKEYGEN,
	IDC_SHOWTRAYICON,		IDH_PGPCLPREF_SHOWTRAYICON,
	IDC_COMMENTBLOCK,		IDH_PGPCLPREF_COMMENTBLOCK,
	IDC_CACHELOGGEDON,		IDH_PGPCLPREF_CACHELOGGEDON,
	IDC_CACHETIMED,			IDH_PGPCLPREF_CACHETIMED,
	IDC_CACHEDURATION,		IDH_PGPCLPREF_CACHEDURATION,
	IDC_SHARECACHE,			IDH_PGPCLPREF_SHARECACHE,
	IDC_NOCACHE,			IDH_PGPCLPREF_NOCACHING,
	IDC_NUMPASSES,			IDH_PGPCLPREF_NUMWIPEPASSES,
	IDC_NUMPASSESSPIN,		IDH_PGPCLPREF_NUMWIPEPASSESSPIN,
	IDC_NUMPASSESTEXT,		IDH_PGPCLPREF_NUMWIPEPASSES,
	IDC_WIPECONFIRM,		IDH_PGPCLPREF_WIPECONFIRM,
	IDC_WIPEONDELETE,		IDH_PGPCLPREF_WIPEONDELETE,
	0,0
};


//	_____________________________________________________
//
//  Message processing function for General prefs property sheet

LRESULT WINAPI
CLGeneralPropDlgProc (
		HWND	hwnd,
		UINT	uMsg,
		WPARAM	wParam,
		LPARAM	lParam)
{
	PPREFSDLGSTRUCT			ppds;

	switch (uMsg) {

	case WM_INITDIALOG:
	{
		UINT			u, uSec;
		INT				i;
		CHAR			sz[64];
		PGPBoolean		b;
		RECT			rc;
		PGPPrefRef		prefref;

		SetWindowLong (hwnd, GWL_USERDATA, ((PROPSHEETPAGE*)lParam)->lParam);
		ppds = (PPREFSDLGSTRUCT)GetWindowLong (hwnd, GWL_USERDATA);

		if (ppds->bNeedsCentering) 
		{
			PGPclCenterWindowOnMonitor (GetParent (hwnd), kPGPclWindowMonitor);
			ppds->bNeedsCentering = FALSE;
		}

		prefref = CLGetPrefRef (ppds);

		// initialize miscellaneous controls
		if (ppds->bToolsPrefsEnabled)
		{
			CLLoadCheckBoxPref (hwnd, IDC_ENCRYPTTOSELF, 
					ppds, prefref, kPGPPrefEncryptToSelf);
		}
		else
		{
			CheckDlgButton (hwnd, IDC_ENCRYPTTOSELF, BST_UNCHECKED);
			ShowWindow (GetDlgItem (hwnd, IDC_ENCRYPTTOSELF), SW_HIDE);
			EnableWindow (GetDlgItem (hwnd, IDC_ENCRYPTTOSELF), FALSE);
		}

		CLLoadCheckBoxPref (hwnd, IDC_USEFASTKEYGEN, 
				ppds, prefref, kPGPPrefFastKeyGen);

		CLLoadCheckBoxPref (hwnd, IDC_SHOWTRAYICON, 
				ppds, prefref, kPGPPrefShowTrayIcon);

		SendDlgItemMessage (hwnd, IDC_COMMENTBLOCK, EM_SETLIMITTEXT,
							COMMENTBLOCK_MAX_LENGTH, 0);
		sz[0] = '\0';
		PGPGetPrefStringBuffer (
				prefref, kPGPPrefComment, sizeof(sz), sz);
		SetDlgItemText (hwnd, IDC_COMMENTBLOCK, sz);
		CLDisablePrefControl (hwnd, IDC_COMMENTBLOCK, 
				ppds, prefref, kPGPPrefComment);

		// initialize caching controls
		GetWindowRect (GetDlgItem (hwnd, IDC_CACHEDURATION), &rc);
		MapWindowPoints (NULL, hwnd, (LPPOINT)&rc, 2);
		ppds->gen.hwndCacheDuration = 
				CreateWindowEx (0, DATETIMEPICK_CLASS,
                             "DateTime",
                             WS_BORDER|WS_CHILD|WS_VISIBLE|WS_TABSTOP|
							 DTS_TIMEFORMAT,
                             rc.left, rc.top,
							 rc.right-rc.left, rc.bottom-rc.top,
							 hwnd, (HMENU)IDC_CACHEDURATION,
							 g_hInst, NULL);

		SendMessage (ppds->gen.hwndCacheDuration, DTM_SETFORMAT, 0,
				(LPARAM)"HH' : 'mm' : 'ss");
		SetWindowPos (ppds->gen.hwndCacheDuration,
				GetDlgItem (hwnd, IDC_NOCACHE),
				0, 0, 0, 0, SWP_NOMOVE|SWP_NOSIZE);

		GetSystemTime (&(ppds->gen.stCacheDuration));
		PGPGetPrefNumber (prefref, kPGPPrefCacheSeconds, &uSec);
		u = uSec / 3600;
		ppds->gen.stCacheDuration.wHour = u;

		uSec -= (u * 3600);
		u = uSec / 60;
		ppds->gen.stCacheDuration.wMinute = u;

		uSec -= (u * 60);
		ppds->gen.stCacheDuration.wSecond = uSec;

		ppds->gen.stCacheDuration.wMilliseconds = 0;

		SendMessage (ppds->gen.hwndCacheDuration, DTM_SETSYSTEMTIME, GDT_VALID,
				(LPARAM)&(ppds->gen.stCacheDuration));

		// initialize cache type
		PGPGetPrefNumber (prefref, kPGPPrefCacheType, &u);
		switch (u) {
			case kPGPPrefCacheTypeSeconds:	i = IDC_CACHETIMED;		break;
			case kPGPPrefCacheTypeLogon:	i = IDC_CACHELOGGEDON;	break;
			default:						i = IDC_NOCACHE;		break;
		}
		CheckRadioButton (hwnd, IDC_CACHELOGGEDON, IDC_NOCACHE, i);
		CLDisablePrefControl (hwnd, IDC_CACHETIMED, 
				ppds, prefref, kPGPPrefCacheType);
		CLDisablePrefControl (hwnd, IDC_CACHELOGGEDON, 
				ppds, prefref, kPGPPrefCacheType);
		CLDisablePrefControl (hwnd, IDC_NOCACHE, 
				ppds, prefref, kPGPPrefCacheType);

		if (u == kPGPPrefCacheTypeSeconds)
		{
			CLDisablePrefControl (ppds->gen.hwndCacheDuration, 0, 
					ppds, prefref, kPGPPrefCacheSeconds);
		}
		else
			EnableWindow (ppds->gen.hwndCacheDuration, FALSE);

		// initialize cache sharing
		CLLoadCheckBoxPref (hwnd, IDC_SHARECACHE, 
				ppds, prefref, kPGPPrefShareCache);
		if (u == kPGPPrefCacheTypeNone)
			EnableWindow (GetDlgItem (hwnd, IDC_SHARECACHE), FALSE);

		// initialize wipe preferences
		if (ppds->bToolsPrefsEnabled)
		{
			SendDlgItemMessage (hwnd, IDC_NUMPASSESSPIN, UDM_SETRANGE,
					0, (LPARAM)MAKELONG (MAXWIPEPASSES, 1));
			SendDlgItemMessage (hwnd, IDC_NUMPASSES, EM_SETLIMITTEXT,
					MAXWIPEPASSESDIGITS, 0);

			PGPGetPrefNumber (prefref, kPGPPrefFileWipePasses, &u);
			SendDlgItemMessage (hwnd, IDC_NUMPASSESSPIN, UDM_SETPOS,
					0, (LPARAM)MAKELONG (u, 0));
			CLDisablePrefControl (hwnd, IDC_NUMPASSES, 
					ppds, prefref, kPGPPrefFileWipePasses);

			CLLoadCheckBoxPref (hwnd, IDC_WIPECONFIRM, 
					ppds, prefref, kPGPPrefWarnOnWipe);

			b = CLLoadCheckBoxPref (hwnd, IDC_WIPEONDELETE, 
					ppds, prefref, kPGPPrefAutoWipeOnDelete);
		}
		else
		{
			CheckDlgButton (hwnd, IDC_WIPECONFIRM, BST_UNCHECKED);
			CheckDlgButton (hwnd, IDC_WIPEONDELETE, BST_UNCHECKED);

			ShowWindow (GetDlgItem (hwnd, IDC_WIPINGGROUP), SW_HIDE);
			ShowWindow (GetDlgItem (hwnd, IDC_WIPINGICON), SW_HIDE);
			ShowWindow (GetDlgItem (hwnd, IDC_NUMPASSESTEXT), SW_HIDE);
			ShowWindow (GetDlgItem (hwnd, IDC_NUMPASSES), SW_HIDE);
			ShowWindow (GetDlgItem (hwnd, IDC_NUMPASSESSPIN), SW_HIDE);
			ShowWindow (GetDlgItem (hwnd, IDC_WIPECONFIRM), SW_HIDE);
			ShowWindow (GetDlgItem (hwnd, IDC_WIPEONDELETE), SW_HIDE);

			EnableWindow (GetDlgItem (hwnd, IDC_NUMPASSES), FALSE);
			EnableWindow (GetDlgItem (hwnd, IDC_NUMPASSESSPIN), FALSE);
			EnableWindow (GetDlgItem (hwnd, IDC_WIPECONFIRM), FALSE);
			EnableWindow (GetDlgItem (hwnd, IDC_WIPEONDELETE), FALSE);
		}

		return TRUE;
	}

	case WM_HELP :
	case WM_CONTEXTMENU :
		return PGPclHtmlHelp (hwnd, uMsg, wParam, lParam, 
				(char*)kPGPclHelpFile, aGeneralIds);

	case WM_COMMAND :
		ppds = (PPREFSDLGSTRUCT)GetWindowLong (hwnd, GWL_USERDATA);
		switch (LOWORD (wParam)) {

		case IDC_CACHELOGGEDON :
		case IDC_CACHETIMED :
		case IDC_NOCACHE :
		{
			PGPPrefRef	prefref = CLGetPrefRef (ppds);

			if (!CLDisablePrefControl (ppds->gen.hwndCacheDuration, 0, ppds,
						prefref, kPGPPrefCacheSeconds))
			{
				EnableWindow (ppds->gen.hwndCacheDuration, 
						IsDlgButtonChecked (
							hwnd, IDC_CACHETIMED) == BST_CHECKED);
			}

			if (!CLDisablePrefControl (GetDlgItem (hwnd, IDC_SHARECACHE), 
						0, ppds, prefref, kPGPPrefShareCache))
			{
				EnableWindow (GetDlgItem (hwnd, IDC_SHARECACHE), 
						IsDlgButtonChecked (
							hwnd, IDC_NOCACHE) == BST_UNCHECKED);
			}
			break;
		}
		}
		break;

	case WM_NOTIFY :
		switch (((NMHDR FAR *) lParam)->code) {

		case PSN_HELP :
			PGPclHtmlHelp (hwnd, kPGPclHelpContext, 0, 0,
					(char*)kPGPclHelpFile, (DWORD*)IDH_PGPCLPREF_GENERALDIALOG);
			break;

		case PSN_APPLY :
		{
			PGPBoolean	bPurge		= FALSE;

			UINT		uTypeNew, uTypeOld;
			UINT		uSecsNew, uSecsOld;
			PGPBoolean	bShareNew, bShareOld;
			UINT		uNumPasses;
			CHAR		sz[64];

			ppds = (PPREFSDLGSTRUCT)GetWindowLong (hwnd, GWL_USERDATA);

			if (ppds->bUseClientLibPrefs && 
				!PGPPrefRefIsValid (ppds->prefref))
			{
				PGPclPeekClientLibPrefRefs (&ppds->prefref, NULL);
			}

			PGPGetPrefNumber (ppds->prefref, kPGPPrefCacheType, &uTypeOld);
			PGPGetPrefNumber (ppds->prefref, kPGPPrefCacheSeconds, &uSecsOld);
			PGPGetPrefBoolean (ppds->prefref, kPGPPrefShareCache, &bShareOld);

			// caching prefs
			if (IsDlgButtonChecked (hwnd, IDC_CACHELOGGEDON) == BST_CHECKED)
				uTypeNew = kPGPPrefCacheTypeLogon;
			else if (IsDlgButtonChecked (hwnd, IDC_CACHETIMED) == BST_CHECKED)
				uTypeNew = kPGPPrefCacheTypeSeconds;
			else
				uTypeNew = kPGPPrefCacheTypeNone;

			SendMessage (ppds->gen.hwndCacheDuration, DTM_GETSYSTEMTIME, 0,
					(LPARAM)&(ppds->gen.stCacheDuration));
			uSecsNew = ppds->gen.stCacheDuration.wHour * 3600;
			uSecsNew += (ppds->gen.stCacheDuration.wMinute * 60);
			uSecsNew += ppds->gen.stCacheDuration.wSecond;

			if (uTypeNew == kPGPPrefCacheTypeSeconds)
			{
				if (uSecsNew != uSecsOld)
				{
					bPurge = TRUE;
					PGPclErrorBox (hwnd, PGPSetPrefNumber (ppds->prefref,
							kPGPPrefCacheSeconds, uSecsNew));
				}
			}

			PGPclErrorBox (hwnd, PGPSetPrefNumber (ppds->prefref,
					kPGPPrefCacheType, uTypeNew));
			if (uTypeNew != uTypeOld)
				bPurge = TRUE;

			bShareNew = CLSaveCheckBoxPref (hwnd, IDC_SHARECACHE, 
					ppds->prefref, kPGPPrefShareCache);
			if (bShareNew != bShareOld)
				bPurge = TRUE;

			if (bPurge) 
			{
				PGPPurgePassphraseCache (ppds->context);
				PGPPurgeKeyDBCache (ppds->context); 
			}

			// miscellaneous prefs
			CLSaveCheckBoxPref (hwnd, IDC_ENCRYPTTOSELF, 
					ppds->prefref, kPGPPrefEncryptToSelf);

			CLSaveCheckBoxPref (hwnd, IDC_USEFASTKEYGEN, 
					ppds->prefref, kPGPPrefFastKeyGen);

			if (!GetDlgItemText (hwnd, IDC_COMMENTBLOCK, sz, sizeof(sz))) 
				sz[0] = '\0';

			PGPclErrorBox (hwnd, 
					PGPSetPrefString (ppds->prefref, kPGPPrefComment, sz));

			// wiping prefs
			uNumPasses = GetDlgItemInt (hwnd, IDC_NUMPASSES, NULL, FALSE);
			if (uNumPasses < 1) 
				uNumPasses = 1;
			if (uNumPasses > MAXWIPEPASSES) 
				uNumPasses = MAXWIPEPASSES;
			PGPclErrorBox (hwnd, PGPSetPrefNumber (ppds->prefref,
					kPGPPrefFileWipePasses, uNumPasses));

			CLSaveCheckBoxPref (hwnd, IDC_WIPECONFIRM, 
					ppds->prefref, kPGPPrefWarnOnWipe);

			CLSaveCheckBoxPref (hwnd, IDC_WIPEONDELETE, 
					ppds->prefref, kPGPPrefAutoWipeOnDelete);

			CLSaveCheckBoxPref (hwnd, IDC_SHOWTRAYICON, 
					ppds->prefref, kPGPPrefShowTrayIcon);

			ppds->bPrefsModified = TRUE;
			ppds->returnErr = kPGPError_NoErr;
            SetWindowLong (hwnd, DWL_MSGRESULT, PSNRET_NOERROR);
            return TRUE;
		}

		case PSN_KILLACTIVE :
		{
			UINT	uCache;

			ppds = (PPREFSDLGSTRUCT)GetWindowLong (hwnd, GWL_USERDATA);

			SendMessage (ppds->gen.hwndCacheDuration, DTM_GETSYSTEMTIME, 0,
					(LPARAM)&(ppds->gen.stCacheDuration));
			uCache = ppds->gen.stCacheDuration.wHour * 3600;
			uCache += (ppds->gen.stCacheDuration.wMinute * 60);
			uCache += ppds->gen.stCacheDuration.wSecond;

			if (uCache > MAXCACHETIMELIMIT)
			{
				PGPclMessageBox (hwnd, IDS_CAPTIONINFO,
						IDS_INVALIDCACHEVALUE, MB_OK|MB_ICONINFORMATION);
				SetFocus (ppds->gen.hwndCacheDuration);
				SetWindowLong (hwnd, DWL_MSGRESULT, TRUE);
				return TRUE;
			}

			if (IsDlgButtonChecked (hwnd, IDC_CACHETIMED) == BST_CHECKED)
			{
				if (uCache == 0)
				{
					PGPclMessageBox (hwnd, IDS_CAPTIONINFO, 
							IDS_INVALIDCACHEDURATION, 
							MB_OK|MB_ICONINFORMATION);
					SetFocus (ppds->gen.hwndCacheDuration);
					SetWindowLong (hwnd, DWL_MSGRESULT, TRUE);
					return TRUE;
				}
			}

			SetWindowLong (hwnd, DWL_MSGRESULT, FALSE);
			return TRUE;
		}
		}
	}

	return FALSE;

}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?