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

📄 hopekingdatabase.cpp

📁 IVR交互式语音应答系统脚本解析器
💻 CPP
📖 第 1 页 / 共 3 页
字号:
	m_OdbcDataMap.SetAt(pDbs->m_csAlis,(void *)NULL);
	for(int i=0;i<m_ListOdbcData.GetSize();i++){
		if(pDbs==m_ListOdbcData[i]){
			m_ListOdbcData.RemoveAt(i);
			break;
		}
	}
	LeaveCriticalSection(&statArea);
	try{
		pDbs->CloseData();
		delete pDbs;
	}
	catch(...){
	}
	return;
}

CDistrabutorMg::CDistrabutorMg(CDataBus * pBus):CAsynWorker(pBus)
{
	InitializeCriticalSection(&statArea);
};

CDistrabutorMg::~CDistrabutorMg()
{
	for(int i=0;i<m_ListDistrData.GetSize();i++){
		if(m_ListDistrData[i]->IsValid()){
			delete m_ListDistrData[i];
		}
	}
	m_ListDistrData.RemoveAll();
	DeleteCriticalSection(&statArea);
}

CResDistrabutor * CDistrabutorMg::OpenDistrabutor(LPCTSTR szName,int GroupNum,LPCTSTR szFeatureList,int timeout,int length)
{
	if(!szName||!szName[0])return NULL;
	EnterCriticalSection(&statArea);
	CResDistrabutor * pDistr=GetDistrabutor(szName);
	if(pDistr){
		LeaveCriticalSection(&statArea);
		return pDistr;
	}
	pDistr=new CResDistrabutor(m_pBus);
	m_ListDistrData.Add(pDistr);
	pDistr->PointeRoad(1);
	try{
		m_DistrMap.SetAt(szName,(void *)pDistr);
		pDistr->m_csName=szName;
		pDistr->m_iTimeout=timeout;
		pDistr->m_iMaxLength=length;
		pDistr->m_iMaxGroupNum=GroupNum;
		if(pDistr->m_iMaxGroupNum<0)pDistr->m_iMaxGroupNum=0;
		if(pDistr->m_iMaxGroupNum>MAX_GROUP_NUM)pDistr->m_iMaxGroupNum=MAX_GROUP_NUM;
		if(pDistr->m_iMaxGroupNum){
			pDistr->pdwGroupCountF=new DWORD[pDistr->m_iMaxGroupNum];
			pDistr->pdwGroupCountN=new DWORD[pDistr->m_iMaxGroupNum];
			pDistr->pdwGroup=new DWORD[pDistr->m_iMaxGroupNum];
			memset(pDistr->pdwGroupCountF,0,sizeof(DWORD)*pDistr->m_iMaxGroupNum);
			memset(pDistr->pdwGroupCountN,0,sizeof(DWORD)*pDistr->m_iMaxGroupNum);
			memset(pDistr->pdwGroup,0,sizeof(DWORD)*pDistr->m_iMaxGroupNum);
		}
		else {
			pDistr->pdwGroupCountF=NULL;
			pDistr->pdwGroupCountN=NULL;
			pDistr->pdwGroup=NULL;
		}
		pDistr->m_iMaxFeatureNum=pDistr->AddFeatureName(szFeatureList);
		if(pDistr->m_iMaxFeatureNum){
			pDistr->pdwFeatureCountF=new DWORD[pDistr->m_iMaxFeatureNum];
			pDistr->pdwFeatureCountN=new DWORD[pDistr->m_iMaxFeatureNum];
			memset(pDistr->pdwFeatureCountF,0,sizeof(DWORD)*pDistr->m_iMaxFeatureNum);
			memset(pDistr->pdwFeatureCountN,0,sizeof(DWORD)*pDistr->m_iMaxFeatureNum);
		}
		else {
			pDistr->pdwFeatureCountF=NULL;
			pDistr->pdwFeatureCountN=NULL;
		}
	}
	catch(...){
	}
	LeaveCriticalSection(&statArea);
	return pDistr;
}

void CDistrabutorMg::CloseDistrabutor(CResDistrabutor * pDistr)
{
	if(!pDistr->IsValid())
		return;
	EnterCriticalSection(&statArea);
	try{
		CString csa=pDistr->m_csName;
		if(pDistr!=GetDistrabutor(csa)){
			LeaveCriticalSection(&statArea);
			return;
		}
	}
	catch(...){
		LeaveCriticalSection(&statArea);
		return;
	}
	m_DistrMap.SetAt(pDistr->m_csName,(void *)NULL);
	for(int i=0;i<m_ListDistrData.GetSize();i++){
		if(pDistr==m_ListDistrData[i]){
			m_ListDistrData.RemoveAt(i);
			break;
		}
	}
	LeaveCriticalSection(&statArea);
	try{
		delete pDistr;
	}
	catch(...){
	}
	return;
}

CResDistrabutor::CResDistrabutor(CDataBus * pBus):CAsynWorker(pBus)
{
	dwSkillStatusF=dwSkillStatusN=0;
	AddTime(5,0,false,false);
}

CResDistrabutor::~CResDistrabutor()
{
	CancelTime(0);
	if(pdwGroupCountF)
		delete [] pdwGroupCountF;
	if(pdwGroupCountN)
		delete [] pdwGroupCountN;
	if(pdwFeatureCountF)
		delete [] pdwFeatureCountF;
	if(pdwFeatureCountN)
		delete [] pdwFeatureCountN;
	if(pdwGroup)
		delete [] pdwGroup;
	for(int i=0;i<m_ResList.GetSize();i++){
		if(m_ResList[i].pbtSkillLevel)
			delete [] m_ResList[i].pbtSkillLevel;
	}
}

int CResDistrabutor::AddFeatureName(LPCTSTR szFeature)
{
	CString csFeat=szFeature,cs;
	int iFeatCount=0;
	while(iFeatCount<MAX_FEATURE_NUM&&!csFeat.IsEmpty()){
		int i=csFeat.Find(",");
		if(i>0){
			cs=csFeat.Left(i);
		}
		else if(i<0){
			cs=csFeat;
		}
		else {
			cs="";
		}
		cs.TrimLeft();
		cs.TrimRight();
		if(!cs.IsEmpty()){
			m_StringFeatureList.SetAt(cs,(void *)(iFeatCount));
			iFeatCount++;
		}
		csFeat=csFeat.Right(csFeat.GetLength()-i-1);
	}
	return iFeatCount;
}

DWORD CResDistrabutor::GetSkillLevel(BYTE * pLevel,LPCTSTR szFeature)
{
	DWORD iFeatCount=0;
	if(!szFeature||!szFeature[0])return iFeatCount;
	CString csFeat=szFeature,cs;
	int ift=0;
	int icount=0;
	int posx=0;
	while(iFeatCount<MAX_FEATURE_NUM&&!csFeat.IsEmpty()){
		int i=csFeat.Find(",");
		if(i>0){
			cs=csFeat.Left(i);
		}
		else if(i<0){
			cs=csFeat;
		}
		else {
			cs="";
		}
		cs.TrimLeft();
		cs.TrimRight();
		if(!cs.IsEmpty()){
			if(pLevel){
				CString cs1="";
				int j=cs.Find("|");
				if(j>0){
					cs1=cs;
					cs=cs.Left(j);
					cs1=cs1.Right(cs1.GetLength()-j-1);
				}
				else if(j==0){
					continue;
				}
				posx=atoi(cs1);
			}
			if(m_StringFeatureList.Lookup(cs,(void * &)(ift))){
				iFeatCount+=1<<ift;
				if(pLevel)
					pLevel[ift]=(BYTE)posx;
				icount++;
				if(icount>=m_iMaxFeatureNum)break;
			}
		}
		csFeat=csFeat.Right(csFeat.GetLength()-i-1);
	}
	return iFeatCount;
}

void CResDistrabutor::AddRes(DWORD dwGroupId,LPCTSTR szSkillFeature,DWORD dwResKey,DWORD dwCatchObj,DWORD dwCatchMod)
{
	int i;
	if(m_ResKeyList.Lookup((void *)dwResKey,(void * &)i))return;
	i=m_ResList.GetSize();
	BYTE btAry[MAX_FEATURE_NUM];
	memset(btAry,0,MAX_FEATURE_NUM);
	RESOBJ res;
	m_ResList.Add(res);
	m_ResList[i].dwGroupId=dwGroupId;
	m_ResList[i].dwFeaturesId=GetSkillLevel(btAry,szSkillFeature);
	m_ResList[i].dwResKey=dwResKey;
	m_ResList[i].dwTmCount=0;
	m_ResList[i].tm=0;
	m_ResList[i].dwCatchObj=dwCatchObj;
	m_ResList[i].dwCatchMod=dwCatchMod;
	if(m_ResList[i].dwFeaturesId){
		m_ResList[i].pbtSkillLevel=new BYTE[m_iMaxFeatureNum];
		memcpy(m_ResList[i].pbtSkillLevel,btAry,m_iMaxFeatureNum);
	}
	else{
		m_ResList[i].pbtSkillLevel=NULL;
	}
	m_ResList[i].dwGroupPos=GetGroupPos(dwGroupId);
	m_ResKeyList.SetAt((void *)dwResKey,(void * )i);
}

BOOL CResDistrabutor::AddNeeder(BOOL bAsyn,DWORD dwIdent,DWORD dwObj,DWORD dwMod,DWORD dwNeedKey1,DWORD dwNeedKey2,DWORD dwType,DWORD dwId,DWORD dwRight)
{
	DWORD ipos=GetGroupPos(dwId);
	if(ipos==0xffffffff||!pdwGroupCountF)return FALSE;
	if(dwType!=0x10&&dwType!=0x11)return FALSE;
	//dwType==0x12 抢答
	int itp=-1;
	int icount=(int)pdwGroupCountF[ipos];
	if(pdwGroupCountF&&icount){
		POSITION pos=m_FreeResList.GetHeadPosition(),pos1=pos;
		while(pos){
			pos1=pos;
			int ip=m_FreeResList.GetNext(pos);
			if(m_ResList[ip].dwGroupId==dwId){
				if(itp!=-1){
					if(dwType==0x10){
						if(m_ResList[ip].tm<m_ResList[ip].tm){
							itp=ip;
						}
					}
					else if(dwType==0x11){
						if(m_ResList[ip].dwTmCount<m_ResList[ip].dwTmCount){
							itp=ip;
						}
					}
					else if(dwType==0x12){
						//send callcoming apply抢答
					}
				}
				else {
					if(dwType==0x12){
						if(icount>1){
							//send callcoming apply抢答
						}
						itp=ip;
					}
					else{
						itp=ip;
					}
				}
				icount--;
				if(icount)break;
			}
		}
		if(itp!=-1){
			m_FreeResList.RemoveAt(pos1);
			m_ResKeyPos.SetAt((void *)m_ResList[itp].dwResKey,(void *)NULL);
			m_ResList[itp].tm=GetTimeStamp();
			if(m_ResList[itp].dwGroupPos!=0xffffffff){
				pdwGroupCountF[m_ResList[itp].dwGroupPos]--;
			}
			if(m_ResList[itp].dwFeaturesId){
				CheckFCount(-1,m_ResList[itp].dwFeaturesId,pdwFeatureCountF,dwSkillStatusF);
			}
			//post message for distrabute
			if(bAsyn==1){
				SetSynMsgReturn(dwMod,
					(CAsynWorker *)dwObj,
					CMD_APPLY_RES,
					UniVar(m_ResList[itp].dwResKey),
					UniVar(dwNeedKey1),
					UniVar(dwNeedKey2),
					UniVar(m_csName),
					InValidVar);
			}
			else{
				CUniMsg um;
				um.m_dwCommand=CMD_APPLY_RES;
				if(bAsyn==0)
					um.m_btMsgType=MSG_RESPONSE;
				else
					um.m_btMsgType=MSG_EVENT;
				um.m_dwSendMode=GetModId();
				um.m_pSender=this;
				um.m_dwReceiveMode=dwMod;
				um.m_pReceivor=(CAsynWorker *)dwObj;
				um.m_dwIdent=dwIdent;
				um.Add(m_ResList[itp].dwResKey);
				um.Add(dwNeedKey1);
				um.Add(dwNeedKey2);
				um.Add(m_csName);
				m_pBus->SendMessage(&um,m_btCurRoad);
			}
			return TRUE;
		}
	}
	if(bAsyn==1){
		return FALSE;
	}
	if(pdwGroupCountN[ipos]>=(DWORD)m_iMaxLength){
		return FALSE;
	}
	pdwGroupCountN[ipos]++;
	NEEDER nr;
	for(int i=0;i<m_NeederListG.GetSize();i++){
		if(m_NeederListG[i].dwRight==dwRight){
			m_NeederListG.InsertAt(i,nr);
			break;
		}
	}
	if(i==m_NeederListG.GetSize()){
		m_NeederListG.Add(nr);
	}
	m_NeederListG[i].dwRight=dwRight;
	m_NeederListG[i].dwObj=dwObj;
	m_NeederListG[i].dwMod=dwMod;
	m_NeederListG[i].dwNeedKey1=dwNeedKey1;
	m_NeederListG[i].dwNeedKey2=dwNeedKey2;
	m_NeederListG[i].dwIdent=dwIdent;
	m_NeederListG[i].dwType=dwType;
	m_NeederListG[i].bAsyn=bAsyn;
	m_NeederListG[i].dwId=dwId;
	m_NeederListG[i].tm=GetTimeStamp();
	return TRUE;
}

BOOL CResDistrabutor::AddNeeder(BOOL bAsyn,DWORD dwIdent,DWORD dwObj,DWORD dwMod,DWORD dwNeedKey1,DWORD dwNeedKey2,DWORD dwType,LPCTSTR szFeature,DWORD dwRight)
{
	DWORD dwSkillId=GetSkillLevel(NULL,szFeature);
	if(!dwSkillId||!pdwFeatureCountF)return TRUE;
	if(dwType!=0x00&&dwType!=0X01)return FALSE;
	DWORD dwTempSkillid=dwSkillStatusF,dwTempSkillCount[MAX_FEATURE_NUM];
	memset(dwTempSkillCount,0,sizeof(DWORD)*MAX_FEATURE_NUM);
	memcpy(dwTempSkillCount,pdwFeatureCountF,sizeof(DWORD)*m_iMaxFeatureNum);
	if((dwType==0x00&&(dwTempSkillid&dwSkillId)==dwSkillId)||(dwType==0x01&&(dwTempSkillid&dwSkillId))){
		int itp=-1;
		POSITION pos=m_FreeResList.GetHeadPosition(),pos1=pos;
		int itempSkl1=0,itempSkl2=0;
		while(pos){
			pos1=pos;
			int ip=m_FreeResList.GetNext(pos);
			BOOL bSuc=FALSE;
			if(m_ResList[ip].dwFeaturesId){
				if(dwType==0x00){
					if((m_ResList[ip].dwFeaturesId&dwSkillId)==dwSkillId){
						bSuc=TRUE;
					}								
				}
				else {
					if(m_ResList[ip].dwFeaturesId&dwSkillId){
						bSuc=TRUE;
					}
				}
				CheckFCount(-1,m_ResList[ip].dwFeaturesId,dwTempSkillCount,dwTempSkillid);
				if((dwType==0x00&&(dwTempSkillid&dwSkillId)==dwSkillId)||(dwType==0x01&&(dwTempSkillid&dwSkillId))){
					if(bSuc){
						if(itp==-1){
							itp=ip;
							itempSkl1=GetSkillLevel(ip);
						}
						else{
							itempSkl2=itempSkl1;
							itempSkl1=GetSkillLevel(ip);
							if(itempSkl2<itempSkl1){
								itp=ip;
							}
						}
					}
				}
				else{
					if(itp==-1&&bSuc){
						itp=ip;
					}
					break;
				}
			}
		}
		if(itp!=-1){
			m_FreeResList.RemoveAt(pos1);
			m_ResKeyPos.SetAt((void *)m_ResList[itp].dwResKey,(void *)NULL);
			m_ResList[itp].tm=GetTimeStamp();
			if(m_ResList[itp].dwGroupPos!=0xffffffff){
				pdwGroupCountF[m_ResList[itp].dwGroupPos]--;
			}
			if(m_ResList[itp].dwFeaturesId){
				CheckFCount(-1,m_ResList[itp].dwFeaturesId,pdwFeatureCountF,dwSkillStatusF);
			}
			//post message for distrabute
			if(bAsyn==1){
				SetSynMsgReturn(dwMod,
					(CAsynWorker *)dwObj,
					CMD_APPLY_RES,
					UniVar(m_ResList[itp].dwResKey),
					UniVar(dwNeedKey1),
					UniVar(dwNeedKey2),
					UniVar(m_csName),
					InValidVar);
			}
			else{
				CUniMsg um;
				um.m_dwCommand=CMD_APPLY_RES;
				if(bAsyn==0)
					um.m_btMsgType=MSG_RESPONSE;
				else
					um.m_btMsgType=MSG_EVENT;
				um.m_dwSendMode=GetModId();
				um.m_pSender=this;
				um.m_dwReceiveMode=dwMod;
				um.m_pReceivor=(CAsynWorker *)dwObj;
				um.m_dwIdent=dwIdent;
				um.Add(m_ResList[itp].dwResKey);
				um.Add(dwNeedKey1);
				um.Add(dwNeedKey2);
				um.Add(m_csName);
				m_pBus->SendMessage(&um,m_btCurRoad);
			}
			return TRUE;
		}
	}
	if(bAsyn==1){
		return FALSE;
	}
	NEEDER nr;
	CheckFCount(1,dwSkillId,pdwFeatureCountN,dwSkillStatusN);
	for(int i=0;i<m_NeederListS.GetSize();i++){
		if(m_NeederListS[i].dwRight==dwRight){

⌨️ 快捷键说明

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