⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 clkspref.c

📁 vc环境下的pgp源码
💻 C
📖 第 1 页 / 共 3 页
字号:
/*____________________________________________________________________________
	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 + -