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

📄 cmagt.cpp

📁 李刚 请赶快放开我的权限 我上载的源码都是很精湛的,请查阅,qing请加我 li_xue_ming@msn.com必要的话可以和我在线沟通
💻 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接口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 + -