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 + -
显示快捷键?