289 lines
8.7 KiB
C++
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]);
|
|
}
|