83 lines
2.2 KiB
C++
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);
|
|
}
|
|
|