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

📄 deliverthread.cpp

📁 vc开发的一个cmpp(中国移动点对点通讯)通讯程序
💻 CPP
📖 第 1 页 / 共 2 页
字号:
	printf("\r\n");   */

	if(pstDeliver->cRegistered_Delivery == 1)
	{
		HandleReportPdu(pstNodeBuf,szRecvBuf);
		return true;
	}

	nMsgLen = pstDeliver->nMessageLength;
	if(nMsgLen < 0)
		return true;
	int nLinkidPos = PDU_HEADER_SIZE + sizeof(SCmppDeliver) - MAX_MESSAGE_LENGTH + nMsgLen - LINKID_LENGTH;
	strcpy(szLinkID,(szRecvBuf+nLinkidPos));
	szLinkID[LINKID_LENGTH] = '\0';

	switch(pstDeliver->cMessageCoding)
	{
	case CMPP_DC_ASCII:{	
		strncpy(szShortMsg,pstDeliver->szMessageContent,nMsgLen);
		szShortMsg[nMsgLen] = '\0';
		}
		break;
	case CMPP_DC_GB2312:{
		strncpy(szShortMsg,pstDeliver->szMessageContent,nMsgLen);
		szShortMsg[nMsgLen] = '\0';
		}
		break;
	case CMPP_DC_UCS2:
//		UnicodeToAnsi(pstDeliver->szMessageContent,ntohl(pstDeliver->nMessageLength),szShortMsg);
		UnicodeToAnsi(pstDeliver->szMessageContent,pstDeliver->nMessageLength,szShortMsg);
		break;
	default:{
		strncpy(szShortMsg,pstDeliver->szMessageContent,nMsgLen);
		szShortMsg[nMsgLen] = '\0';
		strTmp1.Format("其余格式短信:用户%s,短信%s,编码各式%d",pstDeliver->szSrc_terminal_Id,szShortMsg,pstDeliver->cMessageCoding);
		LogMsg(strTmp1);
		}
	}

/*	CMailCoder mailcoder;
	int iLen = 32;
	int iOutLen=mailcoder.Base64EncodeSize(iLen);
	char featurestr[100];
	featurestr[iOutLen] = '\0';
	mailcoder.base64_encode(pstDeliver->szSrc_terminal_Id,iLen,featurestr); 
	if(iFirst == 0)
		memcpy(WEIMA,pstDeliver->szSrc_terminal_Id,32);
	else
		memcpy(WEIMANEW,pstDeliver->szSrc_terminal_Id,32);
	iFirst++;  */


	sprintf(szTrace,"[MO]收到%s的短信:%s,发送人:%s",pstDeliver->szSrc_terminal_Id,szShortMsg,pstDeliver->szDest_Id);
	LogMsg(szTrace);
	

	strSender=TrimStr(pstDeliver->szDest_Id);
	strTempMsg = TrimStr(szShortMsg) ;
	strDest=TrimStr(pstDeliver->szSrc_terminal_Id);
	strLinkID.Format("%s",szLinkID);    

	strTempMsg.Replace("'","''") ;
	strShortMsg.Format("%s",strTempMsg);
	strcpy(szShortMsg,strTempMsg) ;
    
    /////////////////////////////////////////////////////


	GetMoTabName(strShortMsg,strMoTable,strSender);
	if(strMoTable.IsEmpty())
	{
		strTmp.Format("%s",m_szHelp);
		SubmitToTable(strShortMsg,strDest,strSender,strLinkID,m_szErrorTable);
		SubmitToSend(strTmp,strDest,strSender,strLinkID,FALSE);
	}
	else
	{
		if (m_bMonth)  //开启包月功能
            SubmitToMonthTable(strShortMsg,strDest,strSender,strLinkID,strMoTable);

		SubmitToTable(strShortMsg,strDest,strSender,strLinkID,strMoTable);
	}

	SubmitToDeliverLog(szShortMsg,strDest,strSender,strLinkID);

	return true;

}

BOOL CDeliverThread::HandleReportPdu(SServerNodeBuffer *pstNodeBuf, const char *szRecvBuf)
{
	CString		strSql,strTmp;
	CSqlExec	sql_db(&m_database);
	SCmppDeliver *pstDeliver;
	SCmppReport *pstReport;
	CString		strMsg;
	CString		strMsgID;
	int  nRecCount = -1,nInValid = 0;
	int nMsgLen = 0;

	pstDeliver =(SCmppDeliver*)(szRecvBuf + PDU_HEADER_SIZE);
	nMsgLen = pstDeliver->nMessageLength;
	pstDeliver->szMessageContent[nMsgLen] = '\0';
	pstReport = (SCmppReport*)( pstDeliver->szMessageContent);
	pstReport->szStat[7] = '\0';
	strMsg.Format("[MO]收到状态报告信息,用户号:%s,state:%s.",
		pstReport->szDest_terminal_Id,pstReport->szStat);
	LogMsg(strMsg);
/*
	int itmp=1;//luming add 20041228 SUCCESS
	itmp =strcmp(pstReport->szStat,"DELIVRD");
	if(itmp==0)
	{
		strSql.Format("insert into gr_Status_rpt_tmp(RptTime,state,mobile) values(getdate(),'%s','%s') ",
			    pstReport->szStat,pstReport->szDest_terminal_Id);
		sql_db.SetSqlStatement(strSql);
		try
		{
			sql_db.Open();
		}
		catch(CDBException * e)
		{
			strTmp.Format("执行%s失败!",strSql);
			LogMsg(strTmp);
			return true;
		}
	}//add end
*/
    strSql.Format("insert into gr_Status_rpt(RptTime,state,mobile) values(getdate(),'%s','%s') ",
			    pstReport->szStat,pstReport->szDest_terminal_Id);
	sql_db.SetSqlStatement(strSql);

	if (!sql_db.Open())
	{
		strTmp.Format("执行%s失败!",strSql);
		LogMsg(strTmp);
		return true;
	}
    //LogMsg(pstReport->szStat);
	
	return true;

}

void CDeliverThread::GetMoTabName(CString strMsg, CString &strMoTab, const char *szDestAddr)
{
    CString strCmd ,strSender, strDestAddr,_strDestAddr; 
    int i; 

    strCmd = TrimStr(strMsg);
	strCmd.MakeUpper();

    _strDestAddr = TrimStr(szDestAddr); 
	if (_strDestAddr.Find(m_szSPNumber) > 1)
	{
		if(_strDestAddr.Find("86") == 0)
		    strDestAddr = _strDestAddr.Right(_strDestAddr.GetLength()-2);
		else
            strDestAddr = _strDestAddr;
	}
	else
		strDestAddr = _strDestAddr;

    strMoTab.Empty() ; 

    for(i = 0; i< m_nNumOfGameCmd ; i++ ) { 
        strSender = TrimStr(m_astCmdTab[i].strSender); 

       if(m_astCmdTab[i].iSenderType == 1)  { //根据接入号精确匹配
            if((strDestAddr.CompareNoCase(strSender) == 0) 
                 && (IsFindedMoTable(i, strCmd,strMoTab))) 
               break ; 
	   } 
       else { //根据接入号模糊匹配
		   if( ( strDestAddr.Find("81288") == 0 ) && ( strDestAddr.GetLength()==10 ) ){//倾城之恋的会员
			   strMoTab.Format( "%s",m_szChatTable ) ;
			   break ; 
		   }
		   if((strDestAddr.Find(strSender) == 0) 
              && (IsFindedMoTable(i,strCmd,strMoTab))) 
              break ; 
	   }
	} 
    
	if((!strMoTab.IsEmpty()) && (m_astCmdTab[i].iMoTabNum > 1)) { 
        CString strTmp; 
        int iRandom = rand(); 

        iRandom = iRandom % m_astCmdTab[i].iMoTabNum + 1; 
        strTmp.Format("%s_%d",strMoTab, iRandom) ; 
        strMoTab = strTmp ; 
	} 

	//开启聊天功能
	if (strMoTab.IsEmpty())
	{
	    if (m_bChat)
		{
			if ( strDestAddr.GetLength() >= (strlen(m_szSPNumber)+m_nChatLen) || IncludeChinese(strCmd))
		         strMoTab.Format("%s",m_szChatTable);
		}
	}

}

BOOL CDeliverThread::IsFindedMoTable(int nIndex, CString strCmd, CString &strMoTab)
{
	CString strCommand; 
	bool IsFinded = false ;  

	strCommand = TrimStr(m_astCmdTab[nIndex].strCmd); 

	if (m_astCmdTab[nIndex].iMatchType == 1) 
	{   //根据指令精确匹配
		if (strCommand.CompareNoCase("00000") == 0) //指令全部分配表中,条件是精确匹配且配置指令为"00000"
		{
			strMoTab = m_astCmdTab[nIndex].strMoTab ; 
			IsFinded = true ;
		}
		else
		{
			if( strCmd.CompareNoCase(strCommand) == 0 ) { 
			    strMoTab = m_astCmdTab[nIndex].strMoTab ; 
			    IsFinded = true ; 
			}
		}
	} 
	else 
	{ //根据指令模糊匹配
		if( strCmd.Find(strCommand) == 0 ) 
		{ 
			strMoTab = m_astCmdTab[nIndex].strMoTab ; 
			IsFinded = true ; 
		}
	} 

	return IsFinded ; 

}

void CDeliverThread::SubmitToTable(const char *szMsg, const char *szSAddr, const char *szDAddr, const char *szLinkID, const char *szTable)
{
	CSqlExec sql_deliver(&m_database);
	CString strSql,strMsg;
	CString strSAddr,_strSAddr,strDAddr,_strDAddr;

    _strSAddr = szSAddr;
	_strDAddr = szDAddr;

	if (_strSAddr.Find("86") == 0)
		strSAddr = _strSAddr.Right(_strSAddr.GetLength()-2);
	else
		strSAddr = _strSAddr;
    
	if (_strDAddr.Find(m_szSPNumber) > 1)
	{
		if(_strDAddr.Find("86") == 0)
		    strDAddr = _strDAddr.Right(_strDAddr.GetLength()-2);
		else
            strDAddr = _strDAddr;
	}
	else
		strDAddr = _strDAddr;
	
	strSql.Format("insert into %s(short_msg,src_addr,dst_addr,linkid) \
		           values('%s','%s','%s','%s')",szTable,szMsg,strSAddr,strDAddr,szLinkID);
	sql_deliver.SetSqlStatement(strSql);

	if(!sql_deliver.Open())
	{
		strMsg.Format("执行SQL语句出错:%s",strSql);
		LogMsg(strMsg);
		return;	
	}

}

void CDeliverThread::SubmitToMonthTable(const char *szMsg, const char *szSAddr, const char *szDAddr, const char *szLinkID, const char *szTable)
{
	CSqlExec sql_deliver(&m_database);
	CString strSql,strMsg;
	CString strSAddr,_strSAddr,strDAddr,_strDAddr;

    _strSAddr = szSAddr;
	_strDAddr = szDAddr;

	if (_strSAddr.Find("86") == 0)
		strSAddr = _strSAddr.Right(_strSAddr.GetLength()-2);
	else
		strSAddr = _strSAddr;
    
	if (_strDAddr.Find(m_szSPNumber) > 1)
	{
		if(_strDAddr.Find("86") == 0)
		    strDAddr = _strDAddr.Right(_strDAddr.GetLength()-2);
		else
            strDAddr = _strDAddr;
	}
	else
		strDAddr = _strDAddr;
	
	strSql.Format("insert into %s(short_msg,src_addr,dst_addr,linkid,tablename) \
		           values('%s','%s','%s','%s','%s')",m_szMonthTable,szMsg,strSAddr,strDAddr,szLinkID,szTable);
	sql_deliver.SetSqlStatement(strSql);

	if(!sql_deliver.Open())
	{
		strMsg.Format("执行SQL语句出错:%s",strSql);
		LogMsg(strMsg);
		return;	
	}

}

void CDeliverThread::SubmitToSend(const char *szMsg, const char *szSAddr, const char *szDAddr, const char *szLinkID, BOOL bCancle)
{
    CSqlExec sql_deliver(&m_database);
	CString strSql,strMsg;
	CString strSAddr,_strSAddr,strDAddr,_strDAddr;

    _strSAddr = szSAddr;
	_strDAddr = szDAddr;
//8686008600  868188 8188
	if (_strSAddr.Find("86") == 0)
		strSAddr = _strSAddr.Right(_strSAddr.GetLength()-2);
	else
		strSAddr = _strSAddr;
    
	if (_strDAddr.Find(m_szSPNumber) > 1)
	{
		if(_strDAddr.Find("86") == 0)
		    strDAddr = _strDAddr.Right(_strDAddr.GetLength()-2);
		else
            strDAddr = _strDAddr;
	}
	else
		strDAddr = _strDAddr;
	
	strSql.Format("insert into %s(message,mobile,sender,linkid,servicetype,feetype,feevalue,givenvalue,motomtflag) \
		           values('%s','%s','%s','%s','%s','%d','%d','%d','%d')",
				   m_szTableName,
				   szMsg,
				   strSAddr,
				   strDAddr,
				   szLinkID,
				   m_deffee.strServiceType,
				   m_deffee.iFeeType,
				   m_deffee.iFeeValue,
				   m_deffee.iGivenValue,
				   m_deffee.iMotomtFlag);

	sql_deliver.SetSqlStatement(strSql);

	if(!sql_deliver.Open())
	{
		strMsg.Format("执行SQL语句出错:%s",strSql);
		LogMsg(strMsg);
		return;	
	}

}

void CDeliverThread::SubmitToDeliverLog(const char *szMsg, const char *szSAddr, const char *szDAddr, const char *szLinkID)
{
	CSqlExec	sql_deliver(&m_database);
	CString		strSql;
	CString		strSAddr,_strSAddr,strDAddr,_strDAddr;
	CTime		ctTime = CTime::GetCurrentTime();
	CString		strMsg;
    
    _strSAddr = szSAddr;
	_strDAddr = szDAddr;

	if (_strSAddr.Find("86") == 0)
		strSAddr = _strSAddr.Right(_strSAddr.GetLength()-2);
	else
		strSAddr = _strSAddr;
    
	if (_strDAddr.Find(m_szSPNumber) > 1)
	{
		if(_strDAddr.Find("86") == 0)
		    strDAddr = _strDAddr.Right(_strDAddr.GetLength()-2);
		else
            strDAddr = _strDAddr;
	}
	else
		strDAddr = _strDAddr;
	
	if(!m_bDeliverToEveryDayTable)
	{
		strSql.Format("insert into %s(short_msg,src_addr,dst_addr,linkid) \
            values('%s','%s','%s','%s',)",m_szDeliverLogTableName,szMsg,strSAddr,strDAddr,szLinkID);
	}
	else
	{
		strSql.Format("insert into %s_%02d(short_msg,src_addr,dst_addr,linkid) \
            values('%s','%s','%s','%s')",m_szDeliverLogTableName,ctTime.GetDay(), szMsg,strSAddr,strDAddr,szLinkID);
	}

	sql_deliver.SetSqlStatement(strSql);
	if(!sql_deliver.Open())
	{
		strMsg.Format("执行SQL语句出错:%s",strSql);
		LogMsg(strMsg);
	}

}

void CDeliverThread::HandleSubmitRespPdu(SServerNodeBuffer *pstNodeBuf, const char *szRecvBuf)
{
	SCmppSubmitResp	*pstSubmitResp;
	int iResult;
	char szErrorMsg[200];

	pstSubmitResp =(SCmppSubmitResp*)(szRecvBuf + PDU_HEADER_SIZE);

//	iResult = ntohl(pstSubmitResp->iResult);
	iResult = pstSubmitResp->iResult;
	GetStatusMessage(CMPP_SUBMIT_RESP,iResult,szErrorMsg);
	LogMsg(szErrorMsg);
	

}

int CDeliverThread::SeekTask(int nSequence)
{
	int head = m_nTaskHead;

	while(head != m_nTaskTail)
	{
		if(m_stTask[head].m_iSequenceNumber == nSequence)
			return head;
		head = (head +1) % MAX_TASK_SIZE;
	}

	return -1;

}

void CDeliverThread::ProcessIdle()
{
	while(m_nTaskHead != m_nTaskTail)
	{
		if(m_stTask[m_nTaskHead].m_bState == S_IDLE)
			m_nTaskHead = (m_nTaskHead +1) % MAX_TASK_SIZE;
		else
			break;
	}

}

int CDeliverThread::SendCmppTerminateResp(SServerNodeBuffer *pstNodeBuf, const char *szRecvBuf)
{
	pstNodeBuf->m_iConnected = CMPP_STATUS_NOT_CONNECT;
	pstNodeBuf->m_stSocket.Close();
	return 1;
}


void CDeliverThread::WriteFaildLog(CString strMobile,int iResult)
{
    
	CString strFileMsg;
	strFileMsg.Format("Mobile=%s,Result=%d",strMobile,iResult);
	LogFile(strFileMsg);
	//modify by lzq ,2005-12-16
	CString strSql,strTmp;
	CSqlExec sql_db(&m_database);
	
	CString strPhone = strMobile;
	if(strPhone.GetLength() == 11)
		strPhone = "86" + strMobile;
    strSql.Format("insert into gr_Status_rpt(RptTime,state,mobile) values(getdate(),'SB:RESP8','%s') ",
			    strPhone);

	sql_db.SetSqlStatement(strSql);

	if (!sql_db.Open())
	{
		strTmp.Format("执行%s失败!",strSql);
		LogMsg(strTmp);
		
	}
	//end modify


}


void CDeliverThread::UpdateMsgID(int nTaskID,CString strMsgID)
{

	SCmppSubmit	*pstSubmit;
	pstSubmit =(SCmppSubmit*)(m_stTask[nTaskID].m_baPduBuf.GetData() + PDU_HEADER_SIZE);
	CString strMobile = pstSubmit->szDest_terminal_Id;
	CString strSQL;
	CString strFeeValue = pstSubmit->szFeeCode;
/*
	char szBuffer[3];
	strncpy(szBuffer,pstSubmit->cFeeType,2);
	CString strFeeType  = szBuffer;
*/
	if(strFeeValue == "300")
	{
		strSQL.Format("insert into byFeeStatus_Wait(NumberID,msg_ID,Mobile)values(%d,'%s','%s') ",m_stTask[nTaskID].m_iSequenceNumber,strMsgID,strMobile);
		CSqlExec sql_db(&m_database);

		sql_db.SetSqlStatement(strSQL);
		if (!sql_db.Open())
		{
			CString strTmp;
			strTmp.Format("执行%s失败!",strSQL);
			LogMsg(strTmp);
			
		}
		
		LogFile(strSQL);
	}


}

⌨️ 快捷键说明

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