Browse Source

fixed bug within UA_Variant_decodeBinary: arrayDimensions data was copied erroneously to the data field of the variant
added a multidimensional array node for testing

FlorianPalm 9 years ago
parent
commit
cf424650c3
3 changed files with 28 additions and 1 deletions
  1. 4 0
      examples/client.c
  2. 22 0
      examples/server.c
  3. 2 1
      src/ua_types_encoding_binary.c

+ 4 - 0
examples/client.c

@@ -90,6 +90,10 @@ int main(int argc, char *argv[]) {
     wReq.nodesToWrite[0].value.value.storageType = UA_VARIANT_DATA_NODELETE; //do not free the integer on deletion
     wReq.nodesToWrite[0].value.value.data = &value;
     
+
+
+
+
     UA_WriteResponse wResp = UA_Client_write(client, &wReq);
     if(wResp.responseHeader.serviceResult == UA_STATUSCODE_GOOD)
             printf("the new value is: %i\n", value);

+ 22 - 0
examples/server.c

@@ -273,6 +273,28 @@ int main(int argc, char** argv) {
                                   UA_NODEID_NUMERIC(1, ARRAYID), UA_NODEID_NUMERIC(0, UA_NS0ID_ORGANIZES));
    }
 
+   //add a multidimensional Int32 array node for testing purpose
+   void *value = UA_new(&UA_TYPES[UA_TYPES_INT32]);
+   UA_Variant *variant = UA_Variant_new();
+   UA_Variant_setScalar(variant, value, &UA_TYPES[UA_TYPES_INT32]);
+   char myMultiArrayTypename[15];
+   sprintf(myMultiArrayTypename, "%02d", 99);
+   UA_QualifiedName myMultiArrayType = UA_QUALIFIEDNAME(1, myMultiArrayTypename);
+
+   UA_Variant *arrayvar = UA_Variant_new();
+   UA_Int32 *myMultiArray = UA_Array_new(&UA_TYPES[UA_TYPES_INT32],10);
+   arrayvar->arrayDimensions = UA_Array_new(&UA_TYPES[UA_TYPES_INT32],2);
+   arrayvar->arrayDimensions[0] = 2;
+   arrayvar->arrayDimensions[1] = 5;
+   arrayvar->arrayDimensionsSize = 2;
+   arrayvar->arrayLength = 10;
+   arrayvar->data = myMultiArray;
+   arrayvar->type = &UA_TYPES[UA_TYPES_INT32];
+   UA_Server_addVariableNode(server, arrayvar, myMultiArrayType, UA_NODEID_NUMERIC(1, 31415),
+                             UA_NODEID_NUMERIC(1, ARRAYID), UA_NODEID_NUMERIC(0, UA_NS0ID_ORGANIZES));
+
+
+
 	//start server
 	UA_StatusCode retval = UA_Server_run(server, 1, &running); //blocks until running=false
 

+ 2 - 1
src/ua_types_encoding_binary.c

@@ -856,7 +856,8 @@ UA_StatusCode UA_Variant_decodeBinary(UA_ByteString const *src, size_t *UA_RESTR
     /* array dimensions */
     if(isArray && (encodingByte & UA_VARIANT_ENCODINGMASKTYPE_DIMENSIONS)) {
         retval = UA_Int32_decodeBinary(src, offset, &dst->arrayDimensionsSize);
-        retval |= UA_Array_decodeBinary(src, offset, dst->arrayDimensionsSize, &dst->data,
+
+        retval |= UA_Array_decodeBinary(src, offset, dst->arrayDimensionsSize, (void**)&dst->arrayDimensions,
                                         &UA_TYPES[UA_TYPES_INT32]);
         if(retval != UA_STATUSCODE_GOOD) {
             dst->arrayDimensionsSize = -1;