📄 handlemsg.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 + -