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

83 lines
2.2 KiB
C++

#include <smtp/smtpthrd.hpp>
#if defined(_MSC_VER)
#pragma warning(disable:4355)
#endif
SMTPThread::SMTPThread(void)
: mStartTime(0), mDeltaTime(0)
{
mThreadHandler.setCallback(this,&SMTPThread::threadHandler);
mHookHandler.setCallback(this,&SMTPThread::hookHandler);
mEventHandlers.size((MsgPostOpen-MsgPreOpen)+1);
MessageThread::insertHandler(&mThreadHandler);
mBlockHooker.setHandler(&mHookHandler);
}
SMTPThread::SMTPThread(const SMTPThread &someSMTPThread)
{ // private implementation
mThreadHandler.setCallback(this,&SMTPThread::threadHandler);
MessageThread::insertHandler(&mThreadHandler);
}
SMTPThread::~SMTPThread()
{
stop();
MessageThread::removeHandler(&mThreadHandler);
}
CallbackData::ReturnType SMTPThread::hookHandler(CallbackData &someCallbackData)
{
mDeltaTime=(::GetTickCount()-mStartTime);
if(mDeltaTime>TimeOut){::OutputDebugString("SMTPThread::hookHandler TIMEOUT\n");return TRUE;}
return (CallbackData::ReturnType)FALSE;
}
DWORD SMTPThread::threadHandler(ThreadMessage &someThreadMessage)
{
switch(someThreadMessage.message())
{
case ThreadMessage::TM_CREATE :
break;
case ThreadMessage::TM_DESTROY :
break;
case ThreadMessage::TM_USER :
if(MsgOpen==someThreadMessage.userDataOne())handleOpen((String*)someThreadMessage.userDataTwo());
break;
}
return FALSE;
}
void SMTPThread::handleOpen(String *pServerName)
{
ThreadMessage openMessage;
String serverName(*pServerName);
int currentPriority;
BOOL openResult;
delete pServerName;
currentPriority=::GetThreadPriority(::GetCurrentThread());
::SetThreadPriority(::GetCurrentThread(),THREAD_PRIORITY_ABOVE_NORMAL);
if(callHandler(openMessage,MsgPreOpen))
{
::SetThreadPriority(::GetCurrentThread(),currentPriority);
return;
}
mStartTime=::GetTickCount();
mBlockHooker.hookBlock();
SMTPClient::open(serverName);
mBlockHooker.unhookBlock();
openMessage.userDataOne(isConnected());
::SetThreadPriority(::GetCurrentThread(),currentPriority);
callHandler(openMessage,MsgOpen);
callHandler(openMessage,MsgPostOpen);
SMTPClient::close();
}
BOOL SMTPThread::open(const String &serverName)
{
String *pString=new String(serverName);
ThreadMessage openMessage(ThreadMessage::TM_USER,MsgOpen,(LONG)pString);
return postMessage(openMessage);
}