📄 sendmailtoolbarwndproc.c
字号:
{
// Reset the buttons
SendMessage(hwndSendToolbar,
TB_CHECKBUTTON,
(WPARAM)IDC_ENCRYPT,
MAKELPARAM(FALSE,0));
SendMessage(hwndSendToolbar,
TB_CHECKBUTTON,
(WPARAM)IDC_SIGN,
MAKELPARAM(FALSE, 0));
SendMessage(hwndSendToolbar,
TB_ENABLEBUTTON,
(WPARAM)IDC_JUSTDOIT,
MAKELPARAM(FALSE, 0));
}
// clean up after ourselves
FreeRecipientList(pPGPRecipients, NumAddresses);
FreeHeaderData(&hd);
SetCursor(hOldCursor);
}
else
{
// we 'successfully' did nothing to the message
bEncryptSuccessful = TRUE;
}
return bEncryptSuccessful;
break;
}
case IDC_KEYMGR:
{
char szPath[MAX_PATH];
char szPGPkeys[256];
PGPError error = kPGPError_NoErr;
LoadString(g_hinst, IDS_PGPKEYSEXE, szPGPkeys,
sizeof(szPGPkeys));
error = PGPclGetPGPPath (szPath, sizeof(szPath));
if( IsntPGPError(error) )
{
// '/s' keeps it from showing that
// damn splash screen
strcat(szPath, szPGPkeys);
// run it...
WinExec(szPath, SW_SHOW);
}
else
{
char szError[256];
LoadString(g_hinst, IDS_E_LAUNCHPGPKEYS, szError,
sizeof(szError));
MessageBox(NULL,
szError,
0,
MB_OK);
}
break;
}
}
}
case WM_ENTERIDLE:
{
if( g_bSendingMail && g_hwndSendToolbar && wParam == MSGF_MENU )
{
//char szString[256] = {0x00};
//wsprintf(szString, "count = %d", count);
g_bInitializeButtons = FALSE;
g_bSendingMail = FALSE;
g_hwndSendToolbar = NULL;
PostMessage(hwnd, WM_KEYDOWN, (WPARAM)VK_ESCAPE, 0x001c0001);
PostMessage(hwnd, WM_KEYUP, (WPARAM)VK_ESCAPE, 0x001c0001);
//MessageBox(NULL, szString, 0, MB_OK);
}
break;
}
case WM_DRAWITEM:
{
// control identifier
UINT idCtl = (UINT) wParam;
// item-drawing information
LPDRAWITEMSTRUCT lpdis = (LPDRAWITEMSTRUCT) lParam;
//char szString[256] = {0x00};
if( g_bSendingMail )
{
if(lpdis && lpdis->CtlType == ODT_MENU)
{
if(*((void**)(lpdis->itemData + 4)))
{
WPARAM wCommand = 0;
BOOL bItemChecked = FALSE;
// see if it is already checked
if((lpdis->itemState & ODS_CHECKED))
{
bItemChecked = TRUE;
}
// see which plugin this menuitem represents
if( !strcmp(*((char**)(lpdis->itemData + 4)),
"PGP plugin 1 (use toolbar)") )
{
wCommand = IDC_ENCRYPT;
// we might be getting a window from a cancel...
if( g_bInitializeButtons && bItemChecked)
{
g_bEncrypt = TRUE;
}
}
else if( !strcmp(*((char**)(lpdis->itemData + 4)),
"PGP plugin 2 (use toolbar)") )
{
wCommand = IDC_SIGN;
// we might be getting a window from a cancel...
if( g_bInitializeButtons && bItemChecked)
{
g_bSign = TRUE;
}
}
if( !g_bInitializeButtons )
{
// make sure the window handle is valid
if( g_hwndSendToolbar)
{
if( wCommand ) // is this one of our menus
{
BOOL bCommandPressed = FALSE;
BOOL bPGPMIMEPressed = FALSE;
bCommandPressed = SendMessage(
g_hwndSendToolbar,
TB_ISBUTTONCHECKED,
wCommand,
0);
bPGPMIMEPressed = SendMessage(
g_hwndSendToolbar,
TB_ISBUTTONCHECKED,
IDC_MIME,
0);
if( (bCommandPressed &&
!bItemChecked && bPGPMIMEPressed) ||
(bCommandPressed && bItemChecked &&
!bPGPMIMEPressed) ||
(!bCommandPressed && bItemChecked))
{
SendMessage(hwnd,
WM_COMMAND,
(WPARAM)lpdis->itemID,
0);
}
}
}
}
}
}
}
break;
}
}
// Pass all non-custom messages to old window proc
return CallWindowProc(lpOldProc, hwnd, msg, wParam, lParam ) ;
}
BOOL
EncryptSignRichEditText(char** ppBuffer,
long* pLength,
BOOL bEncrypt,
BOOL bSign,
char** pAddresses,
long NumAddresses,
char* pAttachments,
char** ppOutAttachments)
{
BOOL ReturnValue = FALSE;
void* pOutput = NULL;
long outSize = 0;
PGPError error = kPGPError_NoErr;
PGPOptionListRef userOptions = kPGPInvalidRef;
PRECIPIENTDIALOGSTRUCT prds = NULL;
char szExe[256];
char szDll[256];
LoadString(g_hinst, IDS_EXE, szExe, sizeof(szExe));
LoadString(g_hinst, IDS_DLL, szDll, sizeof(szDll));
// allocate a recipient dialog structure
prds = (PRECIPIENTDIALOGSTRUCT) calloc(sizeof(RECIPIENTDIALOGSTRUCT), 1);
if (!prds)
{
PGPclErrorBox(g_hwndEudoraMainWindow, kPGPError_OutOfMemory);
return FALSE;
}
error = PGPsdkLoadDefaultPrefs(g_pgpContext);
if (IsPGPError(error))
{
PGPclEncDecErrorBox(g_hwndEudoraMainWindow, error);
return FALSE;
}
error = PGPOpenDefaultKeyRings(g_pgpContext, (PGPKeyRingOpenFlags)0,
&(prds->OriginalKeySetRef));
if (IsPGPError(error))
{
PGPclEncDecErrorBox(g_hwndEudoraMainWindow, error);
return S_FALSE;
}
if(prds && bEncrypt)
{
char szTitle[256] = {0x00}; // title for recipient dialog
UINT recipientReturn = FALSE; // recipient dialog result
LoadString(GetModuleHandle("PGPplugin.dll"),
IDS_TITLE_RECIPIENTDIALOG, szTitle, sizeof(szTitle));
if( IsntPGPError(error) )
{
prds->Context = g_pgpContext;
prds->tlsContext = g_tlsContext;
prds->Version = CurrentPGPrecipVersion;
prds->hwndParent = g_hwndEudoraMainWindow;
prds->szTitle = szTitle;
prds->dwOptions = PGPCL_ASCIIARMOR;
prds->dwDisableFlags = PGPCL_DISABLE_WIPEORIG |
PGPCL_DISABLE_ASCIIARMOR |
PGPCL_DISABLE_SDA;
prds->dwNumRecipients = NumAddresses;
prds->szRecipientArray = pAddresses;
// If shift is pressed, force the dialog to pop.
if (GetAsyncKeyState( VK_CONTROL) & 0x8000)
prds->dwDisableFlags|=PGPCL_DISABLE_AUTOMODE;
// See who we wish to encrypt this to
recipientReturn = PGPclRecipientDialog( prds );
}
if (prds->AddedKeys != NULL)
{
PGPUInt32 numKeys;
PGPCountKeys(prds->AddedKeys, &numKeys);
if (numKeys > 0)
PGPclQueryAddKeys(g_pgpContext, g_tlsContext,
g_hwndEudoraMainWindow, prds->AddedKeys, NULL);
PGPFreeKeySet(prds->AddedKeys);
prds->AddedKeys = NULL;
}
if (!recipientReturn)
{
if (prds->SelectedKeySetRef != NULL)
PGPFreeKeySet(prds->SelectedKeySetRef);
PGPFreeKeySet(prds->OriginalKeySetRef);
free(prds);
return FALSE;
}
}
if( IsntPGPError(error) )
{
error = EncryptSignBuffer(g_hinst, g_hwndEudoraMainWindow,
g_pgpContext, g_tlsContext, szExe, szDll,
*ppBuffer, *pLength, prds, NULL, &userOptions, &pOutput,
&outSize, bEncrypt, bSign, FALSE);
}
else
{
PGPclEncDecErrorBox(g_hwndEudoraMainWindow, error);
}
*pLength = outSize;
if( IsntPGPError(error) )
{
if( pOutput )
{
*ppBuffer = (char*)HeapReAlloc( GetProcessHeap(),
HEAP_ZERO_MEMORY,
*ppBuffer,
*pLength + 1);
if(*ppBuffer)
{
ReturnValue = TRUE;
memcpy(*ppBuffer, (char*)pOutput, *pLength);
*(*ppBuffer + *pLength) = 0x00; // NULL terminate the string
memset(pOutput, 0x00, *pLength);
}
else
{
error = kPGPError_OutOfMemory;
}
PGPFreeData(pOutput);
}
}
// are there attachments?
if(IsntPGPError(error) && pAttachments && *pAttachments)
{
error = EncryptAttachments( pAttachments,
ppOutAttachments,
prds,
userOptions,
bEncrypt,
bSign);
}
if( PGPRefIsValid(userOptions) )
{
PGPFreeOptionList(userOptions);
}
if (prds)
{
if (prds->SelectedKeySetRef != NULL)
PGPFreeKeySet(prds->SelectedKeySetRef);
PGPFreeKeySet(prds->OriginalKeySetRef);
free(prds);
}
return ReturnValue;
}
PGPError EncryptAttachments(char* pInAttachments,
char** ppOutAttachments,
RECIPIENTDIALOGSTRUCT *prds,
PGPOptionListRef userOptions,
BOOL bEncrypt,
BOOL bSign)
{
PGPError error = kPGPError_NoErr;
char in_file[MAX_PATH] = {0x00};
char out_file[MAX_PATH] = {0x00};
char* pInAttachBackup = NULL;
char* token = NULL;
long size = 0;
char szExe[256];
char szDll[256];
LoadString(g_hinst, IDS_EXE, szExe, sizeof(szExe));
LoadString(g_hinst, IDS_DLL, szDll, sizeof(szDll));
size = strlen(pInAttachments);
pInAttachBackup = malloc(size + 1);
if( !pInAttachBackup )
{
return kPGPError_OutOfMemory;
}
else
{
strcpy(pInAttachBackup, pInAttachments);
}
*ppOutAttachments = malloc(size*2);
if( !*ppOutAttachments )
{
free(pInAttachBackup);
return kPGPError_OutOfMemory;
}
// NULL terminate
**ppOutAttachments = 0x00;
token = strtok(pInAttachments,";");
while(token)
{
// strip off leading spaces or tabs
while( *token == ' ' || *token == '\t')
{
token++;
}
strcpy(in_file, token);
strcpy(out_file, token);
strcat(out_file, ".pgp");
if(VerifyOutputFileName(out_file))
{
strcat(*ppOutAttachments, out_file);
strcat(*ppOutAttachments, ";");
error = EncryptSignFile(g_hinst, g_hwndEudoraMainWindow,
g_pgpContext, g_tlsContext, szExe, szDll, in_file,
prds, NULL, &userOptions, out_file, bEncrypt, bSign,
TRUE);
}
else
{
strcpy(*ppOutAttachments, pInAttachBackup);
error = kPGPError_UserAbort;
break;
}
token = strtok(NULL,";");
}
if(pInAttachBackup)
{
free(pInAttachBackup);
}
return error;
}
BOOL VerifyOutputFileName(char* filename)
{
HANDLE hFileSearch = NULL;
WIN32_FIND_DATA FindDataStruct;
BOOL returnValue = FALSE;
hFileSearch = FindFirstFile(filename, &FindDataStruct);
if(hFileSearch != INVALID_HANDLE_VALUE)
{
BOOL userCancel = FALSE;
OPENFILENAME saveFileName;
char initialDir[MAX_PATH] = {0x00};
char* slash = NULL;
char finalFile[MAX_PATH] = {0x00};
char defaultExtension[MAX_PATH] = {0x00};
int fileStart = 0, fileExtensionStart = 0;
strcpy(initialDir, filename );
strcpy(finalFile, filename );
slash = strrchr(initialDir, '\\');
if(slash)
{
*slash = 0x00;
}
saveFileName.lStructSize=sizeof(saveFileName);
saveFileName.hwndOwner=NULL;
saveFileName.hInstance=NULL;
saveFileName.lpstrFilter= "PGP Files (*.PGP, *.ASC)\0"
"*.PGP;*.ASC\0"
"All Files (*.*)\0"
"*.*\0\0";
saveFileName.lpstrCustomFilter=NULL;
saveFileName.nMaxCustFilter=0;
saveFileName.nFilterIndex=1;
saveFileName.lpstrFile=finalFile;
saveFileName.nMaxFile=MAX_PATH;
saveFileName.lpstrFileTitle=NULL;
saveFileName.nMaxFileTitle=0;
saveFileName.lpstrInitialDir=initialDir;
saveFileName.lpstrTitle=NULL;
saveFileName.Flags= OFN_OVERWRITEPROMPT |
OFN_HIDEREADONLY |
OFN_NOREADONLYRETURN|
OFN_EXPLORER;
saveFileName.nFileOffset=fileStart;
saveFileName.nFileExtension=fileExtensionStart;
saveFileName.lpstrDefExt=defaultExtension;
saveFileName.lCustData=(long)NULL;
saveFileName.lpfnHook=NULL;
saveFileName.lpTemplateName=NULL;
returnValue = GetSaveFileName(&saveFileName);
if(returnValue)
{
strcpy(filename, finalFile);
}
FindClose(hFileSearch);
}
else
{
returnValue = TRUE;
}
return returnValue;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -