#ifndef _SMTP_SMTPTHREAD_HPP_ #define _SMTP_SMTPTHREAD_HPP_ #ifndef _THREAD_MESSAGETHREAD_HPP_ #include #endif #ifndef _SMTP_SMTPCLIENT_HPP_ #include #endif #ifndef _SOCKET_BLOCKHOOKER_HPP_ #include #endif class SMTPThread : private MessageThread, public SMTPClient { public: enum HandlerType{MsgPreOpen,MsgOpen,MsgPostOpen}; SMTPThread(void); SMTPThread(const SMTPThread &someSMTPThread); virtual ~SMTPThread(); BOOL open(const String &serverName); void insertHandler(ThreadCallbackPointer pThreadCallback,HandlerType typeHandler); void removeHandler(HandlerType typeHandler); void stop(void); private: enum {TimeOut=10000}; void handleOpen(String *pServerName); DWORD callHandler(ThreadMessage &someThreadMessage,HandlerType typeHandler); DWORD threadHandler(ThreadMessage &someThreadMessage); CallbackData::ReturnType hookHandler(CallbackData &someCallbackData); ThreadCallback mThreadHandler; Array mEventHandlers; Callback mHookHandler; BlockHooker mBlockHooker; DWORD mStartTime; DWORD mDeltaTime; }; inline void SMTPThread::insertHandler(ThreadCallbackPointer pThreadCallback,HandlerType typeHandler) { mEventHandlers[typeHandler]=ThreadCallbackPointer(pThreadCallback); } inline void SMTPThread::removeHandler(HandlerType typeHandler) { mEventHandlers[typeHandler]=ThreadCallbackPointer(); } inline DWORD SMTPThread::callHandler(ThreadMessage &someThreadMessage,HandlerType typeHandler) { return mEventHandlers[typeHandler].callback(someThreadMessage); } inline void SMTPThread::stop(void) { MessageThread::stop(); } #endif