handlemsg.cpp

来自「液晶电视完整代码可实现人机界面」· C++ 代码 · 共 2,266 行 · 第 1/4 页

CPP
2,266
字号
//------------------------------------------------------------------- //文件名:HandleMsg.cpp//描  述:报文转换//------------------------------------------------------------------- #include "handlemsg.h"typedef struct _ST_ERR_CODE {	int  iErrCode;	char strErrMsg[80];} ST_ERR_CODE;ST_ERR_CODE  ErrorCode[]={	{ERR_SYSTEM,		"System Error"},	{ERR_DB_OPER, 		"Database operation error"},	{ERR_NOTFOUND,		"Record not found"}, 	{ERR_FUNC_NOTLOAD,	"Function not loaded"},	{CFG_FILE_ERROR,	"配置文件错"},	{PARSER_ERROR,		"格式转换失败"},	{SEND_MBFE_ERROR,	"发送MBFE失败"},	{FILE_OPEN_ERROR,	"文件打开错"},	{FILE_OPRT_ERROR,	"文件操作错或内容错误 "},	{ERR_PARAM,		"参数错误 "},	{NET_CONN_ERROR,	"网络连接错误 "},	{NET_SEND_ERROR,	"网络发送错误 "},	{NET_RECV_ERROR,	"网络接收错误 "},	{ERR_NOT_DIRECT_TRANS,  "非直联交易"},	{ERR_KEYI_CZ,           "可疑重账"},	{ERR_DUI_ZHANG,		"对帐"},	{ERR_GET_COMMSEQNO,	"取报文标识号错误"},	{ERR_GET_MSGREFNO,	"取报文参考号错误"},	{9999,			"Unknow Error"}};BOOL DynFuncList::AddFunc(struct DynFunc dynfunc){	if ( funcno >= sizeoflist ){		struct DynFunc *funclist1 = new DynFunc[sizeoflist + 20];		if ( funclist1 == NULL )			return FALSE;				for ( int i=0; i<sizeoflist; i++ ){			memcpy( funclist1[i].func_name , funclist[i].func_name, FUNCNAMESIZE + 1 );			funclist1[i].func_type = funclist[i].func_type;			funclist1[i].func_addr = funclist[i].func_addr;			funclist1[i].parano = funclist[i].parano;		}		if ( funclist )			delete funclist;		funclist = funclist1;		sizeoflist += 20;	}	memcpy( funclist[funcno].func_name ,dynfunc.func_name, FUNCNAMESIZE + 1);	funclist[funcno].func_type = dynfunc.func_type;	funclist[funcno].func_addr = dynfunc.func_addr;	funclist[funcno].parano = dynfunc.parano;	funcno++;	return TRUE;}BOOL DynFuncList::AddFunc(char *funcname, char functype, int (*funcaddr)(), int parano){	if ( funcno >= sizeoflist ){		struct DynFunc *funclist1 = new DynFunc[sizeoflist + 20];		if ( funclist1 == NULL )		{			printf("funclist1 is NULL\n");			return FALSE;		}		for ( int i=0; i<sizeoflist; i++ ){			memcpy( funclist1[i].func_name , funclist[i].func_name, FUNCNAMESIZE + 1 );			funclist1[i].func_type = funclist[i].func_type;			funclist1[i].func_addr = funclist[i].func_addr;			funclist1[i].parano = funclist[i].parano;		}		if ( funclist )			delete funclist;		funclist = funclist1;		sizeoflist += 20;	}	memset( funclist[funcno].func_name, 0, FUNCNAMESIZE );	strncpy( funclist[funcno].func_name ,funcname, FUNCNAMESIZE + 1);	funclist[funcno].func_type = functype;	funclist[funcno].func_addr = funcaddr;	funclist[funcno].parano = parano;	funcno++;	return TRUE;}int DynFuncList::FuncPos(char *funcname){	char *ptr = strstr(funcname, "(");	char buf[FUNCNAMESIZE+1];	memset(buf, 0, FUNCNAMESIZE);	if ( ptr != NULL && ptr-funcname <= FUNCNAMESIZE ){		memcpy( buf, funcname, ptr-funcname );		buf[ptr-funcname] = 0;	} else		return -1;	for ( int i=0; i<funcno; i++ ){		if ( memcmp(funclist[i].func_name ,buf, FUNCNAMESIZE ) == 0 )			return i;	}	return -1;}	void HandleData::PrintIntStr( ){	cout << interparser->XMLToString() << endl;}void HandleData::GetPara( char *func_para, int *argc, char argv[][M_MAX_PARA_LEN] ){	char *ptr = strstr(func_para, "(");	char buf[M_MAX_PARA_LEN + 1];	char value[M_MAX_ITEMCONTENT_LEN + 1];	int i;	// Log(LOGSTEP, "[In GetPara()], ptr: ",  ptr) ;	*argc = 0;	while ( ptr )	{		for ( i=0; i< M_MAX_PARA_LEN && ptr[i] && ptr[i] != ',' && ptr[i] != ')'; i++ )		{			buf[i] = ptr[i];		}		buf[i] = 0;		TrimDeli( buf );			// 删除空格等分割符		if ( strlen(buf) )		{			if ( SelfData( buf ) ) // 需要从内部流取数据			{						GetSelfData( buf, value );				memset( buf, 0, M_MAX_PARA_LEN+1 );				memcpy( buf, value, M_MAX_PARA_LEN );			}			strcpy( argv[(*argc)++], buf );		} 				if ( ptr[i] == ',' )		{	// 存在下一参数			ptr += i;					ptr++;		} else			ptr = 0;	}}// 从内部流中获取数据BOOL HandleData::GetSelfData( char *refer, char *value ){	if ( interparser->GetValuesByFullName( refer, value ) )	{		return FALSE;	}	else	{		return TRUE;	}}void HandleData::Rootcode( char *txcode ){	memcpy(rootcode, txcode, TXCODELEN);  // 交易码 	rootcode[TXCODELEN] = 0;}int HandleData::SetEnv( char *txcode, char *XMLConfigFileName, const DynFuncList &dynfunclist){	if( strlen(txcode) >= TXCODELEN)		memcpy(rootcode, txcode, TXCODELEN);  // 交易码 	else		strcpy( rootcode , txcode );	rootcode[TXCODELEN] = 0;		try 	{		parser = new CXMLParser;		// 格式流		parser->InitConfig(XMLConfigFileName);	// 加载配置文件		for ( int i=0; i < dynfunclist.funcno; i++ )		{			int_dynfunclist.AddFunc( dynfunclist.funclist[i] );		// 注册功能函数列表		}	}	catch ( ... )	{		printf("Set xml_env failed!\n");		return -1;	}	return 0;}int HandleData::RunFunc( char *func, char *input, int &len, char *output ){	int position = int_dynfunclist.FuncPos( func );     // 确定动态函数位置	if ( position < 0 ) 	// 无此函数注册	{		Log( LOGERROR, "No pre_func:", func );		return(ERR_FUNC_NOTLOAD);	}	Log( LOGSTEP, "[In RunFunc()] Run function:", func );	int fargc = FUNCS[position].parano;	char fargv[M_MAX_PARA_NUM][M_MAX_PARA_LEN] ;	int tmplen = inputlen;	int ret = 0;	GetPara( func, &fargc, fargv );	for (int i=0; i<fargc; i++)	{		Log( LOGSTEP, "[In RunFunc()]Parameter: ", fargv[i]);	}	if ( FUNCS[position].func_type == M_DBFUNC )	{		int (*dbfuncp)(void *,int,char[M_MAX_PARA_NUM][M_MAX_PARA_LEN],char *,int *,char *);		dbfuncp = (int (*)(void *,int,char[M_MAX_PARA_NUM][M_MAX_PARA_LEN],char *,int *,char *))FUNCS[position].func_addr;		if ( dbfuncp )		{			ret = dbfuncp( db_proc, fargc, fargv, input, &tmplen, output );		}		else		{			ret = ERR_SYSTEM;		}	} 	else 	{		int (*funcp)(int,char[M_MAX_PARA_NUM][M_MAX_PARA_LEN],char *,int *,char *);		funcp = (int (*)(int,char[M_MAX_PARA_NUM][M_MAX_PARA_LEN],char *,int *,char *))FUNCS[position].func_addr;		if ( funcp )		{			ret = funcp( fargc, fargv, input, &tmplen, output );		}		else		{			ret = ERR_SYSTEM;		}	}		if ( !ret )	{		// 执行动态处理函数成功		Log(LOGSTEP, "[In RunFunc()] Function's output", output);		len = tmplen;		// return 0;		return M_SUCCESS;	}	// Modified by HCH -- 2002.03.25	// return 2;			// 执行动态处理函数失败	else 	{		printf("[%s - %d]RunFunc() [%s] return: [%d] \n", __FILE__, __LINE__, func, ret);		Log(LOGSTEP, "[In RunFunc()] Run function fail", "return");		errno = ret;		return(ret);	}}// 域处理函数,输入函数、域值, 输出处理后的域值void HandleData::ContentFunc( char *func, char *input, char *output ){	char outvalue[M_MAX_OUTPUT_LEN + 1];	int len = sizeof(input);	char strErrMsg[M_MAX_ERRMSG_LEN + 1];	memset( outvalue , 0 , sizeof( outvalue));	printf("[%s  %d]Function [%s]'s input[%s] \n", __FILE__, __LINE__, func, input);	int Ret = RunFunc( func, input, len, outvalue ) ;	printf("[%s - %d]RunFunc() return code: [%d]\n", __FILE__, __LINE__, Ret);	if (Ret != 0)	{		GetErrMsg(Ret, strErrMsg);		printf("[%s - %d]:Run function failed: [%s]\n", __FILE__, __LINE__, strErrMsg);		if (Ret < 0)			printf("Ret=[%d] strErrMsg=[%s]\n",Ret,strErrMsg);		else 		{			// Don't throw exception if Ret > 0			;		}	}	// 输出处理后的域值	if (len < M_MAX_OUTPUT_LEN ){		memcpy(output, outvalue, len);		output[len] = 0;		printf("[%s  %d]Function [%s]'s output[%s] \n", __FILE__, __LINE__, func, output);	}}// 内容检查函数,输入函数串, 检查发现错误时抛出异常。void HandleData::CheckFunc( char *func ){	char errout[M_MAX_OUTPUT_LEN + 1];	int len = sizeof(input);	char strErrMsg[M_MAX_ERRMSG_LEN + 1];	memset(strErrMsg, 0, sizeof(strErrMsg));	Log(LOGSTEP, "Now in check function: ", func);	int ret = RunFunc( func, errout, len, errout ) ;	char strTemp[80];	sprintf(strTemp, "[%s - %d]RunFunc() [%s] return code: [%d]\n", __FILE__, __LINE__, func, ret);	Log(LOGSTEP, "[In Check function]", strTemp);	if (ret != 0)	{		GetErrMsg(ret, strErrMsg);		printf("[%s - %d]:Run function failed: [%s]\n", __FILE__, __LINE__, strErrMsg);		if (ret < 0)		{			ThrowMsgException(ret, strErrMsg);		}		else 		{			// Don't throw exception if ret > 0			;		}	}}// 格式预处理,输出下一处理码void HandleData::PreFunc( char *pre_func, char *transcode ){	char output[M_MAX_OUTPUT_LEN + 1];			// 临时存放处理码, 防止输出值太长	int len = inputlen;	char strErrMsg[M_MAX_ERRMSG_LEN + 1];		int ret = RunFunc( pre_func, input, len, output );	printf("[%s - %d]RunFunc() [%s] return code: [%d]\n", __FILE__, __LINE__, pre_func, ret);	if (ret != 0)	{		GetErrMsg(ret, strErrMsg);		printf("[%s - %d]:Run function failed: [%s]\n", __FILE__, __LINE__, strErrMsg);		if (ret < 0)			ThrowMsgException(ret, strErrMsg);		else 		{			// Don't throw exception if ret > 0			;		}	}	// 执行动态预处理函数成功,生成下一处理码	memcpy(transcode, output, TXCODELEN);	transcode[TXCODELEN] = 0;}// 格式后处理,使用输出流为缺省输入void HandleData::PostFunc( char *post_func ){	char buf[M_MAX_OUTPUT_LEN + 1];			// 格式后处理的输出值	int len = outdatalen;	char strErrMsg[M_MAX_ERRMSG_LEN + 1];		printf("[%s - %d]执行后处理函数: [%s] \n", __FILE__, __LINE__, post_func);	int ret = RunFunc( post_func, output, len, buf );	printf("[%s - %d]RunFunc() [%s] return code: [%d]\n", __FILE__, __LINE__, post_func, ret);	if (ret != 0)	{		GetErrMsg(ret, strErrMsg);		printf("[%s - %d]:Run function failed: [%s]\n", __FILE__, __LINE__, strErrMsg);		if (ret < 0)			ThrowMsgException(ret, strErrMsg);		else 		{			// Don't throw exception if ret > 0			;		}	}}int HandleData::Process( char *in_data, int in_data_len, char *out_data, int &out_data_len ){	input = in_data;	printf("Process inputlen = [%d][%d]\n", in_data_len,inputlen);	inputlen = in_data_len;	output = out_data;	indataptr = 0;	outdatalen = 0;	outputsize = out_data_len;	errno=0;		char	childnode[NODELEN + 1];	char	rightnode[NODELEN + 1];	char	dynlibpath[FILEPATHLEN + 1];	// Added by HCH -- 2002.03.20	void *fptr, *func;	int (*funcp)();	int iOrgFuncNo; 	Log(LOGSTEP, "Input data:", in_data );	// Added by HCH -- 2002.03.20	iOrgFuncNo = int_dynfunclist.funcno;	try	{		status = 0;		if ( parser )			parser->reset();		else			ThrowMsgException( GENERR , "No parser tool !" );		if ( interparser )			delete interparser;		interparser = new CXMLParser;		interparser->InitXMLStream();		// 生成输出流父节点;		interparser->AddRootNode( XML_INTROOT , 0 );		// 注册动态函数		if ( parser->GetRootNode( childnode ) )			ThrowMsgException( GENERR , "Can't locate root node !" );		int ret = parser->Locate( FUNC_LIST );		if ( ret == 0 )		{			parser->GetTagAttri(DYNAMIC_FILE, dynlibpath );			ret = parser->GetChildNode( childnode );			char item_name[80];			char item_values[20];			while ( ret == 0 )			{				if ( !ret )					ret = parser->GetTagAttri( XML_F_NAME , item_name );				if ( !ret )					ret = parser->GetTagAttri( "para_num" , item_values );				// Modified by HCH -- 2002.03.20				// int_dynfunclist.AddFunc(item_name,	'2', test11, atoi(item_values) );				// ============== BEGIN ======================				fptr = dlopen( dynlibpath, RTLD_NOW );				if ( fptr )				{					func = dlsym( fptr, item_name );					if ( func )					{						funcp = (int(*)())func;						int_dynfunclist.AddFunc(item_name,	'2', funcp, atoi(item_values) );					}					else 					{						Log( LOGPROMPT, "Get item name error !", item_name);					}				}				else				{					printf( "Load dll %s error: %s\n" ,dynlibpath, dlerror());				}				// ============== END ======================				ret = parser->GetRightNode( childnode, rightnode );			}		}		// 如果存在解包定义则进行解包		Log( LOGSTEP, "Unpacket beginning ...");		UnpacketData( );		Log(LOGSTEP, "解包结果: ", interparser->XMLToString() );		// 如果存在打包定义则进行打包		Log( LOGSTEP, "Packet beginning ...");				PacketData( );		Log( LOGSTEP, "Packet end ");	}	catch( CommException &e )	{		strcpy(errmsg, e.m_strErrText );		Log( LOGERROR, e.m_strErrText );		status = -1;	}	catch( ... )	{		printf("------Catch Exception!------\n");		status = -1;	}		// 释放动态加载的函数,并关闭动态库	out_data_len = outdatalen;	// Added by HCH -- 2002.03.20	if ( fptr )	{		int_dynfunclist.funcno = iOrgFuncNo;		dlclose( fptr );	}	return status;}void HandleData::UnpacketData( ){	char	transcode[NODELEN + 1];	char    buf[M_TMPBUF_LEN + 1];	char	 strErrMsg[M_MAX_ERRMSG_LEN + 1];	memset( transcode , 0 , NODELEN + 1 );	memcpy( transcode, rootcode, NODELEN + 1 );	// 在配置文件中定位交易码所在位置;	if ( parser->GetRootNode( buf ) )		ThrowMsgException( GENERR , "Can't locate root node !" );	if ( parser->Locate( "transaction", "code", transcode ) )	{		sprintf(strErrMsg, "Can't locate unpack-root transcode[%s] !" , transcode );		ThrowMsgException( GENERR , strErrMsg );	}	printf("[%s - %d]transcode: [%s] \n", __FILE__, __LINE__, transcode);	if ( parser->Locate( REQUEST ) )		ThrowMsgException( GENERR , "Can't locate unpack-root REQUEST !" );	//	存在预处理属性, 则根据预处理返回的处理码重新定位	if ( parser->GetTagAttri( PRE_FUNC , buf ) == 0 )	{		// 执行动态预处理函数"buf", 并获得下一处理码"transcode"		PreFunc( buf, transcode ) ;			if ( parser->GetRootNode( buf ) )		{			ThrowMsgException( GENERR , "Can't locate root node !" );		}		printf("[%s - %d]transcode: [%s] \n", __FILE__, __LINE__, transcode);		if ( parser->Locate( "transaction", "code", transcode ) )		{			sprintf(strErrMsg, "Can't locate unpack transcode[%s] !" , transcode );			ThrowMsgException( GENERR , strErrMsg );		}		if ( parser->Locate( REQUEST ) )		{			ThrowMsgException( GENERR , "Can't locate unpack-root REQUEST !" );		}	}	if ( parser->GetTagAttri( M_XML_DELIMITER_TYPE , buf ) )	{

⌨️ 快捷键说明

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