kltree.c

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

C
1,851
字号
/*____________________________________________________________________________
	Copyright (C) 2002 PGP Corporation
	All rights reserved.
		
	KLTree.c - handle creating and filling TreeList control	

	$Id: KLTree.c,v 1.36 2002/10/27 18:17:28 pbj Exp $
____________________________________________________________________________*/
#include "pgpPFLConfig.h"

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

// constant defitions
#define BITMAP_WIDTH	16
#define BITMAP_HEIGHT	16

// macro defitions
#define PACKVERSION(major,minor) MAKELONG(minor,major)

typedef struct {
	FARPROC			lpfnCallback;
	HWND			hwndTree;
} EXPANDCOLLAPSESTRUCT;

typedef struct {
	FARPROC			lpfnCallback;
	HWND			hwndTree;
	PGPKeySetRef	keysetSelected;
} SELECTEDSTRUCT;

typedef struct _USERVALSTRUCT {
	struct _USERVALSTRUCT* next;
	PKEYLIST		pKL;
	LONG			lValue;
} USERVALSTRUCT;

// external globals
extern HINSTANCE	g_hInst;
extern HIMAGELIST	g_hilKeys;


//	_______________________________________________
//
//  get user value list item

PGPError 
KLGetObjUserVal (
		PKEYLIST		pKL, 
		PGPKeyDBObjRef	obj, 
		LONG*			lValue) 
{
	USERVALSTRUCT* puvs;
	PGPError err;

	err = PGPGetKeyDBObjUserValue (obj, &puvs);
	if (err) 
		return err;

	// there is an existing linked list
	if (puvs) 
	{
		// search for the element inserted by this KL
		do {
			if (puvs->pKL == pKL) 
			{
				*lValue = puvs->lValue;
				return kPGPError_NoErr;
			}
			puvs = puvs->next;
		} while (puvs);

		// no element in list inserted by this KL
		*lValue = 0;
	}

	// no user value
	else 
		*lValue = 0;

	return kPGPError_NoErr;
}


//	_______________________________________________
//
//  set key user value list item

PGPError 
KLSetObjUserVal (
		PKEYLIST		pKL, 
		PGPKeyDBObjRef	obj, 
		LONG			lValue) 
{
	USERVALSTRUCT* puvs;
	USERVALSTRUCT* puvsPrev;
	PGPError err;

	err = PGPGetKeyDBObjUserValue (obj, &puvs);
	if (err) 
		return err;

	// there is an existing linked list
	if (puvs) 
	{
		puvsPrev = NULL;
		// search for the element inserted by this KL
		do {
			if (puvs->pKL == pKL) 
			{
				// if value is zero, remove item from list
				if (!lValue) 
				{
					if (!puvsPrev) 
						PGPSetKeyDBObjUserValue (obj, 
								(PGPUserValue)puvs->next);
					else
						puvsPrev->next = puvs->next;
					KLFree (puvs);
				}
				// otherwise set the list element to the desired value
				else 
					puvs->lValue = lValue;
				return kPGPError_NoErr;
			}
			puvsPrev = puvs;
			puvs = puvs->next;
		} while (puvs);

		// no element in list inserted by this KL, create and append one
		if (!lValue) 
			return kPGPError_NoErr;
		puvs = KLAlloc (sizeof(USERVALSTRUCT));
		puvsPrev->next = puvs;
	}
	// no user value, create one
	else 
	{
		if (!lValue)
			return kPGPError_NoErr;

		puvs = KLAlloc (sizeof(USERVALSTRUCT));
		PGPSetKeyDBObjUserValue (obj, (PGPUserValue)puvs);
	}

	// set contents of linked list element
	puvs->pKL = pKL;
	puvs->next = NULL;
	puvs->lValue = lValue;

	return kPGPError_NoErr;
}


//	_______________________________________________
//
//  set key user value list item

static DWORD 
sGetComCtl32Version (VOID)
{
    HINSTANCE	hinstDll;
    DWORD		dwVersion = 0;

    hinstDll = LoadLibrary (TEXT("comctl32.dll"));
    if (hinstDll)
    {
        DLLGETVERSIONPROC pDllGetVersion;
        pDllGetVersion = 
				(DLLGETVERSIONPROC)GetProcAddress (hinstDll, "DllGetVersion");

        if (pDllGetVersion)
        {
            DLLVERSIONINFO	dvi;
            HRESULT			hr;

            ZeroMemory (&dvi, sizeof(dvi));
            dvi.cbSize = sizeof(dvi);

            hr = (*pDllGetVersion)(&dvi);

            if (SUCCEEDED(hr))
               dwVersion = PACKVERSION(dvi.dwMajorVersion, dvi.dwMinorVersion);
        }

        FreeLibrary(hinstDll);
    }
    return dwVersion;
}


//	_______________________________________________
//
//  Create TreeList Window

HKEYLIST PGPclExport 
PGPclKeyListCreate (
		PGPContextRef		context, 
		PGPtlsContextRef	tlscontext,
		HWND				hwndParent,
		INT					iID, 
		INT					iX, 
		INT					iY,
		INT					iWidth, 
		INT					iHeight,
		UINT				uFlags,
		HWND*				phwndTree) 
{
	PKEYLIST				pKL;
	DWORD					dwStyle;
	PGPclWindowsGenus		genus;

	pKL = KLAlloc (sizeof (KEYLIST));
	if (!pKL) 
		return NULL;

	memset (pKL, 0x00, sizeof (KEYLIST));

	pKL->hwndParent = hwndParent;
	pKL->hwndTree = NULL;

	pKL->iID = iID;
	pKL->pDropTarget = NULL;			//pointer to DropTarget object
	ZeroMemory (&pKL->keyserver, sizeof(PGPKeyServerEntry));	

	pKL->context = context;
	pKL->tlscontext = tlscontext;
	pKL->keysetDisp = kInvalidPGPKeySetRef;
	pKL->keydbBacking = kInvalidPGPKeyDBRef;
	pKL->keydbMain = kInvalidPGPKeyDBRef;
	pKL->bMainKeySet = FALSE;
	pKL->ulOptionFlags = 0;
	pKL->ulDisableActions = 0;
	pKL->ulHideColumns = 0;
	pKL->ulShowColumns = 0;

	pKL->bMultipleSelected = FALSE;
	pKL->uSelectedFlags = 0;
	pKL->iFocusedItemType = 0;
	pKL->iFocusedObjectType = 0;
	pKL->hFocusedItem = NULL;
	pKL->pFocusedObject = NULL;

	pKL->iValidityThreshold = PGPCL_VALIDITY_MARGINAL;

	pKL->iNumberSheets = 0;

	KLGetColumnPreferences (pKL);

	// Create the tree view window.

	dwStyle = WS_VISIBLE | WS_CHILD | WS_BORDER | WS_TABSTOP | WS_GROUP |
			TLS_HASBUTTONS | TLS_HASLINES | TLS_AUTOSCROLL | 
			TLS_PROMISCUOUS | TLS_DRAGABLEHEADERS | TLS_DRAGSELECTION;

	PGPclGetWindowsVersion (NULL, &genus, NULL);
	if (genus >= kPGPclWindowsGenusXp)
		dwStyle |= TLS_USEDEFAULTGUIFONT;

	// The new style of tooltips requires a recent version of the Common
	// Control DLL.
	if (sGetComCtl32Version() >= PACKVERSION(5,81))
		dwStyle |= TLS_TOOLTIPNOTIFY;

	if (uFlags & kPGPclKeyList_SingleSelection)
		dwStyle |= TLS_SINGLESELECT;

	if (uFlags & kPGPclKeyList_ShowSelection)
		dwStyle |= TLS_SHOWSELECTIONALWAYS;

	pKL->hwndTree = CreateWindowEx (WS_EX_CLIENTEDGE, WC_TREELIST, "",
			dwStyle, iX, iY, iWidth, iHeight,
			hwndParent, (HMENU)iID, g_hInst, NULL);

	if (pKL->hwndTree == NULL) 
		return NULL;
	*phwndTree = pKL->hwndTree;

	// Associate the image list with the tree view control.
	TreeList_SetImageList (pKL->hwndTree, g_hilKeys);

	KLSetFocus (pKL, NULL, FALSE);

 	return (HKEYLIST)pKL;
}


//	_______________________________________________
//
//  Insert column information into control

BOOL 
KLAddColumns (PKEYLIST pKL) 
{
	TL_COLUMN tlc;
	CHAR sz[64];
	INT iField, iCol, ids;

	TreeList_DeleteAllColumns (pKL->hwndTree);

	tlc.mask = TLCF_FMT | TLCF_WIDTH | TLCF_TEXT | 
				TLCF_SUBITEM | TLCF_DATATYPE | TLCF_DATAMAX |
				TLCF_MOUSENOTIFY;
	tlc.pszText = sz;

	tlc.iSubItem = 0;
	tlc.fmt = TLCFMT_LEFT;
	tlc.iDataType = TLC_DATASTRING;
	tlc.cx = pKL->wFieldWidth[0];
	tlc.bMouseNotify = FALSE;
	LoadString (g_hInst, IDS_NAMEFIELD, sz, sizeof(sz));
	TreeList_InsertColumn (pKL->hwndTree, 0, &tlc);

	for (iCol=1; iCol<NUMBERFIELDS; iCol++) 
	{
		iField = pKL->wColumnField[iCol];
		if (iField) 
		{
			switch (iField) {
			case KLI_VALIDITY :
				ids = IDS_VALIDITYFIELD;
				if (pKL->ulOptionFlags & kPGPclKeyList_GreenDotMode) 
					tlc.fmt = TLCFMT_IMAGE;
				else 
					tlc.fmt = TLCFMT_LINBAR;
				tlc.cchTextMax = 
						CLConvertFromPGPValidity (kPGPValidity_Complete);
				tlc.iDataType = TLC_DATALONG;
				tlc.bMouseNotify = TRUE;
				break;

			case KLI_SIZE :
				ids = IDS_SIZEFIELD;
				tlc.fmt = TLCFMT_LEFT;
				tlc.cchTextMax = 0;
				tlc.iDataType = TLC_DATASTRING;
				tlc.bMouseNotify = FALSE;
				break;

			case KLI_DESCRIPTION :
				ids = IDS_DESCRIPTIONFIELD;
				tlc.fmt = TLCFMT_LEFT;
				tlc.cchTextMax = 0;
				tlc.iDataType = TLC_DATASTRING;
				tlc.bMouseNotify = FALSE;
				break;

			case KLI_KEYID :
				ids = IDS_KEYIDFIELD;
				tlc.fmt = TLCFMT_LEFT;
				tlc.cchTextMax = 0;
				tlc.iDataType = TLC_DATASTRING;
				tlc.bMouseNotify = FALSE;
				break;
				
			case KLI_TRUST :
				ids = IDS_TRUSTFIELD;
				tlc.fmt = TLCFMT_LINBAR;
				tlc.cchTextMax = 
						CLConvertFromPGPTrust (kPGPKeyTrust_Complete);
				tlc.iDataType = TLC_DATALONG;
				tlc.bMouseNotify = FALSE;
				break;

			case KLI_CREATION :
				ids = IDS_CREATIONFIELD;
				tlc.fmt = TLCFMT_LEFT;
				tlc.cchTextMax = 0;
				tlc.iDataType = TLC_DATASTRING;
				tlc.bMouseNotify = FALSE;
				break;
				
			case KLI_EXPIRATION :
				ids = IDS_EXPIRATIONFIELD;
				tlc.fmt = TLCFMT_LEFT;
				tlc.cchTextMax = 0;
				tlc.iDataType = TLC_DATASTRING;
				tlc.bMouseNotify = FALSE;
				break;
				
			case KLI_ADK :
				ids = IDS_ADKFIELD;
				tlc.fmt = TLCFMT_IMAGE;
				tlc.cchTextMax = 0;
				tlc.iDataType = TLC_DATALONG;
				tlc.bMouseNotify = FALSE;
				break;
			}
			LoadString (g_hInst, ids, sz, sizeof(sz));
			tlc.cx = pKL->wFieldWidth[iField];
			TreeList_InsertColumn (pKL->hwndTree, iCol, &tlc);
		}
	}

	return TRUE;
}


//	_______________________________________________
//
//  Set (or add) a tree item to the tree

static HTLITEM 
sSetOneItem (
		PKEYLIST		pKL, 
		BOOL		bReInsertExisting, 
		HTLITEM		hItem, 
		HTLITEM		hParent, 
		LPSTR		szText, 
		HTLITEM		hInsAfter, 
		INT			iImage, 
		UINT		uState, 
		LPARAM		lParam) 
{
	TL_TREEITEM tlI;
	TL_INSERTSTRUCT tlIns;

	tlI.hItem = hItem;
	tlI.mask = TLIF_TEXT | TLIF_IMAGE | TLIF_STATE | TLIF_PARAM;
	tlI.stateMask = TLIS_BOLD | TLIS_ITALICS;
	tlI.stateMask |= uState;
	tlI.state = uState;
	tlI.pszText = szText;
	tlI.cchTextMax = lstrlen (szText);
	tlI.iImage = iImage;
	tlI.iSelectedImage = iImage;
	tlI.lParam = lParam;

	// Insert the data into the tree.
	if (bReInsertExisting || !hItem) 
	{
		tlIns.item = tlI;
		tlIns.hInsertAfter = hInsAfter;
		tlIns.hParent = hParent;
		return (TreeList_InsertItem (pKL->hwndTree, &tlIns));
	}
	else 
	{
		TreeList_SetItem (pKL->hwndTree, &tlI);
		return hItem;
	}
}


//	_______________________________________________
//
//  Set list data for a key

static VOID 
sFillDescription (
		INT		idx, 
		INT		iVal, 
		LPSTR	sz, 
		INT		iLen) 
{
	INT		ids				= 0;
	BOOL	bSig			= FALSE;
	CHAR	szTemp[128];

	switch (idx) {

	case IDX_RSAPUBKEY :		ids = IDS_RSAPUBKEY;		break;
	case IDX_RSAPUBDISKEY :		ids = IDS_RSAPUBDISKEY;		break;
	case IDX_RSAPUBREVKEY :		ids = IDS_RSAPUBREVKEY;		break;
	case IDX_RSAPUBEXPKEY :		ids = IDS_RSAPUBEXPKEY;		break;
	
	case IDX_RSASECKEY :		ids = IDS_RSASECKEY;		break;
	case IDX_RSASECDISKEY :		ids = IDS_RSASECDISKEY;		break;
	case IDX_RSASECREVKEY :		ids = IDS_RSASECREVKEY;		break;
	case IDX_RSASECEXPKEY :		ids = IDS_RSASECEXPKEY;		break;
	case IDX_RSASECSHRKEY :		ids = IDS_RSASECSHRKEY;		break;

	case IDX_RSAV4PUBKEY :		ids = IDS_RSAV4PUBKEY;		break;
	case IDX_RSAV4PUBDISKEY :	ids = IDS_RSAV4PUBDISKEY;	break;
	case IDX_RSAV4PUBREVKEY :	ids = IDS_RSAV4PUBREVKEY;	break;
	case IDX_RSAV4PUBEXPKEY :	ids = IDS_RSAV4PUBEXPKEY;	break; 

	case IDX_RSAV4SECKEY :		ids = IDS_RSAV4SECKEY;		break;
	case IDX_RSAV4SECDISKEY :	ids = IDS_RSAV4SECDISKEY;	break; 
	case IDX_RSAV4SECREVKEY :	ids = IDS_RSAV4SECREVKEY;	break; 
	case IDX_RSAV4SECEXPKEY :	ids = IDS_RSAV4SECEXPKEY;	break; 
	case IDX_RSAV4SECSHRKEY :	ids = IDS_RSAV4SECSHRKEY;	break; 

	case IDX_RSATOKKEY :		ids = IDS_RSATOKKEY;		break;
	case IDX_RSATOKDISKEY :		ids = IDS_RSATOKDISKEY;		break;
	case IDX_RSATOKREVKEY :		ids = IDS_RSATOKREVKEY;		break;
	case IDX_RSATOKEXPKEY :		ids = IDS_RSATOKEXPKEY;		break;

	case IDX_RSAV4TOKKEY :		ids = IDS_RSAV4TOKKEY;		break;
	case IDX_RSAV4TOKDISKEY :	ids = IDS_RSAV4TOKDISKEY;	break;
	case IDX_RSAV4TOKREVKEY :	ids = IDS_RSAV4TOKREVKEY;	break;
	case IDX_RSAV4TOKEXPKEY :	ids = IDS_RSAV4TOKEXPKEY;	break;

	case IDX_DSAPUBKEY :		ids = IDS_DSAPUBKEY;		break;
	case IDX_DSAPUBDISKEY :		ids = IDS_DSAPUBDISKEY;		break;
	case IDX_DSAPUBREVKEY :		ids = IDS_DSAPUBREVKEY;		break;
	case IDX_DSAPUBEXPKEY :		ids = IDS_DSAPUBEXPKEY;		break;

	case IDX_DSASECKEY :		ids = IDS_DSASECKEY;		break;
	case IDX_DSASECDISKEY :		ids = IDS_DSASECDISKEY;		break;
	case IDX_DSASECREVKEY :		ids = IDS_DSASECREVKEY;		break;
	case IDX_DSASECEXPKEY :		ids = IDS_DSASECEXPKEY;		break;
	case IDX_DSASECSHRKEY :		ids = IDS_DSASECSHRKEY;		break;

	case IDX_ECPUBKEY :			ids = IDS_ECPUBKEY;			break;
	case IDX_ECPUBDISKEY :		ids = IDS_ECPUBDISKEY;		break;
	case IDX_ECPUBREVKEY :		ids = IDS_ECPUBREVKEY;		break;
	case IDX_ECPUBEXPKEY :		ids = IDS_ECPUBEXPKEY;		break;

	case IDX_ECSECKEY :			ids = IDS_ECSECKEY;			break;
	case IDX_ECSECDISKEY :		ids = IDS_ECSECDISKEY;		break;
	case IDX_ECSECREVKEY :		ids = IDS_ECSECREVKEY;		break;
	case IDX_ECSECEXPKEY :		ids = IDS_ECSECEXPKEY;		break;
	case IDX_ECSECSHRKEY :		ids = IDS_ECSECSHRKEY;		break;

	case IDX_RSAUSERID :		ids = IDS_RSAUSERID;		break;
	case IDX_DSAUSERID :		ids = IDS_DSAUSERID;		break;
	case IDX_PHOTOUSERID :		ids = IDS_PHOTOUSERID;		break;
	case IDX_INVALIDUSERID :	ids = IDS_UNKNOWNFORMAT;	break;

	case IDX_CERT :		
		ids = IDS_CERT;	
		bSig = TRUE;
		break;

	case IDX_REVCERT :		
		ids = IDS_REVCERT;			
		bSig = TRUE;
		break;

	case IDX_EXPCERT :		
		ids = IDS_EXPCERT;			
		bSig = TRUE;
		break;

	case IDX_BADCERT :		
		ids = IDS_BADCERT;			
		bSig = TRUE;
		break;

	case IDX_EXPORTCERT :	
		ids = IDS_EXPORTCERT;		
		bSig = TRUE;
		break;

	case IDX_TRUSTEDCERT :		
		ids = IDS_EXPORTMETACERT;	
		bSig = TRUE;
		break;

	case IDX_METACERT:
		ids = IDS_METACERT;			
		bSig = TRUE;
		break;

	case IDX_X509CERT :
		ids = IDS_X509CERT;
		bSig = FALSE;
		break;

	case IDX_X509EXPCERT :
		ids = IDS_X509EXPCERT;
		bSig = FALSE;
		break;

	case IDX_X509REVCERT :
		ids = IDS_X509REVCERT;
		bSig = FALSE;
		break;

	case IDX_X509BADCERT :
		ids = IDS_X509BADCERT;
		bSig = FALSE;
		break;

	default :				
		ids = IDS_UNKNOWNFORMAT;			
		break;
	}

	sz[0] = '\0';

	if (bSig) 
	{
		switch (iVal) {
		case kPGPPublicKeyAlgorithm_RSA :
			LoadString (g_hInst, IDS_RSA, sz, iLen);
			break;

		case kPGPPublicKeyAlgorithm_DSA :
			LoadString (g_hInst, IDS_DSS, sz, iLen);
			break;

		case kPGPPublicKeyAlgorithm_ECSign :
			LoadString (g_hInst, IDS_EC, sz, iLen);
			break;

		default :
			LoadString (g_hInst, IDS_UNKNOWN, sz, iLen);
			break;
		}
		lstrcat (sz, " ");
	}

	LoadString (g_hInst, ids, szTemp, sizeof(szTemp));
	lstrcat (sz, szTemp);
}


//	_______________________________________________
//
//  Set list data for a key

static HTLITEM 

⌨️ 快捷键说明

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