Files
Work/nntp/NNTPTHRD.CPP
2024-08-07 09:16:27 -04:00

107 lines
3.0 KiB
C++

#include <nntp/nntpthrd.hpp>
typedef struct tagSERVERINFO
{
String mServerName;
String mUserName;
String mPassword;
}SERVERINFO;
NNTPThread::NNTPThread(void)
: mIsBlocking(FALSE)
{
mThreadHandler.setCallback(this,&NNTPThread::threadHandler);
mEventHandlers.size((MsgPostOpen-MsgPreOpen)+1);
MessageThread::insertHandler(&mThreadHandler);
}
NNTPThread::NNTPThread(const NNTPThread &someNNTPThread)
{ // private implementation
mThreadHandler.setCallback(this,&NNTPThread::threadHandler);
MessageThread::insertHandler(&mThreadHandler);
}
NNTPThread::~NNTPThread()
{
if(isBlocking())fatalThreadExit();
else stop();
MessageThread::removeHandler(&mThreadHandler);
}
WORD NNTPThread::open(const String &serverName)
{
SERVERINFO *pServerInfo=new SERVERINFO;
pServerInfo->mServerName=serverName;
ThreadMessage openMessage(ThreadMessage::TM_USER,MsgOpen,(LONG)pServerInfo);
return postMessage(openMessage);
}
WORD NNTPThread::open(const String &serverName,const String &userName,const String &password)
{
SERVERINFO *pServerInfo=new SERVERINFO;
pServerInfo->mServerName=serverName;
pServerInfo->mUserName=userName;
pServerInfo->mPassword=password;
ThreadMessage openMessage(ThreadMessage::TM_USER,MsgOpen,(LONG)pServerInfo);
return postMessage(openMessage);
}
void NNTPThread::insertHandler(ThreadCallbackPointer pThreadCallback,HandlerType typeHandler)
{
mEventHandlers[typeHandler]=ThreadCallbackPointer(pThreadCallback);
}
void NNTPThread::removeHandler(HandlerType typeHandler)
{
mEventHandlers[typeHandler]=ThreadCallbackPointer();
}
DWORD NNTPThread::callHandler(ThreadMessage &someThreadMessage,HandlerType typeHandler)
{
return mEventHandlers[typeHandler].callback(someThreadMessage);
}
DWORD NNTPThread::threadHandler(ThreadMessage &someThreadMessage)
{
switch(someThreadMessage.message())
{
case ThreadMessage::TM_CREATE :
break;
case ThreadMessage::TM_DESTROY :
break;
case ThreadMessage::TM_USER :
if(MsgOpen==someThreadMessage.userDataOne())
{
SERVERINFO *pServerInfo=(SERVERINFO*)someThreadMessage.userDataTwo();
String serverName(pServerInfo->mServerName);
String userName(pServerInfo->mUserName);
String password(pServerInfo->mPassword);
::delete pServerInfo;
handleOpen(serverName,userName,password);
}
break;
}
return FALSE;
}
void NNTPThread::handleOpen(const String &serverName,const String &userName,const String &password)
{
ThreadMessage openMessage;
int currentPriority;
currentPriority=::GetThreadPriority(::GetCurrentThread());
::SetThreadPriority(::GetCurrentThread(),THREAD_PRIORITY_ABOVE_NORMAL);
if(callHandler(openMessage,MsgPreOpen))return;
isBlocking(TRUE);
if(!userName.isNull()&&!password.isNull())NNTPClient::open(serverName,userName,password);
else NNTPClient::open(serverName);
openMessage.userDataOne(isConnected());
::SetThreadPriority(::GetCurrentThread(),currentPriority);
callHandler(openMessage,MsgOpen);
callHandler(openMessage,MsgPostOpen);
isBlocking(FALSE);
}