📄 sendmailtoolbarwndproc.c
字号:
/*____________________________________________________________________________
Copyright (C) 1997 Network Associates Inc. and affiliated companies.
All rights reserved.
$Id: SendMailToolbarWndProc.c,v 1.33 1999/03/10 03:02:27 heller Exp $
____________________________________________________________________________*/
// System Headers
#include <windows.h>
#include <windowsx.h>
#include <richedit.h>
#include <commctrl.h>
#include <ctype.h>
// PGPsdk Headers
#include "pgpConfig.h"
#include "pgpKeys.h"
#include "pgpEncode.h"
#include "pgpErrors.h"
#include "pgpUtilities.h"
#include "pgpTLS.h"
#include "pgpSDKPrefs.h"
// Eudora Headers
#include "emssdk/Mimetype.h"
// Shared Headers
#include "PGPcl.h"
// Project Headers
#include "Prefs.h"
#include "PGPDefinedMessages.h"
#include "ReadMailToolbarWndProc.h"
#include "EncryptSign.h"
#include "RichEdit_IO.h"
#include "TranslatorIDs.h"
#include "Translators.h"
#include "AddKey.h"
#include "DisplayMessage.h"
#include "TranslatorUtils.h"
#include "resource.h"
#include "MapFile.h"
#include "EudoraMailHeaders.h"
#include "TranslatorUtils.h"
// Global Variables
extern HINSTANCE g_hinst;
extern HWND g_hwndEudoraStatusbar;
extern HWND g_hwndEudoraMainWindow;
extern PGPContextRef g_pgpContext;
extern PGPtlsContextRef g_tlsContext;
BOOL g_bEncrypt = FALSE;
BOOL g_bSign = FALSE;
BOOL g_bInitializeButtons = FALSE;
BOOL g_bSendingMail = FALSE;
HWND g_hwndSendToolbar = NULL;
BOOL EncryptSignRichEditText(char** ppBuffer,
long* pLength,
BOOL bEncrypt,
BOOL bSign,
char** pAddresses,
long NumAddresses,
char* pAttachments,
char** pOutAttachments);
PGPError EncryptAttachments(char* pInAttachments,
char** ppOutAttachments,
RECIPIENTDIALOGSTRUCT *prds,
PGPOptionListRef userOptions,
BOOL bEncrypt,
BOOL bSign);
BOOL VerifyOutputFileName(char* filename);
LRESULT WINAPI
SendMailToolbarWndProc( HWND hwnd,
UINT msg,
WPARAM wParam,
LPARAM lParam)
{
WNDPROC lpOldProc;
lpOldProc = (WNDPROC)GetProp( hwnd, "oldproc" );
switch(msg)
{
case WM_DESTROY:
{
// Put back old window proc and
SetWindowLong( hwnd, GWL_WNDPROC, (DWORD)lpOldProc );
// remove window property
RemoveProp( hwnd, "oldproc" );
break;
}
case WM_NOTIFY:
{
static char szTooltip[256] = {0x00};
LPTOOLTIPTEXT lpToolTipText = (LPTOOLTIPTEXT) lParam;;
switch (((LPNMHDR)lParam)->code)
{
case TTN_NEEDTEXTA:
{
if(lpToolTipText->hdr.idFrom >= IDC_DECRYPT &&
lpToolTipText->hdr.idFrom <= IDC_MIME )
{
int StringId = lpToolTipText->hdr.idFrom -
WM_USER - 1000;
LoadString (g_hinst,
StringId,
szTooltip,
sizeof(szTooltip));
lpToolTipText->lpszText = szTooltip;
if(g_hwndEudoraStatusbar)
{
SendMessage(g_hwndEudoraStatusbar,
SB_SETTEXT,
(WPARAM)0,
(LPARAM)szTooltip);
}
return 0;
}
}
case TTN_NEEDTEXTW:
{
static wchar_t wideBuf[256];
if(lpToolTipText->hdr.idFrom >= IDC_DECRYPT &&
lpToolTipText->hdr.idFrom <= IDC_MIME )
{
int StringId = lpToolTipText->hdr.idFrom -
WM_USER - 1000;
LoadString (g_hinst,
StringId,
szTooltip,
sizeof(szTooltip));
MultiByteToWideChar(CP_ACP,
MB_PRECOMPOSED,
szTooltip,
-1,
wideBuf,
256);
lpToolTipText->lpszText = (char*)wideBuf;
if(g_hwndEudoraStatusbar)
{
SendMessage(g_hwndEudoraStatusbar,
SB_SETTEXT,
(WPARAM)0,
(LPARAM)szTooltip);
}
return 0;
}
}
}
break;
}
case WM_COMMAND:
{
switch(wParam)
{
case IDC_SENDMAIL:
{
HWND hwndSendToolbar = NULL;
BOOL bEncrypt = FALSE;
BOOL bSign = FALSE;
BOOL bPGPMIME = FALSE;
BYTE KeyboardStatus[256];
//char temp[100];
// Did the user have the shift key pressed
// when they sent mail?
GetKeyboardState( KeyboardStatus );
// Get our Toolbar
hwndSendToolbar = FindWindowEx(hwnd,
NULL,
"ToolbarWindow32",
NULL);
if(hwndSendToolbar)
{
g_bSendingMail = TRUE;
g_hwndSendToolbar = hwndSendToolbar;
// set up the Eudora Plugin Menu correctly
SendMessage(hwnd,
WM_COMMAND,
(WPARAM)IDC_PLUGINMENU,
0);
// See if the user wants us to use PGPMIME
if(SendMessage( hwndSendToolbar,
TB_ISBUTTONCHECKED,
(WPARAM)IDC_MIME,
0))
{
bPGPMIME = TRUE;
}
// See if the user wants us encrypt the message
if(SendMessage( hwndSendToolbar,
TB_ISBUTTONCHECKED,
(WPARAM)IDC_ENCRYPT,
0))
{
bEncrypt = TRUE;
}
// See if the user wants us sign the message
if(SendMessage( hwndSendToolbar,
TB_ISBUTTONCHECKED,
(WPARAM)IDC_SIGN,
0))
{
bSign = TRUE;
}
}
else
{
int err;
char szMessage[256];
char szTitle[256];
LoadString(g_hinst, IDS_E_SENDMAIL, szMessage,
sizeof(szMessage));
LoadString(g_hinst, IDS_E_SENDMAILTITLE, szTitle,
sizeof(szTitle));
err = MessageBox(NULL,
szMessage,
szTitle,
MB_YESNO|MB_ICONSTOP);
if(err == IDNO)
{
return 0;
}
}
if(!bPGPMIME)
{
if(!SendMessage(hwnd, WM_COMMAND, IDC_JUSTDOIT, 0))
{
return 0;
}
else
{
LRESULT lresult;
BYTE oldKeyboardStatus[256];
GetKeyboardState( oldKeyboardStatus );
SetKeyboardState( KeyboardStatus );
lresult = CallWindowProc( lpOldProc,
hwnd,
msg,
wParam,
lParam );
// reset these keys so they don't "stick"
oldKeyboardStatus[VK_SHIFT] = 0;
oldKeyboardStatus[VK_CONTROL] = 0;
oldKeyboardStatus[VK_MENU] = 0;
SetKeyboardState( oldKeyboardStatus );
return lresult;
}
}
break;
}
case IDC_JUSTDOIT:
{
HWND hwndSendToolbar = NULL;
BOOL bEncrypt = FALSE;
BOOL bSign = FALSE;
BOOL bEncryptSuccessful = FALSE;
HCURSOR hCursor, hOldCursor;
//char temp[100];
// Get our Toolbar
hwndSendToolbar = FindWindowEx(hwnd,
NULL,
"ToolbarWindow32",
NULL);
if(hwndSendToolbar)
{
// See if the user wants us encrypt the message
if(SendMessage( hwndSendToolbar,
TB_ISBUTTONCHECKED,
(WPARAM)IDC_ENCRYPT,
0))
{
bEncrypt = TRUE;
}
// See if the user wants us sign the message
if(SendMessage( hwndSendToolbar,
TB_ISBUTTONCHECKED,
(WPARAM)IDC_SIGN,
0))
{
bSign = TRUE;
}
}
// does the user want us to do anything to the message
if(bEncrypt || bSign )
{
BOOL bSelectedText = FALSE;
CHARRANGE chRange = {0,0};
HWND hwndParent = NULL;
HWND hwndRichEdit = NULL;
HWND hwndAfxWnd = NULL;
HWND hwndHeaders = NULL;
char* pRichEditText = NULL;
char** pPGPRecipients = NULL;
long NumAddresses = 0;
long nChar = 0;
HEADERDATA hd;
// zero out HEADERDATA struct
memset(&hd, 0x00, sizeof(hd));
// Find the windows we are interested in...
hwndParent = GetParent(hwnd);
hwndAfxWnd = FindWindowEx( hwndParent,
NULL,
"AfxMDIFrame40",
NULL);
if(!hwndAfxWnd) // 3.04 and 3.05 use new mfc versions
{
hwndAfxWnd = FindWindowEx( hwndParent,
NULL,
"AfxMDIFrame42",
NULL);
if(!hwndAfxWnd)
{
char szMessage[256];
LoadString(g_hinst, IDS_E_OLDVERSION,
szMessage, sizeof(szMessage));
MessageBox(NULL,
szMessage,
0,
MB_OK);
return 0;
}
}
hwndRichEdit = FindWindowEx( hwndAfxWnd,
NULL,
"RICHEDIT",
NULL);
hwndHeaders = FindWindowEx( hwndAfxWnd,
NULL,
"#32770", //Dialog
NULL);
// See if the user has selected text in the window
SendMessage(hwndRichEdit,
EM_EXGETSEL,
(WPARAM)0,
(LPARAM)
&chRange);
bSelectedText = chRange.cpMax - chRange.cpMin;
// if not context menu invoked then we don't
// want to do selected text.
// this will protect users
if(lParam != SENT_FROM_CONTEXT_MENU)
{
bSelectedText = FALSE;
}
if(!bSelectedText)
{
RECT rect;
// there is a bug in the richedit control...
// so if there is no selected text click in
// the lower right corner real quick to
// clear up the bug...
GetClientRect(hwndRichEdit, &rect);
SendMessage(hwndRichEdit,
WM_LBUTTONDOWN,
MK_LBUTTON,
MAKELPARAM(rect.right - 5,
rect.bottom -5 ));
SendMessage(hwndRichEdit,
WM_LBUTTONUP,
MK_LBUTTON,
MAKELPARAM(rect.right - 5 ,
rect.bottom -5 ));
}
// This could take awhile... give some feedback.
hCursor = LoadCursor(NULL, IDC_WAIT);
hOldCursor = SetCursor(hCursor);
// get text of message
pRichEditText = GetRichEditContents ( hwndRichEdit,
&nChar,
FALSE,
bSelectedText);
// get the email headers
GetEudoraHeaders( hwndHeaders, &hd);
// now create an appropriate list for pgplib
NumAddresses = CreateRecipientListFromEudoraHeaders(
&hd,
&pPGPRecipients);
if( pRichEditText )
{
char* pInAttachments = "";
char* pOutAttachments = NULL;
// if context menu invoked then we don't
// want to do attachments.
if(lParam != SENT_FROM_CONTEXT_MENU)
{
pInAttachments = hd.pAttachments;
}
// length might have changed
nChar = strlen(pRichEditText);
// Encrypt Text
bEncryptSuccessful = EncryptSignRichEditText(
&pRichEditText,
&nChar,
bEncrypt,
bSign,
pPGPRecipients,
NumAddresses,
pInAttachments,
&pOutAttachments);
if( bEncryptSuccessful )
{
SetRichEditContents ( hwndRichEdit,
pRichEditText,
FALSE,
bSelectedText);
if(pOutAttachments)
{
// set the attachments
SetEudoraAttachments( hwndHeaders,
pOutAttachments);
free(pOutAttachments);
}
else
{
// Wait for about .5 seconds
// so user can see encrypted text...
Sleep(500);
}
}
}
// want to reset buttons for context menu
// regardless of success or failure
if( bEncryptSuccessful ||
lParam == SENT_FROM_CONTEXT_MENU)
{
// Reset the buttons
SendMessage(hwndSendToolbar,
TB_CHECKBUTTON,
(WPARAM)IDC_ENCRYPT,
MAKELPARAM(FALSE,0));
HeapFree(GetProcessHeap(), 0, pRichEditText);
}
// want to reset buttons for context menu
// regardless of success or failure
if( bEncryptSuccessful ||
lParam == SENT_FROM_CONTEXT_MENU)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -