📄 handlemsg.h
字号:
#ifndef _HANDLEMSG_H_#define _HANDLEMSG_H_#include "xmlparser.h"#include "errcode.h" #include "pub_func.h"#define FUNCS int_dynfunclist.funclistvoid 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 + -