handlemsg.cpp
来自「液晶电视完整代码可实现人机界面」· C++ 代码 · 共 2,266 行 · 第 1/4 页
CPP
2,266 行
printf("[%s - %d]\n", __FILE__, __LINE__); } } else { for (char *ptmp = buf; ptmp != NULL; ) { ch = (char)atoi(ptmp); if ( NoIn(strDeliChars, ch) ) { strDeliChars[strlen(strDeliChars)] = ch; strDeliChars[strlen(strDeliChars) + 1] = 0; } // 定位下一个分割符 ptmp = (char *)strstr(ptmp, ","); if ( ptmp ) ptmp++; } } printf("[%s - %d]Delimiter char: [%s]\n", __FILE__, __LINE__, strDeliChars);/***** // 输入指针指向输入包,若分割类型为"前"则移动指针到数据 if ( iTagPos == M_POS_FRONT_VALUE ) indataptr ++;*****/ // 取循环次数 Ret = format->GetTagAttri( XML_GROUP_ROWS , buf ); if ( Ret ) iRepeat = 1; else { if ( SelfData(buf) ) { Ret = interparser->GetValuesByFullName( buf, tmpstr ); if ( Ret ) { sprintf( tmpstr, "value %s : not found!", buf ); ThrowMsgException( GENERR , tmpstr ); } iRepeat = atoi( tmpstr ); } else iRepeat = atoi( buf ); } // 根据循环次数依次处理 for ( int loop=0; loop<iRepeat; loop++ ) { memset( fmt_currnode , 0 , NODELEN + 1 ); // ==================================================== // GetChildNode(fmt_currnode); // // 1. 将当前节点指针保存到父节点数组中 // 2. 取出当前节点的子节点的名字(不包括字符 '<'), // 保存在 fmt_currnode 中 // 3. 当前指针(m_currstream) 指向找到的子节点 (包括字符 '<') // ==================================================== Ret = format->GetChildNode( fmt_currnode ); while( Ret == 0 ) { // 域 if( strncmp( fmt_currnode , ITEM , sizeof(ITEM) ) == 0 ) { // Modified by HCH -- 2002.04.08 // UnPackTagItem(format, inter_node, iTagPos, strDeliChars) ; UnPackTagItem(format, inter_node, iTagPos, strDeliChars, loop) ; // 将当前节点指针指向父节点 interparser->GetParentNode(); } // 组 或 组合域 else if( strncmp( fmt_currnode , GROUP , sizeof(GROUP) ) == 0 ) { memset( node_name , 0 , NODELEN + 1 ); format->GetTagAttri( XML_F_NAME , node_name ); if (loop != 0) { sprintf(node_name, "%s%d", node_name, loop); } Log( LOGSTEP, "---group ", node_name ) ; if ( interparser->AddChildNode( inter_node , node_name ) ){ sprintf( tmpstr, "Add internal node failed: %s", node_name ); ThrowMsgException( GENERR , tmpstr ); } // =========================================== // Save pointer of indata iOldPtr = indataptr; memset(strTagName, 0, sizeof(strTagName)); // Get TAG name of the subgroup if ( format->GetTagAttri(M_XML_TAG_NAME, strTagName) ) { sprintf(tmpstr, " Search %s's tag name failed!", node_name ); ThrowMsgException(GENERR , tmpstr ); } Log(LOGSTEP, "\t---TAG name of group: ", strTagName) ; // Move pointer of indata p = SearchCNAPSTag(input + indataptr, strTagName); if (p != NULL) indataptr = p - input; else { sprintf(tmpstr, "Search %s's tag[%s] error!", node_name, buf); ThrowMsgException(GENERR , tmpstr ); } sprintf(tmpstr, "[%s - %d] indataptr is: [%d]", __FILE__, __LINE__, indataptr); Log(LOGSTEP, "LENGTH: ", tmpstr); // =========================================== // 取 group 的分隔类型 if ( format->GetTagAttri( M_XML_DELIMITER_TYPE , buf ) == 0 ) UnPackGroupData( buf, format, node_name ); else UnPackTagData(format, node_name, iTagPos, strDeliChars); //Log(LOGSTEP, "Group end: ", interparser->XMLToString() ); // Added by HCH -- 2002.04.05 // Restore indata pointer //indataptr = iOldPtr; interparser->GetParentNode(); } // 格式或内容检查函数 else if( strncmp( fmt_currnode , XML_CHECK , sizeof(XML_CHECK) ) == 0 ) { char func[M_MAX_ITEMCONTENT_LEN + 1]; if ( !format->GetTagAttri( XML_FUNC , func ) ) CheckFunc( func ); } else { Log( LOGPROMPT, "---无效的节点:", fmt_currnode ) ; } memset( rightnode , 0 , NODELEN + 1 ); Ret = format->GetRightNode( fmt_currnode , rightnode ); memset( fmt_currnode , 0 , NODELEN + 1); strcpy( fmt_currnode , rightnode ); } Log(LOGSTEP, "NOTE: ", "Process TAG group for a time end!"); format->GetParentNode(); sprintf(tmpstr, "[%s - %d] indataptr is: [%d]", __FILE__, __LINE__, indataptr); Log(LOGSTEP, "LENGTH: ", tmpstr); } Log(LOGSTEP, "NOTE: ", "Process TAG group end!");}// Modified by HCH -- 2002.04.08// void HandleData::UnPackTagItem(CXMLParser *format, char *inter_node, int iTagPos, char *pszDeliChars)void HandleData::UnPackTagItem(CXMLParser *format, char *inter_node, int iTagPos, char *pszDeliChars, int iSeqNo){ int len=0; char node_name[NODELEN + 1]; char isneeded[NODELEN + 1]; char buf[M_MAX_ITEMCONTENT_LEN + 1]; char func[M_MAX_ITEMCONTENT_LEN + 1]; char tmpstr[MSGLEN + 1]; char Tmpbuf[MSGLEN + 1]; char strTagName[M_MAX_ITEMCONTENT_LEN + 1]; char *p; int iNeedFlag; memset( node_name , 0 , NODELEN ); memset( Tmpbuf , 0 , sizeof( Tmpbuf )); // Get item name if ( format->GetTagAttri( XML_F_NAME , node_name ) ){ sprintf( tmpstr, " Find item name failed!" ); ThrowMsgException( GENERR , tmpstr ); } Log( LOGSTEP, "---item ", node_name ) ; iNeedFlag = 0; format->GetTagAttri(XML_ITEM_NEED, isneeded ); if ( strncmp(isneeded, NECESSARY, sizeof(NECESSARY) ) == 0 ) iNeedFlag = 1; memset(strTagName, 0, sizeof(strTagName)); // Get TAG name if ( format->GetTagAttri(M_XML_TAG_NAME, strTagName) ) { if (iNeedFlag) { sprintf(tmpstr, " Search %s's tag name failed!", node_name); ThrowMsgException( GENERR , tmpstr ); } else { Log(LOGSTEP, "\t---TAG: ", strTagName) ; return; } } // 在输入流中定位 TAG p = SearchCNAPSTag( input + indataptr, strTagName ); if (p == NULL) { sprintf(tmpstr, " Search %s's tag[%s] failed!", node_name, strTagName); if (iNeedFlag) ThrowMsgException(GENERR, tmpstr); } // 取TAG对应的数据内容 memset(buf, 0, sizeof(buf)); len = 0; while (*p != '\0' && NoIn(pszDeliChars, *p) && len < M_MAX_ITEMCONTENT_LEN) { buf[len++] = *p; p++; } sprintf( Tmpbuf ,"[%s]==[%s]" , strTagName , buf ); Log( LOGSTEP, "TAG content: ", Tmpbuf) ; if ( !format->GetTagAttri( XML_FUNC , func ) ) { ContentFunc( func, buf, buf ); } // Added by HCH -- 2002.04.08 if (iSeqNo != 0) { sprintf(node_name, "%s%d", node_name, iSeqNo); } if ( interparser->AddChildNode( inter_node, node_name ) ) { sprintf( tmpstr, "Add internal node failed : %s", node_name ); ThrowMsgException( GENERR , tmpstr); } // 将 Values 插入 当前指针(m_currstream) 指向的串中 // 第一个 '>'字符之后. if ( interparser->AddValuesByTag( node_name , buf ) ) { sprintf( tmpstr, "Add internal node value failed : %s", node_name ); ThrowMsgException( GENERR , tmpstr); }}void HandleData::PacketData( ){ char transcode[NODELEN + 1]; char buf[M_TMPBUF_LEN + 1]; memset( transcode , 0 , NODELEN + 1 ); memcpy( transcode, rootcode, NODELEN + 1 ); printf("[%s - %d]transcode: [%s] \n", __FILE__, __LINE__, transcode); // 在配置文件中定位交易码所在位置; // ============================================================== // 1. 获取整个 XML 格式串的根节点的名字(不包括字符 '<'), // 保存在 buf 中。 // 2. 当前指针(m_currstream) 指向根节点(包括字符 '<') // ============================================================== if ( parser->GetRootNode( buf ) ) { ThrowMsgException( GENERR , "Can't locate root node !" ); printf("[%s - %d]GetRootNode() 获得根节点的名字: [%s] \n", __FILE__, __LINE__, buf); } // ============================================================== // 1. 根据三个输入参数定位 XML 格式串, // 2. 当前指针(m_currstream) 指向找到的节点 (包括字符 '<') // ============================================================== if ( parser->Locate( "transaction", "code", transcode ) ) { sprintf(buf, "Can't locate pack-root transcode[%s] !" , transcode ); ThrowMsgException( GENERR , buf ); } // 存在预处理属性, 则根据预处理返回的处理码重新定位 // ============================================================== // 1. 根据输入参数 TagName 定位 XML 格式串, // 2. 当前指针(m_currstream) 指向找到的节点 (包括字符 '<') // ============================================================== if ( parser->Locate( RESPONSE ) ) ThrowMsgException( GENERR , "Can't locate pack-root RESPONSE !" ); // ============================================================== // 从当前指针(m_currstream)指向的 XML 格式串中 // 获取 TAG(TagName)中的属性 AttriName 的属性值, // 保存到 AttriValues 中 // ============================================================== if ( parser->GetTagAttri( PRE_FUNC , buf ) == 0 ) { // 获得下一处理码, 保存在 transcode 中 PreFunc( buf, transcode ) ; if ( parser->GetRootNode( buf ) ) ThrowMsgException( GENERR , "Can't locate root node !" ); printf("[%s - %d]Root node: [%s] \n", __FILE__, __LINE__, buf); printf("[%s - %d]Transcode: [%s] \n", __FILE__, __LINE__, transcode); if ( parser->Locate( "transaction", "code", transcode ) ) { sprintf(buf, "Can't locate pack transcode[%s] !" , transcode ); ThrowMsgException( GENERR , buf ); } if ( parser->Locate( RESPONSE ) ) ThrowMsgException( GENERR , "Can't locate pack-root RESPONSE !" ); } if ( parser->GetTagAttri( M_XML_DELIMITER_TYPE , buf ) ) { ThrowMsgException( GENERR , "Can't find response's delimiter_type !" ); } PackGroupData( buf, parser, XML_INTROOT ); // ========================================================= // The following lines were added by HCH on 2002.03.28 // 应该重新从根节点开始查找 if ( parser->GetRootNode( buf ) ) ThrowMsgException( GENERR , "Can't locate root node !" ); printf("[%s - %d]Root node: [%s] \n", __FILE__, __LINE__, buf); printf("[%s - %d]Root Transcode: [%s] \n", __FILE__, __LINE__, rootcode); if ( parser->Locate("transaction", "code", rootcode) ) ThrowMsgException( GENERR , "Can't locate pack-root transcode !" ); printf("[%s - %d]格式后处理之前, output: [%s] \n", __FILE__, __LINE__, output); if ( !parser->Locate( POST_FUNC ) ) { if ( parser->GetTagAttri( XML_FUNC , buf ) == 0 ) { printf("[%s - %d]执行格式后处理函数: [%s] \n", __FILE__, __LINE__, buf); // 执行格式后处理函数 PostFunc( buf ); printf("[%s - %d]格式后处理之后, output: [%s] \n", __FILE__, __LINE__, output); } else { printf("[%s - %d]取格式后处理函数失败 \n", __FILE__, __LINE__); } } else { printf("[%s - %d]不存在格式后处理函数 \n", __FILE__, __LINE__); }}void HandleData::PackGroupData( char *deli_type, CXMLParser *format , char *referstr ){ if ( strncmp( deli_type, FIXED, sizeof(FIXED) ) == 0 ) PackFixedData( format, referstr ); else if ( strncmp( deli_type, DELI, sizeof(DELI) ) == 0 ) PackDeliData( format, referstr ); else if ( strncmp( deli_type, TAG, sizeof(TAG) ) == 0 ) { // Added by HCH -- 2002.04.01 PackTagData( format, referstr ); } else { char tmpstr[M_TMPBUF_LEN + 1]; sprintf( tmpstr, "Unknown deli_type: %s", deli_type ); ThrowMsgException( GENERR , tmpstr ); }}void HandleData::PackFixedData( CXMLParser *format , char *referstr ){ char node_name[NODELEN + 1]; char rightnode[NODELEN + 1]; char fmt_currnode[NODELEN + 1]; int Ret = 0; char buf[M_TMPBUF_LEN + 1]; int iRepeat= 0; char refer[(MAXDEPTH) * (NODELEN + 1) + 1]; strcpy( refer, referstr ); memset( node_name , 0 , NODELEN + 1 ); // Get item name Ret = format->GetTagAttri( XML_F_NAME , node_name ); if ( !Ret ){ // 注:根节点没有名字 Log( LOGSTEP, "---group ", node_name ) ; strcat( refer, "." ); strcat( refer, node_name ); } // 取重复次数 Ret = format->GetTagAttri( XML_GROUP_ROWS , buf ); if ( Ret ) iRepeat = 1; else { if ( SelfData( buf ) ) { char value[M_TMPBUF_LEN + 1]; if ( GetSelfData( buf, value ) ) { iRepeat = atoi( value ); } } else { iRepeat = atoi( buf ); } } for ( int loop=0; loop<iRepeat; loop++ ) { memset( fmt_currnode , 0 , NODELEN + 1 ); // ==================================================== // GetChildNode(fmt_currnode); // // 1. 将当前节点指针保存到父节点数组中 // 2. 取出当前节点的子节点的名字(不包括字符 '<'), // 保存在 fmt_currnode 中 // 3. 当前指针(m_currstream) 指向找到的子节点 (包括字符 '<') // ==================================================== Ret = format->GetChildNode( fmt_currnode ); while( Ret == 0 ) { // 域 if( strncmp( fmt_currnode , ITEM , sizeof(ITEM) ) == 0 ) { // Modified by HCH -- 2002.04.08 // PackFixedItem( format , refer ) ; PackFixedItem( format , refer, loop) ; } // 组 或 组合域 else if( strncmp( fmt_currnode , GROUP , sizeof(GROUP) ) == 0 ) { // 若存在其他类型则调用同一打包函数 if ( format->GetTagAttri( M_XML_DELIMITER_TYPE , buf ) == 0 ) PackGroupData( buf, format, refer ); else PackFixedData( format, refer ); Log( LOGSTEP, "---the output at the end of group ", output ) ; } // 格式或内容检查函数 else if( strncmp( fmt_currnode , XML_CHECK , sizeof(XML_CHECK) ) == 0 ) { char func[M_MAX_ITEMCONTENT_LEN + 1]; if ( !format->GetTagAttri( XML_FUNC , func ) ) { Log(LOGSTEP, "Now execute check function ", func); CheckFunc( func ); } } else { Log( LOGPROMPT, "---无效的节点:", fmt_currnode ) ; } memset( rightnode , 0 , NODELEN + 1 ); // ================================================= // 1. 获取当前指针(m_currstream)指向的串中 // 节点 node 的右兄弟节点的名字(不包括 '<'字符), // 保存到 rightnode 中 // 2. 当前节点指针(m_currstream)指向找到的右兄弟节点 // (包括 '<'字符) // ================================================= Ret = format->GetRightNode( fmt_currnode , rightnode ); memset( fmt_currnode , 0 , NODELEN + 1); strcpy( fmt_currnode , rightnode ); } format->GetParentNode(); }}// Modified by HCH -- 2002.04.08// void HandleData::PackFixedItem( CXMLParser *format , char *referstr )void HandleData::PackFixedItem( CXMLParser *format , char *referstr, int iSeqNo){ int len=0; int outputResult; char node_name[NODELEN + 1]; char isneeded[NODELEN + 1]; char buf[M_MAX_ITEMCONTENT_LEN + 1]; char func[M_MAX_ITEMCONTENT_LEN + 1]; char tmpstr[MSGLEN + 1]; char value[M_MAX_ITEMCONTENT_LEN + 1]; char refer[(MAXDEPTH) * (NODELEN + 1) + 1]; // Get item name if ( format->GetTagAttri( XML_F_NAME , node_name ) ){ sprintf( tmpstr, " Find item name failed!" ); ThrowMsgException( GENERR , tmpstr ); } if (iSeqNo != 0) sprintf( refer, "%s.%s%d.", referstr, node_name, iSeqNo); else sprintf( refer, "%s.%s.", referstr, node_name ); Log( LOGSTEP, "---item ", refer ) ; // Get item length if ( format->GetTagAttri( XML_ITEM_LENGTH , buf ) ) { sprintf( tmpstr, "item %s : Find fixed-item length failed!", node_name ); ThrowMsgException( GENERR , tmpstr ); } len = atoi( buf ); if ( len > M_MAX_ITEMCONTENT_LEN ) { Log(LOGPROMPT, "Data too large, cut it:", node_name ); len = M_MAX_ITEMCONTENT_LEN; } if ( format->GetTagAttri( XML_ITEM_VALUE , buf ) ) { // 无value说明,需要引用内部数据流数据 if(len==0) { GetSelfData( refer, value );//得到417报文CLX标记后的内容 } else if ( GetSelfData( refer, value ) ){ memcpy( buf, value, M_MAX_ITEMCONTENT_LEN ); } else { sprintf( tmpstr, "[%s -- %d]item %s : Can't get internal data!", __FILE__, __LINE__, node_name ); ThrowMsgException( GENERR , tmpstr ); } } else { if ( SelfData( buf ) ) { // 指明引用内部数据流数据 if ( GetSelfData( buf, value ) ) { memcpy( buf, value, M_MAX_ITEMCONTENT_LEN ); } else { sprintf( tmpstr, "[%s -- %d]item %s : Can't get internal data!", __FILE__, __LINE__, node_name ); ThrowMsgException( GENERR , tmpstr ); } } } // value 指出的普通ascii字符串直接引用 format->GetTagAttri( XML_ITEM_NEED , isneeded );
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?