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

📄 handlemsg.h

📁 液晶电视完整代码可实现人机界面
💻 H
字号:
#ifndef  _HANDLEMSG_H_
#define  _HANDLEMSG_H_

#include "xmlparser.h"
#include "errcode.h"	
#include "pub_func.h"

#define FUNCS int_dynfunclist.funclist

void GetErrMsg(int , char *);


struct DynFunc // 注册函数表
{			 
	char func_name[FUNCNAMESIZE + 1];    //  函数名 
	char func_type;  		     // 函数类型:1-动态加载 2-静态加载 3-数据库类静态加载 
	int (*func_addr)();                  // 函数地址 
	int parano;                          // 函数参数个数 
};

class DynFuncList
{
public:
	DynFuncList()
	{
		funclist = NULL;
		funcno = 0;
		sizeoflist = 0;
	};

	~DynFuncList()
	{
		delete []funclist;
	};

	BOOL AddFunc(struct DynFunc dynfunc);
	BOOL AddFunc(char *funcname, char functype, int (*funcaddr)(), int parano);
	int FuncPos(char *funcname);

	struct DynFunc *funclist;
	int funcno;
	int sizeoflist;
};


class HandleData
{
public:
	HandleData() //构造函数
	{
		interparser = 0;		// 内部格式及数据流

		logmode = LOGERROR;		// 缺省只记录错误
		strcpy(logfile, M_LOGFILE_NAME);
		strcpy( rootcode, "0000" );	// 初始交易码 
		db_proc = 0;	 		// 数据库指针 
		indataptr = 0;
		input = 0;
		inputlen = 0;
		outdatalen = 0;			// 输出流当前长度
		output = 0;
		outputsize = 0;			// 输出流最大长度

		memset( errmsg, 0, MSGLEN + 1);	// 格式转换失败原因
		errno = 0;
	};
	~HandleData()//析构函数
	{
		if ( parser )
		{
			delete parser;
		}
		if ( interparser )
		{
			delete interparser;
		}
	};
	// 设置解析报文环境,包括,初始处理码,数据库指针,功能函数表
	int SetEnv(char *transcode, char *XMLConfigFileName,const DynFuncList &dynfunclist);
	
	void Rootcode( char *txcode );

	// 设置记录日志的方式、日志文件名
	void SetLog(int LogMode, char *logname="handlemsg.log"){
		logmode = LogMode;
		strcpy( logfile, logname );
	}
	
	// 报文处理解析, 返回: 0 成功  1 失败,此时可调用 ErrMsg() 获得失败原因
	int Process( char *in_data, int in_data_len, char *out_data, int &out_data_len );
	// int Process(char *XMLConfigFileName,  char *in_data, int in_data_len, char *out_data, int &out_data_len );
	
	void PrintIntStr( );
	int  GetErrno(){ return errno; }

private:
	char rootcode[TXCODELEN + 1];  	// 初始交易码 
	void *db_proc;			// 数据库指针 
	DynFuncList int_dynfunclist;
	CXMLParser *parser;		// 格式流;
	CXMLParser *interparser;	// 内部格式及数据流;
	int  indataptr;
	char *input;
	int  inputlen;
	int  outdatalen;		// 输出流当前长度
	char *output;
	int  outputsize;		// 输出流最大长度
	int  errno;
	char errmsg[MSGLEN + 1];	// 格式转换失败原因
	int  logmode;
	char logfile[FILEPATHLEN + 1];
	int  status;

	// 解析报文, 失败抛出异常
	void UnpacketData( );
		
	// 判断组类型,调用相应的解包函数
	void UnPackGroupData( char *deli_type, CXMLParser *format , char *inter_node );

	// 定长格式解包函数(格式信息,内部流当前节点)解包失败抛出异常
	void UnPackFixedData( CXMLParser *format, char *inter_node );
	
	// 分割符型解包函数(格式信息,内部流当前节点)解包失败抛出异常
	void UnPackDeliData( CXMLParser *format, char *inter_node, int DeliPos=M_NO_POS_VALUE, char *DeliAscs=NULL );
	
	// 标识型解包函数(格式信息,内部流当前节点)解包失败抛出异常
	void UnPackTagData(CXMLParser *format, char *inter_node, int Tag_Pos=M_NO_POS_VALUE, char *pszDeliChars=NULL);

	// 解定长格式ITEM(格式信息,内部流当前节点)解包失败抛出异常
	void UnPackFixedItem( CXMLParser *format, char *inter_node, int iSeqNo);
	
	// 解分割符型ITEM(格式信息,内部流当前节点,分割符)解包失败抛出异常
	void UnPackDeliItem( CXMLParser *format, char *inter_node, int deli_pos, char *deli_ascs, int iSeqNo);

	// 解标识型ITEM(格式信息,内部流当前节点,TAG 位置)解包失败抛出异常
	void UnPackTagItem(CXMLParser *format, char *inter_node, int iTagPos, char *pszDeliChars, int iSeqNo);


	// 生成报文, 失败抛出异常
	void PacketData( );
	
	// 判断组类型,调用相应的打包函数
	void PackGroupData( char *deli_type, CXMLParser *format , char *referstr );
	
	// 定长格式打包函数(格式串,节点路径)解包失败抛出异常
	void PackFixedData( CXMLParser *format, char *referstr );
	
	// 分割符型打包函数(格式串,节点路径)解包失败抛出异常
	void PackDeliData( CXMLParser *format, char *referstr, int DeliPos=M_NO_POS_VALUE, char DeliAsc=NOASC  );
	
	// 标识型打包函数(格式串,节点路径)解包失败抛出异常
	void PackTagData( CXMLParser *format, char *referstr);

	// 生成定长型ITEM信息(格式串,节点路径)
	void PackFixedItem( CXMLParser *format, char *referstr, int iSeqNo);

	// 生成分割符型ITEM信息(格式串,节点路径,分割类型,分割符)
	void PackDeliItem( CXMLParser *format , char *referstr, int iSeqNo );

	// 生成标识型ITEM信息(格式串,节点路径,TAG 位置)
	void PackTagItem( CXMLParser *format , char *referstr, int iTagPos, int iSeqNo);
	
	//格式或内容检查处理函数,输入函数名+(+参数+)、输入字符串、长度,输出串及长度
	int RunFunc( char *func, char *input, int &len, char *output );
	
	// 域处理函数,输入函数, 域值, 输出处理后的域值
	void ContentFunc( char *func, char *input, char *output );

	// 内容检查函数,输入函数串, 检查发现错误时抛出异常。
	void CheckFunc( char *func );

	// 格式预处理,输出下一处理码
	void PreFunc( char *pre_func, char *transcode );

	// 格式后处理,使用输出流为缺省输入
	void PostFunc( char *post_func );

	// 根据refer从内部数据流取数据
	BOOL GetSelfData( char *refer, char *value );
	BOOL GetSelfData( char refer[][NODELEN + 1], char *value );

	// 构造函数调用参数,参数可以为内部流数据
	void GetPara( char *func_para, int *argc, char argv[][M_MAX_PARA_LEN] );
	// 向输出流输出字符,成功返回0,超过输出缓冲返回 -1
	int Output( char asc )
	{
		if ( outdatalen < outputsize - 1 )
		{
			output[outdatalen++] = asc;
			output[outdatalen] = 0;
			return 0;
		}
		return -1;
	}

	// 向输出流输出字符串,成功返回0,超过输出缓冲返回 -1
	int Output( char *str, int len )
	{
		if ( outdatalen < outputsize - len )
		{
			memcpy( output + outdatalen, str, len );
			outdatalen += len;
			output[outdatalen] = 0;
			return 0;
		}
		return -1;
	}
	
	// 记录日志
	void Log( int grade, char *prompt, char *msg=NULL, int errcode=0 )
	{
		try
		{
			if ( grade >= LOGERROR && grade <= logmode )
			{
				ofstream tfile( logfile , ios::app );	
				if ( msg )
				       tfile<<prompt<<"["<<msg<<"]"<< endl << endl;
				else
					tfile << prompt <<  endl;
			}
		}
		catch( ... )
		{
			cout << "Can't log infomation!"  <<  endl;
		}
	}

};
#endif

⌨️ 快捷键说明

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