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 + -
显示快捷键?