cpgpexchcommands.cpp

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

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

	$Id: CPGPexchCommands.cpp,v 1.33 2002/11/22 23:35:13 sdas Exp $
____________________________________________________________________________*/
#include "CPGPexch.h"
#include <process.h>
#include <richedit.h>
#include "Globals.h"
#include "Recipients.h"
#include "Utils.h"
#include "resource.h"

#include "EncryptSign.h"
#include "DecryptVerify.h"
#include "Prefs.h"
#include "PGPsc.h"
#include "RichEdit_IO.h"
#include "pgpClientPrefs.h"
#include "pgpDebug.h"

enum {
	kPGPexch_StdBitmap,
	kPGPexch_AltBitmap,
	kPGPexch_XPBitmap
};

typedef struct {
		HWND hwndFound;
		int yMax;
		BOOL bInternetExplorer;
		BOOL bMicrosoftWord;
		BOOL bListView;
} FindStruct;

static HWND FindMessageWindow(IExchExtCallback* pmecb, FindStruct *fs);
BOOL CALLBACK ReportChildren(HWND hwnd, LPARAM lParam);
static BOOL ByDefaultConvert(void);
static void SetConvertPref(PGPBoolean bConvert);
static HRESULT IsSelectionRelevant(IExchExtCallback* peecbExchCallBack, 
								   BOOL &bRelevant);


STDMETHODIMP CPGPexch::InstallCommands(IExchExtCallback* pmecb, 
                            HWND hWnd, HMENU hMenu,
                            UINT * pcmdidBase, LPTBENTRY lptbeArray,
                            UINT ctbe, ULONG ulFlags)
{
	if ((EECONTEXT_READNOTEMESSAGE != _context) && 
		(EECONTEXT_SENDNOTEMESSAGE != _context) &&
		(EECONTEXT_VIEWER != _context))
		return S_FALSE;

	// First, the menu

	HMENU hmenuTools;
	HMENU hmenuHelp;
	HMENU hmenuHelpTopics;
	ULONG ulBeforeTools;
	ULONG ulAfterExchange;
	HRESULT hr = pmecb->GetMenuPos(EECMDID_Tools, &hmenuTools, 
									&ulBeforeTools, NULL, 0);
	if (S_OK != hr)
		return S_FALSE; // No such menu item?  Very bad.
	hr = pmecb->GetMenuPos(EECMDID_HelpAboutMicrosoftExchange, &hmenuHelp,
							NULL, NULL, 0);
	if (S_OK != hr)
		return S_FALSE; // No such menu item?  Very bad.
	hr = pmecb->GetMenuPos(EECMDID_HelpMicrosoftExchangeHelpTopics, 
							&hmenuHelpTopics, NULL, &ulAfterExchange, 0);
	if (S_OK != hr)
		return S_FALSE; // No such menu item?  Very bad.

	char szCommand[80];
	
	_hmenuPGP = CreatePopupMenu();
	if (_context == EECONTEXT_SENDNOTEMESSAGE)
		InsertMenu(hmenuTools, ulBeforeTools, 
					MF_BYPOSITION | MF_STRING | MF_POPUP, 
					(UINT) _hmenuPGP, "P&GP");
	else
		InsertMenu(hmenuTools, ulBeforeTools, 
					MF_BYPOSITION | MF_STRING | MF_POPUP, 
					(UINT) _hmenuPGP, "&PGP");

	if (_context == EECONTEXT_SENDNOTEMESSAGE)
	{
		UIGetString(szCommand, sizeof(szCommand), IDS_ENCRYPT_MENU);
		AppendMenu(_hmenuPGP, MF_STRING, *pcmdidBase, szCommand);
		_cmdidEncrypt = *pcmdidBase;
 		++(*pcmdidBase);

		UIGetString(szCommand, sizeof(szCommand), IDS_SIGN_MENU);
		AppendMenu(_hmenuPGP, MF_STRING, *pcmdidBase, szCommand);
		_cmdidSign = *pcmdidBase;
 		++(*pcmdidBase);

		UIGetString(szCommand, sizeof(szCommand), IDS_CONVERT_MENU);
		AppendMenu(_hmenuPGP, MF_STRING, *pcmdidBase, szCommand);
		_cmdidConvert = *pcmdidBase;
		++(*pcmdidBase);
		
		AppendMenu(_hmenuPGP, MF_SEPARATOR, 0, NULL);
		
		UIGetString(szCommand, sizeof(szCommand), IDS_ENCRYPTNOW_MENU);
		AppendMenu(_hmenuPGP, MF_STRING, *pcmdidBase, szCommand);
		_cmdidEncryptNow = *pcmdidBase;
		++(*pcmdidBase);
		
		UIGetString(szCommand, sizeof(szCommand), IDS_SIGNNOW_MENU);
		AppendMenu(_hmenuPGP, MF_STRING, *pcmdidBase, szCommand);
		_cmdidSignNow = *pcmdidBase;
		++(*pcmdidBase);
		
		UIGetString(szCommand, sizeof(szCommand), IDS_ENCRYPTSIGN_MENU);
		AppendMenu(_hmenuPGP, MF_STRING, *pcmdidBase, szCommand);
		_cmdidEncryptSign = *pcmdidBase;
		++(*pcmdidBase);
		
		AppendMenu(_hmenuPGP, MF_SEPARATOR, 0, NULL);
	}

	if ((_context == EECONTEXT_READNOTEMESSAGE) || 
		(_context == EECONTEXT_VIEWER))
	{
		UIGetString(szCommand, sizeof(szCommand), IDS_DECRYPT_MENU);
		AppendMenu(_hmenuPGP, MF_STRING, *pcmdidBase, szCommand);
		_cmdidDecrypt = *pcmdidBase;
 		++(*pcmdidBase);

		AppendMenu(_hmenuPGP, MF_SEPARATOR, 0, NULL);
	}

	UIGetString(szCommand, sizeof(szCommand), IDS_PGPKEYS_MENU);
	AppendMenu(_hmenuPGP, MF_STRING, *pcmdidBase, szCommand);
	_cmdidPgpKeys = *pcmdidBase;
	++(*pcmdidBase);

	UIGetString(szCommand, sizeof(szCommand), IDS_PGPPREFS_MENU);
	AppendMenu(_hmenuPGP, MF_STRING, *pcmdidBase, szCommand);
	_cmdidPrefs = *pcmdidBase;
	++(*pcmdidBase);
	
	UIGetString(szCommand, sizeof(szCommand), IDS_PGPHELP_MENU);
	InsertMenu(hmenuHelpTopics, ulAfterExchange, 
				MF_BYPOSITION | MF_STRING, *pcmdidBase, szCommand);
	_cmdidHelp = *pcmdidBase;
	++(*pcmdidBase);
	
	UIGetString(szCommand, sizeof(szCommand), IDS_ABOUT_MENU);
	AppendMenu(hmenuHelp, MF_STRING, *pcmdidBase, szCommand);
	_cmdidAbout = *pcmdidBase;
	++(*pcmdidBase);
	
	// Next, the toolbar

	int tbindx;
	HWND hwndToolbar = NULL;
	for (tbindx = ctbe-1; (int) tbindx > -1; --tbindx)
	{
		if (EETBID_STANDARD == lptbeArray[tbindx].tbid)
		{
			hwndToolbar = lptbeArray[tbindx].hwnd;
			if (_context == EECONTEXT_SENDNOTEMESSAGE)
			{
				_hwndSendToolbar = hwndToolbar;
				_itbbEncrypt = lptbeArray[tbindx].itbbBase++;
				_itbbSign = lptbeArray[tbindx].itbbBase++;
			}

			if ((_context == EECONTEXT_READNOTEMESSAGE) ||
				(_context == EECONTEXT_VIEWER))
			{
				_hwndReadToolbar = hwndToolbar;
				_itbbDecrypt = lptbeArray[tbindx].itbbBase++;
			}
			
			_itbbPgpKeys = lptbeArray[tbindx].itbbBase++;
			break;
		}
	}

	if (hwndToolbar)
	{
		TBADDBITMAP tbab;
		PGPclWindowsGenus osType;
		UINT nBitmapType;

		PGPclGetWindowsVersion(NULL, &osType, NULL);
		if (_fOutlookXP)
			nBitmapType = kPGPexch_XPBitmap;
		else if ((osType == kPGPclWindowsGenusUnknown) ||
			(osType == kPGPclWindowsGenus95) ||
			(osType == kPGPclWindowsGenusNT3) ||
			(osType == kPGPclWindowsGenusNT4) ||
			(osType == kPGPclWindowsGenus98))
		{
			nBitmapType = kPGPexch_StdBitmap;
		}
		else
			nBitmapType = kPGPexch_AltBitmap;

		tbab.hInst = UIGetInstance();
		if (_context == EECONTEXT_SENDNOTEMESSAGE)
		{
			switch (nBitmapType)
			{
			case kPGPexch_StdBitmap:
				tbab.nID = IDB_ENCRYPT;
				break;

			case kPGPexch_AltBitmap:
				tbab.nID = IDB_ALT_ENCRYPT;
				break;

			case kPGPexch_XPBitmap:
				tbab.nID = IDB_XP_ENCRYPT;
				break;
			}

			_itbmEncrypt = SendMessage(hwndToolbar, TB_ADDBITMAP, 1, 
							(LPARAM)&tbab);

			switch (nBitmapType)
			{
			case kPGPexch_StdBitmap:
				tbab.nID = IDB_SIGN;
				break;

			case kPGPexch_AltBitmap:
				tbab.nID = IDB_ALT_SIGN;
				break;

			case kPGPexch_XPBitmap:
				tbab.nID = IDB_XP_SIGN;
				break;
			}

			_itbmSign = SendMessage(hwndToolbar, TB_ADDBITMAP, 1, 
							(LPARAM)&tbab);
		}

		if ((_context == EECONTEXT_READNOTEMESSAGE) || 
			(_context == EECONTEXT_VIEWER))
		{
			switch (nBitmapType)
			{
			case kPGPexch_StdBitmap:
				tbab.nID = IDB_DECRYPT;
				break;

			case kPGPexch_AltBitmap:
				tbab.nID = IDB_ALT_DECRYPT;
				break;

			case kPGPexch_XPBitmap:
				tbab.nID = IDB_XP_DECRYPT;
				break;
			}

			_itbmDecrypt = SendMessage(hwndToolbar, TB_ADDBITMAP, 1, 
							(LPARAM)&tbab);
		}
		
		switch (nBitmapType)
		{
		case kPGPexch_StdBitmap:
			tbab.nID = IDB_PGPKEYS;
			break;
			
		case kPGPexch_AltBitmap:
			tbab.nID = IDB_ALT_PGPKEYS;
			break;
			
		case kPGPexch_XPBitmap:
			tbab.nID = IDB_XP_PGPKEYS;
			break;
		}
		
		_itbmPgpKeys = SendMessage(hwndToolbar, TB_ADDBITMAP, 1, 
						(LPARAM)&tbab);
	}

	return S_OK;
}


STDMETHODIMP CPGPexch::QueryButtonInfo (ULONG tbid, UINT itbb, 
                            LPTBBUTTON ptbb, LPTSTR lpsz, UINT cch, 
                            ULONG ulFlags)
{
	if ((EECONTEXT_READNOTEMESSAGE != _context) &&
		(EECONTEXT_SENDNOTEMESSAGE != _context) &&
		(EECONTEXT_VIEWER != _context))
		return S_FALSE;

	HRESULT hr = S_FALSE;

	if ((itbb == _itbbEncrypt) && (_context == EECONTEXT_SENDNOTEMESSAGE))
	{
		ptbb->iBitmap = _itbmEncrypt;
		ptbb->idCommand = _cmdidEncrypt;
		ptbb->fsState = TBSTATE_ENABLED;
		ptbb->fsStyle = TBSTYLE_CHECK;
		ptbb->dwData = 0;
		ptbb->iString = -1;

		UIGetString(lpsz, cch, IDS_ENCRYPT_TOOLTIP);
		hr = S_OK;
	}

	if ((itbb == _itbbSign) && (_context == EECONTEXT_SENDNOTEMESSAGE))
	{
		ptbb->iBitmap = _itbmSign;
		ptbb->idCommand = _cmdidSign;
		ptbb->fsState = TBSTATE_ENABLED;
		ptbb->fsStyle = TBSTYLE_CHECK;
		ptbb->dwData = 0;
		ptbb->iString = -1;

		UIGetString(lpsz, cch, IDS_SIGN_TOOLTIP);
		hr = S_OK;
	}

	if (itbb == _itbbPgpKeys)
	{
		ptbb->iBitmap = _itbmPgpKeys;
		ptbb->idCommand = _cmdidPgpKeys;
		ptbb->fsState = TBSTATE_ENABLED;
		ptbb->fsStyle = TBSTYLE_BUTTON;
		ptbb->dwData = 0;
		ptbb->iString = -1;

		UIGetString(lpsz, cch, IDS_PGPKEYS_TOOLTIP);
		hr = S_OK;
	}

	if ((itbb == _itbbDecrypt) && 
		((_context == EECONTEXT_READNOTEMESSAGE) || 
		(_context == EECONTEXT_VIEWER)))
	{
		ptbb->iBitmap = _itbmDecrypt;
		ptbb->idCommand = _cmdidDecrypt;
		ptbb->fsState = TBSTATE_ENABLED;
		ptbb->fsStyle = TBSTYLE_BUTTON;
		ptbb->dwData = 0;
		ptbb->iString = -1;

		UIGetString(lpsz, cch, IDS_DECRYPT_TOOLTIP);
		hr = S_OK;
	}


	return hr;
}


STDMETHODIMP CPGPexch::ResetToolbar(ULONG tbid, ULONG ulFlags)
{
	// To implement this method,
	// the extension must cache the results of a prior call
	// to IExchExtCallback::GetToolbar.

	return S_FALSE;
}


STDMETHODIMP CPGPexch::QueryHelpText(UINT cmdid, ULONG ulFlags, 
                                      LPTSTR psz, UINT cch)
{
	if ((EECONTEXT_READNOTEMESSAGE != _context) &&
		(EECONTEXT_SENDNOTEMESSAGE != _context) &&
		(EECONTEXT_VIEWER != _context))
		return S_FALSE;

	if (ulFlags == EECQHT_STATUS)
	{
		if ((cmdid == _cmdidEncrypt) && 
			(_context == EECONTEXT_SENDNOTEMESSAGE))
		{
			UIGetString(psz, cch, IDS_ENCRYPT_STATUS);
			return S_OK;
		}

		if ((cmdid == _cmdidSign) && 
			(_context == EECONTEXT_SENDNOTEMESSAGE))
		{
			UIGetString(psz, cch, IDS_SIGN_STATUS);
			return S_OK;
		}

		if ((cmdid == _cmdidEncryptNow) && 
			(_context == EECONTEXT_SENDNOTEMESSAGE))
		{
			UIGetString(psz, cch, IDS_ENCRYPTNOW_STATUS);
			return S_OK;
		}

		if ((cmdid == _cmdidSignNow) && 
			(_context == EECONTEXT_SENDNOTEMESSAGE))
		{
			UIGetString(psz, cch, IDS_SIGNNOW_STATUS);
			return S_OK;
		}

		if ((cmdid == _cmdidEncryptSign) && 
			(_context == EECONTEXT_SENDNOTEMESSAGE))
		{
			UIGetString(psz, cch, IDS_ENCRYPTSIGN_STATUS);
			return S_OK;
		}

		if ((cmdid == _cmdidDecrypt) && 
			((_context == EECONTEXT_READNOTEMESSAGE) ||
			(_context == EECONTEXT_VIEWER)))
		{
			UIGetString(psz, cch, IDS_DECRYPT_STATUS);
			return S_OK;
		}

		if (cmdid == _cmdidPgpKeys)
		{
			UIGetString(psz, cch, IDS_PGPKEYS_STATUS);
			return S_OK;
		}

		if (cmdid == _cmdidPrefs)
		{
			UIGetString(psz, cch, IDS_PGPPREFS_STATUS);
			return S_OK;
		}

		if (cmdid == _cmdidHelp)
		{
			UIGetString(psz, cch, IDS_PGPHELP_STATUS);
			return S_OK;
		}

		if (cmdid == _cmdidAbout)
		{
			UIGetString(psz, cch, IDS_ABOUT_STATUS);
			return S_OK;
		}

	}
	else if (ulFlags == EECQHT_TOOLTIP)
	{
		if ((cmdid == _cmdidEncrypt) && 
			(_context == EECONTEXT_SENDNOTEMESSAGE))
		{
			UIGetString(psz, cch, IDS_ENCRYPT_TOOLTIP);
			return S_OK;
		}

		if ((cmdid == _cmdidSign) && 
			(_context == EECONTEXT_SENDNOTEMESSAGE))
		{
			UIGetString(psz, cch, IDS_SIGN_TOOLTIP);
			return S_OK;
		}

		if ((cmdid == _cmdidEncryptNow) && 
			(_context == EECONTEXT_SENDNOTEMESSAGE))
		{
			UIGetString(psz, cch, IDS_ENCRYPTNOW_TOOLTIP);
			return S_OK;
		}

		if ((cmdid == _cmdidSignNow) && 
			(_context == EECONTEXT_SENDNOTEMESSAGE))
		{
			UIGetString(psz, cch, IDS_SIGNNOW_TOOLTIP);
			return S_OK;
		}

		if ((cmdid == _cmdidEncryptSign) && 
			(_context == EECONTEXT_SENDNOTEMESSAGE))
		{
			UIGetString(psz, cch, IDS_ENCRYPTSIGN_TOOLTIP);
			return S_OK;
		}

		if ((cmdid == _cmdidDecrypt) && 
			((_context == EECONTEXT_READNOTEMESSAGE) ||
			(_context == EECONTEXT_VIEWER)))
		{
			UIGetString(psz, cch, IDS_DECRYPT_TOOLTIP);
			return S_OK;
		}

		if (cmdid == _cmdidPgpKeys)
		{
			UIGetString(psz, cch, IDS_PGPKEYS_TOOLTIP);
			return S_OK;
		}
	}

	return S_FALSE;
}


STDMETHODIMP CPGPexch::Help(IExchExtCallback* pmecb, UINT cmdid)
{
	return S_FALSE;
}


STDMETHODIMP_(VOID) CPGPexch::InitMenu(IExchExtCallback* pmecb)
{
	FindStruct fs;
	HWND hwndMain;
	HWND hwndToolbar;
	HRESULT hr;
	char szTitle[256];
	BOOL bRichText = FALSE;
	BOOL bShowConvert = TRUE;

	if ((EECONTEXT_READNOTEMESSAGE != _context) &&
		(EECONTEXT_SENDNOTEMESSAGE != _context))
		return;

	pmecb->GetWindow(&hwndMain);
	GetWindowText(hwndMain, szTitle, sizeof(szTitle));
	if (strlen(szTitle) > 12)
	{
		if (!strncmp(szTitle+strlen(szTitle)-12, "(Rich Text)", 11))
			bRichText = TRUE;
	}

	_hwndMessage = FindMessageWindow(pmecb, &fs);

	hr = pmecb->GetToolbar(EETBID_STANDARD, &hwndToolbar);
	if (hr != S_OK)
		return;

	if (_context == EECONTEXT_SENDNOTEMESSAGE)
	{
		if (fs.bInternetExplorer || fs.bMicrosoftWord || bRichText)
		{
			DeleteMenu(_hmenuPGP, _cmdidEncryptNow, MF_BYCOMMAND);
			DeleteMenu(_hmenuPGP, _cmdidSignNow, MF_BYCOMMAND);
			DeleteMenu(_hmenuPGP, _cmdidEncryptSign, MF_BYCOMMAND);
			DrawMenuBar(hwndMain);
		}
	}

	if (!_fInitMenuOnce)
	{
		// Only set encrypt and sign flags once.
		
		_fInitMenuOnce = TRUE;
		
		_bEncrypt = ByDefaultEncrypt(_memoryMgr);
		_bSign = ByDefaultSign(_memoryMgr);
		_bConvert = ByDefaultConvert();
	}

	if (_context == EECONTEXT_READNOTEMESSAGE)
	{
		SPropValue *pval = NULL;
		HRESULT hr;
		ULONG numVals = 1;
		SizedSPropTagArray(1, taga) = {1, {PR_PGPEXCH_HTML}};
		IMessage *pmsg = NULL;

		// Warn user if message is HTML or RTF

		pmecb->GetObject(NULL, (IMAPIProp **) &pmsg);
		hr = pmsg->GetProps((SPropTagArray *) &taga, 0, &numVals, &pval);
		if (SUCCEEDED(hr))
		{
			if (pval[0].Value.b == TRUE)
				UIWarnOk(hwndMain, IDS_W_HTMLDECRYPT, 
					kPGPPrefWin32OutlookHTMLDecrypt);

			pval[0].Value.b = FALSE;
			pmsg->SetProps(1, pval, NULL);
			MAPIFreeBuffer(pval);
		}
		pmsg->Release();
	}

	if (_context == EECONTEXT_SENDNOTEMESSAGE)
	{
		HMENU hmenu;
		MENUITEMINFO miiEncrypt;
		MENUITEMINFO miiSign;

⌨️ 快捷键说明

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