Browse Source

added delete and deleteMembers to code generator logic

Leon Urbas 11 years ago
parent
commit
3548575f88
3 changed files with 88 additions and 28 deletions
  1. 53 5
      src/opcua_basictypes.c
  2. 2 2
      src/opcua_secureChannelLayer.c
  3. 33 21
      tool/generate_builtin.py

+ 53 - 5
src/opcua_basictypes.c

@@ -54,11 +54,29 @@ UA_Int32 UA_Array_decode(char const * src,UA_Int32 noElements, UA_Int32 type, UA
 	UA_Int32 i = 0;
 
 	for(i=0; i<noElements; i++) {
+		retval |= UA_alloc((void**)&dst[i], UA_[type].calcSize(UA_NULL));
 		retval |= UA_[type].decode(src, pos, (void*)dst[i]);
 	}
 	return retval;
 }
 
+UA_Int32 UA_Array_deleteMembers(void ** p,UA_Int32 noElements) {
+	UA_Int32 retval = UA_SUCCESS;
+	UA_Int32 i = 0;
+
+	for(i=0; i<noElements; i++) {
+		retval |= UA_free((void*)p[i]);
+	}
+	return retval;
+}
+
+UA_Int32 UA_Array_delete(void **p,UA_Int32 noElements) {
+	UA_Int32 retval = UA_SUCCESS;
+	retval |= UA_Array_deleteMembers(p,noElements);
+	retval |= UA_free(p);
+	return retval;
+}
+
 UA_Int32 UA_free(void * ptr){
 	printf("UA_free - ptr=%p\n",ptr);
 	free(ptr);
@@ -312,7 +330,6 @@ UA_Byte UA_Byte_securityPoliceNoneData[] = "http://opcfoundation.org/UA/Security
 UA_String UA_String_securityPoliceNone = { sizeof(UA_Byte_securityPoliceNoneData), UA_Byte_securityPoliceNoneData };
 
 UA_Int32 UA_String_compare(UA_String* string1, UA_String* string2) {
-	UA_Int32 i;
 	UA_Int32 retval;
 
 	if (string1->length == 0 && string2->length == 0) {
@@ -322,7 +339,9 @@ UA_Int32 UA_String_compare(UA_String* string1, UA_String* string2) {
 	} else if (string1->length != string2->length) {
 		retval = UA_NOT_EQUAL;
 	} else {
-		retval = strncmp(string1->data,string2->data,string1->length);
+		// casts to overcome signed warnings
+		//TODO: map return of strncmp to UA_EQUAL/UA_NOT_EQUAL
+		retval = strncmp((char const*)string1->data,(char const*)string2->data,string1->length);
 	}
 	return retval;
 }
@@ -802,7 +821,6 @@ UA_Int32 UA_DiagnosticInfo_decode(char const * src, UA_Int32 *pos, UA_Diagnostic
 }
 UA_Int32 UA_DiagnosticInfo_encode(UA_DiagnosticInfo const *src, UA_Int32 *pos, char *dst) {
 	UA_Int32 retval = UA_SUCCESS;
-	UA_Byte mask;
 	int i;
 
 	UA_Byte_encode(&(src->encodingMask), pos, dst);
@@ -949,16 +967,26 @@ UA_Int32 UA_QualifiedName_encode(UA_QualifiedName const *src, UA_Int32* pos,
 	retval |= UA_String_encode(&(src->name),pos,dst);
 	return retval;
 }
+UA_Int32 UA_QualifiedName_delete(UA_QualifiedName  * p) {
+	UA_Int32 retval = UA_SUCCESS;
+	retval |= UA_QualifiedName_deleteMembers(p);
+	retval |= UA_free(p);
+	return retval;
+}
+// FIXME: Implement
+UA_Int32 UA_QualifiedName_deleteMembers(UA_QualifiedName  * p) {
+	return UA_ERR_NOT_IMPLEMENTED;
+}
 
 
 UA_Int32 UA_Variant_calcSize(UA_Variant const * p) {
 	UA_Int32 length = 0;
-	UA_Int32 ns0Id = p->encodingMask & 0x1F; // Bits 1-5
+	UA_UInt32 ns0Id = p->encodingMask & 0x1F; // Bits 1-5
 	UA_Boolean isArray = p->encodingMask & (0x01 << 7); // Bit 7
 	UA_Boolean hasDimensions = p->encodingMask & (0x01 << 6); // Bit 6
 	int i;
 
-	if (p->vt == UA_NULL || ( p->encodingMask & 0x1F) != p->vt->Id) {
+	if (p->vt == UA_NULL || ns0Id != p->vt->Id) {
 		return UA_ERR_INCONSISTENT;
 	}
 	length += sizeof(UA_Byte); //p->encodingMask
@@ -1042,6 +1070,16 @@ UA_Int32 UA_Variant_decode(char const * src, UA_Int32 *pos, UA_Variant *dst) {
 	}
 	return retval;
 }
+UA_Int32 UA_Variant_delete(UA_Variant  * p) {
+	UA_Int32 retval = UA_SUCCESS;
+	retval |= UA_Variant_deleteMembers(p);
+	retval |= UA_free(p);
+	return retval;
+}
+// FIXME: Implement
+UA_Int32 UA_Variant_deleteMembers(UA_Variant  * p) {
+	return UA_ERR_NOT_IMPLEMENTED;
+}
 
 
 //TODO: place this define at the server configuration
@@ -1128,6 +1166,16 @@ UA_Int32 UA_DataValue_calcSize(UA_DataValue const * p) {
 	return length;
 }
 
+// FIXME: Implement
+UA_Int32 UA_DataValue_delete(UA_DataValue * p) {
+	return UA_ERR_NOT_IMPLEMENTED;
+}
+// FIXME: Implement
+UA_Int32 UA_DataValue_deleteMembers(UA_DataValue * p) {
+	return UA_ERR_NOT_IMPLEMENTED;
+}
+
+
 /**
  * RequestHeader
  * Part: 4

+ 2 - 2
src/opcua_secureChannelLayer.c

@@ -490,9 +490,9 @@ void SL_receive(UA_connection *connection, UA_ByteString *serviceMessage) {
 
 		case packetType_OPN: /* openSecureChannel Message received */
 			UA_AsymmetricAlgorithmSecurityHeader_encode(secureChannelPacket.data, &pos, &asymAlgSecHeader);
-			UA_String_printf("SL_receive - AAS_Header.ReceiverThumbprint=",
+			UA_ByteString_printf("SL_receive - AAS_Header.ReceiverThumbprint=",
 					&(asymAlgSecHeader.receiverCertificateThumbprint));
-			UA_String_printf("SL_receive - AAS_Header.SecurityPolicyUri=",
+			UA_ByteString_printf("SL_receive - AAS_Header.SecurityPolicyUri=",
 					&(asymAlgSecHeader.securityPolicyUri));
 			UA_ByteString_printf("SL_receive - AAS_Header.SenderCertificate=",
 					&(asymAlgSecHeader.senderCertificate));

+ 33 - 21
tool/generate_builtin.py

@@ -141,20 +141,12 @@ def createStructured(element):
     print("UA_Int32 " + name + "_calcSize(" + name + " const * ptr);", end='\n', file=fh)
     print("UA_Int32 " + name + "_encode(" + name + " const * src, UA_Int32* pos, char* dst);", end='\n', file=fh)
     print("UA_Int32 " + name + "_decode(char const * src, UA_Int32* pos, " + name + "* dst);", end='\n', file=fh)
+    print("UA_Int32 " + name + "_delete("+ name + "* p);", end='\n', file=fh)
+    print("UA_Int32 " + name + "_deleteMembers(" + name + "* p);", end='\n', file=fh)
 
-    if "Response" in name[len(name)-9:]:
-		#Sten: not sure how to get it, actually we need to solve it on a higher level
-        #print("UA_Int32 "  + name + "_calcSize(" + name + " const * ptr) {\n\treturn UA_ResponseHeader_getSize()", end='', file=fc)
-		print("UA_Int32 "  + name + "_calcSize(" + name + " const * ptr) {\n\treturn 0", end='', file=fc)  
-    elif "Request" in name[len(name)-9:]:
-		#Sten: dito
-        #print("UA_Int32 "  + name + "_calcSize(" + name + " const * ptr) {\n\treturn UA_RequestHeader_getSize()", end='', file=fc) 
-		print("UA_Int32 "  + name + "_calcSize(" + name + " const * ptr) {\n\treturn 0", end='', file=fc) 
-    else:
-	# code 
-		print("UA_Int32 "  + name + "_calcSize(" + name + " const * ptr) {", end='', file=fc)
-		print("\n\tif(ptr==UA_NULL){return sizeof("+ name +");}", end='', file=fc)
-		print("\n\treturn 0", end='', file=fc)
+    print("UA_Int32 "  + name + "_calcSize(" + name + " const * ptr) {", end='', file=fc)
+    print("\n\tif(ptr==UA_NULL){return sizeof("+ name +");}", end='', file=fc)
+    print("\n\treturn 0", end='', file=fc)
 
     # code _calcSize
     for n,t in valuemap.iteritems():
@@ -190,8 +182,8 @@ def createStructured(element):
                 print('\tretval |= UA_'+t+"_encode(&(src->"+n+"),pos,dst);", end='\n', file=fc)
     print("\treturn retval;\n}\n", end='\n', file=fc)
 
-    print("UA_Int32 "+name+"_decode(char const * src, UA_Int32* pos, " + name + "* dst) {\n\tUA_Int32 retval = UA_SUCCESS;", end='\n', file=fc)
     # code _decode
+    print("UA_Int32 "+name+"_decode(char const * src, UA_Int32* pos, " + name + "* dst) {\n\tUA_Int32 retval = UA_SUCCESS;", end='\n', file=fc)
     for n,t in valuemap.iteritems():
         if t in elementary_size:
             print('\tretval |= UA_'+t+'_decode(src,pos,&(dst->'+n+'));', end='\n', file=fc)
@@ -199,17 +191,37 @@ def createStructured(element):
             if t in enum_types:
                 print('\tretval |= UA_'+t+'_decode(src,pos,&(dst->'+n+'));', end='\n', file=fc)
             elif t.find("**") != -1:
-				print('\tretval |= UA_Int32_decode(src,pos,&(dst->'+n+'Size)); // decode size', end='\n', file=fc)
-				#allocate memory
-				print('\tretval |= UA_alloc((void**)&(dst->' + n + "),dst->" + n + "Size*sizeof(void*));", end='\n', file=fc)
-				print("\tretval |= UA_Array_decode(src,dst->"+n+"Size, UA_" + t[0:t.find("*")].upper()+",pos,(void const**) (dst->"+n+"));", end='\n', file=fc) #not tested
+		print('\tretval |= UA_Int32_decode(src,pos,&(dst->'+n+'Size)); // decode size', end='\n', file=fc)
+		#allocate memory
+		print('\tretval |= UA_alloc((void**)&(dst->' + n + "),dst->" + n + "Size*sizeof(void*));", end='\n', file=fc)
+		print("\tretval |= UA_Array_decode(src,dst->"+n+"Size, UA_" + t[0:t.find("*")].upper()+",pos,(void const**) (dst->"+n+"));", end='\n', file=fc) #not tested
             elif t.find("*") != -1:
-				#allocate memory
-				print('\tretval |= UA_alloc((void**)&(dst->' + n + "),UA_" + t[0:t.find("*")] +"_calcSize(UA_NULL));", end='\n', file=fc)
-				print('\tretval |= UA_' + t[0:t.find("*")] + "_decode(src,pos,dst->"+ n +");", end='\n', file=fc)
+		#allocate memory
+		print('\tretval |= UA_alloc((void**)&(dst->' + n + "),UA_" + t[0:t.find("*")] +"_calcSize(UA_NULL));", end='\n', file=fc)
+		print('\tretval |= UA_' + t[0:t.find("*")] + "_decode(src,pos,dst->"+ n +");", end='\n', file=fc)
             else:
                 print('\tretval |= UA_'+t+"_decode(src,pos,&(dst->"+n+"));", end='\n', file=fc)
     print("\treturn retval;\n}\n", end='\n', file=fc)
+    
+    # code _delete and _deleteMembers
+    print('UA_Int32 '+name+'_delete('+name+'''* p) {
+	UA_Int32 retval = UA_SUCCESS;
+	retval |= '''+name+'''_deleteMembers(p);
+	retval |= UA_free(p);
+	return retval;
+    }''', end='\n', file=fc)
+    
+    print("UA_Int32 "+name+"_deleteMembers(" + name + "* p) {\n\tUA_Int32 retval = UA_SUCCESS;", end='\n', file=fc)
+    for n,t in valuemap.iteritems():
+        if t not in elementary_size:
+            if t.find("**") != -1:
+		print("\tretval |= UA_Array_delete(p->"+n+",p->"+n+"Size);", end='\n', file=fc) #not tested
+            elif t.find("*") != -1:
+		print('\tretval |= UA_' + t[0:t.find("*")] + "_delete(p->"+n+");", end='\n', file=fc)
+            else:
+		print('\tretval |= UA_' + t + "_deleteMembers(&(p->"+n+"));", end='\n', file=fc)
+		
+    print("\treturn retval;\n}\n", end='\n', file=fc)
         
 def createOpaque(element):
     name = "UA_" + element.get("Name")