?? cmagt.cpp
字號:
#include <string.h>
#include "afsmbase.h"
#include "sys.h"
#include "omcevent.h"
#include "cmevent.h"
#include "p_oplog.h"
#include "fmessage.h"
/*====================================================================
函數名 CountStrNum
功能 :計算出字符串內子字符串的個數
算法實現 :(可選項)
引用全局變量:
輸入參數說明:要計算的字符串
返回值說明:子字符串的個數
====================================================================*/
WORD16 CountStrNum(PCHAR str,CHAR chDiv)
{
WORD16 wCount=0;
WORD16 i=0;
//預處理字符串,刪除字符串兩邊的空格。
str = Trim(str);
while(str[i]!='\0')
{
if(str[i]==chDiv)
wCount++;
i++;
}
if(strlen(str)==0)
return 0;
else
return ++wCount;
}
/*====================================================================
函數名 GetStrByIndex
功能 :獲取子字符串
算法實現 :(可選項)
引用全局變量:
輸入參數說明:子字符串位置、要計算的字符串、分隔符
返回值說明:子字符串
====================================================================*/
LPSTR GetStrByIndex(WORD16 wPos, LPSTR str, CHAR chDiv)
{
WORD16 wIndex;
WORD16 subPos=0;
for(wIndex = 0; wIndex < wPos-1; wIndex++, str++)
{
while((*str != chDiv) && (*str != '\0'))
str++;
if(*str == '\0')
break;
}
if(*str != '\0')
{
while((str[subPos]!=chDiv) && (str[subPos] != 0))
subPos++;
str[subPos]='\0';
}
return str;
}
/*====================================================================
函數名 : ParseFBody
功能 :解析命令行參數
算法實現 :(可選項)
引用全局變量:
輸入參數說明:
返回值說明 :TRUE/FALSE
====================================================================*/
BOOL ParseFBody(LPSTR strSource,LPSTR strAname,LPSTR strApara)
{
BOOL bResult = TRUE;
LPSTR lpTemp,pchDest;
WORD16 wCount;
WORD16 wLoop;
WORD16 wStrLen;
wCount = CountStrNum(strSource,',');
CHAR sTempBuf[300];
strcpy(sTempBuf,strSource);
for(wLoop = 1;wLoop <= wCount;wLoop++)
{
pchDest=GetStrByIndex(wLoop,strSource,',');
if(strstr(StrUpper(pchDest),(LPSTR)"ANAME=") != NULL)
{
//處理ANAME(應用進程名字)
lpTemp = strpbrk(pchDest,(LPSTR)"=");
++lpTemp;++lpTemp;
strcpy(strAname,lpTemp);
wStrLen=strlen(strAname);
strAname[wStrLen-1]=NULL;
}
else if(strstr(StrUpper(pchDest),(LPSTR)"APARA=") != NULL)
{
//處理APARA(應用進程命令行參數)
lpTemp = strpbrk(pchDest,(LPSTR)"=");
strcpy(strApara,(++lpTemp));
//當參數值為"NULL",表明行參數為空(NULL)
if(0 == strcmp(strApara,"NULL"))
{
strApara[0] = NULL;
}
else
{
strcpy(strApara,(++lpTemp));
wStrLen=strlen(strApara);
strApara[wStrLen-1]=NULL;
}
}
else
{
//出錯信息
PrintMsg((LPSTR)"CMAGT: F Body in F Message Attribute Error!\n");
return FALSE;
}
strcpy(strSource,sTempBuf);
}
return bResult;
}
VOID GetUpdateRecord(LPBYTE lpFHead,
LPCSTR lpszInfo,
BOOL bSucceed,
TLogUpdateRecord &tLogUpdateRecord)
{
//recordid
CHAR LogRecordNo[F_RECORDID_LEN+1];
memcpy( LogRecordNo,
lpFHead + F_RECORDID_OFFSET,
F_RECORDID_LEN*sizeof(BYTE));
LogRecordNo[F_RECORDID_LEN] = '\0';
sscanf( LogRecordNo, (PCHAR)"%x", &tLogUpdateRecord.sdwRecordID );
//EndTime
tLogUpdateRecord.sdwEndTime = time(NULL);
//DetailInfo
if ( strlen( lpszInfo ) < MAX_LOGRECORD_DETAIL_LEN + 1 )
strcpy( tLogUpdateRecord.achDetailInfo, lpszInfo );
//Succeed
tLogUpdateRecord.bSucceed = bSucceed;
}
class CCmAgt : public COperationLogFSM
{
public:
CCmAgt();
VOID onFsmStart(LPBYTE lpIn,LPBYTE lpOut,LPBYTE lpData);
BOOL WriteUpdateLog(LPBYTE lpFHead,LPCSTR lpszInfo, BOOL bSucceed);
};
BOOL CCmAgt::WriteUpdateLog( LPBYTE lpFHead,LPCSTR lpszInfo, BOOL bSucceed)
{
TLogUpdateRecord tLogUpdateRecord;
GetUpdateRecord(lpFHead, lpszInfo, bSucceed, tLogUpdateRecord);
BOOL bRet = UpdateLogRecord(&tLogUpdateRecord);
if (! bRet )
{
Trace(1, (PCHAR)"UpdateLogRecord Error!");
}
return bRet;
}
CCmAgt::CCmAgt()
{
BEGIN_FSM_MAP()
BEGIN_FSM_STATE( STA_IDLE )
EVENT_MAP(EV_FSM_START,onFsmStart,STA_IDLE)
END_FSM_STATE()
END_FSM_MAP()
}
VOID CCmAgt::onFsmStart(LPBYTE lpIn,LPBYTE lpOut,LPBYTE lpData)
{
//定義F接口使用的變量
CFMessage cFMessage,cFAckMessage; //全部F接口消息內容存放
CHAR achAName[FBODY_ATTR_LENGTH]; //存放F消息體ANAME值
CHAR achAPara[FBODY_ATTR_LENGTH]; //存放F消息體APARA值
//其它變量定義
CHAR achMMIAck[BRDCAST_LENGTH];
CHAR achFBody[FBODY_LENGTH];
//操作日志的標識
BOOL bRecordLog = TRUE;
/**********************************************************************************/
WORD32 dwExitCode=255;
memset(achFBody,0x00,FBODY_LENGTH*sizeof(CHAR));
memset(achMMIAck,0x00,BRDCAST_LENGTH*sizeof(CHAR));
//獲取F接口消息
PCHAR pchFMessage = GetUserCmdLine();
if(pchFMessage == NULL)
{
PrintMsg((PCHAR)"CMAGT: Cannot direct startup,only for debug mode!\n");
PrintMsg((PCHAR)"Useage: cmagt F-Messag \n");
PrintMsg((PCHAR)"Sample: cmagt 00de0200CAGTCAGT001F00050000000000000000000000000000000000000000:ANAME=\"cmgetdb\",APARA=\"-all\"; \n");
FsmExit(0);
}
PrintMsg((PCHAR)"GetUserCmdLine:\n%s\n",pchFMessage);
//賦值給CFMessage實例進行處理
cFMessage = pchFMessage;
//打印此F接口消息
cFMessage.Print();
/*
CHAR pchFMessage[300];
strcpy(pchFMessage,
"00de0200CAGTCAGT001F00050000000000000000000000000000000000000000:ANAME=\"cmgetdb\",APARA=\"-all\";");
*/
//獲取F接口消息體內容
WORD32 dwLength=cFMessage.GetBodyLength();
//pchFBody = new CHAR[dwLength-2];
memcpy(achFBody,&pchFMessage[F_MESS_HEADER_LENGTH+1],
(dwLength-1)*sizeof(CHAR));
achFBody[dwLength-2] = NULL;
PrintMsg((PCHAR)"Trim Head and Tail one element string:\n");
PrintMsg((PCHAR)"%s\n\n",achFBody);
if(0 == strcmp(StrUpper(cFMessage.GetTransCommCode()),(PCHAR)"CAGT"))
{
PrintMsg((PCHAR)"Start Run CM Application...\n");
//獲取屬性對應的屬性值(ANAME,APARA)
if(TRUE == ParseFBody(achFBody,achAName,achAPara))
{
PrintMsg((PCHAR)"ANAME = %s,APARA = %s\n",achAName,achAPara);
//啟動相應的CM應用進程
if( FAILURE == PsCreate_Wait(achAName,achAPara,&dwExitCode) )
{
PrintMsg((PCHAR)"cmagt: Error!!! Can not create or wait for %s!\n",achAName);
bRecordLog = FALSE;
}
}
else
{
//F接口消息體中的屬性錯誤,FSM退出
PrintMsg((PCHAR)"cmagt: Error!!! F Message Body is not Correct!\n");
bRecordLog = FALSE;
}
}
else
{
//F接口消息頭中的轉義碼錯誤,FSM退出
PrintMsg((PCHAR)"cmagt: Error!!! F Head in F Message TransCmdCode Error!\n" );
bRecordLog = FALSE;
}
PrintMsg((PCHAR)"cmagt: ExitCode = %d\n",dwExitCode);
//發(fā)送F接口MMI應答消息給客戶端
strcpy(achMMIAck,(PCHAR)cFMessage.GetHead());
//設置消息體內容
strcat(achMMIAck,IntToHexString(dwExitCode,sizeof(WORD32)));
cFAckMessage = achMMIAck;
cFAckMessage.SetBroad(FALSE);
cFAckMessage.Print();
PrintMsg((PCHAR)"F ACK Message:%s\n",(PCHAR)cFAckMessage.GetMessage());
PrintMsg((PCHAR)"Message No: %d\n",EV_CMD_CMAGT);
FsmASend(EV_CMD_CMAGT,cFAckMessage.GetMessage(),cFAckMessage.GetLength()+1,(PCHAR)"SSF");
FsmDelay(100);
WriteUpdateLog(cFMessage.GetHead(),"配置代理進程啟動服務",bRecordLog);
FsmExit(0);
}
SWORD32 AppFsmStart()
{
FID tFid;
CCmAgt *pcSpawn = new CCmAgt;
pcSpawn->FsmCreate(&tFid);
pcSpawn->FsmRegister();
return SUCCESS;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -