handlemsg.cpp
来自「液晶电视完整代码可实现人机界面」· C++ 代码 · 共 2,266 行 · 第 1/4 页
CPP
2,266 行
ThrowMsgException( GENERR , "Can't find request delimite_type !" ); } UnPackGroupData( buf, parser, XML_INTROOT );}void HandleData::UnPackGroupData( char *deli_type, CXMLParser *format , char *inter_node ){ if ( strncmp( deli_type, FIXED, sizeof(FIXED) ) == 0 ) { UnPackFixedData( format, inter_node ); } else if ( strncmp( deli_type, DELI, sizeof(DELI) ) == 0 ) { UnPackDeliData( format, inter_node ); } else if (strncmp(deli_type, TAG, sizeof(TAG)) == 0) { /* Added by HCH -- 2002.04.01 */ UnPackTagData(format, inter_node); } else { char tmpstr[M_TMPBUF_LEN + 1]; sprintf( tmpstr, "Unknown deli_type: %s", deli_type ); ThrowMsgException( GENERR , tmpstr ); }}void HandleData::UnPackFixedData( CXMLParser *format, char *inter_node ){ char node_name[NODELEN + 1]; char rightnode[NODELEN + 1]; char fmt_currnode[NODELEN + 1]; int Ret = 0; char ciRepeat[M_TMPBUF_LEN + 1]; char buf[M_TMPBUF_LEN + 1]; char tmpstr[M_TMPBUF_LEN + 1]; int iRepeat= 0; Ret = format->GetTagAttri( XML_GROUP_ROWS , ciRepeat ); if ( Ret ) iRepeat = 1; else { if ( SelfData(ciRepeat) ) { Ret = interparser->GetValuesByFullName( ciRepeat, tmpstr ); if ( Ret ) { sprintf( tmpstr, "value %s : not found!", ciRepeat ); ThrowMsgException( GENERR , tmpstr ); } iRepeat = atoi( tmpstr ); } else iRepeat = atoi( ciRepeat ); } 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 // UnPackFixedItem(format, inter_node); UnPackFixedItem(format, inter_node, loop) ; // 将当前节点指针指向父节点 interparser->GetParentNode(); } // 组 或 组合域 else if( strncmp( fmt_currnode , GROUP , sizeof(GROUP) ) == 0 ) { memset( node_name , 0 , NODELEN + 1 ); // Get group name format->GetTagAttri( XML_F_NAME , node_name ); Log( LOGSTEP, "---group ", node_name ) ; // Added by HCH -- 2002.04.08 if (loop != 0) { sprintf(node_name, "%s%d", node_name, loop); } if ( interparser->AddChildNode( inter_node , node_name ) ) { sprintf( tmpstr, "Add internal node failed: %s", node_name ); ThrowMsgException( GENERR , tmpstr ); } // 取 group 的分隔类型 if ( format->GetTagAttri( M_XML_DELIMITER_TYPE , buf ) == 0 ) { UnPackGroupData( buf, format, node_name ); } else { UnPackFixedData( format, node_name ); } //Log(LOGSTEP, "Group end: ", interparser->XMLToString() ); 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 ); // ================================================= // 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::UnPackFixedItem( CXMLParser *format, char *inter_node )void HandleData::UnPackFixedItem(CXMLParser *format, char *inter_node, 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]; memset( node_name , 0 , NODELEN ); // 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 ) ; // 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 ) { len = M_MAX_ITEMCONTENT_LEN; } if ( indataptr + len > inputlen ) { memset( isneeded , 0 , 30 ); // 取 "强制/可选" 说明 format->GetTagAttri( XML_ITEM_NEED , isneeded ); if ( strncmp(isneeded, NECESSARY, sizeof(NECESSARY) ) ) { len = inputlen - indataptr; } else { // 必须有足够长度 sprintf( tmpstr, "item %s : not enough!", node_name ); ThrowMsgException( GENERR , tmpstr ); } } if ( len > M_MAX_ITEMCONTENT_LEN ) { memcpy( buf, input+indataptr, M_MAX_ITEMCONTENT_LEN ); buf[M_MAX_ITEMCONTENT_LEN] = 0; } else { memcpy( buf, input+indataptr, len ); buf[len] = 0; } indataptr += len; sprintf(tmpstr, "[%s - %d] indataptr is: [%d]", __FILE__, __LINE__, indataptr); Log(LOGSTEP, "LENGTH: ", tmpstr); 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::UnPackDeliData( CXMLParser *format, char *inter_node, int DeliPos, char *DeliAscs ){ char node_name[NODELEN + 1]; char rightnode[NODELEN + 1]; char fmt_currnode[NODELEN + 1]; int Ret = 0; char deli_asc; char deli_ascs[DELIASCSNO + 1]; char buf[M_TMPBUF_LEN + 1]; char tmpstr[M_TMPBUF_LEN + 1]; int deli_pos= 0; int iRepeat= 0; // 取分割类型(1-前/0-后) Ret = format->GetTagAttri( M_XML_DELIMITER_POS , buf ); if ( Ret ) { if ( DeliPos == M_NO_POS_VALUE ) ThrowMsgException( GENERR , "Without delimiter position!" ); else deli_pos = DeliPos; } else { if ( strncmp ( buf, XML_FRONT, sizeof(XML_FRONT) ) == 0 ) { deli_pos = M_POS_FRONT_VALUE; } else if ( strncmp ( buf, XML_BACK, sizeof(XML_BACK) ) == 0 ) { deli_pos = M_POS_BACK_VALUE; } else { ThrowMsgException( GENERR , "Unknown delimiter position!" ); } } memset( deli_ascs, 0, DELIASCSNO+1 ); if ( DeliAscs ) sprintf( deli_ascs, "%s", DeliAscs ); // 取分割符并转换为字符 // 取分割符的 ASCII 码 Ret = format->GetTagAttri( M_XML_DELIMITER_ASC , buf ); if ( Ret ) { if ( !deli_ascs ) ThrowMsgException( GENERR , "Without delimiter !" ); } else { for (char *ptmp = buf; ptmp != NULL; ) { deli_asc = (char)atoi( ptmp ); if ( NoIn( deli_ascs, deli_asc ) ) { deli_ascs[strlen(deli_ascs)] = deli_asc; deli_ascs[strlen(deli_ascs) + 1] = 0; } // 定位下一个分割符 ptmp = (char *)strstr(ptmp, ","); if ( ptmp ) ptmp++; } // end of for } // 输入指针指向输入包,若分割类型为"前"则移动指针到数据 if ( deli_pos == 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 // UnPackDeliItem( format, inter_node, deli_pos, deli_ascs ) ; UnPackDeliItem( format, inter_node, deli_pos, deli_ascs, 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 ); // Added by HCH -- 2002.04.08 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 ); } // 取 group 的分隔类型 if ( format->GetTagAttri( M_XML_DELIMITER_TYPE , buf ) == 0 ) UnPackGroupData( buf, format, node_name ); else UnPackDeliData( format, node_name, deli_pos, deli_ascs ); //Log(LOGSTEP, "Group end: ", interparser->XMLToString() ); interparser->GetParentNode(); // 若分割类型为"后"则移动指针到数据 if ( deli_pos == M_POS_BACK_VALUE ) indataptr ++; } // 格式或内容检查函数 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 ); } format->GetParentNode(); }}// Modified by HCH -- 2002.04.08// void HandleData::UnPackDeliItem( CXMLParser *format, char *inter_node, int deli_pos, char *deli_ascs )void HandleData::UnPackDeliItem( CXMLParser *format, char *inter_node, int deli_pos, char *deli_ascs, 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]; memset( node_name , 0 , NODELEN ); // 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 ) ; // 若分割类型为"前"则移动指针到数据 if ( deli_pos == M_POS_FRONT_VALUE ) indataptr ++; // 找下一个分隔符 for ( len = 0; indataptr + len < inputlen && NoIn(deli_ascs, input[indataptr + len] ); len++ ); if ( NoIn(deli_ascs, input[indataptr + len] ) ) { ThrowMsgException( GENERR , "Input data error: without delimiter!" ); } if ( len > M_MAX_ITEMCONTENT_LEN ) { memcpy( buf, input+indataptr, M_MAX_ITEMCONTENT_LEN ); buf[M_MAX_ITEMCONTENT_LEN] = 0; } else { memcpy( buf, input+indataptr, len ); buf[len] = 0; } indataptr += len; // 若分割类型为"后"则移动指针到数据 if ( deli_pos == M_POS_BACK_VALUE ) indataptr ++; format->GetTagAttri( XML_ITEM_NEED , isneeded ); if ( strncmp(isneeded, NECESSARY, sizeof(NECESSARY) ) == 0 ) { // 必须有数据 if ( len == 0 ) { sprintf( tmpstr, "item %s : No input!", node_name ); ThrowMsgException( GENERR , tmpstr ); } } 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); }}//========================================================================/*********************************************************************** * * * Author: HCH * Date: 2002.04.01 * ***********************************************************************/void HandleData::UnPackTagData(CXMLParser *format, char *inter_node, int Tag_Pos, char *pszDeliChars){ char node_name[NODELEN + 1]; char rightnode[NODELEN + 1]; char fmt_currnode[NODELEN + 1]; int Ret = 0; char buf[M_TMPBUF_LEN + 1]; char tmpstr[M_TMPBUF_LEN + 1]; int iTagPos = 0; int iRepeat= 0; char strDeliChars[DELIASCSNO + 1]; char ch; char *p; // Added by HCH -- 2002.04.05 int iOldPtr; char strTagName[M_MAX_TAGNAME_LEN + 1]; // 取 TAG 的位置(1-前/0-后) Ret = format->GetTagAttri(M_XML_TAG_POS, buf); if ( Ret ) { if ( Tag_Pos == M_NO_POS_VALUE ) { // 第一次调用(与 "request" 同行) ; // ThrowMsgException( GENERR , "Without tag position!" ); } else iTagPos = Tag_Pos; } else { if ( strncmp(buf, XML_FRONT, sizeof(XML_FRONT) ) == 0 ) iTagPos = M_POS_FRONT_VALUE; else if ( strncmp ( buf, XML_BACK, sizeof(XML_BACK) ) == 0 ) iTagPos = M_POS_BACK_VALUE; else ThrowMsgException( GENERR , "Unknown tag position!" ); } printf("[%s - %d]Tag pos: [%d]\n", __FILE__, __LINE__, iTagPos); memset(strDeliChars, 0, sizeof(strDeliChars)); if (pszDeliChars) sprintf(strDeliChars, "%s", pszDeliChars); // 取分割符的 ASCII 码 Ret = format->GetTagAttri(M_XML_DELIMITER_ASC , buf); if ( Ret ) { if (!pszDeliChars ) { // 第一次调用(与 "request" 同行) ;
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?