📄 hopekingdatabase.cpp
字号:
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 + -