📄 deliverthread.cpp
字号:
/*
if (pstReport->cReportType == 1)//图片
{
if(pstReport->cState==0)//发送成功
{
strSql.Format("update gr_Status_rpt set StatusRpt='%d',RptTime=getdate(),Result=0 \
where msgid='%s'",pstReport->cErrorCode,strMsgID);
}
else
{
strSql.Format("update gr_Status_rpt set StatusRpt='%d',RptTime=getdate(),Result=1 \
where msgid='%s'",pstReport->cErrorCode,strMsgID);
}
sql_db.SetSqlStatement(strSql);
sql_db.Open();
}
*/
if (pstReport->cReportType == 0) //0,对先前一条Submit命令的状态报告;1,对先前一条前转Deliver命令的状态报告
{
if (m_bReport && pstReport->cState != 0) //等待发送或发送失败
// if ( m_bReport ) //等待发送或发送失败 modify by gyh at 2003/12/15
{
strSql.Format("insert into gr_Status_rpt(statusRpt,RptTime,Result,MsgId,mobile) values('%d',getdate(),%d,'%s','%s') ",
pstReport->cErrorCode,pstReport->cState,strMsgID,pstReport->szUserNumber);
sql_db.SetSqlStatement(strSql);
if (!sql_db.Open())
{
strTmp.Format("执行%s失败!",strSql);
LogMsg(strTmp);
LogFile(strTmp);
ACTIVE_FLAG = false;
return true;
}
}
}
printf("状态报告序列号:%s\n",strMsgID);
//开启搜索禁止
if (m_bForbid)
{
if (!IsTimeToForbidMobile())
return true;
//执行存储过程
strSql.Format("exec forbidmobile");
sql_db.SetSqlStatement(strSql);
if (!sql_db.Open())
{
LogMsg("执行ForbidMobile存储过程失败!");
LogFile("执行ForbidMobile存储过程失败!");
return true;
}
sql_db.FetchAllData();
nRecCount = sql_db.RowCount();
if (nRecCount > 0)
{
nInValid = atoi(sql_db.GetFieldValue(0,"ST"));
if (nInValid > 0)
{
//重新载入零星号段
LoadInValidMobile();
}
}
}
return true;
}
BOOL CDeliverThread::HandleDeliverPdu(SClientNodeBuffer *pstNodeBuf,const char* szRecvBuf)
{
char szTrace[300];
char szShortMsg[200];
char szLinkID[9];
CString strSql,strMoTable,strTmp,strTempMsg,strLinkID;
CSqlExec sql_db(&m_database);
SSGipDeliver *pstDeliver;
CString strSender,strShortMsg;
CString strDest,strResult,strTmp1,strServiceType;
int nMsgLen;//added by zsc,去掉协议外的信息 2003-8-6
SendSGipDeliverResp(pstNodeBuf,szRecvBuf,SGIP_OK);
pstDeliver =(SSGipDeliver*)(szRecvBuf + PDU_HEADER_SIZE);
nMsgLen = ntohl(pstDeliver->nMessageLength);
int nLinkidPos = PDU_HEADER_SIZE + sizeof(SSGipDeliver) - MAX_MESSAGE_LENGTH + nMsgLen - 8;
memcpy(szLinkID,(szRecvBuf+nLinkidPos),8);
szLinkID[8] = '\0';
switch(pstDeliver->cMessageCoding)
{
case SGIP_DC_ASCII:{
// strcpy(szShortMsg,pstDeliver->szMessageContent);
strncpy(szShortMsg,pstDeliver->szMessageContent,nMsgLen);
szShortMsg[nMsgLen] = '\0';//added by zsc,去掉协议外的信息
//LogMsg("收到ASCII信息");
}
break;
case SGIP_DC_GB2312:{
// strcpy(szShortMsg,pstDeliver->szMessageContent);
strncpy(szShortMsg,pstDeliver->szMessageContent,nMsgLen);
szShortMsg[nMsgLen] = '\0';
//LogMsg("收到中文信息");
}
break;
case SGIP_DC_UCS2://unicode
UnicodeToAnsi(pstDeliver->szMessageContent,ntohl(pstDeliver->nMessageLength),szShortMsg);
//LogMsg("收到Unicode编码信息");
break;
default:{
//LogMsg("收到其余格式短信");
// strcpy(szShortMsg,pstDeliver->szMessageContent);
strncpy(szShortMsg,pstDeliver->szMessageContent,nMsgLen);
szShortMsg[nMsgLen] = '\0';
strTmp1.Format("其余格式短信:用户%s,短信%s,编码各式%d",pstDeliver->szUserNumber,szShortMsg,pstDeliver->cMessageCoding);
LogMsg(strTmp1);
LogFile(strTmp1);
if (m_bRecieve)
break;
else
return false;
}
}
sprintf(szTrace,"[MO]收到%s的短信:%s,发送人:%s",pstDeliver->szUserNumber,szShortMsg,pstDeliver->szSPNumber);
LogMsg(szTrace);
strSender=TrimStr(pstDeliver->szSPNumber);
strTempMsg = TrimStr(szShortMsg) ;
strDest=TrimStr(pstDeliver->szUserNumber);
strLinkID.Format("%s",szLinkID); //add by qjf MO和MT之间一一对应 2004-2-9
strTempMsg.Replace("'","''") ;
strShortMsg.Format("%s",strTempMsg);
strcpy(szShortMsg,strTempMsg) ;
/////////////////////////////////////////////////////
CString strTemp = strShortMsg.Mid(0,4);
//add by lzq
int iFlag = 0;
if(strTemp.Compare("0001") == 0)
iFlag = 1;
else if(strTemp.Compare("8003") == 0)
iFlag = 2;
if(iFlag)
{
SubmitToDeliverLog(szShortMsg,strDest,strSender,strLinkID);
CString csRecMobile = strDest;
if(iFlag == 1)//同步确认
{
CString strContent ;
strContent = GetResMsg(strShortMsg,strServiceType,csRecMobile,iFlag);
SubmitToOrderSend(strContent,"10109696",strSender,strLinkID,strServiceType);
}
CString csDeliverMsg = szShortMsg;
// LogMsg(csDeliverMsg,1);
if(strSender == "21012")
{
strMoTable = "gr_deliver_voice";
CString csTempStr = "1";
if(csDeliverMsg.GetLength() > 5)
csTempStr = csDeliverMsg.Mid(5,1);
if(csTempStr == "1")
csDeliverMsg = "X";
else
csDeliverMsg = "XQ";
}else
GetMoTabName(strShortMsg,strMoTable,strSender);
if(!strMoTable.IsEmpty())
{
SubmitToTable(csDeliverMsg,csRecMobile,strSender,strLinkID,strMoTable);
}
//end of add
return true;
}
//end of add by lzq
// add by ycf 20020825
if(m_bEnableNumCtrl //m_bEnableNumCtrl是号码段控制功能开关
&& !IsEnableMobile(strDest))
{ //判断是否是本地区的有效号码段 valid mobile Number
SubmitToSend(m_szErrMobileMsg,strDest,strSender,strLinkID,TRUE);
return true;
}
// add by ycf 20020912
if (m_bEnableGameQuit)
{
strTempMsg.MakeUpper();
strTempMsg.Replace("+","");
// if (strTempMsg.CompareNoCase(m_szCancelAll) == 0)
if ( ( strTempMsg.CompareNoCase(m_szCancelAll) == 0 )
|| ( strTempMsg.CompareNoCase(m_szEqualAll) == 0 ) )
{
if( IsGameUser( strDest.Right(11) ) ){
//取消全部(执行存储过程)
strSql.Format("exec gamequitall '%s' ",strDest.Right(11));
SubmitToDatabase(strSql);
strTmp.Format("%s",m_szCancelAllHelp);
SubmitToTable(szShortMsg,strDest,strSender,strLinkID,m_szErrorTable);
SubmitToSend(strTmp,strDest,strSender,strLinkID,TRUE);
}
else{
strTmp.Format("%s",m_szCancelHelp2);
SubmitToTable(szShortMsg,strDest,strSender,strLinkID,m_szErrorTable);
SubmitToSend(strTmp,strDest,strSender,strLinkID,TRUE);
}
return true;
}
if ( ( strTempMsg.Find(m_szCancel) == 0 ) || ( strTempMsg.Find(m_szEqual) == 0 ) ) {
strResult = GameQuitCmd(strDest,strTempMsg,strShortMsg);
if (strShortMsg.IsEmpty())
strTmp.Format("%s",strResult);
else
strTmp.Format("%s",strShortMsg);
SubmitToTable(szShortMsg,strDest,strSender,strLinkID,m_szErrorTable);
SubmitToSend(strTmp,strDest,strSender,strLinkID,TRUE);
return true;
}
}
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;
}
CString CDeliverThread::GameQuitCmd(CString strMobile,CString strSrcCmd,CString &strMessage)
{
CString strTmp,strQuitSql,strSql,strSrc,strGameSql;
CString strResult,strTemp1,strTemp2,strTemp;
BOOL bOrder = true;
strMessage.Empty();
strResult.Empty();
if (strMobile.Find("86") == 0)
strSrc = strMobile.Mid(2);
else
strSrc = strMobile;
if( strSrcCmd.Find(m_szCancel) == 0 )
strTmp = TrimStr(strSrcCmd.Mid(strlen(m_szCancel)));
else
strTmp = TrimStr(strSrcCmd.Mid(strlen(m_szEqual)));
strTmp.Replace("+","");
for (int i=0;i< m_nGameQuitNum;i++)
{
if (strTmp.CompareNoCase(m_sGameQuit[i].strSrcCmd) == 0)
{
//取消部分
strSql = m_sGameQuit[i].strQuitSQL;
if (strSql.IsEmpty())
continue;
strQuitSql.Format(strSql,strSrc); //modify by ycf 20021112
SubmitToDatabase(strQuitSql);
strMessage = m_sGameQuit[i].strMessage;
bOrder = false;
break;
}
}
if (bOrder) //定制各项业务
{
for (int i=0;i<m_nGameQuitNum;i++)
{
strGameSql = TrimStr(m_sGameQuit[i].strGameSQL);
if (strGameSql.IsEmpty())
continue;
if (IsGameUser(strGameSql,strSrc))
{
strTemp1 = TrimStr(m_sGameQuit[i].strSrcCmd);
strTemp2 = TrimStr(m_sGameQuit[i].strGameName);
strTemp += " "+strTemp1+":"+strTemp2;
}
}
if (strTemp.IsEmpty())
{
strResult.Format("%s",m_szCancelHelp2);
}
else
{
strTemp1.Format("%s",m_szCancelHelp1);
strTemp1.Replace("@@","%s");
strResult.Format(strTemp1,strTemp);
}
}
return strResult;
}
BOOL CDeliverThread::IsGameUser(CString strGameSql,CString strSrc)
{
CSqlExec sql_Get(&m_database);
int nRecCount = -1,nCount = 0;
CString strSql,strTmp;
BOOL bUser = false;
strSql.Format(strGameSql,strSrc);
sql_Get.SetSqlStatement(strSql);
if (!sql_Get.Open())
{
return false;
}
sql_Get.FetchAllData();
nRecCount = sql_Get.RowCount();
if (nRecCount > 0)
{
nCount = atoi(sql_Get.GetFieldValue(0,"ST")); //modify by ycf 20021122
if (nCount > 0)
bUser = true;
else
bUser = false;
}
return bUser;
}
CString CDeliverThread::GetQuitSQL(CString strSql,CString strSrc)
{ //QUITSQL
CString strResult;
char szTmp;
int nCount=1;
for (int i=0;i<strSql.GetLength();i++)
{
szTmp = strSql.GetAt(i);
if (szTmp == '@')
nCount++;
}
strSql.Replace("@","%s"); //
if (nCount > 1) //
nCount--;
switch (nCount)
{//支持6个
case 1:
strResult.Format(strSql,strSrc);
break;
case 2:
strResult.Format(strSql,strSrc,strSrc);
break;
case 3:
strResult.Format(strSql,strSrc,strSrc,strSrc);
break;
case 4:
strResult.Format(strSql,strSrc,strSrc,strSrc,strSrc);
break;
case 5:
strResult.Format(strSql,strSrc,strSrc,strSrc,strSrc,strSrc);
break;
case 6:
strResult.Format(strSql,strSrc,strSrc,strSrc,strSrc,strSrc,strSrc);
break;
default:
strResult.Format(strSql,strSrc);
break;
}
return strResult;
}
BOOL CDeliverThread::SubmitToDatabase(const char *szSql)
{
CSqlExec sql_sm(&m_database);
CString strMsg;
sql_sm.SetSqlStatement(szSql);
if(!sql_sm.Open())
{
strMsg.Format("执行SQL语句出错:%s",szSql);
LogMsg(strMsg);
LogFile(strMsg);
return false;
}
return true;
}
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);
LogFile(strMsg);
}
}
int CDeliverThread::SendPacket(CTcpAsyncSocket *pstSocket,unsigned char* szSendBuf,int nSendLen)
{
// int nLen = pstSocket->Send(szSendBuf,nSendLen);
int nBytes,nBytesLeft=nSendLen;
int nBytesSent=0;
if(pstSocket->m_hSocket)
{
while (nBytesLeft>0)
{
nBytes=pstSocket->Send(szSendBuf+nBytesSent,nBytesLeft);
if(nBytes >nBytesLeft)
return 0;
if(nBytes <=0)
{
int nError=GetLastError( );
pstSocket->m_hSocket=INVALID_SOCKET;
return -1;
}
nBytesSent+=nBytes;
nBytesLeft-=nBytes;
}
}
return nBytesSent;
}
void CDeliverThread::Quit()
{
SClientNodeBuffer *pstClientNodeBuf;
SDeliverNodeBuffer *pstDeliverNodeBuf;
CTcpAsyncSocket *pstSocket;
int i,k;
for(i=0;i<m_stDeliverNodeBuf.GetSize();i++)
{
pstDeliverNodeBuf =(SDeliverNodeBuffer *)m_stDeliverNodeBuf.GetAt(i);
for(k=0;k<pstDeliverNodeBuf->m_stClientNodeBuf.GetSize();k++)
{
pstClientNodeBuf =(SClientNodeBuffer *)pstDeliverNodeBuf->m_stClientNodeBuf.GetAt(k);
pstClientNodeBuf->m_pstClientSocket->Close();
delete pstClientNodeBuf->m_pstClientSocket;
delete pstDeliverNodeBuf->m_stClientNodeBuf.GetAt(k);
}
pstDeliverNodeBuf->m_stClientNodeBuf.RemoveAll();
pstDeliverNodeBuf->m_stListenSocket.Close();
delete m_stDeliverNodeBuf.GetAt(i);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -