utils.cpp

来自「PGP8.0源码 请认真阅读您的文件包然后写出其具体功能」· C++ 代码 · 共 569 行

CPP
569
字号
/*____________________________________________________________________________
	Copyright (C) 2002 PGP Corporation
	All rights reserved.

	$Id: Utils.cpp,v 1.13.2.1 2002/11/27 01:11:39 sdas Exp $
____________________________________________________________________________*/
#include "CPGPexch.h"
#include <crtdbg.h>
#include <process.h>
#include "Globals.h"
#include "Utils.h"
#include "resource.h"
#include "stdio.h"

#include "PGPsc.h"

#define WARN_BIT		0x0001
#define CONTINUE_BIT	0x0002

static HINSTANCE g_hInstance;
static char *szOldText = NULL;

typedef struct _HexDumpParam
{
	char *szText;
	int nLength;
} HexDumpParam;


BOOL CALLBACK WarnYesNoDlgProc(HWND hwndDlg, 
							   UINT uMsg, 
							   WPARAM wParam, 
							   LPARAM lParam);

BOOL CALLBACK WarnOkDlgProc(HWND hwndDlg, 
							UINT uMsg, 
							WPARAM wParam, 
							LPARAM lParam);

BOOL CALLBACK HexDumpDlgProc(HWND hwndDlg, 
							 UINT uMsg, 
							 WPARAM wParam, 
							 LPARAM lParam);

void DumpText(HWND hList, char *szText, int nLength);




HINSTANCE UIGetInstance(void)
{
	return g_hInstance;
}


void UISetInstance(HINSTANCE hInstance)
{
	g_hInstance = hInstance;
}


void UIGetString(char *szBuffer, size_t nLength, UINT nID)
{
	LoadString(g_hInstance, nID, szBuffer, nLength);
	return;
}


void UIFormatString(char *szBuffer, size_t nLength, UINT nID, char *szData)
{
	char szTemp[1024];

    LoadString(g_hInstance, nID, szTemp, 1023);
	wsprintf(szBuffer, szTemp, szData);
	return;
}


void UIDisplayString(HWND hwnd, char *szBuffer)
{
	char szTitle[255];

	LoadString(g_hInstance, IDS_TITLE, szTitle, 254);
	MessageBox(hwnd, szBuffer, szTitle, MB_ICONEXCLAMATION);
	return;
}


void UIDisplayStringID(HWND hwnd, UINT nID)
{
	char szTitle[255];
	char szBuffer[1024];

	LoadString(g_hInstance, IDS_TITLE, szTitle, 254);
	LoadString(g_hInstance, nID, szBuffer, 1023);
	MessageBox(hwnd, szBuffer, szTitle, MB_ICONEXCLAMATION);
	return;
}


BOOL UIAskYesNoStringID(HWND hwnd, UINT nID)
{
	char szTitle[255];
	char szBuffer[1024];
	int nResult;

	LoadString(g_hInstance, IDS_TITLE, szTitle, 254);
	LoadString(g_hInstance, nID, szBuffer, 1023);
	
	nResult = MessageBox(hwnd, szBuffer, szTitle, MB_YESNO | MB_ICONQUESTION);
	if (nResult == IDYES)
		return TRUE;
	else
		return FALSE;
}


void UIDisplayErrorCode(char *szFile, 
						int nLine, 
						char *szModule, 
						int nCode,
						BOOL bKeyrings)
{
	char szErrorMsg[255];
	char szTitle[255];
	char szFileName[255];

	if (bKeyrings)
	{
		if (UIAskYesNoStringID(NULL, IDS_Q_NOKEYRINGS))
		{
			char szPath[MAX_PATH];

			PGPclGetPath(kPGPclPGPkeysExeFile, szPath, MAX_PATH-1);
			PGPclExecute(szPath, SW_SHOW);
		}

		return;
	}
	else
		PGPclEncDecErrorToString(nCode, szErrorMsg, 254);

	if (szModule == NULL)
	{
		UIGetString(szFileName, sizeof(szFileName), IDS_DLL);
		szModule = szFileName;
	}

#ifdef _DEBUG
	_CrtSetReportMode(_CRT_ERROR, _CRTDBG_MODE_WNDW);
	_CrtDbgReport(_CRT_ERROR, szFile, nLine, szModule, szErrorMsg);
#endif

	LoadString(g_hInstance, IDS_TITLE, szTitle, 254);
	MessageBox(NULL, szErrorMsg, szTitle, MB_ICONEXCLAMATION);
	return;
}


BOOL UIWarnYesNo(HWND hwnd, UINT nID, UINT nPrefIndex, BOOL bDefault)
{
	char szMessage[1024];
	PGPPrefRef prefRef;
	PGPBoolean bWarn;
	BOOL bContinue;
	DWORD dwResult;
	PGPError err = kPGPError_NoErr;

	UIGetString(szMessage, 1023, nID);

	err = PGPclPeekClientLibPrefRefs(&prefRef, NULL);
	if (IsPGPError(err))
	{
		PGPclErrorBox(hwnd, err);
		return FALSE;
	}

	err = PGPGetPrefBoolean(prefRef, nPrefIndex, &bWarn);
	if (IsPGPError(err))
		bWarn = TRUE;

	if (!bWarn)
		return bDefault;

	dwResult = DialogBoxParam(UIGetInstance(), MAKEINTRESOURCE(IDD_WARN), 
					hwnd, (DLGPROC) WarnYesNoDlgProc, (LPARAM) szMessage);

	bWarn = (dwResult & WARN_BIT) == WARN_BIT;
	bContinue = (dwResult & CONTINUE_BIT) == CONTINUE_BIT;

	err = PGPclPeekClientLibPrefRefs(&prefRef, NULL);
	if (IsPGPError(err))
	{
		PGPclErrorBox(hwnd, err);
		return FALSE;
	}

	PGPSetPrefBoolean(prefRef, nPrefIndex, bWarn);
	PGPclFlushClientLibPrefs(prefRef, NULL);

	return bContinue;
}


BOOL UIAskYesNo(HWND hwnd, UINT nID, UINT nPrefIndex)
{
	char szMessage[1024];
	PGPPrefRef prefRef;
	PGPBoolean bWarn;
	BOOL bContinue;
	DWORD dwResult;
	PGPSize nLength;
	char *cDataIn;
	char cDataOut[1];
	PGPError err = kPGPError_NoErr;

	UIGetString(szMessage, 1023, nID);

	err = PGPclPeekClientLibPrefRefs(&prefRef, NULL);
	if (IsPGPError(err))
	{
		PGPclErrorBox(hwnd, err);
		return FALSE;
	}

	err = PGPGetPrefData(prefRef, nPrefIndex, &nLength, (void **) &cDataIn);
	if (IsPGPError(err) || !nLength)
		bWarn = TRUE;
	else
	{
		bWarn = (cDataIn[0] & WARN_BIT) == WARN_BIT;
		bContinue = (cDataIn[0] & CONTINUE_BIT) == CONTINUE_BIT;
		PGPFreeData(cDataIn);
	}

	if (!bWarn)
		return bContinue;

	dwResult = DialogBoxParam(UIGetInstance(), MAKEINTRESOURCE(IDD_ASK), 
					hwnd, (DLGPROC) WarnYesNoDlgProc, (LPARAM) szMessage);

	cDataOut[0] = (char) dwResult;
	bWarn = (dwResult & WARN_BIT) == WARN_BIT;
	bContinue = (dwResult & CONTINUE_BIT) == CONTINUE_BIT;

	err = PGPclPeekClientLibPrefRefs(&prefRef, NULL);
	if (IsPGPError(err))
	{
		PGPclErrorBox(hwnd, err);
		return FALSE;
	}

	PGPSetPrefData(prefRef, nPrefIndex, 1, cDataOut);
	PGPclFlushClientLibPrefs(prefRef, NULL);

	return bContinue;
}


void UIWarnOk(HWND hwnd, UINT nID, UINT nPrefIndex)
{
	char szMessage[1024];
	PGPPrefRef prefRef;
	PGPBoolean bWarn;
	DWORD dwResult;
	PGPError err = kPGPError_NoErr;

	UIGetString(szMessage, 1023, nID);

	err = PGPclPeekClientLibPrefRefs(&prefRef, NULL);
	if (IsPGPError(err))
	{
		PGPclErrorBox(hwnd, err);
		return;
	}

	err = PGPGetPrefBoolean(prefRef, nPrefIndex, &bWarn);
	if (IsPGPError(err))
		bWarn = TRUE;

	if (!bWarn)
		return;

	dwResult = DialogBoxParam(UIGetInstance(), MAKEINTRESOURCE(IDD_WARNOK), 
					hwnd, (DLGPROC) WarnOkDlgProc, (LPARAM) szMessage);

	bWarn = (dwResult & WARN_BIT) == WARN_BIT;

	err = PGPclPeekClientLibPrefRefs(&prefRef, NULL);
	if (IsPGPError(err))
	{
		PGPclErrorBox(hwnd, err);
		return;
	}

	PGPSetPrefBoolean(prefRef, nPrefIndex, bWarn);
	PGPclFlushClientLibPrefs(prefRef, NULL);

	return;
}


void PGPDebugMessage(const char *szMessage)
{
	char szTitle[255];

#ifdef _DEBUG
	_CrtSetReportMode(_CRT_ERROR, _CRTDBG_MODE_WNDW);
	_CrtDbgReport(_CRT_ERROR, NULL, NULL, NULL, szMessage);
#endif

	LoadString(g_hInstance, IDS_TITLE, szTitle, 254);
	MessageBox(NULL, szMessage, szTitle, MB_ICONEXCLAMATION);
	return;
}


void UIHexDump(HWND hwnd, char *szMessage, int nLength)
{
	HexDumpParam lParam;

	lParam.szText = szMessage;
	lParam.nLength = nLength;

	DialogBoxParam(g_hInstance, MAKEINTRESOURCE(IDD_HEXDUMP), hwnd, 
		(DLGPROC) HexDumpDlgProc, (LPARAM) &lParam);

	return;
}


BOOL CALLBACK WarnYesNoDlgProc(HWND hwndDlg, 
							   UINT uMsg, 
							   WPARAM wParam, 
							   LPARAM lParam)
{
	BOOL bReturnCode = FALSE;
	DWORD dwResult;

	switch(uMsg)
	{
	case WM_INITDIALOG:
		{
			SetWindowText(GetDlgItem(hwndDlg, IDC_WARNING), (char *) lParam);
			break;
		}

	case WM_COMMAND:
		switch (LOWORD(wParam))
		{
		case IDC_YESCONTINUE:
			if (IsDlgButtonChecked(hwndDlg, IDC_NOWARN) == BST_CHECKED)
				dwResult = CONTINUE_BIT;
			else
				dwResult = CONTINUE_BIT | WARN_BIT;

			EndDialog(hwndDlg, dwResult);
			bReturnCode = TRUE;
			break;

		case IDC_NOCONTINUE:
			if (IsDlgButtonChecked(hwndDlg, IDC_NOWARN) == BST_CHECKED)
				dwResult = 0;
			else
				dwResult = WARN_BIT;

			EndDialog(hwndDlg, dwResult);
			bReturnCode = TRUE;
			break;
		}
		break;
	}

	return(bReturnCode);
}


BOOL CALLBACK WarnOkDlgProc(HWND hwndDlg, 
							UINT uMsg, 
							WPARAM wParam, 
							LPARAM lParam)
{
	BOOL bReturnCode = FALSE;
	DWORD dwResult;

	switch(uMsg)
	{
	case WM_INITDIALOG:
		{
			SetWindowText(GetDlgItem(hwndDlg, IDC_WARNING), (char *) lParam);
			break;
		}

	case WM_COMMAND:
		switch (LOWORD(wParam))
		{
		case IDOK:
			if (IsDlgButtonChecked(hwndDlg, IDC_NOWARN) == BST_CHECKED)
				dwResult = 0;
			else
				dwResult = WARN_BIT;

			EndDialog(hwndDlg, dwResult);
			DestroyWindow(hwndDlg);
			bReturnCode = TRUE;
			break;
		}
		break;
	}

	return(bReturnCode);
}


BOOL CALLBACK HexDumpDlgProc(HWND hwndDlg, 
							 UINT uMsg, 
							 WPARAM wParam, 
							 LPARAM lParam)
{
	BOOL bReturnCode = FALSE;
	HWND hList;

	hList = GetDlgItem(hwndDlg, IDC_DUMP);

	switch(uMsg)
	{
	case WM_INITDIALOG:
		{
			LV_COLUMN lvcText;
			HexDumpParam *pParam;

			// Setup the list control columns
			lvcText.mask = LVCF_FMT | LVCF_TEXT | LVCF_WIDTH | LVCF_SUBITEM;
			lvcText.fmt = LVCFMT_LEFT;
			lvcText.cx = 500;
			lvcText.pszText = "ASCII";
			lvcText.iSubItem = -1;
			ListView_InsertColumn(hList, 0, &lvcText);
			
			lvcText.mask = LVCF_FMT | LVCF_TEXT | LVCF_WIDTH | LVCF_SUBITEM;
			lvcText.fmt = LVCFMT_LEFT;
			lvcText.cx = 1400;
			lvcText.pszText = "Hex";
			lvcText.iSubItem = 1;
			ListView_InsertColumn(hList, 1, &lvcText);

			pParam = (HexDumpParam *) lParam;

			// Fill list control with text
			DumpText(hList, pParam->szText, pParam->nLength);
			break;
		}

	case WM_COMMAND:
		switch (LOWORD(wParam))
		{
		case IDOK:
			EndDialog(hwndDlg, FALSE);
			bReturnCode = TRUE;
			break;
		}
		break;
	}

	return(bReturnCode);
}


void DumpText(HWND hList, char *szText, int nLength)
{
	int nX, nY;
	int nHexIndex, nAsciiIndex;
	int nLimit;
	int nLines;
	char szHex[241];
	char szAscii[81];
	LV_ITEM	lviText;

	nLines = 0;

	for (nX=0; nX<nLength; nX+=80)
	{
		nHexIndex = 0;
		nAsciiIndex = 0;

		if ((nX+80) > nLength)
			nLimit = nLength;
		else
			nLimit = nX+80;

		for (nY=nX; nY<nLimit; nY++)
		{
			wsprintf(&(szHex[nHexIndex]), "%02X ", szText[nY]);
			nHexIndex += 3;

			if ((szText[nY] > 31) && (szText[nY] < 127))
				wsprintf(&(szAscii[nAsciiIndex]), "%c", szText[nY]);
			else if (szText[nY] == '\n')
			{
				nX = nY-79;
				nY = nLimit;
			}
			else
				wsprintf(&(szAscii[nAsciiIndex]), " ");
			nAsciiIndex++;
		}
		
		szHex[nHexIndex] = 0;
		szAscii[nAsciiIndex] = 0;

		lviText.mask = LVIF_TEXT;
		lviText.pszText = szAscii;
		lviText.iItem = nLines;
		lviText.iSubItem = 0;
		ListView_InsertItem(hList, &lviText);

		lviText.mask = LVIF_TEXT;
		lviText.pszText = szHex;
		lviText.iItem = nLines;
		lviText.iSubItem = 1;
		ListView_SetItem(hList, &lviText);

		nLines++;
	}

	return;
}

int IsPlatform98OrME()
{
	OSVERSIONINFO osiVerInfo={sizeof(OSVERSIONINFO), 0};
	if(FALSE == GetVersionEx(&osiVerInfo))
		return -1;

	if(VER_PLATFORM_WIN32_WINDOWS == osiVerInfo.dwPlatformId)
		return 1;

	return 0;
}

void ExchPluginTrace(LPCTSTR lpszFormat, ...)
{
#ifdef _DEBUG 
	va_list args;
	va_start(args, lpszFormat);

	int nBuf;
	char szBuffer[512]={0};

	nBuf = _vsnprintf(szBuffer, sizeof(szBuffer), lpszFormat, args);

	// was there an error? was the expanded string too long?
	//pgpAssert(nBuf >= 0);
	if(nBuf >= 0)
		OutputDebugString(szBuffer);

	va_end(args);
#endif
}

/*__Editor_settings____

	Local Variables:
	tab-width: 4
	End:
	vi: ts=4 sw=4
	vim: si
_____________________*/

⌨️ 快捷键说明

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