clavlist.c

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

C
1,349
字号
		HWND			hwnd,
		PAVLISTSTRUCT	pavls)
{
	BOOL				bReturn		= TRUE;
	PGPAVAttribute		attr		= 0;
	CHAR				sz[256];

	switch (pavls->serverclass) {
	case kPGPKeyServerClass_Invalid :
		sInsertAttribute (hwnd, pavls, kPGPAVAttribute_CommonName);
		sInsertAttribute (hwnd, pavls, kPGPAVAttribute_MailFirstName);
		sInsertAttribute (hwnd, pavls, kPGPAVAttribute_MailMiddleName);
		sInsertAttribute (hwnd, pavls, kPGPAVAttribute_MailLastName);
		break;

	case kPGPKeyServerClass_Verisign :
#if PGP_VERISIGN_NAMES
		sInsertAttribute (hwnd, pavls, kPGPAVAttribute_MailFirstName);
		sInsertAttribute (hwnd, pavls, kPGPAVAttribute_MailMiddleName);
		sInsertAttribute (hwnd, pavls, kPGPAVAttribute_MailLastName);
#else
		sInsertAttribute (hwnd, pavls, kPGPAVAttribute_CommonName);
#endif //PGP_VERISIGN_NAMES
		sInsertAttribute (hwnd, pavls, kPGPAVAttribute_CertType);
		break;

	default :
		sInsertAttribute (hwnd, pavls, kPGPAVAttribute_CommonName);
		break;
	}

	sInsertAttribute (hwnd, pavls, kPGPAVAttribute_Email);
	sInsertAttribute (hwnd, pavls, kPGPAVAttribute_OrganizationName);
	sInsertAttribute (hwnd, pavls, kPGPAVAttribute_OrganizationalUnitName);
	sInsertAttribute (hwnd, pavls, kPGPAVAttribute_Country);
	sInsertAttribute (hwnd, pavls, kPGPAVAttribute_Locality);
	sInsertAttribute (hwnd, pavls, kPGPAVAttribute_State);
	sInsertAttribute (hwnd, pavls, kPGPAVAttribute_StreetAddress);
	sInsertAttribute (hwnd, pavls, kPGPAVAttribute_PostalCode);
	sInsertAttribute (hwnd, pavls, kPGPAVAttribute_POBOX);
	sInsertAttribute (hwnd, pavls, kPGPAVAttribute_TelephoneNumber);
	sInsertAttribute (hwnd, pavls, kPGPAVAttribute_Initials);
	sInsertAttribute (hwnd, pavls, kPGPAVAttribute_DNSName);
	sInsertAttribute (hwnd, pavls, kPGPAVAttribute_IPAddress);
	sInsertAttribute (hwnd, pavls, kPGPAVAttribute_RFC822Name);

	if (pavls->selectedpair == NULL)
	{
		LoadString (g_hInst, IDS_NEWATTRIBUTETITLE, sz, sizeof(sz));
		SetWindowText (hwnd, sz);

		if (!SendDlgItemMessage (hwnd, IDC_ATTRIBUTELIST, CB_GETCOUNT, 0, 0))
		{
			PGPclMessageBox (hwnd, IDS_CAPTIONALERT, 
					IDS_NOMOREATTRIBUTES, MB_OK|MB_ICONEXCLAMATION);
			bReturn = FALSE;
		}
		else
		{
			SendDlgItemMessage (
					hwnd, IDC_ATTRIBUTELIST, CB_SETCURSEL, 0, 0);
			attr = SendDlgItemMessage (
					hwnd, IDC_ATTRIBUTELIST, CB_GETITEMDATA, 0, 0);
		}

		SetFocus (GetDlgItem (hwnd, IDC_ATTRIBUTELIST));
	}
	else
	{
		INT	index;

		attr = pavls->selectedpair->attribute;
		sInsertAttribute (hwnd, NULL, attr);
		PGPclGetAVListAttributeString (attr, sz, sizeof(sz));
		index = SendDlgItemMessage (hwnd, IDC_ATTRIBUTELIST,
							CB_FINDSTRINGEXACT, 0, (LPARAM)sz);
		SendDlgItemMessage (hwnd, IDC_ATTRIBUTELIST, CB_SETCURSEL, index, 0);
		sGetValueString (pavls->selectedpair, sz, sizeof(sz));
		SetDlgItemText (hwnd, IDC_VALUE, sz);
		SendDlgItemMessage (hwnd, IDC_VALUE, EM_SETSEL, 0, -1);
		SetFocus (GetDlgItem (hwnd, IDC_VALUE));
	}

	if (attr == kPGPAVAttribute_MailMiddleName)
		SendDlgItemMessage (
				hwnd, IDC_VALUE, EM_SETLIMITTEXT, 1, 0);
	else
		SendDlgItemMessage (
				hwnd, IDC_VALUE, EM_SETLIMITTEXT, 255, 0);

	return bReturn;
}


//	___________________________________________________
//
//	New AV pair dialog procedure

static BOOL CALLBACK
sAVPairDlgProc (
		HWND	hwnd,
		UINT	uMsg,
		WPARAM	wParam,
		LPARAM	lParam)
{
	PAVLISTSTRUCT		pavls;
	PGPSize				size;
	INT					index;

	switch (uMsg) {

	case WM_INITDIALOG :
		SetWindowLong (hwnd, GWL_USERDATA, lParam);
		pavls = (PAVLISTSTRUCT)lParam;

		if (!sInitAVPairDialog (hwnd, pavls))
			EndDialog (hwnd, 0);

		return FALSE;

	case WM_HELP :
	case WM_CONTEXTMENU :
		return PGPclHtmlHelp (hwnd, uMsg, wParam, lParam, 
				(char*)kPGPclHelpFile, aAVeditIds);

	case WM_COMMAND :
		pavls = (PAVLISTSTRUCT)GetWindowLong (hwnd, GWL_USERDATA);

		switch (LOWORD(wParam)) {

		case IDC_ATTRIBUTELIST :
			if (HIWORD (wParam) == CBN_SELCHANGE)
			{
				PGPAVAttribute		attr;

				SetDlgItemText (hwnd, IDC_VALUE, "");
				SetFocus (GetDlgItem (hwnd, IDC_VALUE));

				index = SendDlgItemMessage (
						hwnd, IDC_ATTRIBUTELIST, CB_GETCURSEL, 0, 0);
				attr = SendDlgItemMessage (
						hwnd, IDC_ATTRIBUTELIST, CB_GETITEMDATA, index, 0);

				if (attr == kPGPAVAttribute_MailMiddleName)
					SendDlgItemMessage (
							hwnd, IDC_VALUE, EM_SETLIMITTEXT, 1, 0);
				else
					SendDlgItemMessage (
							hwnd, IDC_VALUE, EM_SETLIMITTEXT, 255, 0);
			}
			break;

		case IDCANCEL :
			EndDialog (hwnd, 0);
			break;

		case IDOK :
			size = GetWindowTextLength (GetDlgItem (hwnd, IDC_VALUE));
			if (size == 0)
			{
				PGPclMessageBox (hwnd, IDS_CAPTIONINFO, 
						IDS_MUSTENTERVALUE, MB_OK|MB_ICONINFORMATION);
				break;
			}

			if (pavls->selectedpair)
			{
				if (pavls->selectedpair->value.pointervalue)
					PGPFreeData (pavls->selectedpair->value.pointervalue);
			}
			else
			{
				pavls->selectedpair = pavls->pAVListEnd;
				index = SendDlgItemMessage (
						hwnd, IDC_ATTRIBUTELIST, CB_GETCURSEL, 0, 0);
				pavls->selectedpair->attribute = SendDlgItemMessage (
						hwnd, IDC_ATTRIBUTELIST, CB_GETITEMDATA, index, 0);
				(pavls->pAVListEnd)++;
			}

			pavls->selectedpair->value.pointervalue = PGPNewData (
							PGPPeekContextMemoryMgr (pavls->context),
							size+1, kPGPMemoryMgrFlags_Clear);

			if (pavls->selectedpair->value.pointervalue)
			{
				pavls->selectedpair->size = size;
				GetWindowText (GetDlgItem (hwnd, IDC_VALUE),
						pavls->selectedpair->value.pointervalue, size+1);
			}
			else
				pavls->selectedpair->size = 0;

			EndDialog (hwnd, 1);
			break;
		}
		return TRUE;
	}
	return FALSE;
}


//	___________________________________________________
//
//	Initialize the AV list listview control

static VOID
sInitAVListControls (
		HWND			hwnd,
		PAVLISTSTRUCT	pavls)
{
	LV_COLUMN		lvc;
	RECT			rc;
	CHAR			sz[32];
	HWND			hwndList;

	// initialize text string
	switch (pavls->serverclass) {
	case kPGPKeyServerClass_NetToolsCA :
		LoadString (g_hInst, IDS_CATYPENETTOOLS, sz, sizeof(sz));
		break;

	case kPGPKeyServerClass_Verisign :
		LoadString (g_hInst, IDS_CATYPEVERISIGN, sz, sizeof(sz));
		break;

	case kPGPKeyServerClass_Entrust :
		LoadString (g_hInst, IDS_CATYPEENTRUST, sz, sizeof(sz));
		break;

	case kPGPKeyServerClass_Netscape :
		LoadString (g_hInst, IDS_CATYPENETSCAPE, sz, sizeof(sz));
		break;

	case kPGPKeyServerClass_Microsoft :
		LoadString (g_hInst, IDS_CATYPEMICROSOFT, sz, sizeof(sz));
		break;

	default :
		LoadString (g_hInst, IDS_CATYPEUNSPECIFIED, sz, sizeof(sz));
		break;
	}
	SetDlgItemText (hwnd, IDC_CATYPE, sz);

	// add columns
	hwndList = GetDlgItem (hwnd, IDC_AVLIST);
	GetClientRect (hwndList, &rc);
	lvc.mask = LVCF_WIDTH|LVCF_TEXT;
	lvc.pszText = sz;

	LoadString (g_hInst, IDS_ATTRIBUTE, sz, sizeof(sz));
	lvc.cx = INITIAL_ATTRIBUTE_COLUMNWIDTH;
	lvc.iSubItem = 0;
	if (ListView_InsertColumn (hwndList, 0, &lvc) == -1) return;

	LoadString (g_hInst, IDS_VALUE, sz, sizeof(sz));
	lvc.cx = rc.right - rc.left
					-INITIAL_ATTRIBUTE_COLUMNWIDTH -SCROLLBAR_WIDTH;
	lvc.iSubItem = 1;
	if (ListView_InsertColumn (hwndList, 1, &lvc) == -1) return;

}


//	___________________________________________________
//
//	Load the AV list listview control with AV pairs

static VOID
sLoadAVList (
		HWND			hwnd,
		PAVLISTSTRUCT	pavls)
{
	CHAR				sz[256];
	LV_ITEM				lvi;
	HWND				hwndList;
	PGPAttributeValue*	pAV;

	hwndList = GetDlgItem (hwnd, IDC_AVLIST);

	ListView_DeleteAllItems (hwndList);

	lvi.iItem = 0;
	lvi.pszText = sz;

	for (pAV=pavls->pAVListStart; pAV<pavls->pAVListEnd; pAV++)
	{
		lvi.mask = LVIF_TEXT|LVIF_PARAM;
		lvi.iSubItem = 0;
		PGPclGetAVListAttributeString (pAV->attribute, sz, sizeof(sz));
		lvi.lParam = (LPARAM)pAV;
		ListView_InsertItem (hwndList, &lvi);

		lvi.mask = LVIF_TEXT;
		lvi.iSubItem = 1;
		sz[0] = '\0';
		sGetValueString (pAV, sz, sizeof(sz));
		ListView_SetItem (hwndList, &lvi);

		lvi.iItem++;
	}
}


//	___________________________________________________
//
//	remove the selected AV pair from the list

static VOID
sRemoveSelectedAVPair (
		PAVLISTSTRUCT	pavls)
{
	PGPAttributeValue*	pAV;

	if (pavls->selectedpair->value.pointervalue)
		PGPFreeData (pavls->selectedpair->value.pointervalue);

	for (pAV=pavls->selectedpair; pAV<pavls->pAVListEnd; pAV++)
	{
		pgpCopyMemory ((pAV+1), pAV, sizeof(PGPAttributeValue));
	}

	(pavls->pAVListEnd)--;
}


//	_____________________________________________________
//
//  draw listview item

static VOID
sDrawItem (
		LPDRAWITEMSTRUCT	pdis)
{
	RECT			rc;
	RECT			rcAll;
	RECT			rcLabel;
	RECT			rcDraw;

	BOOL			bFocus = (GetFocus() == pdis->hwndItem);
	BOOL			bSelected;

	COLORREF		clrTextSave, clrBkSave;

	static CHAR		sz[128];

	LV_COLUMN		lvc;
	LV_ITEM			lvi;
	UINT			nJustify = DT_LEFT;
	INT				iCol;

	// get item data
	lvi.mask		= LVIF_TEXT | LVIF_STATE;
	lvi.iItem		= pdis->itemID;
	lvi.iSubItem	= 0;
	lvi.pszText		= sz;
	lvi.cchTextMax	= sizeof(sz);
	lvi.stateMask	= 0xFFFF;     // get all state flags
	ListView_GetItem (pdis->hwndItem, &lvi);

	bSelected = lvi.state & LVIS_SELECTED;

	ListView_GetItemRect (pdis->hwndItem, pdis->itemID, &rcAll, LVIR_BOUNDS);
	ListView_GetItemRect (pdis->hwndItem, pdis->itemID, &rcLabel, LVIR_LABEL);
	rcAll.left = rcLabel.left;

	// set colors if item is selected
	if (bSelected && bFocus)
	{
		clrTextSave = SetTextColor(pdis->hDC, GetSysColor(COLOR_HIGHLIGHTTEXT));
		clrBkSave = SetBkColor(pdis->hDC, GetSysColor(COLOR_HIGHLIGHT));

		FillRect (pdis->hDC, &rcAll, (HBRUSH)(COLOR_HIGHLIGHT+1));
	}
	else if (bSelected && !bFocus)
	{
		clrTextSave = SetTextColor(pdis->hDC, GetSysColor(COLOR_BTNTEXT));
		clrBkSave = SetBkColor(pdis->hDC, GetSysColor(COLOR_BTNFACE));

		FillRect (pdis->hDC, &rcAll, (HBRUSH)(COLOR_BTNFACE+1));
	}
	else
		FillRect (pdis->hDC, &rcAll, (HBRUSH)(COLOR_WINDOW+1));

	// draw item label
	rcDraw = rcLabel;
	rcDraw.left += OFFSET_FIRST;
	rcDraw.right -= OFFSET_FIRST;

	DrawText (pdis->hDC, sz, -1, &rcDraw,
			DT_LEFT | DT_SINGLELINE | DT_NOPREFIX | DT_NOCLIP | DT_VCENTER |
			DT_END_ELLIPSIS);

	// draw labels for extra columns
	rc = rcLabel;
	lvc.mask = LVCF_FMT | LVCF_WIDTH;
	for (iCol = 1; ListView_GetColumn (pdis->hwndItem, iCol, &lvc); iCol++)
	{
		rc.left = rc.right;
		rc.right += lvc.cx;

		sz[0] = '\0';
		ListView_GetItemText (pdis->hwndItem, pdis->itemID, iCol,
						sz, sizeof(sz));
		if (sz[0] == '\0')
			continue;

		switch (lvc.fmt & LVCFMT_JUSTIFYMASK)
		{
		case LVCFMT_RIGHT:
			nJustify = DT_RIGHT;
			break;
		case LVCFMT_CENTER:
			nJustify = DT_CENTER;
			break;
		default:
			break;
		}

		rcDraw = rc;
		rcDraw.left += OFFSET_OTHER;
		rcDraw.right -= OFFSET_OTHER;

		DrawText (pdis->hDC, sz, -1, &rcDraw,
			nJustify | DT_SINGLELINE | DT_NOPREFIX | DT_NOCLIP | DT_VCENTER |
			DT_END_ELLIPSIS);
	}

	// draw focus rectangle if item has focus
	if (lvi.state & LVIS_FOCUSED && bFocus && bSelected)
		DrawFocusRect (pdis->hDC, &rcAll);

	// set original colors if item was selected
	if (bSelected)
	{
		SetTextColor (pdis->hDC, clrTextSave);
		SetBkColor (pdis->hDC, clrBkSave);
	}
}


//	___________________________________________________
//
//	Check if all attributes have values assigned

static BOOL
sAllAttributesHaveValues (
		HWND			hwnd,
		PAVLISTSTRUCT	pavls)
{

⌨️ 快捷键说明

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