klfocus.c

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

C
458
字号
/*____________________________________________________________________________
	Copyright (C) 2002 PGP Corporation
	All rights reserved.
		
	KLFocus.c - routines for tracking the focused/selected items

	$Id: KLFocus.c,v 1.12 2002/10/09 13:02:54 pbj Exp $
____________________________________________________________________________*/
#include "pgpPFLConfig.h"	

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

#include "pgpImageList.h"

// external globals
extern HINSTANCE g_hInst; 

// typedefs
typedef struct {
	FARPROC			lpfnCallback;
	PKEYLIST		pKL;
	PGPKeySetRef	keysetSelected;
	INT				icount;
	PGPError		err;
} SELOBJECTINFO;

typedef struct {
	FARPROC			lpfnCallback;
	INT				iObjectCount;
} SELOBJECTCOUNT;

//	________________________________________
//
//  Count a single object
//
//	lptli	= pointer to TreeList item to delete

static BOOL CALLBACK 
sCountSingleObject (
		TL_TREEITEM*	lptli, 
		LPARAM			lParam) 
{
	SELOBJECTCOUNT*	psoc = (SELOBJECTCOUNT*)lParam;
	++(psoc->iObjectCount);
	return TRUE;
}


//	____________________________________________
//
//  Update status bar text on basis of selection

static VOID 
sUpdateStatusBarText (PKEYLIST pKL) 
{
	CHAR sz1[128];
	CHAR sz2[128];
	INT ids;
	SELOBJECTCOUNT soc;

	if (!pKL->hwndStatusBar) 
		return;
	if (pKL->ulOptionFlags & kPGPclKeyList_DisableStatusBar) 
		return;

	switch (pKL->uSelectedFlags) {
		case 0 :						ids = 0;					break;
		case kPGPclKeyList_Key :		ids = IDS_KEYSELECTED;		break;
		case kPGPclKeyList_UserID :		ids = IDS_UIDSELECTED;		break;
		case kPGPclKeyList_Signature :	ids = IDS_CERTSELECTED;		break;
		default :						ids = IDS_MULTISELECTED;	break;
	}

	if (pKL->bMultipleSelected) 
	{
		soc.lpfnCallback = sCountSingleObject;
		soc.iObjectCount = 0;
		TreeList_IterateSelected (pKL->hwndTree, &soc);
	}
	else 
		soc.iObjectCount = 1;

	if (ids) 
	{
		LoadString (g_hInst, ids, sz1, sizeof(sz1));
		wsprintf (sz2, sz1, soc.iObjectCount);
	}
	else
		lstrcpy (sz2, "");

	SendMessage (pKL->hwndStatusBar, SB_SETTEXT, 1, (LPARAM)sz2);
}


//	________________________________________
//
//  figure out the object type from an image

INT 
KLGetObjectType (
		INT		iImage)
{ 
	switch (iImage) {
		case IDX_NONE : 
			return kPGPclKeyList_None; 

		case IDX_RSAPUBKEY :
		case IDX_RSAPUBDISKEY :
		case IDX_RSAPUBREVKEY :
		case IDX_RSAPUBEXPKEY :
		case IDX_RSASECKEY :
		case IDX_RSASECDISKEY :
		case IDX_RSASECREVKEY :
		case IDX_RSASECEXPKEY :
		case IDX_RSASECSHRKEY :
		case IDX_DSAPUBKEY :
		case IDX_DSAPUBDISKEY :
		case IDX_DSAPUBREVKEY :
		case IDX_DSAPUBEXPKEY :
		case IDX_DSASECKEY :
		case IDX_DSASECDISKEY :
		case IDX_DSASECREVKEY :
		case IDX_DSASECEXPKEY :
		case IDX_DSASECSHRKEY :
		case IDX_RSAV4PUBKEY :
		case IDX_RSAV4PUBDISKEY :
		case IDX_RSAV4PUBREVKEY :
		case IDX_RSAV4PUBEXPKEY :
		case IDX_RSAV4SECKEY :
		case IDX_RSAV4SECDISKEY :
		case IDX_RSAV4SECREVKEY :
		case IDX_RSAV4SECEXPKEY :
		case IDX_RSAV4SECSHRKEY :
		case IDX_UNKNOWNKEY :
		case IDX_RSATOKKEY :
		case IDX_RSATOKDISKEY :
		case IDX_RSATOKREVKEY :
		case IDX_RSATOKEXPKEY :
		case IDX_RSAV4TOKKEY :
		case IDX_RSAV4TOKDISKEY :
		case IDX_RSAV4TOKREVKEY :
		case IDX_RSAV4TOKEXPKEY :
		case IDX_ECPUBKEY :
		case IDX_ECPUBDISKEY :
		case IDX_ECPUBREVKEY :
		case IDX_ECPUBEXPKEY :
		case IDX_ECSECKEY :
		case IDX_ECSECDISKEY :
		case IDX_ECSECREVKEY :
		case IDX_ECSECEXPKEY :
		case IDX_ECSECSHRKEY :
			return kPGPclKeyList_Key; 

		case IDX_RSAUSERID :
		case IDX_DSAUSERID : 
		case IDX_PHOTOUSERID :
		case IDX_INVALIDUSERID :
			return kPGPclKeyList_UserID; 

		case IDX_CERT :
		case IDX_REVCERT : 
		case IDX_BADCERT :
		case IDX_EXPCERT :
		case IDX_EXPORTCERT :
		case IDX_TRUSTEDCERT :
		case IDX_METACERT :
		case IDX_X509CERT :
		case IDX_X509EXPCERT :
		case IDX_X509REVCERT :
			return kPGPclKeyList_Signature; 

		default :
			return kPGPclKeyList_None;
	}
}

//	________________________________________
//
//  Set handle of selected item.
//  Type and pointer to object are retrieved from 
//  TreeList as imagelist index.

VOID 
KLSetFocus (
		PKEYLIST	pKL, 
		HTLITEM		hFocused, 
		BOOL		bMultiple) 
{
	TL_TREEITEM tli;

	pKL->hFocusedItem = hFocused;
	pKL->bMultipleSelected = bMultiple;

	if (!bMultiple) 
		pKL->uSelectedFlags = 0;

	tli.hItem = hFocused;
	tli.mask = TLIF_IMAGE | TLIF_PARAM;
	if (hFocused && TreeList_GetItem (pKL->hwndTree, &tli))
	{
		pKL->iFocusedItemType = tli.iImage;
		pKL->pFocusedObject = (void*)tli.lParam;

		pKL->iFocusedObjectType = KLGetObjectType (pKL->iFocusedItemType);
		if (pKL->iFocusedObjectType != kPGPclKeyList_None)
			pKL->uSelectedFlags |= pKL->iFocusedObjectType;
	}
	else 
	{
		pKL->iFocusedItemType = IDX_NONE;
		pKL->iFocusedObjectType = kPGPclKeyList_None;
		pKL->pFocusedObject = NULL;
	}

	sUpdateStatusBarText (pKL);
}

//	________________________________________
//
//	Get type of focused item

INT 
KLFocusedItemType (PKEYLIST pKL) 
{
	return pKL->iFocusedItemType;
}

//	________________________________________
//
//	Get type of focused object

INT 
KLFocusedObjectType (PKEYLIST pKL) 
{
	return pKL->iFocusedObjectType;
}

//	________________________________________
//
//	Get handle of focused item

HTLITEM 
KLFocusedItem (PKEYLIST pKL) 
{
	return pKL->hFocusedItem;
}

//	________________________________________
//
//	Get pointer to focused object

VOID* KLFocusedObject (PKEYLIST pKL) 
{
	return pKL->pFocusedObject;
}

//	________________________________________
//
//	Get type of focused object

BOOL 
KLMultipleSelected (PKEYLIST pKL) 
{
	return pKL->bMultipleSelected;
}

//	________________________________________
//
//	Get type of focused object

UINT 
KLSelectedFlags (PKEYLIST pKL) 
{
	return pKL->uSelectedFlags;
}

//	_______________________________________________
//
//	routines called as callback functions from the 
//  TreeList control
//

static BOOL CALLBACK 
sAddKeyToKeySet (
		TL_TREEITEM*	lptli, 
		LPARAM			lParam) 
{
	SELOBJECTINFO*	psoi = (SELOBJECTINFO*)lParam;
	PGPKeyDBObjRef	key;
	PGPError		err;

	switch (lptli->iImage) {
	case IDX_RSAPUBKEY :
	case IDX_RSAPUBDISKEY :
	case IDX_RSASECKEY :
	case IDX_RSASECDISKEY :
	case IDX_DSAPUBKEY :
	case IDX_DSAPUBDISKEY :
	case IDX_DSASECKEY :
	case IDX_DSASECDISKEY :
	case IDX_DSASECSHRKEY :
	case IDX_RSAPUBREVKEY :
	case IDX_RSAPUBEXPKEY :
	case IDX_RSASECREVKEY :
	case IDX_RSASECEXPKEY :
	case IDX_RSASECSHRKEY :
	case IDX_DSAPUBREVKEY :
	case IDX_DSAPUBEXPKEY :
	case IDX_DSASECREVKEY :
	case IDX_DSASECEXPKEY :
	case IDX_RSAV4PUBKEY :
	case IDX_RSAV4PUBDISKEY :
	case IDX_RSAV4PUBREVKEY :
	case IDX_RSAV4PUBEXPKEY :
	case IDX_RSAV4SECKEY :
	case IDX_RSAV4SECDISKEY :
	case IDX_RSAV4SECREVKEY :
	case IDX_RSAV4SECEXPKEY :
	case IDX_RSAV4SECSHRKEY :
	case IDX_RSATOKKEY :
	case IDX_RSATOKDISKEY :
	case IDX_RSATOKREVKEY :
	case IDX_RSATOKEXPKEY :
	case IDX_RSAV4TOKKEY :
	case IDX_RSAV4TOKDISKEY :
	case IDX_RSAV4TOKREVKEY :
	case IDX_RSAV4TOKEXPKEY :
	case IDX_ECPUBKEY :
	case IDX_ECPUBDISKEY :
	case IDX_ECPUBREVKEY :
	case IDX_ECPUBEXPKEY :
	case IDX_ECSECKEY :
	case IDX_ECSECDISKEY :
	case IDX_ECSECREVKEY :
	case IDX_ECSECEXPKEY :
	case IDX_ECSECSHRKEY :
		key = (PGPKeyDBObjRef)(lptli->lParam);
		break;

	case IDX_RSAUSERID :
	case IDX_DSAUSERID :
	case IDX_PHOTOUSERID :
	case IDX_INVALIDUSERID :
		key = PGPPeekKeyDBObjKey ((PGPKeyDBObjRef)(lptli->lParam));
		break;

	case IDX_CERT :
	case IDX_REVCERT :
	case IDX_BADCERT :
	case IDX_EXPORTCERT :
	case IDX_TRUSTEDCERT :
	case IDX_METACERT :
		key = PGPPeekKeyDBObjKey ((PGPKeyDBObjRef)(lptli->lParam));
		break;

	case IDX_UNKNOWNKEY :
		psoi->err = kPGPError_Win32_UnsupportedKeyType;
		return FALSE;

	default :
		return FALSE;
	}

	if (PGPKeyDBObjRefIsValid (key)) 
	{
		err = PGPAddKey (key, psoi->keysetSelected);
		if (IsntPGPError (err))
			++(psoi->icount);
	}

	return TRUE;
}

//	___________________________
//
//	Get keyset of selected keys

PGPError 
KLGetSelectedKeys (
		PKEYLIST		pKL, 
		PGPKeySetRef*	pkeyset,
		INT*			piCount) 
{
	PGPError			err		= kPGPError_NoErr;
	SELOBJECTINFO		soi;

	soi.lpfnCallback	= sAddKeyToKeySet;
	soi.pKL				= pKL;
	soi.icount			= 0;
	soi.err				= kPGPError_NoErr;

	if (pkeyset)
		*pkeyset = kInvalidPGPKeySetRef;
	if (piCount)
		*piCount = 0;

	if (pkeyset)
		err = PGPNewEmptyKeySet (pKL->keydbBacking, &(soi.keysetSelected));
	else
		soi.keysetSelected = NULL;

	if (IsntPGPError (err)) 
	{
		TreeList_IterateSelected (pKL->hwndTree, &soi);
		if (IsPGPError (soi.err))
		{
			err = soi.err;
			if (PGPKeySetRefIsValid (soi.keysetSelected))
				PGPFreeKeySet (soi.keysetSelected);
		}
		else
		{
			if (pkeyset)
				*pkeyset = soi.keysetSelected;
			if (piCount)
				*piCount = soi.icount;
		}
	}

	return err;
}


//	___________________________
//
//	Get selected item info

PGPError PGPclExport
PGPclKeyListGetSelectionInfo (
		HKEYLIST				hkeylist,
		PGPUInt32*				puFocusedType,
		PGPKeyDBObjRef*			pobjFocused,
		PGPBoolean*				pbMultipleSel,
		PGPUInt32*				puSelectionFlags)
{
	PKEYLIST pKL = (PKEYLIST)hkeylist;
	if (!pKL) 
		return kPGPError_BadParams;

	if (puFocusedType)
		*puFocusedType = pKL->iFocusedItemType;

	if (pobjFocused)
		*pobjFocused = pKL->pFocusedObject;

	if (pbMultipleSel)
		*pbMultipleSel = pKL->bMultipleSelected;

	if (puSelectionFlags)
		*puSelectionFlags = pKL->uSelectedFlags;

	return kPGPError_NoErr;
}


⌨️ 快捷键说明

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