⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 hopekingdatabase.cpp

📁 IVR交互式语音应答系统脚本解析器
💻 CPP
📖 第 1 页 / 共 3 页
字号:
			m_NeederListS.InsertAt(i,nr);
			break;
		}
	}
	if(i==m_NeederListS.GetSize()){
		m_NeederListS.Add(nr);
	}
	m_NeederListS[i].dwRight=dwRight;
	m_NeederListS[i].dwObj=dwObj;
	m_NeederListS[i].dwMod=dwMod;
	m_NeederListS[i].dwNeedKey1=dwNeedKey1;
	m_NeederListS[i].dwNeedKey2=dwNeedKey2;
	m_NeederListS[i].dwIdent=dwIdent;
	m_NeederListS[i].dwType=dwType;
	m_NeederListG[i].bAsyn=bAsyn;
	m_NeederListS[i].dwId=dwSkillId;
	m_NeederListS[i].tm=GetTimeStamp();
	return TRUE;
}

BOOL CResDistrabutor::LockRes(DWORD dwResKey)
{
	int ipos=-1;
	POSITION pos=NULL;
	if(!m_ResKeyPos.Lookup((void *)dwResKey,(void * &)pos))return FALSE;
	if(pos==NULL)return FALSE;
	if(!m_ResKeyList.Lookup((void *)dwResKey,(void * &)ipos))return FALSE;
	if(ipos<0||ipos>=m_ResList.GetSize())return FALSE;
	if(m_FreeResList.GetAt(pos)!=ipos)return FALSE;
	m_ResKeyPos.SetAt((void *)dwResKey,(void *)NULL);
	m_FreeResList.RemoveAt(pos);
	m_ResList[ipos].tm=GetTimeStamp();
	if(m_ResList[ipos].dwGroupPos!=0xffffffff){
		pdwGroupCountF[m_ResList[ipos].dwGroupPos]--;
	}
	if(m_ResList[ipos].dwFeaturesId){
		CheckFCount(-1,m_ResList[ipos].dwFeaturesId,pdwFeatureCountF,dwSkillStatusF);
	}
	return TRUE;
}

BOOL CResDistrabutor::FreeRes(DWORD dwResKey)
{
	int ipos=-1;
	POSITION pos=NULL;
	if(!m_ResKeyList.Lookup((void *)dwResKey,(void * &)ipos))return FALSE;
	if(ipos<0||ipos>=m_ResList.GetSize())return FALSE;
	BOOL bAdded=FALSE;
	if(m_ResKeyPos.Lookup((void *)dwResKey,(void * &)pos)){
		if(pos!=NULL&&m_FreeResList.GetAt(pos)==ipos){
			bAdded=TRUE;
		}
	}
	if(!bAdded){
		if(m_ResList[ipos].tm){
			m_ResList[ipos].dwTmCount+=GetTimeStamp()-m_ResList[ipos].tm;
		}
		else{
			m_ResList[ipos].dwTmCount=0;
		}
		m_ResList[ipos].tm=GetTimeStamp();
		if(CheckNeeder(ipos)){
			return TRUE;
		}
		pos=m_FreeResList.AddTail(ipos);
		m_ResKeyPos.SetAt((void *)dwResKey,(void *)pos);
		if(m_ResList[ipos].dwGroupPos!=0xffffffff){
			pdwGroupCountF[m_ResList[ipos].dwGroupPos]++;
		}
		if(m_ResList[ipos].dwFeaturesId){
			CheckFCount(1,m_ResList[ipos].dwFeaturesId,pdwFeatureCountF,dwSkillStatusF);
		}
	}
	return TRUE;
}

DWORD CResDistrabutor::GetGroupPos(DWORD dwGroupId)
{
	for(int i=0;i<m_iMaxGroupNum;i++){
		if(pdwGroup[i]==dwGroupId)return (DWORD)i;
		else if(pdwGroup[i]=0){
			pdwGroup[i]=dwGroupId;
			return (DWORD)i;
		}
	}
	return 0xffffffff;
}

void CResDistrabutor::CheckFCount(int step,DWORD dwFeaturesId,DWORD * pdwFeature,DWORD & dwSki)
{
	if(pdwFeature){
		for(int i=0;i<m_iMaxFeatureNum;i++){
			DWORD dwFilter=1<<i;
			if((dwFilter&dwFeaturesId)==dwFilter){
				pdwFeature+=step;
				if(pdwFeature){
					dwFeaturesId|=dwFilter;
				}
				else{
					dwFeaturesId&=~dwFilter;
				}
			}
		}
	}
}

int CResDistrabutor::GetSkillLevel(int ip)
{
	int iret=0;
	if(m_ResList[ip].dwFeaturesId){
		for(int i=0;i<m_iMaxFeatureNum;i++){
			DWORD dwFilter=1<<i;
			if((dwFilter&m_ResList[ip].dwFeaturesId)==dwFilter){
				iret+=m_ResList[ip].pbtSkillLevel[i];
			}
		}
	}
	return iret;
}

BOOL CResDistrabutor::CheckNeeder(int ipos)
{
	if(pdwFeatureCountN&&(m_ResList[ipos].dwFeaturesId&dwSkillStatusN)){
		for(int i=0;i<m_NeederListS.GetSize();i++){
			if(m_NeederListS[i].dwType==0x00){
				if((m_ResList[ipos].dwFeaturesId&m_NeederListS[i].dwId)==m_NeederListS[i].dwId){
					CheckFCount(-1,m_NeederListS[i].dwId,pdwFeatureCountN,dwSkillStatusN);
					m_ResList[ipos].tm=GetTimeStamp();
					//post message for distrabute
					if(m_NeederListS[i].bAsyn){
						SetSynMsgReturn(m_NeederListS[i].dwMod,
							(CAsynWorker *)m_NeederListS[i].dwObj,
							CMD_APPLY_RES,
							UniVar(m_ResList[ipos].dwResKey),
							UniVar(m_NeederListS[i].dwNeedKey1),
							UniVar(m_NeederListS[i].dwNeedKey2),
							UniVar(m_csName),
							InValidVar);
					}
					else{
						CUniMsg um;
						um.m_dwCommand=CMD_APPLY_RES;
						um.m_btMsgType=MSG_RESPONSE;
						um.m_dwSendMode=GetModId();
						um.m_pSender=this;
						um.m_dwReceiveMode=m_NeederListS[i].dwMod;
						um.m_pReceivor=(CAsynWorker *)m_NeederListS[i].dwObj;
						um.m_dwIdent=m_NeederListS[i].dwIdent;
						um.Add(m_ResList[ipos].dwResKey);
						um.Add(m_NeederListS[i].dwNeedKey1);
						um.Add(m_NeederListS[i].dwNeedKey2);
						um.Add(m_csName);
						m_pBus->SendMessage(&um,m_btCurRoad);
					}
					return TRUE;
				}
			}
			else {//
				if(m_ResList[ipos].dwFeaturesId&m_NeederListS[i].dwId){
					CheckFCount(-1,m_NeederListS[i].dwId,pdwFeatureCountN,dwSkillStatusN);
					m_ResList[ipos].tm=GetTimeStamp();
					//post message for distrabute
					if(m_NeederListS[i].bAsyn){
						SetSynMsgReturn(m_NeederListS[i].dwMod,
							(CAsynWorker *)m_NeederListS[i].dwObj,
							CMD_APPLY_RES,
							UniVar(m_ResList[ipos].dwResKey),
							UniVar(m_NeederListS[i].dwNeedKey1),
							UniVar(m_NeederListS[i].dwNeedKey2),
							UniVar(m_csName),
							InValidVar);
					}
					else{
						CUniMsg um;
						um.m_dwCommand=CMD_APPLY_RES;
						um.m_btMsgType=MSG_RESPONSE;
						um.m_dwSendMode=GetModId();
						um.m_pSender=this;
						um.m_dwReceiveMode=m_NeederListS[i].dwMod;
						um.m_pReceivor=(CAsynWorker *)m_NeederListS[i].dwObj;
						um.m_dwIdent=m_NeederListS[i].dwIdent;
						um.Add(m_ResList[ipos].dwResKey);
						um.Add(m_NeederListS[i].dwNeedKey1);
						um.Add(m_NeederListS[i].dwNeedKey2);
						um.Add(m_csName);
						m_pBus->SendMessage(&um,m_btCurRoad);
					}
					return TRUE;
				}
			}
		}
	}
	if(pdwGroupCountN&&m_ResList[ipos].dwGroupPos!=0xffffffff&&pdwGroupCountN[m_ResList[ipos].dwGroupPos]){
		for(int i=0;i<m_NeederListG.GetSize();i++){
			if(m_NeederListG[i].dwId==m_ResList[ipos].dwGroupId){
				pdwGroupCountN[m_ResList[ipos].dwGroupPos]--;
				m_ResList[ipos].tm=GetTimeStamp();
				//post message for distrabute
				if(m_NeederListS[i].bAsyn){
					SetSynMsgReturn(m_NeederListS[i].dwMod,
						(CAsynWorker *)m_NeederListS[i].dwObj,
						CMD_APPLY_RES,
						UniVar(m_ResList[ipos].dwResKey),
						UniVar(m_NeederListS[i].dwNeedKey1),
						UniVar(m_NeederListS[i].dwNeedKey2),
						UniVar(m_csName),
						InValidVar);
				}
				else{
					CUniMsg um;
					um.m_dwCommand=CMD_APPLY_RES;
					um.m_btMsgType=MSG_RESPONSE;
					um.m_dwSendMode=GetModId();
					um.m_pSender=this;
					um.m_dwReceiveMode=m_NeederListS[i].dwMod;
					um.m_pReceivor=(CAsynWorker *)m_NeederListS[i].dwObj;
					um.m_dwIdent=m_NeederListS[i].dwIdent;
					um.Add(m_ResList[ipos].dwResKey);
					um.Add(m_NeederListS[i].dwNeedKey1);
					um.Add(m_NeederListS[i].dwNeedKey2);
					um.Add(m_csName);
					m_pBus->SendMessage(&um,m_btCurRoad);
				}
				return TRUE;
			}
		}
	}
	return FALSE;
}

void CResDistrabutor::OnMsgReceive(CUniMsg * pMsg)
{
	switch(pMsg->m_dwCommand){
	case CMD_APPLY_RES:
		{
			CUniMsg um;
			um.m_dwCommand=CMD_APPLY_RES;
			if(pMsg->m_btMsgType==MSG_EVENT)
				um.m_btMsgType=MSG_EVENT;
			else
				um.m_btMsgType=MSG_RESPONSE;
			um.m_dwSendMode=pMsg->m_dwReceiveMode;
			um.m_dwReceiveMode=pMsg->m_dwSendMode;
			um.m_pReceivor=pMsg->m_pSender;
			um.m_pSender=pMsg->m_pReceivor;
			um.m_dwIdent=pMsg->m_dwIdent;
			um.m_ierror=0;
			BOOL bret;
			if(pMsg->GetSize()!=5){
				um.Add(0);
				um.Add((*pMsg)[0]);
				um.Add((*pMsg)[1]);
				um.Add(m_csName);
				m_pBus->SendMessage(&um,m_btCurRoad);
			}
			if(pMsg->GetAt(3).it==DATA_TYPE_STRING){
				bret=AddNeeder(pMsg->m_btMsgType==MSG_EVENT?2:0,pMsg->m_dwIdent,(DWORD)pMsg->m_pSender,pMsg->m_dwSendMode,(DWORD)((*pMsg)[0]),(DWORD)((*pMsg)[1]),(DWORD)((*pMsg)[2]),(LPCTSTR)((*pMsg)[3]),(DWORD)((*pMsg)[4]));
			}
			else{
				bret=AddNeeder(pMsg->m_btMsgType==MSG_EVENT?2:0,pMsg->m_dwIdent,(DWORD)pMsg->m_pSender,pMsg->m_dwSendMode,(DWORD)((*pMsg)[0]),(DWORD)((*pMsg)[1]),(DWORD)((*pMsg)[2]),(DWORD)((*pMsg)[3]),(DWORD)((*pMsg)[4]));
			}
			if(!bret){
				um.Add(0);
				um.Add((*pMsg)[0]);
				um.Add((*pMsg)[1]);
				um.Add(m_csName);
				m_pBus->SendMessage(&um,m_btCurRoad);
			}
		}
		break;
	case CMD_LOCK_RES:
		{
			if(pMsg->m_btMsgType==MSG_EVENT){
				CUniMsg um;
				um.m_dwCommand=CMD_LOCK_RES;
				um.m_btMsgType=MSG_RESPONSE;
				um.m_dwSendMode=pMsg->m_dwReceiveMode;
				um.m_dwReceiveMode=pMsg->m_dwSendMode;
				um.m_pReceivor=pMsg->m_pSender;
				um.m_pSender=pMsg->m_pReceivor;
				um.m_dwIdent=pMsg->m_dwIdent;
				um.m_ierror=0;
				if(pMsg->GetSize()!=1){
					um.Add(0);
					m_pBus->SendMessage(&um,m_btCurRoad);
				}
				um.Add(LockRes((*pMsg)[0]));
				m_pBus->SendMessage(&um,m_btCurRoad);
			}
			else{
				if(pMsg->GetSize()==1){
					LockRes((*pMsg)[0]);
				}
			}
		}
		break;
	case CMD_FREE_RES:
		{
			if(pMsg->m_btMsgType==MSG_EVENT){
				CUniMsg um;
				um.m_dwCommand=CMD_FREE_RES;
				um.m_btMsgType=MSG_RESPONSE;
				um.m_dwSendMode=pMsg->m_dwReceiveMode;
				um.m_dwReceiveMode=pMsg->m_dwSendMode;
				um.m_pReceivor=pMsg->m_pSender;
				um.m_pSender=pMsg->m_pReceivor;
				um.m_dwIdent=pMsg->m_dwIdent;
				um.m_ierror=0;
				if(pMsg->GetSize()!=1){
					um.Add(0);
					m_pBus->SendMessage(&um,m_btCurRoad);
				}
				um.Add(FreeRes((*pMsg)[0]));
				m_pBus->SendMessage(&um,m_btCurRoad);
			}
			else {
				if(pMsg->GetSize()==1){
					FreeRes((*pMsg)[0]);
				}
			}
		}
		break;
	default:
		CAsynWorker::OnMsgReceive(pMsg);
	}
}

void CResDistrabutor::OnTimer(int iNumTimeflake,DWORD dwIdent)
{
	int i=0;
	time_t tms=GetTimeStamp();
	for(i=0;i<m_NeederListG.GetSize();i++){
		if(tms-m_NeederListG[i].tm>=m_iTimeout){
			if(m_NeederListG[i].bAsyn==1){
				SetSynMsgReturn(m_NeederListS[i].dwMod,
					(CAsynWorker *)m_NeederListS[i].dwObj,
					CMD_APPLY_RES,
					UniVar(0),
					UniVar(m_NeederListS[i].dwNeedKey1),
					UniVar(m_NeederListS[i].dwNeedKey2),
					UniVar(m_csName),
					InValidVar);
			}
			else{
				CUniMsg um;
				um.m_dwCommand=CMD_APPLY_RES;
				if(m_NeederListG[i].bAsyn==0)
					um.m_btMsgType=MSG_RESPONSE;
				else 
					um.m_btMsgType=MSG_EVENT;
				um.m_dwSendMode=GetModId();
				um.m_pSender=this;
				um.m_dwReceiveMode=m_NeederListG[i].dwMod;
				um.m_pReceivor=(CAsynWorker *)m_NeederListG[i].dwObj;
				um.m_dwIdent=m_NeederListG[i].dwIdent;
				um.Add(0);
				um.Add(m_NeederListG[i].dwNeedKey1);
				um.Add(m_NeederListG[i].dwNeedKey2);
				um.Add(m_csName);
				int posx=GetGroupPos(m_NeederListG[i].dwId);
				if(posx!=-1)
					pdwGroupCountN[posx]--;
				m_pBus->SendMessage(&um,m_btCurRoad);
				m_NeederListG.RemoveAt(i);
				i--;
			}
		}
	}
	for(i=0;i<m_NeederListS.GetSize();i++){
		if(tms-m_NeederListS[i].tm>=m_iTimeout){
			if(m_NeederListS[i].bAsyn==1){
				SetSynMsgReturn(m_NeederListS[i].dwMod,
					(CAsynWorker *)m_NeederListS[i].dwObj,
					CMD_APPLY_RES,
					UniVar(0),
					UniVar(m_NeederListS[i].dwNeedKey1),
					UniVar(m_NeederListS[i].dwNeedKey2),
					UniVar(m_csName),
					InValidVar);
			}
			else{
				CUniMsg um;
				um.m_dwCommand=CMD_APPLY_RES;
				if(m_NeederListS[i].bAsyn==0)
					um.m_btMsgType=MSG_RESPONSE;
				else 
					um.m_btMsgType=MSG_EVENT;
				um.m_dwSendMode=GetModId();
				um.m_pSender=this;
				um.m_dwReceiveMode=m_NeederListS[i].dwMod;
				um.m_pReceivor=(CAsynWorker *)m_NeederListS[i].dwObj;
				um.m_dwIdent=m_NeederListS[i].dwIdent;
				um.Add(0);
				um.Add(m_NeederListS[i].dwNeedKey1);
				um.Add(m_NeederListS[i].dwNeedKey2);
				um.Add(m_csName);
				CheckFCount(-1,m_NeederListS[i].dwId,pdwFeatureCountN,dwSkillStatusN);
				m_pBus->SendMessage(&um,m_btCurRoad);
				m_NeederListS.RemoveAt(i);
				i--;
			}
		}
	}
}

CAsynWorker::SYNMSGRESULT CResDistrabutor::OnAsynMsg(CUniMsg * pMsg,CUniMsg * pCmdReceive)
{
	switch(pMsg->m_dwCommand){
	case CMD_APPLY_RES:
		{
			BOOL bret;
			if(pMsg->GetSize()!=5){
				pCmdReceive->Add(0);
				pCmdReceive->Add((*pMsg)[0]);
				pCmdReceive->Add((*pMsg)[1]);
				pCmdReceive->Add(m_csName);
			}
			if(pMsg->GetAt(3).it==DATA_TYPE_STRING){
				bret=AddNeeder(1,pMsg->m_dwIdent,(DWORD)pMsg->m_pSender,pMsg->m_dwSendMode,(DWORD)((*pMsg)[0]),(DWORD)((*pMsg)[1]),(DWORD)((*pMsg)[2]),(LPCTSTR)((*pMsg)[3]),(DWORD)((*pMsg)[4]));
			}
			else{
				bret=AddNeeder(1,pMsg->m_dwIdent,(DWORD)pMsg->m_pSender,pMsg->m_dwSendMode,(DWORD)((*pMsg)[0]),(DWORD)((*pMsg)[1]),(DWORD)((*pMsg)[2]),(DWORD)((*pMsg)[3]),(DWORD)((*pMsg)[4]));
			}
			if(!bret){
				pCmdReceive->Add(0);
				pCmdReceive->Add((*pMsg)[0]);
				pCmdReceive->Add((*pMsg)[1]);
				pCmdReceive->Add(m_csName);
				return asynnowdo;
			}
		}
		break;
	case CMD_LOCK_RES:
		{
			if(pMsg->GetSize()!=1){
				pCmdReceive->Add(0);
			}
			pCmdReceive->Add(LockRes((*pMsg)[0]));
			return asynnowdo;
		}
		break;
	case CMD_FREE_RES:
		{
			if(pMsg->GetSize()!=1){
				pCmdReceive->Add(0);
			}
			pCmdReceive->Add(FreeRes((*pMsg)[0]));
			return asynnowdo;
		}
		break;
	default:
		break;
	}
	return OnAsynMsg(pMsg,pCmdReceive);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -