Browse Source

revised responseHeader_calcSize function
revised nodeId_calcSize function

FlorianPalm 11 years ago
parent
commit
8ecf916c5a

+ 51 - 35
OPCUAServer/src/opcua_binaryEncDec.c

@@ -237,31 +237,31 @@ Int32 decodeToDiagnosticInfo(char* buf, Int32 *pos,
 	Byte mask;
 	for(mask = 1; mask <= 0x40; mask << 2)
 	{
-		switch(mask && encodingByte)
+		switch(mask & encodingByte)
 		{
-		DIEMT_SYMBOLIC_ID:
+		case DIEMT_SYMBOLIC_ID:
 			dstDiagnosticInfo->symbolicId = decodeInt32(buf, pos);
 			break;
-		DIEMT_NAMESPACE:
+		case DIEMT_NAMESPACE:
 
 			dstDiagnosticInfo->namespaceUri = decodeInt32(buf, pos);
 			break;
-		DIEMT_LOCALIZED_TEXT:
+		case DIEMT_LOCALIZED_TEXT:
 			dstDiagnosticInfo->localizesText = decodeInt32(buf, pos);
 			break;
-		DIEMT_LOCALE:
+		case DIEMT_LOCALE:
 			dstDiagnosticInfo->locale = decodeInt32(buf, pos);
 			break;
-		DIEMT_ADDITIONAL_INFO:
+		case DIEMT_ADDITIONAL_INFO:
 			decodeUAString(buf, pos, &dstDiagnosticInfo->additionalInfo);
 			break;
-		DIEMT_INNER_STATUS_CODE:
+		case DIEMT_INNER_STATUS_CODE:
 
 			dstDiagnosticInfo->innerStatusCode = decodeUAStatusCode(buf, pos);
 			break;
-		DIEMT_INNER_DIAGNOSTIC_INFO:
+		case DIEMT_INNER_DIAGNOSTIC_INFO:
 
-			dstDiagnosticInfo->innerDiagnosticInfo = opcua_malloc(sizeof(T_DiagnosticInfo));
+			dstDiagnosticInfo->innerDiagnosticInfo = (T_DiagnosticInfo*)opcua_malloc(sizeof(T_DiagnosticInfo));
 			decodeToDiagnosticInfo(buf, pos,
 				dstDiagnosticInfo->innerDiagnosticInfo);
 			break;
@@ -277,8 +277,8 @@ Int32 diagnosticInfo_calcSize(UA_DiagnosticInfo *diagnosticInfo)
 	Byte mask;
 	Int32 j = 0;
 	mask = 0;
-	puts("diagnosticInfo called");
-	printf("with this mask %u", diagnosticInfo->EncodingMask);
+	//puts("diagnosticInfo called");
+	//printf("with this mask %u", diagnosticInfo->EncodingMask);
 	for(mask = 1; mask <= 0x40; mask *= 2)
 	{
 		j++;
@@ -286,7 +286,7 @@ Int32 diagnosticInfo_calcSize(UA_DiagnosticInfo *diagnosticInfo)
 		{
 
 		case DIEMT_SYMBOLIC_ID:
-			puts("diagnosticInfo symbolic id");
+		//	puts("diagnosticInfo symbolic id");
 			length += sizeof(Int32);
 			break;
 		case DIEMT_NAMESPACE:
@@ -352,32 +352,48 @@ Int32 decodeRequestHeader(const AD_RawMessage *srcRaw, Int32 *pos,
 
 	return 0;
 }*/
-
-Int32 extensionObject_calcSize(UA_ExtensionObject extensionObject)
+Int32 nodeId_calcSize(UA_NodeId *nodeId)
 {
-	Int32 length;
-	length = 2; //The EncodingMask Byte
-	//ToDo
-	switch(extensionObject.TypeId.EncodingByte)
+	Int32 length = 0;
+	switch(nodeId->EncodingByte)
 	{
-	case NIEVT_TWO_BYTE:
-		length += sizeof(Byte);
-		break;
-	case NIEVT_FOUR_BYTE:
-		length += 2*sizeof(Byte);
-		break;
-	case NIEVT_NUMERIC:
-		break;
-	case NIEVT_STRING:
-		break;
-	case NIEVT_GUID:
-		break;
-	case NIEVT_BYTESTRING:
-		break;
-	default:
-		break;
+		case NIEVT_TWO_BYTE:
+			length += 2 * sizeof(Byte);
+			break;
+		case NIEVT_FOUR_BYTE:
+			length += 4 * sizeof(Byte);
+			break;
+		case NIEVT_NUMERIC:
+			//TODO call registered function which knows how to calculate the length
+			break;
+		case NIEVT_STRING:
+			length += sizeof(Byte) + sizeof(UInt16) + sizeof(UInt32) + nodeId->Identifier.String.Length;
+			break;
+		case NIEVT_GUID:
+			length += sizeof(Byte) + sizeof(UInt16) + sizeof(UInt32) + sizeof(UInt16) + sizeof(UInt16) + 8 * sizeof(Byte);
+			break;
+		case NIEVT_BYTESTRING:
+			length += sizeof(Byte) + sizeof(UInt16) +  sizeof(UInt32) + nodeId->Identifier.OPAQUE.Length;
+			break;
+		default:
+			break;
 	}
+	return length;
+}
+Int32 extensionObject_calcSize(UA_ExtensionObject *extensionObject)
+{
+	Int32 length;
+	Byte mask;
+
+	length += nodeId_calcSize(&(extensionObject->TypeId));
+	length += sizeof(Byte); //The EncodingMask Byte
+
 
+	if(extensionObject->Encoding == 0x01 ||
+	   extensionObject->Encoding == 0x02)
+	{
+		length += sizeof(Int32) + extensionObject->Length;
+	}
 	return length;
 }
 
@@ -396,7 +412,7 @@ Int32 responseHeader_calcSize(T_ResponseHeader *responseHeader)
 
 	length += diagnosticInfo_calcSize(responseHeader->serviceDiagnostics);
 	//ToDo
-	//length += extensionObject_calcSize(responseHeader->additionalHeader);
+	length += extensionObject_calcSize(&(responseHeader->additionalHeader));
 
 
 	return length;

+ 6 - 2
OPCUAServer/src/opcua_binaryEncDec.h

@@ -172,6 +172,10 @@ Int32 encodeResponseHeader(const T_ResponseHeader *responseHeader, Int32 *pos, A
  */
 Int32 diagnosticInfo_calcSize(UA_DiagnosticInfo *diagnosticInfo);
 
-
-
+/**
+ *
+ * @param extensionObject
+ * @return length of the binary encoded data
+ */
+Int32 extensionObject_calcSize(UA_ExtensionObject *extensionObject);
 #endif /* OPCUA_BINARYENCDEC_NEU_H_ */

+ 37 - 0
OPCUAServer/tests/check_stack.c

@@ -141,6 +141,28 @@ START_TEST(diagnosticInfo_calcSize_test)
 }
 END_TEST
 
+START_TEST(extensionObject_calcSize_test)
+{
+
+	Int32 valreal = 0;
+	Int32 valcalc = 0;
+	Byte data[3] = {1,2,3};
+	UA_ExtensionObject extensionObject;
+
+	extensionObject.TypeId.EncodingByte = NIEVT_TWO_BYTE;; // Numeric TWO BYTES
+	extensionObject.TypeId.Identifier.Numeric = 0;
+
+	extensionObject.Encoding = 0x00;
+	extensionObject.Length = 0;
+	//extensionObject.Body = &data;
+
+	valcalc = extensionObject_calcSize(&extensionObject);
+	valreal = 3;
+	ck_assert_int_eq(valcalc, valreal);
+
+}
+END_TEST
+
 START_TEST(responseHeader_calcSize_test)
 {
 	Int32 valreal = 0;
@@ -153,6 +175,7 @@ START_TEST(responseHeader_calcSize_test)
 	responseHeader.timestamp = 150014;
 	responseHeader.requestHandle = 514;
 	responseHeader.serviceResult = 504;
+
 	//Should have the size of 26 Bytes
 	diagnosticInfo.EncodingMask = 0x01 | 0x02 | 0x04 | 0x08 | 0x10;
 	diagnosticInfo.SymbolicId = 30;
@@ -227,6 +250,14 @@ Suite* TL_testSuite_diagnosticInfo_calcSize()
 	suite_add_tcase(s,tc_core);
 	return s;
 }
+Suite* TL_testSuite_extensionObject_calcSize()
+{
+	Suite *s = suite_create("extensionObject_calcSize");
+	TCase *tc_core = tcase_create("Core");
+	tcase_add_test(tc_core, extensionObject_calcSize_test);
+	suite_add_tcase(s,tc_core);
+	return s;
+}
 Suite* TL_testSuite_responseHeader_calcSize()
 {
 	Suite *s = suite_create("responseHeader_calcSize");
@@ -269,6 +300,12 @@ int main (void)
 	number_failed += srunner_ntests_failed(sr);
 	srunner_free(sr);
 
+	s = TL_testSuite_extensionObject_calcSize();
+	sr = srunner_create(s);
+	srunner_run_all(sr,CK_NORMAL);
+	number_failed += srunner_ntests_failed(sr);
+	srunner_free(sr);
+
 	s = TL_testSuite_responseHeader_calcSize();
 	sr = srunner_create(s);
 	srunner_run_all(sr,CK_NORMAL);