Files
Work/smtp/MAILDLG.CPP
2024-08-07 09:16:27 -04:00

289 lines
8.7 KiB
C++

#include <smtp/maildlg.hpp>
#include <smtp/mail.hpp>
#include <smtp/mailreg.hpp>
#include <smtp/srvrdlg.hpp>
#include <smtp/uuencode.hpp>
#include <common/systime.hpp>
#include <common/opendlg.hpp>
#include <statbar/statbar.hpp>
MailDlg::MailDlg(void)
{
mInitHandler.setCallback(this,&MailDlg::initHandler);
mDestroyHandler.setCallback(this,&MailDlg::destroyHandler);
mCommandHandler.setCallback(this,&MailDlg::commandHandler);
mCloseHandler.setCallback(this,&MailDlg::closeHandler);
mDlgCodeHandler.setCallback(this,&MailDlg::dlgCodeHandler);
mOpenHandler.setCallback(this,&MailDlg::openHandler);
mPreOpenHandler.setCallback(this,&MailDlg::preOpenHandler);
DWindow::insertHandler(VectorHandler::InitDialogHandler,&mInitHandler);
DWindow::insertHandler(VectorHandler::DestroyHandler,&mDestroyHandler);
DWindow::insertHandler(VectorHandler::CommandHandler,&mCommandHandler);
DWindow::insertHandler(VectorHandler::CloseHandler,&mCloseHandler);
DWindow::insertHandler(VectorHandler::DialogCodeHandler,&mDlgCodeHandler);
SMTPThread::insertHandler(&mOpenHandler,SMTPThread::MsgOpen);
SMTPThread::insertHandler(&mPreOpenHandler,SMTPThread::MsgPreOpen);
}
MailDlg::~MailDlg()
{
DWindow::removeHandler(VectorHandler::InitDialogHandler,&mInitHandler);
DWindow::removeHandler(VectorHandler::DestroyHandler,&mDestroyHandler);
DWindow::removeHandler(VectorHandler::CommandHandler,&mCommandHandler);
DWindow::removeHandler(VectorHandler::CloseHandler,&mCloseHandler);
DWindow::removeHandler(VectorHandler::DialogCodeHandler,&mDlgCodeHandler);
SMTPThread::removeHandler(SMTPThread::MsgOpen);
SMTPThread::removeHandler(SMTPThread::MsgPreOpen);
}
MailDlg &MailDlg::operator=(const MailDlg &/*someMailDlg*/)
{ // private implementation
return *this;
}
BOOL MailDlg::perform(const String &strCommandLine)
{
if(!strCommandLine.isNull())mCommandLine=strCommandLine;
return ::DialogBoxParam(processInstance(),(LPSTR)"Mail",(HWND)0,DWindow::DlgProc,(LPARAM)(DWindow*)this);
}
CallbackData::ReturnType MailDlg::initHandler(CallbackData &/*someCallbackData*/)
{
::SetClassLong(*this,GCL_HICON,(long)(HICON)::LoadIcon(processInstance(),"MAIL"));
mStatusBar=new StatusBar(*this);
mStatusBar.disposition(PointerDisposition::Delete);
initializeRecipients();
initializeReversePaths();
return (CallbackData::ReturnType)FALSE;
}
CallbackData::ReturnType MailDlg::destroyHandler(CallbackData &/*someCallbackData*/)
{
return (CallbackData::ReturnType)FALSE;
}
CallbackData::ReturnType MailDlg::dlgCodeHandler(CallbackData &/*someCallbackData*/)
{
return (CallbackData::ReturnType)DLGC_WANTARROWS|DLGC_WANTCHARS;
}
CallbackData::ReturnType MailDlg::commandHandler(CallbackData &someCallbackData)
{
switch(someCallbackData.wmCommandID())
{
case IDOK :
if(getFields())open(mMailInfo.server());
break;
case IDCANCEL :
endDialog(FALSE);
break;
case MailServer :
handleMailServer();
break;
case MailTo :
handleMailTo(someCallbackData);
break;
case MailFrom :
handleMailFrom(someCallbackData);
break;
case MailAttach :
handleMailAttach();
break;
}
return (CallbackData::ReturnType)FALSE;
}
CallbackData::ReturnType MailDlg::closeHandler(CallbackData &/*someCallbackData*/)
{
return (CallbackData::ReturnType)FALSE;
}
DWORD MailDlg::preOpenHandler(ThreadMessage &someThreadMessage)
{
enableControls(FALSE);
return FALSE;
}
DWORD MailDlg::openHandler(ThreadMessage &someThreadMessage)
{
if(!someThreadMessage.userDataOne())
{
enableControls(TRUE);
return TRUE;
}
sendMail();
enableControls(TRUE);
return FALSE;
}
void MailDlg::handleMailTo(CallbackData &someCallbackData)
{
if(CBN_KILLFOCUS!=someCallbackData.wmCommandCommand())return;
MailReg mailReg;
String comboText;
getText(MailTo,comboText);
mailReg.addRecipient(comboText);
}
void MailDlg::handleMailFrom(CallbackData &someCallbackData)
{
if(CBN_KILLFOCUS!=someCallbackData.wmCommandCommand())return;
MailReg mailReg;
String comboText;
getText(MailFrom,comboText);
mailReg.addReversePath(comboText);
}
void MailDlg::handleMailServer(void)
{
String serverName;
ServerDialog serverDialog(*this);
serverDialog.performDialog(serverName);
}
void MailDlg::handleMailAttach(void)
{
OpenDialog openFile;
String pathFileName;
UUEncode uuEncode;
if(!openFile.getOpenFileName(*this,"*.*","Open File","",pathFileName))return;
if(!uuEncode.encode(*this,pathFileName,mAttachment,FALSE))
mStatusBar->setText(pathFileName+String(" is not attached."));
else mStatusBar->setText(pathFileName+String(" is attached."));
}
BOOL MailDlg::getFields(void)
{
String workString;
DWORD lineCount;
getText(MailFrom,workString);
mMailInfo.reversePath(workString);
getText(MailTo,workString);
mMailInfo.toField(workString);
getText(MailSubject,workString);
mMailInfo.subjectField(workString);
lineCount=DWindow::sendMessage(MailText,EM_GETLINECOUNT,0,0L);
mMailInfo.mailData().remove();
for(int itemIndex=0;itemIndex<lineCount;itemIndex++)
{
String lineString;
*((WORD*)(LPSTR)lineString)=String::MaxString;
if(!DWindow::sendMessage(MailText,EM_GETLINE,itemIndex,(LPARAM)(LPSTR)lineString))lineString="\n";
mMailInfo.mailData().insert(&lineString);
}
MailReg mailReg;
mMailInfo.server(mailReg.server());
if(mMailInfo.server().isNull())
{
handleMailServer();
MailReg mailReg;
mMailInfo.server(mailReg.server());
if(mMailInfo.server().isNull())
{
::MessageBox(*this,(LPSTR)String(STRING_NOSERVER),(LPSTR)String(STRING_ERROR),MB_OK);
return FALSE;
}
}
if(mMailInfo.reversePath().isNull())
{
::MessageBox(*this,(LPSTR)String(STRING_NOREVERSEPATH),(LPSTR)String(STRING_ERROR),MB_OK);
return FALSE;
}
if(mMailInfo.toField().isNull())
{
::MessageBox(*this,(LPSTR)String(STRING_NORECIPIENT),(LPSTR)String(STRING_ERROR),MB_OK);
return FALSE;
}
if(!mMailInfo.mailData().size())
{
::MessageBox(*this,(LPSTR)String(STRING_NODATA),(LPSTR)String(STRING_ERROR),MB_OK);
return FALSE;
}
if(!mMailInfo.server().isNull())return TRUE;
return TRUE;
}
void MailDlg::sendMail(void)
{
RegKey regKey(RegKey::LocalMachine);
Block<String> mailData;
Block<String> recipients;
String headerString;
String strDomain;
if(regKey.openKey(String(STRING_DOMAINNAMEKEYNAME)))regKey.queryValue(String(STRING_DOMAINNAMEKEYENTRY),strDomain);
if(strDomain.isNull())strDomain=String(STRING_LOCALHOST);
if(!helo(strDomain))return;
if(!mail(mMailInfo.reversePath()))return;
mMailInfo.recipients(recipients);
for(int rcptIndex=0;rcptIndex<recipients.size();rcptIndex++)rcpt(recipients[rcptIndex]);
headerString=String(STRING_TO)+mMailInfo.toField();
mailData.insert(&headerString);
headerString=String(STRING_REPLYTO)+mMailInfo.reversePath();
mailData.insert(&headerString);
headerString=String(STRING_SUBJECT)+(mMailInfo.subjectField().isNull()?String("<no subject>"):mMailInfo.subjectField());
mailData.insert(&headerString);
SystemTime systemTime;
headerString=String(STRING_DATE)+systemTime.toString();
mailData.insert(&headerString);
for(int lineIndex=0;lineIndex<mMailInfo.mailData().size();lineIndex++)mailData.insert(&mMailInfo.mailData()[lineIndex]);
mailData+=mAttachment;
data(mailData);
quit();
mAttachment.remove();
mStatusBar->setText(STRING_MAILSENT);
clearEditControl();
}
void MailDlg::initializeRecipients(void)
{
MailReg mailReg;
Block<String> strBlock;
if(!mCommandLine.isNull())DWindow::sendMessage(MailTo,CB_INSERTSTRING,-1,(LPARAM)(LPSTR)mCommandLine);
mailReg.getRecipients(strBlock);
for(int itemIndex=0;itemIndex<strBlock.size();itemIndex++)DWindow::sendMessage(MailTo,CB_INSERTSTRING,-1,(LPARAM)(LPSTR)strBlock[itemIndex]);
if(!mCommandLine.isNull())DWindow::sendMessage(MailTo,CB_SELECTSTRING,0,(LPARAM)(LPSTR)mCommandLine);
else if(strBlock.size())DWindow::sendMessage(MailTo,CB_SELECTSTRING,0,(LPARAM)(LPSTR)strBlock[0]);
}
void MailDlg::initializeReversePaths(void)
{
MailReg mailReg;
Block<String> strBlock;
mailReg.getReversePaths(strBlock);
for(int itemIndex=0;itemIndex<strBlock.size();itemIndex++)DWindow::sendMessage(MailFrom,CB_INSERTSTRING,-1,(LPARAM)(LPSTR)strBlock[itemIndex]);
if(strBlock.size())DWindow::sendMessage(MailFrom,CB_SELECTSTRING,0,(LPARAM)(LPSTR)strBlock[0]);
}
void MailDlg::enableControls(BOOL enableFlag)
{
enable(IDCANCEL,enableFlag);
enable(IDOK,enableFlag);
enable(MailTo,enableFlag);
enable(MailFrom,enableFlag);
enable(MailText,enableFlag);
enable(MailSubject,enableFlag);
enable(MailAttach,enableFlag);
}
void MailDlg::clearEditControl(void)
{
DWindow::sendMessage(MailText,WM_SETTEXT,0,0L);
}
void MailDlg::message(const String &messageString)
{
if(!mStatusBar.isOkay())return;
mStatusBar->setText(messageString);
}
void MailDlg::message(Block<String> &messageStrings)
{
if(!mStatusBar.isOkay())return;
for(int lineIndex=0;lineIndex<messageStrings.size();lineIndex++)
mStatusBar->setText(messageStrings[lineIndex]);
}