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 + -
显示快捷键?