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