#include #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); }