📄 clkspref.c
字号:
/*____________________________________________________________________________
Copyright (C) 1998 Network Associates, Inc.
All rights reserved.
CLksPref.c - handle keyserver preferences dialogs
$Id: CLkspref.c,v 1.37 1999/03/12 15:30:21 pbj Exp $
____________________________________________________________________________*/
#include "pgpPFLConfig.h"
// project header files
#include "pgpclx.h"
#include "..\Include\treelist.h"
// constant definitions
#define BITMAP_WIDTH 16
#define BITMAP_HEIGHT 16
#define TREEOFFSETLEFT 8
#define BUTTONOFFSETX 10
#define BUTTONOFFSETY 10
#define DOMAINLISTWIDTH 48
#define CHECKLISTWIDTH 48
#define IDX_NONE -1
#define IDX_UNCHECKED 0
#define IDX_UNCHECKEDPUSHED 1
#define IDX_CHECKED 2
#define IDX_CHECKEDPUSHED 3
#define IDX_WORLDDOMAIN 4
#define IDX_SERVER 5
#define NUM_BITMAPS 6
// typedefs
typedef struct {
HWND hWndTree;
BOOL bEdit;
CHAR szServer[256];
PGPUInt16 iPort;
PGPKeyServerType iType;
CHAR szKeyIDAuth[kPGPMaxKeyIDStringSize];
PGPPublicKeyAlgorithm authAlg;
CHAR szUserIDAuth[kPGPMaxUserIDSize +1];
CHAR szDomain[256];
BOOL bListed;
BOOL bRoot;
VOID* pOrigStruct;
} KEYSERVERSTRUCT, *PKEYSERVERSTRUCT;
// external globals
extern HINSTANCE g_hInst;
extern CHAR g_szHelpFile[MAX_PATH];
// local globals
static HIMAGELIST hIml;
static HTLITEM hTSelected;
static HTLITEM hTDefault;
static INT iSelectedType;
static BOOL bSelectedRoot;
static BOOL bFirstInList;
static BOOL bLastInList;
static UINT uNumberOfServers;
static DWORD aIds[] = { // Help IDs
IDC_PROTOCOL, IDH_PGPCLPREF_SERVERPROTOCOL,
IDC_SERVERNAME, IDH_PGPCLPREF_SERVERNAME,
IDC_PORT, IDH_PGPCLPREF_SERVERPORT,
IDC_SERVERKEY, IDH_PGPCLPREF_SERVERAUTHKEY,
IDC_ANYDOMAIN, IDH_PGPCLPREF_SERVERNODOMAIN,
IDC_DOMAIN, IDH_PGPCLPREF_SERVERDOMAIN,
IDC_SPECIFIEDDOMAIN,IDH_PGPCLPREF_SERVERDOMAIN,
IDC_LISTED, IDH_PGPCLPREF_SERVERLISTED,
0,0
};
// _____________________________________________________
//
// concatenate protocol and server names
static VOID
sURLfromInfo (
PGPKeyServerType iType,
LPSTR szServer,
PGPUInt16 iPort,
LPSTR szURL)
{
switch (iType) {
case kPGPKeyServerType_LDAP : lstrcpy (szURL, "ldap://"); break;
case kPGPKeyServerType_LDAPS : lstrcpy (szURL, "ldaps://"); break;
case kPGPKeyServerType_HTTPS : lstrcpy (szURL, "https://"); break;
default : lstrcpy (szURL, "http://"); break;
}
lstrcat (szURL, szServer);
if (iPort != 0) {
CHAR szPort[8];
wsprintf (szPort, ":%i", iPort);
lstrcat (szURL, szPort);
}
}
// _____________________________________________________
//
// put data for one keyserver into treelist
static HTLITEM
sSetOneKSItem (HWND hWndTree, PKEYSERVERSTRUCT pkss)
{
TL_TREEITEM tlI;
TL_LISTITEM tlL;
TL_INSERTSTRUCT tlIns;
HTLITEM hTNew;
CHAR sz[256];
sURLfromInfo (pkss->iType, pkss->szServer, pkss->iPort, sz);
tlI.hItem = NULL;
tlI.mask = TLIF_TEXT | TLIF_IMAGE | TLIF_STATE | TLIF_PARAM;
tlI.stateMask = TLIS_BOLD;
if (pkss->bRoot)
tlI.state = TLIS_BOLD;
else
tlI.state = 0;
tlI.pszText = sz;
tlI.cchTextMax = lstrlen (sz);
tlI.iImage = IDX_SERVER;
tlI.iSelectedImage = IDX_SERVER;
tlI.lParam = (LPARAM)pkss;
tlIns.item = tlI;
tlIns.hInsertAfter = (HTLITEM)TLI_LAST;
tlIns.hParent = NULL;
hTNew = TreeList_InsertItem (hWndTree, &tlIns);
if (lstrlen (pkss->szDomain))
tlL.pszText = pkss->szDomain;
else
tlL.pszText = NULL;
tlL.hItem = hTNew;
tlL.stateMask = TLIS_VISIBLE;
tlL.iSubItem = 1;
tlL.mask = TLIF_DATAVALUE | TLIF_TEXT | TLIF_STATE;
tlL.state = TLIS_VISIBLE;
tlL.lDataValue = IDX_WORLDDOMAIN;
TreeList_SetListItem (hWndTree, &tlL, FALSE);
tlL.pszText = NULL;
tlL.hItem = hTNew;
tlL.stateMask = TLIS_VISIBLE;
tlL.iSubItem = 2;
tlL.mask = TLIF_DATAVALUE | TLIF_STATE;
tlL.state = TLIS_VISIBLE;
if (pkss->bListed) tlL.lDataValue = IDX_CHECKED;
else tlL.lDataValue = IDX_UNCHECKED;
TreeList_SetListItem (hWndTree, &tlL, FALSE);
return hTNew;
}
// _____________________________________________________
//
// populate keyserver treelist with data from preferences
static INT
sFillTreeList (
PGPPrefRef PrefRef,
PGPContextRef context,
HWND hWndTree,
PGPKeySetRef keysetMain)
{
PGPKeyServerEntry* keyserverList;
PGPKeyRef key;
PGPUInt32 u, u2;
PGPError err;
PKEYSERVERSTRUCT pkss;
PGPKeyID keyid;
// load keyserverprefs
err = PGPGetKeyServerPrefs (PrefRef, &keyserverList, &uNumberOfServers);
if (IsPGPError (err))
uNumberOfServers = 0;
for (u=0; u<uNumberOfServers; u++) {
pkss = clAlloc (sizeof(KEYSERVERSTRUCT));
if (pkss) {
pkss->hWndTree = hWndTree;
pkss->bEdit = FALSE;
lstrcpy (pkss->szServer, keyserverList[u].serverDNS);
pkss->iPort = keyserverList[u].serverPort;
pkss->iType = keyserverList[u].protocol;
lstrcpy (pkss->szDomain, keyserverList[u].domain);
pkss->bListed = (keyserverList[u].flags & kKeyServerListed);
pkss->authAlg = keyserverList[u].authAlg;
pkss->bRoot = (keyserverList[u].flags & kKeyServerIsRoot);
// get auth key userid
pkss->szUserIDAuth[0] = '\0';
if ((pkss->authAlg != kPGPPublicKeyAlgorithm_Invalid) &&
keyserverList[u].authKeyIDString[0]) {
lstrcpy (pkss->szKeyIDAuth,
keyserverList[u].authKeyIDString);
err = PGPGetKeyIDFromString (
keyserverList[u].authKeyIDString, &keyid);
if (IsntPGPError (err)) {
err = PGPGetKeyByKeyID (keysetMain, &keyid,
keyserverList[u].authAlg, &key);
if (IsntPGPError (err)) {
PGPGetPrimaryUserIDNameBuffer (key,
sizeof(pkss->szUserIDAuth),
pkss->szUserIDAuth, &u2);
}
else {
lstrcpy (pkss->szUserIDAuth,
keyserverList[u].authKeyIDString);
}
}
}
if (pkss->szUserIDAuth[0] == '\0') {
LoadString (g_hInst, IDS_UNKNOWNKEY, pkss->szUserIDAuth,
sizeof(pkss->szUserIDAuth));
}
sSetOneKSItem (hWndTree, pkss);
}
}
if (keyserverList) PGPDisposePrefData (PrefRef, keyserverList);
return 0;
}
// _____________________________________________________
//
// add columns to treelist
static BOOL
sAddColumns (HWND hWndTree, INT iWidth) {
TL_COLUMN tlc;
CHAR sz[64];
TreeList_DeleteAllColumns (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 = iWidth - DOMAINLISTWIDTH - CHECKLISTWIDTH - 20;
tlc.bMouseNotify = FALSE;
LoadString (g_hInst, IDS_SERVER, sz, sizeof(sz));
TreeList_InsertColumn (hWndTree, 0, &tlc);
tlc.fmt = TLCFMT_IMAGE;
tlc.iDataType = TLC_DATALONG;
tlc.cx = DOMAINLISTWIDTH;
tlc.bMouseNotify = FALSE;
LoadString (g_hInst, IDS_DOMAIN, sz, sizeof(sz));
TreeList_InsertColumn (hWndTree, 1, &tlc);
tlc.fmt = TLCFMT_IMAGE;
tlc.iDataType = TLC_DATALONG;
tlc.cx = CHECKLISTWIDTH;
tlc.bMouseNotify = TRUE;
LoadString (g_hInst, IDS_LISTED, sz, sizeof(sz));
TreeList_InsertColumn (hWndTree, 2, &tlc);
return TRUE;
}
// _____________________________________________________
//
// create new treelist control for keyserver prefs
HWND
CLCreateKeyserverTreeList (
PGPPrefRef PrefRef,
PGPContextRef context,
HWND hWndParent,
PGPKeySetRef keysetMain)
{
HBITMAP hBmp; // handle to a bitmap
HDC hDC;
HWND hWndTree;
RECT rc;
INT iwidth, iheight, itop, iNumBits;
POINT pt;
// Ensure that the common control DLL is loaded.
InitCommonControls ();
// Ensure that the custom control DLL is loaded.
InitTreeListControl ();
// initialize flags
iSelectedType = IDX_NONE;
bSelectedRoot = FALSE;
bLastInList = TRUE;
bFirstInList = TRUE;
// create tree view window
GetWindowRect (GetDlgItem (hWndParent, IDC_NEWKEYSERVER), &rc);
pt.x = rc.left;
pt.y = rc.top;
ScreenToClient (hWndParent, &pt);
itop = pt.y;
iwidth = pt.x - BUTTONOFFSETX - TREEOFFSETLEFT;
GetWindowRect (GetDlgItem (hWndParent, IDC_SYNCONSTATICTEXT), &rc);
pt.x = rc.left;
pt.y = rc.top;
ScreenToClient (hWndParent, &pt);
iheight = pt.y - BUTTONOFFSETY - itop;
GetClientRect (hWndParent, &rc);
hWndTree = CreateWindowEx (WS_EX_CLIENTEDGE, WC_TREELIST, "",
WS_VISIBLE | WS_CHILD | WS_BORDER | WS_TABSTOP | WS_GROUP |
TLS_AUTOSCROLL | TLS_SINGLESELECT | TLS_SHOWSELECTIONALWAYS,
TREEOFFSETLEFT, itop, iwidth, iheight,
hWndParent, (HMENU)IDC_KSTREELIST, g_hInst, NULL);
if (hWndTree == NULL) return NULL;
// Initialize the tree view window.
// First create imagelist and load the appropriate bitmaps based on
// current display capabilities.
hDC = GetDC (NULL); // DC for desktop
iNumBits = GetDeviceCaps (hDC, BITSPIXEL) * GetDeviceCaps (hDC, PLANES);
ReleaseDC (NULL, hDC);
if (iNumBits <= 8) {
hIml = ImageList_Create (16, 16, ILC_COLOR|ILC_MASK,
NUM_BITMAPS, 0);
hBmp = LoadBitmap (g_hInst, MAKEINTRESOURCE (IDB_IMAGES4));
ImageList_AddMasked (hIml, hBmp, RGB(255, 0, 255));
DeleteObject (hBmp);
}
else {
hIml = ImageList_Create (16, 16, ILC_COLOR24|ILC_MASK,
NUM_BITMAPS, 0);
hBmp = LoadBitmap (g_hInst, MAKEINTRESOURCE (IDB_IMAGES24));
ImageList_AddMasked (hIml, hBmp, RGB(255, 0, 255));
DeleteObject (hBmp);
}
// Associate the image list with the tree view control.
TreeList_SetImageList (hWndTree, hIml);
sAddColumns (hWndTree, iwidth);
sFillTreeList (PrefRef, context, hWndTree, keysetMain);
return hWndTree;
}
// _____________________________________________________
//
// destroy treelist control for keyserver prefs
INT
CLDestroyKeyserverTreeList (HWND hWndTree)
{
HTLITEM hTServer;
TL_TREEITEM tlI;
// free all KEYSERVERSTRUCT structures
hTServer = TreeList_GetFirstItem (hWndTree);
while (hTServer) {
tlI.hItem = hTServer;
tlI.mask = TLIF_NEXTHANDLE | TLIF_PARAM;
TreeList_GetItem (hWndTree, &tlI);
clFree ((VOID*)(tlI.lParam));
hTServer = tlI.hItem;
}
// close treelist
SendMessage (hWndTree, WM_CLOSE, 0, 0);
return 0;
}
// _____________________________________________________
//
// check if specified server is already in list
static BOOL
sIsThisServerAlreadyInList (PKEYSERVERSTRUCT pkssThis)
{
TL_TREEITEM tlI;
HTLITEM hTServer;
INT iServerCount;
PKEYSERVERSTRUCT pkss;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -