Files
ict/client/ewsc/net/netlib/THNetRegClient.cpp
2026-01-23 08:57:55 +08:00

351 lines
8.1 KiB
C++

// THNetRegClient.cpp: implementation of the CTHNetRegMsgRecv class.
//
//////////////////////////////////////////////////////////////////////
#include "compat_mfc.h"
#include "compat_socket.h"
#include "THNetRegClient.h"
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CTHNetRegMsgSend::CTHNetRegMsgSend()
{
m_nRegID = 0;
m_szRegName[0] = 0;
}
CTHNetRegMsgSend::CTHNetRegMsgSend(const char * szRegName)
{
m_nRegID = 0;
if(szRegName == NULL)
{
m_szRegName[0] = 0;
}
else
{
strcpy(m_szRegName,szRegName);
}
}
CTHNetRegMsgSend::CTHNetRegMsgSend(const int nRegID)
{
m_nRegID = nRegID;
m_szRegName[0] = 0;
}
CTHNetRegMsgSend::~CTHNetRegMsgSend()
{
m_oLink.Close();
}
void CTHNetRegMsgSend::SetRegName(const char * szRegName,const int nSubID)
{
strcpy(m_szRegName,szRegName);
m_nRegID = 0;
m_nSubID = nSubID;
}
void CTHNetRegMsgSend::SetRegID(const int nRegID,const int nSubID)
{
m_nRegID = nRegID;
m_nSubID = nSubID;
m_szRegName[0] = 0;
}
int CTHNetRegMsgSend::LinkTo(const char * szHost,int nPort)
{
m_oLink.m_oServPara.SetHostName(szHost,nPort);
return m_oLink.LinkTo(szHost,nPort);
}
int CTHNetRegMsgSend::LinkToSrv(const char * szSrvName,int nAppNo,int nCtxNo)
{
m_oLink.m_oServPara.SetServName(szSrvName,nAppNo,nCtxNo);
return m_oLink.LinkToSrv(szSrvName,nAppNo,nCtxNo);
}
int CTHNetRegMsgSend::LinkToSrv(const char * szSrvName,const char * szApp,const char * szCtx)
{
m_oLink.m_oServPara.SetServName(szSrvName,szApp,szCtx);
return m_oLink.LinkToSrv(szSrvName,szApp,szCtx);
}
void CTHNetRegMsgSend::SetServName(const char * szSrvName,const int nAppNo,const int nCtxNo)
{
m_oLink.m_oServPara.SetServName(szSrvName,nAppNo,nCtxNo);
}
void CTHNetRegMsgSend::SetServName(const char * szSrvName,const char * szApp,const char * szCtx)
{
m_oLink.m_oServPara.SetServName(szSrvName,szApp,szCtx);
}
void CTHNetRegMsgSend::SetGetHostNameCallBackByAppID(GETHOSTBYSRV_CALLBACK pCmd)
{
m_oCallbackWithAppID = pCmd;
m_oLink.SetGetHostNameCallBackByAppID(m_oCallbackWithAppID);
}
void CTHNetRegMsgSend::SetGetHostNameCallBackByAppName(GETHOSTBYSRV_CALLBACK_BYNAME pCmd)
{
m_oCallbackWithAppName = pCmd;
m_oLink.SetGetHostNameCallBackByAppName(m_oCallbackWithAppName);
}
int CTHNetRegMsgSend::SendRegMsg(CNetCmdCommCmdValue * pValue,const char * szHost)
{
XByteArray ba(1024 * 1024);
/*
if(m_szRegName[0] != 0)
{
ba.WriteString(m_szRegName);
}
*/
pValue->Write(&ba);
NET_HEAD oHead;
memset(&oHead,0,sizeof(NET_HEAD));
if(m_szRegName[0] != 0)
{
oHead.cmdtype = 0;
oHead.src.reg_id = 0;
strcpy(oHead.src.regname,m_szRegName);
oHead.userdata1 = m_nSubID;
oHead.userdata2 = 0;
}
else
{
// oHead.cmdtype = m_nRegID;
oHead.src.reg_id = m_nRegID;
oHead.src.regname[0]= 0;
oHead.cmdtype = m_nRegID;
oHead.userdata1 = m_nSubID;
oHead.userdata2 = 0;
}
oHead.src.n_reg_type = 2;
// oHead.userdata1 = 2;
oHead.len = ba.m_nLength;
bool beSucc = m_oLink.IsWritable();
if(!beSucc || !m_bSendSucc)
{
beSucc = m_oLink.LinkByPara(m_oLink.m_oServPara);
}
m_bSendSucc = beSucc;
if(beSucc)
{
m_bSendSucc = m_oLink.TxStream(&oHead,ba.m_pData);
}
return m_bSendSucc;
}
void CTHNetRegMsgSend::SetHostName(const char * szHost,int nPort)
{
m_oLink.m_oServPara.SetHostName(szHost,nPort);
}
CTHNetRegMsgRecv::CTHNetRegMsgRecv()
{
m_pStream = NULL;
m_pStreamWithName = NULL;
m_oCallbackWithAppName = NULL;
m_oCallbackWithAppID = NULL;
m_oDataList.RemoveAll();
}
CTHNetRegMsgRecv::~CTHNetRegMsgRecv()
{
if(m_pStream != NULL)
{
delete m_pStream;
}
if(m_pStreamWithName != NULL)
{
delete m_pStreamWithName;
}
POSITION pos = m_oDataList.GetHeadPosition();
while (pos != NULL)
{
XByteArray * pa = (XByteArray * )m_oDataList.GetNext(pos);
delete pa;
}
m_oDataList.RemoveAll();
}
void CTHNetRegMsgRecv::SetServName(const char * szSrvName,const int nAppNo,const int nCtxNo)
{
m_oLink.m_oServPara.SetServName(szSrvName,nAppNo,nCtxNo);
}
void CTHNetRegMsgRecv::SetServName(const char * szSrvName,const char * szApp,const char * szCtx)
{
m_oLink.m_oServPara.SetServName(szSrvName,szApp,szCtx);
}
void CTHNetRegMsgRecv::SetRegName(const char * szRegName,const int nSubID)
{
strcpy(m_szRegName,szRegName);
m_nRegID = 0;
m_nSubID = nSubID;
}
void CTHNetRegMsgRecv::SetRegID(const int nRegID,const int nSubID)
{
m_nRegID = nRegID;
m_nSubID = nSubID;
m_szRegName[0] = 0;
}
void CTHNetRegMsgRecv::SetGetHostNameCallBackByAppID(GETHOSTBYSRV_CALLBACK pCmd)
{
m_oCallbackWithAppID = pCmd;
}
void CTHNetRegMsgRecv::SetGetHostNameCallBackByAppName(GETHOSTBYSRV_CALLBACK_BYNAME pCmd)
{
m_oCallbackWithAppName = pCmd;
}
bool StreamFuncWithName(void* pParam1, void* pParam2, void* pParam3)
{
RegStreamWithName* pStream = (RegStreamWithName*)pParam1;
CTHNetRegMsgRecv * pClient = (CTHNetRegMsgRecv *)pStream->GetParent();
if(pClient == NULL)
{
return false;
}
NET_HEAD* pHead =(NET_HEAD*)pParam2;
if(strcmp(pStream->GetRegType()->cmdtypename,pClient->m_szRegName))
{
return false;
}
// printf("get new mess !\n");
if(pClient->m_nSubID > 0)
{
if(pHead->userdata1 != pClient->m_nSubID)
{
return false;
}
}
XByteArray* pa = new XByteArray(pHead->len);
pa->WriteData((BYTE*)pParam3, pHead->len);
pClient->WriteMess(pa);
return true;
}
bool StreamFunc(void* pParam1, void* pParam2, void* pParam3)
{
RegStream* pStream = (RegStream*)pParam1;
CTHNetRegMsgRecv * pClient = (CTHNetRegMsgRecv *)pStream->GetParent();
if(pClient == NULL)
{
return false;
}
NET_HEAD* pHead =(NET_HEAD*)pParam2;
if(pStream->GetRegType()->cmdtype != pClient->m_nRegID)
{
return false;
}
// printf("get new mess !\n");
if(pClient->m_nSubID > 0)
{
if(pHead->userdata1 != pClient->m_nSubID)
{
return false;
}
}
XByteArray* pa = new XByteArray(pHead->len);
pa->WriteData((BYTE*)pParam3, pHead->len);
pClient->WriteMess(pa);
return true;
}
BOOL CTHNetRegMsgRecv::RegistWithName()
{
if(m_pStreamWithName != NULL)
{
delete m_pStreamWithName;
m_pStreamWithName = NULL;
}
if(m_pStream)
{
delete m_pStream;
m_pStream = NULL;
}
if(m_szRegName[0] == 0)
{
if(m_nRegID > 0)
{
return Regist();
}
return FALSE;
}
reg_type_withname regtype;
regtype.cmdtype = 0;
regtype.userdata1 = m_nSubID;
regtype.userdata2 = 1;
strcpy(regtype.cmdtypename,m_szRegName);
m_pStreamWithName = new RegStreamWithName(regtype,this);
memcpy(&(m_pStreamWithName->m_oServPara),&(m_oLink.m_oServPara),sizeof(CTHServPara));
m_pStreamWithName->SetProcFunc(StreamFuncWithName);
m_pStreamWithName->SetGetHostNameCallBackByAppID(m_oCallbackWithAppID);
m_pStreamWithName->SetGetHostNameCallBackByAppName(m_oCallbackWithAppName);
m_pStreamWithName->MakeStream();
return TRUE;
}
BOOL CTHNetRegMsgRecv::Regist()
{
if(m_pStream)
{
delete m_pStream;
m_pStream = NULL;
}
if(m_pStreamWithName != NULL)
{
delete m_pStreamWithName;
m_pStreamWithName = NULL;
}
if(m_nRegID <= 0)
{
if(m_szRegName[0] != 0)
{
return RegistWithName();
}
return FALSE;
}
reg_type regtype;
regtype.cmdtype = m_nRegID;
regtype.userdata1 = m_nSubID;
regtype.userdata2 = 1;
m_pStream = new RegStream(regtype,this);
memcpy(&(m_pStream->m_oServPara),&(m_oLink.m_oServPara),sizeof(CTHServPara));
m_pStream->SetProcFunc(StreamFunc);
m_pStream->SetGetHostNameCallBackByAppID(m_oCallbackWithAppID);
m_pStream->SetGetHostNameCallBackByAppName(m_oCallbackWithAppName);
m_pStream->MakeStream();
return TRUE;
}
XByteArray * CTHNetRegMsgRecv::ReadMess()
{
if(m_oDataList.GetCount() == 0)
{
return NULL;
}
XByteArray * pa = (XByteArray * )m_oDataList.GetHead();
m_oDataList.RemoveHead();
return pa;
}
void CTHNetRegMsgRecv::WriteMess(XByteArray * pa)
{
// printf("new mess %d !!!\n",m_oDataList.GetCount());
m_oDataList.AddTail(pa);
}
void CTHNetRegMsgRecv::SetHostName(const char * szHost,int nPort)
{
m_oLink.m_oServPara.SetHostName(szHost,nPort);
}
int CTHNetRegMsgRecv::RecvMess(CNetCmdCommCmdValue * pValue,int nSleepTime) //ÒÔºÁÃëΪµ¥Î»...
{
int nTestTimes = nSleepTime / 50 + 1;
while (1)
{
XByteArray * pa = ReadMess();
if(pa == NULL)
{
nSleepTime -= 100;
if(nSleepTime <= 0)
{
return -1;
}
Sleep(50);
continue;
}
pValue->Read(pa);
delete pa;
break;
}
return 1;
}