/***********************************************************************
		module		:	[8583协议]
		function		:	[把buf中数据按定义好的格式解包到ISO_MSG变量m中]
  		return			:	[-1:异常
								其他:buf的长度]
		comment	:	[全局普通函数]
		machine		:	[无]
		language	:	[CHN]
 		keyword		:	[内部有MALLOC操作,用完需要函数iso8583_free进行释放]
		date			:	[11/08/10]
 		author		:	[chen-zhengkai]
************************************************************************/
int iso8583_unpack(ISO_MSG *m, const char *buf)
{
	const char* start = buf;
	int flds, i;
	char fmt[8];
	memset(fmt, 0, sizeof(fmt));

	//0域的操作
	if (m->fld[0].buf != NULL || s_isodef[0].fmt != FMT_FIXED) {	//异常处理
		MY_TRACE("flds = %d", 0);
		return -1;
	}
	m->fld[0].len = s_isodef[0].len;
	memset(m->fld[0].buf, 0x00, NUM);
	if (s_iCompress) {
		buf += BCD2ASC((char*)m->fld[0].buf, (unsigned char*)buf, m->fld[0].len, s_isodef[0].fmt);
	}
	else {
		memcpy(m->fld[0].buf, buf, m->fld[0].len);
		buf += m->fld[0].len;
	}

	//操作1域,位图域
#if ISO_FLDS==128
	if(buf[0] & 0x80) {		//128位版
		flds = 128;
	} 
	else {
		flds = 64;
	}
#else
	if( buf[0] & 0x80 ) {	//128位版
		MY_TRACE("flds = %d", 1);
		return -1;
	}
	flds = 64;
#endif
	m->fld[1].len = flds/8;		//64位8字节,128位16字节
	memset(m->fld[1].buf, 0x00, NUM);
	memcpy(m->fld[1].buf, buf, m->fld[1].len);
	buf += m->fld[1].len;	//偏移
	//2--64(128)域操作
	for (i = 2; i <= flds; i++) {
		if (BITGET(m->fld[1].buf, i)) {	//第i字段不为零
			//长度处理
			if ( s_isodef[i].fmt) {	//不定长
				if ( s_iCompress ) {	//需解压
					buf += BCD2INT(&(m->fld[i].len), (unsigned char*)buf, s_isodef[i].fmt, 0);
				}
				else {
					sprintf(fmt, "%%0%dd", s_isodef[i].fmt);		//格式化成 %0?d
					sscanf(buf, fmt, &(m->fld[i].len));		//把buf内容格式化成整数存入len
					buf += s_isodef[i].fmt;	//偏移
				}
				if (m->fld[i].len > s_isodef[i].len) {	//异常处理
					MY_TRACE("flds = %d", i);
					return -1;
				}
			}
			else {	//定长
				m->fld[i].len = s_isodef[i].len;
			}
			//内容处理
			memset(m->fld[i].buf, 0x00, NUM);
			switch (s_isodef[i].typ) {
				case TYP_BCD:
					if (s_iCompress) {
						buf += BCD2ASC((char*)m->fld[i].buf, (unsigned char*)buf, m->fld[i].len, s_isodef[i].fmt); 
						break;
					}
				case TYP_ASC:
				case TYP_BIN:
					memcpy(m->fld[i].buf, buf, m->fld[i].len);
					buf += m->fld[i].len;
					break;
				default:
					MY_TRACE("flds = %d", i);
					return -1;
			}
		}
	}
	return (buf-start);	//返回长度
}
/***********************************************************************
		module		:	[8583协议]
		function		:	[把ISO_MSG变量m中数据按定义好的格式组包到buf中]
  		return			:	[-1:异常
								其他:buf的长度]
		comment	:	[全局普通函数]
		machine		:	[无]
		language	:	[CHN]
 		keyword		:	[buf格式:0字段--1位图字段--(2-128)中有数据的字段......]
		date			:	[11/08/10]
 		author		:	[chen-zhengkai]
************************************************************************/
int iso8583_pack(const ISO_MSG *m, char *buf)
{
	char *start = buf;
	int flds, i;
	char fmt[8] = {0};
	char tmp[8] = {0};

	//0域操作
	if (m->fld[0].len != s_isodef[0].len || s_isodef[0].fmt != FMT_FIXED) {
		MY_TRACE("flds = %d", 0);
		return -1;
	}

	if (s_iCompress) {	//是否压缩数据,asc2bcd
		buf += ASC2BCD((unsigned char*)buf, (char*)m->fld[0].buf, s_isodef[0].len, s_isodef[0].fmt);
	}
	else {
		memcpy(buf, m->fld[0].buf, s_isodef[0].len);		//0字段(消息类型)操作
		buf += s_isodef[0].len;
	}

	//(1域)位图域操作
	if (m->fld[1].buf == NULL || s_isodef[1].len != 16) {
		MY_TRACE("flds = %d", 1);
		return -1;
	}
#if ISO_FLDS==128
	if ((m->fld[1].len == s_isodef[1].len) && (m->fld[1].buf[0] & 0x80)) {
		memcpy(buf, m->fld[1].buf, s_isodef[0].len);
		buf += s_isodef[1].len;
		flds = 128;
	}
	else {
		if ((m->fld[1].len == 8) && !(m->fld[1].buf[0] & 0x80)) {
			memcpy(buf, m->fld[1].buf, 8);
			buf += 8;
			flds = 64;
		}
		else {
			MY_TRACE("flds = %d", 1);
			return -1;
		}
	}
#else
	if ((m->fld[1].len != 8) || (m->fld[1].buf[0] & 0x80)) {	//不是64位版则返回
		MY_TRACE("flds = %d", 1);
		return -1;
	}
	memcpy(buf, m->fld[1].buf, m->fld[1].len);	//位图字段操作
	buf += m->fld[1].len;
	flds = 64;
#endif
	for (i = 2; i <= flds; i++) {
		if (BITGET(m->fld[1].buf, i)) {	//第i字段不为零
			if (m->fld[i].buf == NULL || m->fld[i].len <= 0 || m->fld[i].len > s_isodef[i].len) {	//异常情况
				MY_TRACE("flds = %d", i);
				return -1;
			}
			if (s_isodef[i].fmt) {  //不定长
				if (s_iCompress) {	//需要压缩
					sprintf(fmt, "%%0%dd", s_isodef[i].fmt);		//格式化成 %0?d
					sprintf(tmp, fmt, m->fld[i].len);		//最终格式化,  tmp里面存的是长度
					buf += ASC2BCD((unsigned char*)buf, tmp, s_isodef[i].fmt, 0);		//把长度转BCD压缩
				}
				else {	//无需压缩
					sprintf(fmt, "%%0%dd", s_isodef[i].fmt);	//格式化成 %0?d
					sprintf(buf, fmt, m->fld[i].len);	//最终格式化,  tmp里面存的是长度
					buf += s_isodef[i].fmt;		//把长度存入BUFF
				}
			}
			switch (s_isodef[i].typ) {	//确认类型,BCD,ASC,BIN
				case TYP_BCD:
					if (s_iCompress) {		//需要压缩
						buf += ASC2BCD((unsigned char*)buf, (char*)m->fld[i].buf, m->fld[i].len, s_isodef[i].fmt);
						break;
					}
				case TYP_ASC:
				case TYP_BIN:
					memcpy(buf, m->fld[i].buf, m->fld[i].len);
					buf += m->fld[i].len;
					break;
				default:
					MY_TRACE("flds = %d", i);
					return -1;
					break;
			}
		}
	}
	return (buf-start);		//返回总的buf长度
}
Exemple #3
0
/*
 * Using the definition d, unpack the content of buf into the ISO 
 * message struct m.
 * Returns 0. FIXME: Should be something different.
 */
int iso8583_unpack(ISO_MSG *m, const char *buf)
{
 const char *start = buf;
 int flds, i;
    char fmt[8];

 memset(fmt, 0, sizeof(fmt));

 /* Field 0 is mandatory and fixed length. */
 if (m->fld[0].buf != NULL || s_isodef[0].fmt != FMT_FIXED) {
  MY_TRACE("flds = %d", 0);
  return -1;
 }

 m->fld[0].len = s_isodef[0].len;
 m->fld[0].buf = (unsigned char *) malloc((m->fld[0].len) * sizeof(char));
 if(s_iCompress)
 {
  buf += BCD2ASC((char*)m->fld[0].buf,(const unsigned char*) buf, m->fld[0].len, s_isodef[0].fmt);
 }
 else
 {
  memcpy(m->fld[0].buf, buf, m->fld[0].len);
  buf += m->fld[0].len;
 }


 /*
  * First bit in the bitmap (field 1) defines if the message is 
  * extended or not.
  * 0: not exteded - i.e. only (some of) the fields 0 to 64 are 
  *    used
  * 1: extended - i.e. (some of) the fields 0 to 128 are used
  * I.e. if one or more of the fields 65 to 128 is used, the 
  * bit is 1.
  */
#if ISO_FLDS==128
 if(buf[0] & 0x80) {
  flds = 128;
 } else {
  flds = 64;
 }
#else /*ISO_FLDS==128*/
 if(buf[0] & 0x80) {
  MY_TRACE("flds = %d", 1);
  return -1;
 }
 flds = 64;
#endif /*ISO_FLDS==128*/

 m->fld[1].len = flds/8;
 m->fld[1].buf = (unsigned char *) calloc((m->fld[1].len), sizeof(char));
 memcpy(m->fld[1].buf, buf, m->fld[1].len);
 buf += m->fld[1].len;

 for (i = 2; i <= flds; i++) 
 {
  if (MY_BITGET(m->fld[1].buf, i)) 
  { /* i'th bit != 0 */
   if ( s_isodef[i].fmt)
   { /* Variable length */
    if(s_iCompress) 
    {
     buf += BCD2INT(&(m->fld[i].len),(const unsigned char*) buf, s_isodef[i].fmt, 0);
    }
    else
    {
     sprintf(fmt, "%%0%dd", s_isodef[i].fmt);
     sscanf(buf, fmt, &(m->fld[i].len));
     buf += s_isodef[i].fmt;     
    }    

    if (m->fld[i].len > s_isodef[i].len) {
     MY_TRACE("flds = %d", i);
     return -1;
    }
   }
   else
   {
    m->fld[i].len = s_isodef[i].len;
   }

   m->fld[i].buf = (unsigned char *) malloc((m->fld[i].len) * sizeof(char));
   
   switch (s_isodef[i].typ) {
   case TYP_BCD: /* Fallthrough */
    if(s_iCompress)
    {
     buf += BCD2ASC((char*)m->fld[i].buf,(const unsigned char*) buf, m->fld[i].len, s_isodef[i].fmt); 
     break;
    }
   case TYP_ASC:
   case TYP_BIN:
    memcpy(m->fld[i].buf, buf, m->fld[i].len);
    buf += m->fld[i].len;
    break;
   default:
    MY_TRACE("flds = %d", i);
    return -1;
    break;
   }
  }
 }

 return (buf-start);
}
/*============================================================================
 * method which implements the Read service.
 *===========================================================================*/
OpcUa_StatusCode my_Read(
							OpcUa_Endpoint             a_hEndpoint,
							OpcUa_Handle               a_hContext,
							const OpcUa_RequestHeader* a_pRequestHeader,
							OpcUa_Double               a_nMaxAge,
							OpcUa_TimestampsToReturn   a_eTimestampsToReturn,
							OpcUa_Int32                a_nNoOfNodesToRead,
							const OpcUa_ReadValueId*   a_pNodesToRead,
							OpcUa_ResponseHeader*      a_pResponseHeader,
							OpcUa_Int32*               a_pNoOfResults,
							OpcUa_DataValue**          a_pResults,
							OpcUa_Int32*               a_pNoOfDiagnosticInfos,
							OpcUa_DiagnosticInfo**     a_pDiagnosticInfos)
{
	OpcUa_Int i,n;
	OpcUa_Void* p_Node;
	extern OpcUa_UInt32		securechannelId;
	extern OpcUa_UInt32		session_flag;
	extern OpcUa_Double		msec_counter;
	extern OpcUa_String*	p_user_name;

    OpcUa_InitializeStatus(OpcUa_Module_Server, "OpcUa_ServerApi_Read");

    /* validate arguments. */
    OpcUa_ReturnErrorIfArgumentNull(a_hEndpoint);
    OpcUa_ReturnErrorIfArgumentNull(a_hContext);
    OpcUa_ReturnErrorIfArgumentNull(a_pRequestHeader);
    OpcUa_ReferenceParameter(a_nMaxAge);
    OpcUa_ReferenceParameter(a_eTimestampsToReturn);
    OpcUa_ReturnErrorIfArrayArgumentNull(a_nNoOfNodesToRead, a_pNodesToRead);
    OpcUa_ReturnErrorIfArgumentNull(a_pResponseHeader);
    OpcUa_ReturnErrorIfArrayArgumentNull(a_pNoOfResults, a_pResults);
    OpcUa_ReturnErrorIfArrayArgumentNull(a_pNoOfDiagnosticInfos, a_pDiagnosticInfos);

	*a_pNoOfDiagnosticInfos=0;
	*a_pDiagnosticInfos=OpcUa_Null;

	RESET_SESSION_COUNTER

 #ifndef NO_DEBUGING_
	MY_TRACE("\n\n\nRREADSERVICE==============================================\n");
	if(p_user_name!=OpcUa_Null)
		MY_TRACE("\nUser:%s\n",OpcUa_String_GetRawString(p_user_name)); 
#endif /*_DEBUGING_*/
  

	if(OpcUa_IsBad(session_flag))
	{
		//teile client mit , dass Session geschlossen ist
#ifndef NO_DEBUGING_
		MY_TRACE("\nSession nicht aktiv\n"); 
#endif /*_DEBUGING_*/
		uStatus=OpcUa_BadSessionNotActivated;
		OpcUa_GotoError;
	}

	
	uStatus=check_authentication_token(a_pRequestHeader);
	if(OpcUa_IsBad(uStatus))
	{
#ifndef NO_DEBUGING_
		MY_TRACE("\nAuthentication Token ungültig.\n"); 
#endif /*_DEBUGING_*/
		OpcUa_GotoError;
	}

	*a_pResults=OpcUa_Alloc(a_nNoOfNodesToRead*sizeof(OpcUa_DataValue));
	OpcUa_GotoErrorIfAllocFailed((*a_pResults))
	

	for(n=0;n<a_nNoOfNodesToRead;n++)
	{
		OpcUa_DataValue_Initialize((*a_pResults)+n);
		((*a_pResults)+n)->StatusCode=OpcUa_BadAttributeIdInvalid;
		p_Node=search_for_node((a_pNodesToRead+n)->NodeId);
		if(p_Node!= OpcUa_Null)   //pruefe ob Knoten existiert
		{
			if(((a_pNodesToRead+n)->AttributeId)<=7 && ((a_pNodesToRead+n)->AttributeId)>=1)
			{
				if((a_pNodesToRead+n)->AttributeId==OpcUa_Attributes_NodeId)
				{
					((*a_pResults)+n)->Value.Value.NodeId=OpcUa_Memory_Alloc(sizeof(OpcUa_NodeId));
					if(((*a_pResults)+n)->Value.Value.NodeId !=OpcUa_Null)
					{
						OpcUa_NodeId_Initialize(((*a_pResults)+n)->Value.Value.NodeId);
						*(((*a_pResults)+n)->Value.Value.NodeId)=((_ObjectKnoten_*)p_Node)->BaseAttribute.NodeId; 
						fill_datatype_arraytype_in_my_Variant(((*a_pResults)+n),OpcUaId_NodeId, OpcUa_VariantArrayType_Scalar,0);
						((*a_pResults)+n)->StatusCode=OpcUa_Good;
					}
					else
					{
						((*a_pResults)+n)->StatusCode=OpcUa_BadOutOfMemory;
					}
				}
				if((a_pNodesToRead+n)->AttributeId==OpcUa_Attributes_NodeClass)
				{
					((*a_pResults)+n)->Value.Value.Int32=((_ObjectKnoten_*)p_Node)->BaseAttribute.NodeClass;
					fill_datatype_arraytype_in_my_Variant(((*a_pResults)+n),OpcUaId_Int32, OpcUa_VariantArrayType_Scalar,0);
					((*a_pResults)+n)->StatusCode=OpcUa_Good;
				}
				if((a_pNodesToRead+n)->AttributeId==OpcUa_Attributes_BrowseName)
				{
					((*a_pResults)+n)->Value.Value.QualifiedName=OpcUa_Memory_Alloc(sizeof(OpcUa_QualifiedName));
					if(((*a_pResults)+n)->Value.Value.QualifiedName!=OpcUa_Null)
					{
						OpcUa_QualifiedName_Initialize(((*a_pResults)+n)->Value.Value.QualifiedName);
						OpcUa_String_AttachCopy(&((*a_pResults)+n)->Value.Value.QualifiedName->Name,((_ObjectKnoten_*)p_Node)->BaseAttribute.BrowseName);
						((*a_pResults)+n)->Value.Value.QualifiedName->NamespaceIndex=((_ObjectKnoten_*)p_Node)->BaseAttribute.NodeId.NamespaceIndex;     
						fill_datatype_arraytype_in_my_Variant(((*a_pResults)+n),OpcUaId_QualifiedName, OpcUa_VariantArrayType_Scalar,0);
						((*a_pResults)+n)->StatusCode=OpcUa_Good;
					}
					else
					{
						((*a_pResults)+n)->StatusCode=OpcUa_BadOutOfMemory;
					}
				}
				if((a_pNodesToRead+n)->AttributeId==OpcUa_Attributes_DisplayName)
				{
					((*a_pResults)+n)->Value.Value.LocalizedText=OpcUa_Memory_Alloc(sizeof(OpcUa_LocalizedText));
					if(((*a_pResults)+n)->Value.Value.LocalizedText!=OpcUa_Null)
					{
						OpcUa_LocalizedText_Initialize(((*a_pResults)+n)->Value.Value.LocalizedText);
						OpcUa_String_AttachCopy(&((*a_pResults)+n)->Value.Value.LocalizedText->Text,((_ObjectKnoten_*)p_Node)->BaseAttribute.DisplayName);
						OpcUa_String_AttachCopy(&((*a_pResults)+n)->Value.Value.LocalizedText->Locale,"en");
						fill_datatype_arraytype_in_my_Variant(((*a_pResults)+n),OpcUaId_LocalizedText, OpcUa_VariantArrayType_Scalar,0);
						((*a_pResults)+n)->StatusCode=OpcUa_Good;
					}
					else
					{
						((*a_pResults)+n)->StatusCode=OpcUa_BadOutOfMemory;
					}

				}
				if(((a_pNodesToRead+n)->AttributeId==OpcUa_Attributes_Description || (a_pNodesToRead+n)->AttributeId==OpcUa_Attributes_WriteMask) || (a_pNodesToRead+n)->AttributeId==OpcUa_Attributes_UserWriteMask)
				{
						((*a_pResults)+n)->StatusCode=OpcUa_BadNotReadable;
				}
			}
			else
			{
				switch((((_ObjectKnoten_*)p_Node)->BaseAttribute.NodeClass))
				{
				case OpcUa_NodeClass_Variable:
					{
						if((a_pNodesToRead+n)->AttributeId<=20 && (a_pNodesToRead+n)->AttributeId>=13)
						{
							if((a_pNodesToRead+n)->AttributeId==OpcUa_Attributes_Value)
							{
								 ((*a_pResults)+n)->StatusCode=fill_Variant_for_value_attribute((_VariableKnoten_*)p_Node, OpcUa_Null,((*a_pResults)+n));
								if(a_eTimestampsToReturn!=OpcUa_TimestampsToReturn_Neither)
								{
									uStatus=assigne_Timestamp(((*a_pResults)+n),a_eTimestampsToReturn);
									if(OpcUa_IsBad(uStatus))
									{
										((*a_pResults)+n)->StatusCode=OpcUa_BadInternalError;
										uStatus=OpcUa_Good;
									}
								}
							}
							if((a_pNodesToRead+n)->AttributeId==OpcUa_Attributes_DataType)
							{
								((*a_pResults)+n)->Value.Value.NodeId=OpcUa_Memory_Alloc(sizeof(OpcUa_NodeId));
								if(((*a_pResults)+n)->Value.Value.NodeId!=OpcUa_Null)
								{
									OpcUa_NodeId_Initialize(((*a_pResults)+n)->Value.Value.NodeId);
									*(((*a_pResults+n)->Value.Value.NodeId))=((_VariableKnoten_*)p_Node)->DataType;
									fill_datatype_arraytype_in_my_Variant(((*a_pResults)+n),OpcUaId_NodeId, OpcUa_VariantArrayType_Scalar,0);
									((*a_pResults)+n)->StatusCode=OpcUa_Good;
								}
								else
								{
									((*a_pResults)+n)->StatusCode=OpcUa_BadOutOfMemory;
								}
							}
							if((a_pNodesToRead+n)->AttributeId==OpcUa_Attributes_ValueRank)
							{
								((*a_pResults)+n)->Value.Value.Int32=((_VariableKnoten_*)p_Node)->ValueRank;
								fill_datatype_arraytype_in_my_Variant(((*a_pResults)+n),OpcUaId_Int32, OpcUa_VariantArrayType_Scalar,0);
								((*a_pResults)+n)->StatusCode=OpcUa_Good;
							}
							if((a_pNodesToRead+n)->AttributeId==OpcUa_Attributes_ArrayDimensions)
							{
								
								((*a_pResults)+n)->Value.Value.UInt32=(((_VariableKnoten_*)p_Node)->ArrayDimensions);
								fill_datatype_arraytype_in_my_Variant(((*a_pResults)+n),OpcUaId_UInt32, OpcUa_VariantArrayType_Scalar,0);
								((*a_pResults)+n)->StatusCode=OpcUa_Good;

							}
							if((a_pNodesToRead+n)->AttributeId==OpcUa_Attributes_AccessLevel)
							{
								((*a_pResults)+n)->Value.Value.Byte=((_VariableKnoten_*)p_Node)->AccessLevel;
								fill_datatype_arraytype_in_my_Variant(((*a_pResults)+n),OpcUaId_Byte, OpcUa_VariantArrayType_Scalar,0);
								((*a_pResults)+n)->StatusCode=OpcUa_Good;
							}
							if((a_pNodesToRead+n)->AttributeId==OpcUa_Attributes_UserAccessLevel)
							{
								((*a_pResults)+n)->Value.Value.Byte=((_VariableKnoten_*)p_Node)->UserAccessLevel;
								fill_datatype_arraytype_in_my_Variant(((*a_pResults)+n),OpcUaId_Byte, OpcUa_VariantArrayType_Scalar,0);
								((*a_pResults)+n)->StatusCode=OpcUa_Good;
							}
							if((a_pNodesToRead+n)->AttributeId==OpcUa_Attributes_MinimumSamplingInterval)
							{
								((*a_pResults)+n)->Value.Value.Double=OpcUa_MinimumSamplingIntervals_Indeterminate;
								fill_datatype_arraytype_in_my_Variant(((*a_pResults)+n),OpcUaId_Double, OpcUa_VariantArrayType_Scalar,0);
								((*a_pResults)+n)->StatusCode=OpcUa_Good;
							}
							if((a_pNodesToRead+n)->AttributeId==OpcUa_Attributes_Historizing)
							{
								((*a_pResults)+n)->Value.Value.Boolean=((_VariableKnoten_*)p_Node)->Historizing;
								fill_datatype_arraytype_in_my_Variant(((*a_pResults)+n),OpcUaId_Boolean, OpcUa_VariantArrayType_Scalar,0);
								((*a_pResults)+n)->StatusCode=OpcUa_Good;
							}
						}
						break;
					}
				case OpcUa_NodeClass_VariableType:
					{
						if(((a_pNodesToRead+n)->AttributeId<=16 && (a_pNodesToRead+n)->AttributeId>=13) ||((a_pNodesToRead+n)->AttributeId==8))
						{
							if((a_pNodesToRead+n)->AttributeId==OpcUa_Attributes_Value)
							{
								 ((*a_pResults)+n)->StatusCode=fill_Variant_for_value_attribute((_VariableKnoten_*)p_Node, OpcUa_Null,((*a_pResults)+n));
								if(a_eTimestampsToReturn!=OpcUa_TimestampsToReturn_Neither)
								{
									uStatus=assigne_Timestamp(((*a_pResults)+n),a_eTimestampsToReturn);
									if(OpcUa_IsBad(uStatus))
									{
										((*a_pResults)+n)->StatusCode=OpcUa_BadInternalError;
										uStatus=OpcUa_Good;
									}
								}
							}
							if((a_pNodesToRead+n)->AttributeId==OpcUa_Attributes_DataType)
							{
								((*a_pResults)+n)->Value.Value.NodeId=OpcUa_Memory_Alloc(sizeof(OpcUa_NodeId));
								if(((*a_pResults)+n)->Value.Value.NodeId!=OpcUa_Null)
								{
									OpcUa_NodeId_Initialize(((*a_pResults)+n)->Value.Value.NodeId);
									*((*a_pResults)+n)->Value.Value.NodeId=((_VariableTypeKnoten_*)p_Node)->DataType;
									fill_datatype_arraytype_in_my_Variant(((*a_pResults)+n),OpcUaId_NodeId, OpcUa_VariantArrayType_Scalar,0);
									((*a_pResults)+n)->StatusCode=OpcUa_Good;
								}
								else
								{
									((*a_pResults)+n)->StatusCode=OpcUa_BadOutOfMemory;
								}
							}
							if((a_pNodesToRead+n)->AttributeId==OpcUa_Attributes_ArrayDimensions)
							{
								((*a_pResults)+n)->Value.Value.UInt32=((_VariableTypeKnoten_*)p_Node)->ArrayDimensions; 
								fill_datatype_arraytype_in_my_Variant(((*a_pResults)+n),OpcUaId_UInt32, OpcUa_VariantArrayType_Scalar,0);
								((*a_pResults)+n)->StatusCode=OpcUa_Good;
							}
							if((a_pNodesToRead+n)->AttributeId==OpcUa_Attributes_IsAbstract)
							{
								((*a_pResults)+n)->Value.Value.Boolean=((_VariableTypeKnoten_*)p_Node)->IsAbstract;
								fill_datatype_arraytype_in_my_Variant(((*a_pResults)+n),OpcUaId_Boolean, OpcUa_VariantArrayType_Scalar,0);
								((*a_pResults)+n)->StatusCode=OpcUa_Good;
							}
							
						}
						break;
					}
				case OpcUa_NodeClass_Object:
					{
						if((a_pNodesToRead+n)->AttributeId==OpcUa_Attributes_EventNotifier)
						{
							((*a_pResults)+n)->Value.Value.Byte=((_ObjectKnoten_*)p_Node)->EventNotifier;
							fill_datatype_arraytype_in_my_Variant(((*a_pResults)+n),OpcUaId_Byte, OpcUa_VariantArrayType_Scalar,0);
							((*a_pResults)+n)->StatusCode=OpcUa_Good;
						}
						break;
					}
					
				case OpcUa_NodeClass_ObjectType:
					{
						if((a_pNodesToRead+n)->AttributeId==OpcUa_Attributes_IsAbstract)
						{
							((*a_pResults)+n)->Value.Value.Boolean=((_ObjectTypeKnoten_*)p_Node)->IsAbstract;
							fill_datatype_arraytype_in_my_Variant(((*a_pResults)+n),OpcUaId_Boolean, OpcUa_VariantArrayType_Scalar,0);
							((*a_pResults)+n)->StatusCode=OpcUa_Good;
						}
						break;
					}
					
				case OpcUa_NodeClass_DataType:
					{

						if((a_pNodesToRead+n)->AttributeId==OpcUa_Attributes_IsAbstract)
						{
							((*a_pResults)+n)->Value.Value.Boolean=((_DataTypeKnoten_*)p_Node)->IsAbstract;
							fill_datatype_arraytype_in_my_Variant(((*a_pResults)+n),OpcUaId_Boolean, OpcUa_VariantArrayType_Scalar,0);
							((*a_pResults)+n)->StatusCode=OpcUa_Good;
						}
						break;
					}
				
				case OpcUa_NodeClass_ReferenceType:
					{
						if((a_pNodesToRead+n)->AttributeId<=10 && (a_pNodesToRead+n)->AttributeId>=8)
						{
							if((a_pNodesToRead+n)->AttributeId==OpcUa_Attributes_IsAbstract)
							{
								((*a_pResults)+n)->Value.Value.Boolean=((_ReferenceTypeKnoten_*)p_Node)->IsAbstract;
								fill_datatype_arraytype_in_my_Variant(((*a_pResults)+n),OpcUaId_Boolean, OpcUa_VariantArrayType_Scalar,0);
								((*a_pResults)+n)->StatusCode=OpcUa_Good;
							}
							if((a_pNodesToRead+n)->AttributeId==OpcUa_Attributes_Symmetric)
							{
								((*a_pResults)+n)->Value.Value.Boolean=((_ReferenceTypeKnoten_*)p_Node)->Symmetric;
								fill_datatype_arraytype_in_my_Variant(((*a_pResults)+n),OpcUaId_Boolean, OpcUa_VariantArrayType_Scalar,0);
								((*a_pResults)+n)->StatusCode=OpcUa_Good;
							}
							if((a_pNodesToRead+n)->AttributeId==OpcUa_Attributes_InverseName)
							{
								((*a_pResults)+n)->Value.Value.LocalizedText=OpcUa_Memory_Alloc(sizeof(OpcUa_LocalizedText));
								if(((*a_pResults)+n)->Value.Value.NodeId!=OpcUa_Null)
								{
									OpcUa_LocalizedText_Initialize(((*a_pResults)+n)->Value.Value.LocalizedText);
									OpcUa_String_AttachCopy(&((*a_pResults)+n)->Value.Value.LocalizedText->Text, ((_ReferenceTypeKnoten_*)p_Node)->InverseName_text);
									OpcUa_String_AttachCopy(&((*a_pResults)+n)->Value.Value.LocalizedText->Locale, ((_ReferenceTypeKnoten_*)p_Node)->InverseName_locale);
									fill_datatype_arraytype_in_my_Variant(((*a_pResults)+n),OpcUaId_LocalizedText, OpcUa_VariantArrayType_Scalar,0);
									((*a_pResults)+n)->StatusCode=OpcUa_Good;
								}
								else
								{
									((*a_pResults)+n)->StatusCode=OpcUa_BadOutOfMemory;
								}
							}
						}
						break;
					}
				default:
					break;
					
				
				}
			}
			
		
		}
		else
		{
			((*a_pResults)+n)->StatusCode=OpcUa_BadNodeIdUnknown;
		}
		
	}
	
	

	*a_pNoOfResults=a_nNoOfNodesToRead;

#ifndef NO_DEBUGING_
	MY_TRACE("\nanzahl der nodes :%d\n",a_nNoOfNodesToRead);
	for(i=0;i<a_nNoOfNodesToRead;i++)
	{
		MY_TRACE("\n|%d|, |%d| attributeId:%u\n",(a_pNodesToRead+i)->NodeId.NamespaceIndex,(a_pNodesToRead+i)->NodeId.Identifier.Numeric,(a_pNodesToRead+i)->AttributeId);
		
	}
#endif /*_DEBUGING_*/


	
	uStatus = response_header_ausfuellen(a_pResponseHeader,a_pRequestHeader,uStatus);
	if(OpcUa_IsBad(uStatus))
	{
       a_pResponseHeader->ServiceResult=OpcUa_BadInternalError;
	}
#ifndef NO_DEBUGING_
	MY_TRACE("\nSERVICE===ENDE============================================\n\n\n"); 
#endif /*_DEBUGING_*/

	RESET_SESSION_COUNTER

    OpcUa_ReturnStatusCode;
    OpcUa_BeginErrorHandling;

    
	uStatus = response_header_ausfuellen(a_pResponseHeader,a_pRequestHeader,uStatus);
	if(OpcUa_IsBad(uStatus))
	{
       a_pResponseHeader->ServiceResult=OpcUa_BadInternalError;
	}
#ifndef NO_DEBUGING_
	MY_TRACE("\nSERVICEENDE (IM SERVICE SIND FEHLER AUFGETRETTEN)===========\n\n\n"); 
#endif /*_DEBUGING_*/
	RESET_SESSION_COUNTER
    OpcUa_FinishErrorHandling;
}
Exemple #5
0
/*
 * Using the definition d, pack the content of the ISO message m into 
 * buf. NOTE: buf must be large enough to contain the packed message.
 * Returns the length of the data written to buf.
 */
int iso8583_pack(const ISO_MSG *m, char *buf)
{
 char *start = buf;
 int flds, i;
 char fmt[8], tmp[8]={0};

 /* Field 0 is mandatory and fixed length. */
 if (m->fld[0].len != s_isodef[0].len || s_isodef[0].fmt != FMT_FIXED) {
  MY_TRACE("flds = %d", 0);
  return -1;
 }

 if (s_iCompress) 
 {
  buf += ASC2BCD((unsigned char*)buf, (const char*)m->fld[0].buf, s_isodef[0].len, s_isodef[0].fmt);
 }
 else
 {
  memcpy(buf, m->fld[0].buf, s_isodef[0].len);
  buf += s_isodef[0].len;  
 }

 /*
  * The bitmap contains either 64 or 128 fields - flds is the 
  * number of allowed fields, i.e. either 64 or 128.
  */
 if (m->fld[1].buf == NULL || s_isodef[1].len != 16) {
  MY_TRACE("flds = %d", 1);
  return -1;
 }
 
#if ISO_FLDS==128
 if ((m->fld[1].len == s_isodef[1].len) && (m->fld[1].buf[0] & 0x80))
 {
  memcpy(buf, m->fld[1].buf, s_isodef[0].len);
  buf += s_isodef[1].len;
  flds = 128;
 }
 else
 {
  if ((m->fld[1].len == 8) && !(m->fld[1].buf[0] & 0x80))
  {
   memcpy(buf, m->fld[1].buf, 8);
   buf += 8;
   flds = 64;
  }
  else
  {
   MY_TRACE("flds = %d", 1);
   return -1;
  }
 }
#else /*ISO_FLDS==128*/
 if ((m->fld[1].len != 8) || (m->fld[1].buf[0] & 0x80)) {
  MY_TRACE("flds = %d", 1);
  return -1;
 }
 
 memcpy(buf, m->fld[1].buf, m->fld[1].len);
 buf += m->fld[1].len;
 flds = 64;
#endif /*ISO_FLDS==128*/

 for (i = 2; i <= flds; i++) 
 {
  if (MY_BITGET(m->fld[1].buf, i)) 
  { /* i'th bit != 0 */
   if (m->fld[i].buf == NULL || m->fld[i].len <= 0 || m->fld[i].len > s_isodef[i].len)
   {
    MY_TRACE("flds = %d", i);
    return -1;
   }

   if (s_isodef[i].fmt) 
   { /* Variable length */
    if (s_iCompress)
    {
     sprintf(fmt, "%%0%dd", s_isodef[i].fmt);
     sprintf(tmp, fmt, m->fld[i].len);
     buf += ASC2BCD((unsigned char*)buf, tmp, s_isodef[i].fmt, 0);
    }
    else
    {
     sprintf(fmt, "%%0%dd", s_isodef[i].fmt);
     sprintf(buf, fmt, m->fld[i].len);
     buf += s_isodef[i].fmt;
    }   
   }

   switch (s_isodef[i].typ) {
   case TYP_BCD: /* Fallthrough */
    if (s_iCompress)
    {
     buf += ASC2BCD((unsigned char*)buf,(const char*) m->fld[i].buf, m->fld[i].len, s_isodef[i].fmt); 
     break;
    }
   case TYP_ASC:
   case TYP_BIN:
    memcpy(buf, m->fld[i].buf, m->fld[i].len);
    buf += m->fld[i].len;
    break;
   default:
    MY_TRACE("flds = %d", i);
    return -1;
    break;
   }
     }
 }

 return (buf-start);
}