Przeglądaj źródła

fix the unit tests

Julius Pfrommer 9 lat temu
rodzic
commit
8514dc7703

+ 2 - 2
CMakeLists.txt

@@ -429,8 +429,8 @@ if(BUILD_EXAMPLES)
 					           ${PROJECT_SOURCE_DIR}/tools/pyUANamespace/NodeID_Blacklist_FullNS0.txt
 					           ${PROJECT_SOURCE_DIR}/examples/server_nodeset.xml)
 					   
-	add_executable(server_nodeset ${PROJECT_SOURCE_DIR}/examples/server_nodeset.c ${PROJECT_BINARY_DIR}/src_generated/nodeset.c $<TARGET_OBJECTS:open62541-object>)
-	target_link_libraries(server_nodeset ${LIBS})
+	# add_executable(server_nodeset ${PROJECT_SOURCE_DIR}/examples/server_nodeset.c ${PROJECT_BINARY_DIR}/src_generated/nodeset.c $<TARGET_OBJECTS:open62541-object>)
+	# target_link_libraries(server_nodeset ${LIBS})
 
 	if(ENABLE_METHODCALLS)
 	  add_executable(server_method ${PROJECT_SOURCE_DIR}/examples/server_method.c $<TARGET_OBJECTS:open62541-object>)

+ 243 - 225
examples/server.c

@@ -46,7 +46,9 @@ UA_Logger logger;
 /*************************/
 /* Read-only data source */
 /*************************/
-static UA_StatusCode readTimeData(void *handle, const UA_NodeId nodeId, UA_Boolean sourceTimeStamp, const UA_NumericRange *range, UA_DataValue *value) {
+static UA_StatusCode
+readTimeData(void *handle, const UA_NodeId nodeId, UA_Boolean sourceTimeStamp,
+             const UA_NumericRange *range, UA_DataValue *value) {
     if(range) {
         value->hasStatus = UA_TRUE;
         value->status = UA_STATUSCODE_BADINDEXRANGEINVALID;
@@ -72,7 +74,9 @@ static UA_StatusCode readTimeData(void *handle, const UA_NodeId nodeId, UA_Boole
 /*      Only on Linux        */
 /*****************************/
 FILE* temperatureFile = NULL;
-static UA_StatusCode readTemperature(void *handle, const UA_NodeId nodeId, UA_Boolean sourceTimeStamp, const UA_NumericRange *range, UA_DataValue *value) {
+static UA_StatusCode
+readTemperature(void *handle, const UA_NodeId nodeId, UA_Boolean sourceTimeStamp,
+                const UA_NumericRange *range, UA_DataValue *value) {
     if(range) {
         value->hasStatus = UA_TRUE;
         value->status = UA_STATUSCODE_BADINDEXRANGEINVALID;
@@ -115,24 +119,29 @@ FILE* triggerFile = NULL;
 FILE* ledFile = NULL;
 UA_Boolean ledStatus = 0;
 
-static UA_StatusCode readLedStatus(void *handle, UA_NodeId nodeid, UA_Boolean sourceTimeStamp, const UA_NumericRange *range, UA_DataValue *value) {
-  if(range)
-    return UA_STATUSCODE_BADINDEXRANGEINVALID;
+static UA_StatusCode
+readLedStatus(void *handle, UA_NodeId nodeid, UA_Boolean sourceTimeStamp,
+              const UA_NumericRange *range, UA_DataValue *value) {
+    if(range)
+        return UA_STATUSCODE_BADINDEXRANGEINVALID;
 
-  value->hasValue = UA_TRUE;
-  UA_StatusCode retval = UA_Variant_setScalarCopy(&value->value, &ledStatus, &UA_TYPES[UA_TYPES_BOOLEAN]);
+    value->hasValue = UA_TRUE;
+    UA_StatusCode retval = UA_Variant_setScalarCopy(&value->value, &ledStatus,
+                                                    &UA_TYPES[UA_TYPES_BOOLEAN]);
 
-  if(retval != UA_STATUSCODE_GOOD)
-    return retval;
+    if(retval != UA_STATUSCODE_GOOD)
+        return retval;
   
-  if(sourceTimeStamp) {
-          value->sourceTimestamp = UA_DateTime_now();
-          value->hasSourceTimestamp = UA_TRUE;
-  }
-  return UA_STATUSCODE_GOOD;
+    if(sourceTimeStamp) {
+        value->sourceTimestamp = UA_DateTime_now();
+        value->hasSourceTimestamp = UA_TRUE;
+    }
+    return UA_STATUSCODE_GOOD;
 }
 
-static UA_StatusCode writeLedStatus(void *handle, const UA_NodeId nodeid, const UA_Variant *data, const UA_NumericRange *range) {
+static UA_StatusCode
+writeLedStatus(void *handle, const UA_NodeId nodeid,
+               const UA_Variant *data, const UA_NumericRange *range) {
     if(range)
         return UA_STATUSCODE_BADINDEXRANGEINVALID;
 
@@ -159,9 +168,10 @@ static UA_StatusCode writeLedStatus(void *handle, const UA_NodeId nodeid, const
 }
 
 #ifdef ENABLE_METHODCALLS
-static UA_StatusCode getMonitoredItems(const UA_NodeId objectId, const UA_Variant *input, UA_Variant *output, void *handle) {
+static UA_StatusCode
+getMonitoredItems(const UA_NodeId objectId, const UA_Variant *input,
+                  UA_Variant *output, void *handle) {
     UA_String tmp = UA_STRING("Hello World");
-    //UA_Server *theServer = (UA_Server *) handle; // Commented, would result in "unused variable" error
     UA_Variant_setScalarCopy(output, &tmp, &UA_TYPES[UA_TYPES_STRING]);
     printf("getMonitoredItems was called\n");
     return UA_STATUSCODE_GOOD;
@@ -197,243 +207,251 @@ static UA_ByteString loadCertificate(void) {
     return certificate;
 }
 
-UA_StatusCode nodeIter(UA_NodeId childId, UA_Boolean isInverse, UA_NodeId referenceTypeId, void *handle);
-UA_StatusCode nodeIter(UA_NodeId childId, UA_Boolean isInverse, UA_NodeId referenceTypeId, void *handle) {  
-  /*printf("References ns=%d;i=%d using i=%d ", childId.namespaceIndex, childId.identifier.numeric, referenceTypeId.identifier.numeric);
-  if (isInverse == UA_TRUE) {
-    printf(" (inverse)");
-  }
-  printf("\n");*/
-  
-  return UA_STATUSCODE_GOOD;
+static UA_StatusCode
+nodeIter(UA_NodeId childId, UA_Boolean isInverse, UA_NodeId referenceTypeId, void *handle) {  
+    return UA_STATUSCODE_GOOD;
 }
 
 int main(int argc, char** argv) {
-  signal(SIGINT, stopHandler); /* catches ctrl-c */
+    signal(SIGINT, stopHandler); /* catches ctrl-c */
 #ifdef UA_MULTITHREADING
-  pthread_rwlock_init(&writeLock, 0);
+    pthread_rwlock_init(&writeLock, 0);
 #endif
 
-  UA_Server *server = UA_Server_new(UA_ServerConfig_standard);
-  logger = Logger_Stdout_new();
-  UA_Server_setLogger(server, logger);
-  UA_ByteString certificate = loadCertificate();
-  UA_Server_setServerCertificate(server, certificate);
-  UA_ByteString_deleteMembers(&certificate);
-  UA_Server_addNetworkLayer(server, ServerNetworkLayerTCP_new(UA_ConnectionConfig_standard, 16664));
-
-  // add node with the datetime data source
-  UA_DataSource dateDataSource = (UA_DataSource) {.handle = NULL, .read = readTimeData, .write = NULL};
-  UA_VariableAttributes v_attr;
-  UA_VariableAttributes_init(&v_attr);
-  v_attr.description = UA_LOCALIZEDTEXT("en_US","current time");
-  v_attr.displayName = UA_LOCALIZEDTEXT("en_US","current time");
-  const UA_QualifiedName dateName = UA_QUALIFIEDNAME(1, "current time");
-  UA_AddNodesResult res;
-  res = UA_Server_addDataSourceVariableNode(server, UA_NODEID_NULL,
-                                            UA_NODEID_NUMERIC(0, UA_NS0ID_OBJECTSFOLDER),
-                                            UA_NODEID_NUMERIC(0, UA_NS0ID_ORGANIZES), dateName,
-                                            UA_NODEID_NULL, v_attr, dateDataSource);
-
-  // Get and reattach the datasource
-  UA_DataSource dataSourceCopy;
-  UA_Server_getNodeAttribute_value_dataSource(server, res.addedNodeId, &dataSourceCopy);
-  if (dataSourceCopy.read != dateDataSource.read)
-    UA_LOG_WARNING(logger, UA_LOGCATEGORY_USERLAND, "The returned dataSource is not the same as we set?");
-  else
-    UA_Server_setNodeAttribute_value_dataSource(server, res.addedNodeId, dataSourceCopy);
-#ifndef _WIN32
-  /* cpu temperature monitoring for linux machines */
-  if((temperatureFile = fopen("/sys/class/thermal/thermal_zone0/temp", "r"))) {
-          // add node with the data source
-          UA_DataSource temperatureDataSource = (UA_DataSource) {.handle = NULL, .read = readTemperature, .write = NULL};
-          const UA_QualifiedName tempName = UA_QUALIFIEDNAME(1, "cpu temperature");
-          UA_VariableAttributes_init(&v_attr);
-          v_attr.description = UA_LOCALIZEDTEXT("en_US","temperature");
-          v_attr.displayName = UA_LOCALIZEDTEXT("en_US","temperature");
-          UA_Server_addDataSourceVariableNode(server, UA_NODEID_NULL,
+    UA_Server *server = UA_Server_new(UA_ServerConfig_standard);
+    logger = Logger_Stdout_new();
+    UA_Server_setLogger(server, logger);
+    UA_ByteString certificate = loadCertificate();
+    UA_Server_setServerCertificate(server, certificate);
+    UA_ByteString_deleteMembers(&certificate);
+    UA_Server_addNetworkLayer(server, ServerNetworkLayerTCP_new(UA_ConnectionConfig_standard, 16664));
+
+    // add node with the datetime data source
+    UA_DataSource dateDataSource = (UA_DataSource) {.handle = NULL, .read = readTimeData, .write = NULL};
+    UA_VariableAttributes v_attr;
+    UA_VariableAttributes_init(&v_attr);
+    v_attr.description = UA_LOCALIZEDTEXT("en_US","current time");
+    v_attr.displayName = UA_LOCALIZEDTEXT("en_US","current time");
+    const UA_QualifiedName dateName = UA_QUALIFIEDNAME(1, "current time");
+    UA_AddNodesResult res;
+    res = UA_Server_addDataSourceVariableNode(server, UA_NODEID_NULL,
                                               UA_NODEID_NUMERIC(0, UA_NS0ID_OBJECTSFOLDER),
-                                              UA_NODEID_NUMERIC(0, UA_NS0ID_ORGANIZES), tempName,
-                                              UA_NODEID_NULL, v_attr, temperatureDataSource);
-  }
-
-  /* LED control for rpi */
-  if(access("/sys/class/leds/led0/trigger", F_OK ) != -1 || access("/sys/class/leds/led0/brightness", F_OK ) != -1) {
-    if((triggerFile = fopen("/sys/class/leds/led0/trigger", "w")) && (ledFile = fopen("/sys/class/leds/led0/brightness", "w"))) {
-      //setting led mode to manual
-      fprintf(triggerFile, "%s", "none");
-      fflush(triggerFile);
-
-      //turning off led initially
-      fprintf(ledFile, "%s", "1");
-      fflush(ledFile);
-
-      // add node with the LED status data source
-      UA_DataSource ledStatusDataSource = (UA_DataSource) {.handle = NULL, .read = readLedStatus, .write = writeLedStatus};
-      UA_VariableAttributes_init(&v_attr);
-      v_attr.description = UA_LOCALIZEDTEXT("en_US","status LED");
-      v_attr.displayName = UA_LOCALIZEDTEXT("en_US","status LED");
-      const UA_QualifiedName statusName = UA_QUALIFIEDNAME(0, "status LED");
-      UA_Server_addDataSourceVariableNode(server, UA_NODEID_NULL,
-                                          UA_NODEID_NUMERIC(0, UA_NS0ID_OBJECTSFOLDER),
-                                          UA_NODEID_NUMERIC(0, UA_NS0ID_ORGANIZES), statusName,
-                                          UA_NODEID_NULL, v_attr, ledStatusDataSource);
-    } else
-      UA_LOG_WARNING(logger, UA_LOGCATEGORY_USERLAND,
-                     "[Raspberry Pi] LED file exist, but is not accessible (try to run server with sudo)");
-  }
+                                              UA_NODEID_NUMERIC(0, UA_NS0ID_ORGANIZES), dateName,
+                                              UA_NODEID_NULL, v_attr, dateDataSource);
+
+    // Get and reattach the datasource
+    UA_DataSource dataSourceCopy;
+    UA_Server_getNodeAttribute_value_dataSource(server, res.addedNodeId, &dataSourceCopy);
+    if (dataSourceCopy.read != dateDataSource.read)
+        UA_LOG_WARNING(logger, UA_LOGCATEGORY_USERLAND, "The returned dataSource is not the same as we set?");
+    else
+        UA_Server_setNodeAttribute_value_dataSource(server, res.addedNodeId, dataSourceCopy);
+#ifndef _WIN32
+    /* cpu temperature monitoring for linux machines */
+    if((temperatureFile = fopen("/sys/class/thermal/thermal_zone0/temp", "r"))) {
+        // add node with the data source
+        UA_DataSource temperatureDataSource = (UA_DataSource) {
+            .handle = NULL, .read = readTemperature, .write = NULL};
+        const UA_QualifiedName tempName = UA_QUALIFIEDNAME(1, "cpu temperature");
+        UA_VariableAttributes_init(&v_attr);
+        v_attr.description = UA_LOCALIZEDTEXT("en_US","temperature");
+        v_attr.displayName = UA_LOCALIZEDTEXT("en_US","temperature");
+        UA_Server_addDataSourceVariableNode(server, UA_NODEID_NULL,
+                                            UA_NODEID_NUMERIC(0, UA_NS0ID_OBJECTSFOLDER),
+                                            UA_NODEID_NUMERIC(0, UA_NS0ID_ORGANIZES), tempName,
+                                            UA_NODEID_NULL, v_attr, temperatureDataSource);
+    }
+
+    /* LED control for rpi */
+    if(access("/sys/class/leds/led0/trigger", F_OK ) != -1 ||
+       access("/sys/class/leds/led0/brightness", F_OK ) != -1) {
+        if((triggerFile = fopen("/sys/class/leds/led0/trigger", "w")) &&
+           (ledFile = fopen("/sys/class/leds/led0/brightness", "w"))) {
+            //setting led mode to manual
+            fprintf(triggerFile, "%s", "none");
+            fflush(triggerFile);
+
+            //turning off led initially
+            fprintf(ledFile, "%s", "1");
+            fflush(ledFile);
+
+            // add node with the LED status data source
+            UA_DataSource ledStatusDataSource = (UA_DataSource) {
+                .handle = NULL, .read = readLedStatus, .write = writeLedStatus};
+            UA_VariableAttributes_init(&v_attr);
+            v_attr.description = UA_LOCALIZEDTEXT("en_US","status LED");
+            v_attr.displayName = UA_LOCALIZEDTEXT("en_US","status LED");
+            const UA_QualifiedName statusName = UA_QUALIFIEDNAME(0, "status LED");
+            UA_Server_addDataSourceVariableNode(server, UA_NODEID_NULL,
+                                                UA_NODEID_NUMERIC(0, UA_NS0ID_OBJECTSFOLDER),
+                                                UA_NODEID_NUMERIC(0, UA_NS0ID_ORGANIZES), statusName,
+                                                UA_NODEID_NULL, v_attr, ledStatusDataSource);
+        } else
+            UA_LOG_WARNING(logger, UA_LOGCATEGORY_USERLAND,
+                           "[Raspberry Pi] LED file exist, but is not accessible (try to run server with sudo)");
+    }
 #endif
 
-  // add a static variable node to the adresspace
-  UA_VariableAttributes myVar;
-  UA_VariableAttributes_init(&myVar);
-  myVar.description = UA_LOCALIZEDTEXT("en_US", "the answer");
-  myVar.displayName = UA_LOCALIZEDTEXT("en_US", "the answer");
-  UA_Int32 myInteger = 42;
-  UA_Variant_setScalarCopy(&myVar.value, &myInteger, &UA_TYPES[UA_TYPES_INT32]);
-  const UA_QualifiedName myIntegerName = UA_QUALIFIEDNAME(1, "the answer");
-  const UA_NodeId myIntegerNodeId = UA_NODEID_STRING(1, "the.answer");
-  UA_NodeId parentNodeId = UA_NODEID_NUMERIC(0, UA_NS0ID_OBJECTSFOLDER);
-  UA_NodeId parentReferenceNodeId = UA_NODEID_NUMERIC(0, UA_NS0ID_ORGANIZES);
-  UA_Server_addVariableNode(server, myIntegerNodeId, parentNodeId, parentReferenceNodeId,
-                            myIntegerName, UA_NODEID_NULL, myVar);
-  UA_Variant_deleteMembers(&myVar.value);
-
-  /**************/
-  /* Demo Nodes */
-  /**************/
+    // add a static variable node to the adresspace
+    UA_VariableAttributes myVar;
+    UA_VariableAttributes_init(&myVar);
+    myVar.description = UA_LOCALIZEDTEXT("en_US", "the answer");
+    myVar.displayName = UA_LOCALIZEDTEXT("en_US", "the answer");
+    UA_Int32 myInteger = 42;
+    UA_Variant_setScalarCopy(&myVar.value, &myInteger, &UA_TYPES[UA_TYPES_INT32]);
+    const UA_QualifiedName myIntegerName = UA_QUALIFIEDNAME(1, "the answer");
+    const UA_NodeId myIntegerNodeId = UA_NODEID_STRING(1, "the.answer");
+    UA_NodeId parentNodeId = UA_NODEID_NUMERIC(0, UA_NS0ID_OBJECTSFOLDER);
+    UA_NodeId parentReferenceNodeId = UA_NODEID_NUMERIC(0, UA_NS0ID_ORGANIZES);
+    UA_Server_addVariableNode(server, myIntegerNodeId, parentNodeId, parentReferenceNodeId,
+                              myIntegerName, UA_NODEID_NULL, myVar);
+    UA_Variant_deleteMembers(&myVar.value);
+
+    /**************/
+    /* Demo Nodes */
+    /**************/
 
 #define DEMOID 50000
-  UA_ObjectAttributes object_attr;
-  UA_ObjectAttributes_init(&object_attr);
-  object_attr.description = UA_LOCALIZEDTEXT("en_US","Demo");
-  object_attr.displayName = UA_LOCALIZEDTEXT("en_US","Demo");
-  UA_Server_addObjectNode(server, UA_NODEID_NUMERIC(1, DEMOID), UA_NODEID_NUMERIC(0, UA_NS0ID_OBJECTSFOLDER),
-                          UA_NODEID_NUMERIC(0, UA_NS0ID_ORGANIZES), UA_QUALIFIEDNAME(1, "Demo"),
-                          UA_NODEID_NULL, object_attr);
+    UA_ObjectAttributes object_attr;
+    UA_ObjectAttributes_init(&object_attr);
+    object_attr.description = UA_LOCALIZEDTEXT("en_US","Demo");
+    object_attr.displayName = UA_LOCALIZEDTEXT("en_US","Demo");
+    UA_Server_addObjectNode(server, UA_NODEID_NUMERIC(1, DEMOID),
+                            UA_NODEID_NUMERIC(0, UA_NS0ID_OBJECTSFOLDER),
+                            UA_NODEID_NUMERIC(0, UA_NS0ID_ORGANIZES), UA_QUALIFIEDNAME(1, "Demo"),
+                            UA_NODEID_NULL, object_attr);
 
 #define SCALARID 50001
-  object_attr.description = UA_LOCALIZEDTEXT("en_US","Scalar");
-  object_attr.displayName = UA_LOCALIZEDTEXT("en_US","Scalar");
-  UA_Server_addObjectNode(server, UA_NODEID_NUMERIC(1, SCALARID),
-                          UA_NODEID_NUMERIC(1, DEMOID), UA_NODEID_NUMERIC(0, UA_NS0ID_ORGANIZES),
-                          UA_QUALIFIEDNAME(1, "Scalar"), UA_NODEID_NULL, object_attr);
+    object_attr.description = UA_LOCALIZEDTEXT("en_US","Scalar");
+    object_attr.displayName = UA_LOCALIZEDTEXT("en_US","Scalar");
+    UA_Server_addObjectNode(server, UA_NODEID_NUMERIC(1, SCALARID),
+                            UA_NODEID_NUMERIC(1, DEMOID), UA_NODEID_NUMERIC(0, UA_NS0ID_ORGANIZES),
+                            UA_QUALIFIEDNAME(1, "Scalar"), UA_NODEID_NULL, object_attr);
 
 #define ARRAYID 50002
-  object_attr.description = UA_LOCALIZEDTEXT("en_US","Array");
-  object_attr.displayName = UA_LOCALIZEDTEXT("en_US","Array");
-  UA_Server_addObjectNode(server, UA_NODEID_NUMERIC(1, ARRAYID),
-                          UA_NODEID_NUMERIC(1, DEMOID), UA_NODEID_NUMERIC(0, UA_NS0ID_ORGANIZES),
-                          UA_QUALIFIEDNAME(1, "Array"), UA_NODEID_NULL, object_attr);
+    object_attr.description = UA_LOCALIZEDTEXT("en_US","Array");
+    object_attr.displayName = UA_LOCALIZEDTEXT("en_US","Array");
+    UA_Server_addObjectNode(server, UA_NODEID_NUMERIC(1, ARRAYID),
+                            UA_NODEID_NUMERIC(1, DEMOID), UA_NODEID_NUMERIC(0, UA_NS0ID_ORGANIZES),
+                            UA_QUALIFIEDNAME(1, "Array"), UA_NODEID_NULL, object_attr);
 
 #define MATRIXID 50003
-  object_attr.description = UA_LOCALIZEDTEXT("en_US","Matrix");
-  object_attr.displayName = UA_LOCALIZEDTEXT("en_US","Matrix");
-  UA_Server_addObjectNode(server, UA_NODEID_NUMERIC(1, MATRIXID), UA_NODEID_NUMERIC(1, DEMOID),
-                          UA_NODEID_NUMERIC(0, UA_NS0ID_ORGANIZES), UA_QUALIFIEDNAME(1, "Matrix"),
-                          UA_NODEID_NULL, object_attr);
-
-  UA_UInt32 id = 51000; // running id in namespace 0
-  for(UA_UInt32 type = 0; UA_IS_BUILTIN(type); type++) {
-    if(type == UA_TYPES_VARIANT || type == UA_TYPES_DIAGNOSTICINFO)
-        continue;
-
-    UA_VariableAttributes attr;
-    UA_VariableAttributes_init(&attr);
-    char name[15];
-    sprintf(name, "%02d", type);
-    attr.displayName = UA_LOCALIZEDTEXT("en_US",name);
-    UA_QualifiedName qualifiedName = UA_QUALIFIEDNAME(1, name);
-
-    /* add a scalar node for every built-in type */
-    void *value = UA_new(&UA_TYPES[type]);
-    UA_Variant_setScalar(&attr.value, value, &UA_TYPES[type]);
-    UA_Server_addVariableNode(server, UA_NODEID_NUMERIC(1, ++id), UA_NODEID_NUMERIC(1, SCALARID),
-                              UA_NODEID_NUMERIC(0, UA_NS0ID_ORGANIZES), qualifiedName, UA_NODEID_NULL, attr);
-    UA_Variant_deleteMembers(&attr.value);
-
-    /* add an array node for every built-in type */
-    UA_Variant_setArray(&attr.value, UA_Array_new(&UA_TYPES[type], 10), 10, &UA_TYPES[type]);
-    UA_Server_addVariableNode(server, UA_NODEID_NUMERIC(1, ++id), UA_NODEID_NUMERIC(1, ARRAYID),
-                              UA_NODEID_NUMERIC(0, UA_NS0ID_ORGANIZES), qualifiedName, UA_NODEID_NULL, attr);
-    UA_Variant_deleteMembers(&attr.value);
-
-    /* add an matrix node for every built-in type */
-    void* myMultiArray = UA_Array_new(&UA_TYPES[type],9);
-    attr.value.arrayDimensions = UA_Array_new(&UA_TYPES[UA_TYPES_INT32],2);
-    attr.value.arrayDimensions[0] = 3;
-    attr.value.arrayDimensions[1] = 3;
-    attr.value.arrayDimensionsSize = 2;
-    attr.value.arrayLength = 9;
-    attr.value.data = myMultiArray;
-    attr.value.type = &UA_TYPES[type];
-    UA_Server_addVariableNode(server, UA_NODEID_NUMERIC(1, ++id), UA_NODEID_NUMERIC(1, MATRIXID),
-                              UA_NODEID_NUMERIC(0, UA_NS0ID_ORGANIZES), qualifiedName, UA_NODEID_NULL, attr);
-    UA_Variant_deleteMembers(&attr.value);
-  }
+    object_attr.description = UA_LOCALIZEDTEXT("en_US","Matrix");
+    object_attr.displayName = UA_LOCALIZEDTEXT("en_US","Matrix");
+    UA_Server_addObjectNode(server, UA_NODEID_NUMERIC(1, MATRIXID), UA_NODEID_NUMERIC(1, DEMOID),
+                            UA_NODEID_NUMERIC(0, UA_NS0ID_ORGANIZES), UA_QUALIFIEDNAME(1, "Matrix"),
+                            UA_NODEID_NULL, object_attr);
+
+    UA_UInt32 id = 51000; // running id in namespace 0
+    for(UA_UInt32 type = 0; UA_IS_BUILTIN(type); type++) {
+        if(type == UA_TYPES_VARIANT || type == UA_TYPES_DIAGNOSTICINFO)
+            continue;
+
+        UA_VariableAttributes attr;
+        UA_VariableAttributes_init(&attr);
+        char name[15];
+        sprintf(name, "%02d", type);
+        attr.displayName = UA_LOCALIZEDTEXT("en_US",name);
+        UA_QualifiedName qualifiedName = UA_QUALIFIEDNAME(1, name);
+
+        /* add a scalar node for every built-in type */
+        void *value = UA_new(&UA_TYPES[type]);
+        UA_Variant_setScalar(&attr.value, value, &UA_TYPES[type]);
+        UA_Server_addVariableNode(server, UA_NODEID_NUMERIC(1, ++id),
+                                  UA_NODEID_NUMERIC(1, SCALARID),
+                                  UA_NODEID_NUMERIC(0, UA_NS0ID_ORGANIZES),
+                                  qualifiedName, UA_NODEID_NULL, attr);
+        UA_Variant_deleteMembers(&attr.value);
+
+        /* add an array node for every built-in type */
+        UA_Variant_setArray(&attr.value, UA_Array_new(&UA_TYPES[type], 10),
+                            10, &UA_TYPES[type]);
+        UA_Server_addVariableNode(server, UA_NODEID_NUMERIC(1, ++id),
+                                  UA_NODEID_NUMERIC(1, ARRAYID),
+                                  UA_NODEID_NUMERIC(0, UA_NS0ID_ORGANIZES),
+                                  qualifiedName, UA_NODEID_NULL, attr);
+        UA_Variant_deleteMembers(&attr.value);
+
+        /* add an matrix node for every built-in type */
+        void* myMultiArray = UA_Array_new(&UA_TYPES[type],9);
+        attr.value.arrayDimensions = UA_Array_new(&UA_TYPES[UA_TYPES_INT32],2);
+        attr.value.arrayDimensions[0] = 3;
+        attr.value.arrayDimensions[1] = 3;
+        attr.value.arrayDimensionsSize = 2;
+        attr.value.arrayLength = 9;
+        attr.value.data = myMultiArray;
+        attr.value.type = &UA_TYPES[type];
+        UA_Server_addVariableNode(server, UA_NODEID_NUMERIC(1, ++id),
+                                  UA_NODEID_NUMERIC(1, MATRIXID),
+                                  UA_NODEID_NUMERIC(0, UA_NS0ID_ORGANIZES),
+                                  qualifiedName, UA_NODEID_NULL, attr);
+        UA_Variant_deleteMembers(&attr.value);
+    }
 
 #ifdef ENABLE_METHODCALLS
-  UA_Argument inputArguments;
-  UA_Argument_init(&inputArguments);
-  inputArguments.arrayDimensionsSize = -1;
-  inputArguments.arrayDimensions = NULL;
-  inputArguments.dataType = UA_TYPES[UA_TYPES_STRING].typeId;
-  inputArguments.description = UA_LOCALIZEDTEXT("en_US", "A String");
-  inputArguments.name = UA_STRING("Input an integer");
-  inputArguments.valueRank = -1;
-
-  UA_Argument outputArguments;
-  UA_Argument_init(&outputArguments);
-  outputArguments.arrayDimensionsSize = -1;
-  outputArguments.arrayDimensions = NULL;
-  outputArguments.dataType = UA_TYPES[UA_TYPES_STRING].typeId;
-  outputArguments.description = UA_LOCALIZEDTEXT("en_US", "A String");
-  outputArguments.name = UA_STRING("Input an integer");
-  outputArguments.valueRank = -1;
-
-  UA_NodeAttributes addmethodattributes;
-  UA_NodeAttributes_init(&addmethodattributes);
-  addmethodattributes.description = UA_LOCALIZEDTEXT("en_US", "Return a single argument as passed by the caller");
-  addmethodattributes.displayName = UA_LOCALIZEDTEXT("en_US", "ping");
-  UA_Server_addMethodNode(server, UA_NODEID_NUMERIC(1,62541),
-                          UA_NODEID_NUMERIC(0, UA_NS0ID_OBJECTSFOLDER),
-                          UA_NODEID_NUMERIC(0, UA_NS0ID_HASCOMPONENT),
-                          UA_QUALIFIEDNAME(1,"ping"), addmethodattributes,
-                          &getMonitoredItems, // Call this method
-                          (void *) server,    // Pass our server pointer as a handle to the method
-                          1, &inputArguments, 1, &outputArguments);
+    UA_Argument inputArguments;
+    UA_Argument_init(&inputArguments);
+    inputArguments.arrayDimensionsSize = -1;
+    inputArguments.arrayDimensions = NULL;
+    inputArguments.dataType = UA_TYPES[UA_TYPES_STRING].typeId;
+    inputArguments.description = UA_LOCALIZEDTEXT("en_US", "A String");
+    inputArguments.name = UA_STRING("Input an integer");
+    inputArguments.valueRank = -1;
+
+    UA_Argument outputArguments;
+    UA_Argument_init(&outputArguments);
+    outputArguments.arrayDimensionsSize = -1;
+    outputArguments.arrayDimensions = NULL;
+    outputArguments.dataType = UA_TYPES[UA_TYPES_STRING].typeId;
+    outputArguments.description = UA_LOCALIZEDTEXT("en_US", "A String");
+    outputArguments.name = UA_STRING("Input an integer");
+    outputArguments.valueRank = -1;
+
+    UA_MethodAttributes addmethodattributes;
+    UA_MethodAttributes_init(&addmethodattributes);
+    addmethodattributes.description = UA_LOCALIZEDTEXT("en_US", "Return a single argument as passed by the caller");
+    addmethodattributes.displayName = UA_LOCALIZEDTEXT("en_US", "ping");
+    addmethodattributes.executable = UA_TRUE;
+    addmethodattributes.userExecutable = UA_TRUE;
+    UA_Server_addMethodNode(server, UA_NODEID_NUMERIC(1,62541),
+                            UA_NODEID_NUMERIC(0, UA_NS0ID_OBJECTSFOLDER),
+                            UA_NODEID_NUMERIC(0, UA_NS0ID_HASCOMPONENT),
+                            UA_QUALIFIEDNAME(1,"ping"), addmethodattributes,
+                            &getMonitoredItems, // Call this method
+                            (void *) server,    // Pass our server pointer as a handle to the method
+                            1, &inputArguments, 1, &outputArguments);
 #endif
    
-  // Example for iterating over all nodes referenced by "Objects":
-  //printf("Nodes connected to 'Objects':\n=============================\n");
-  UA_Server_forEachChildNodeCall(server, UA_NODEID_NUMERIC(0, UA_NS0ID_OBJECTSFOLDER), nodeIter, NULL);
+    // Example for iterating over all nodes referenced by "Objects":
+    //printf("Nodes connected to 'Objects':\n=============================\n");
+    UA_Server_forEachChildNodeCall(server, UA_NODEID_NUMERIC(0, UA_NS0ID_OBJECTSFOLDER), nodeIter, NULL);
   
-  // Some easy localization
-  UA_LocalizedText objectsName = UA_LOCALIZEDTEXT("de_DE", "Objekte");
-  UA_Server_setNodeAttribute_displayName(server, UA_NODEID_NUMERIC(0, UA_NS0ID_OBJECTSFOLDER), &objectsName);
+    // Some easy localization
+    UA_LocalizedText objectsName = UA_LOCALIZEDTEXT("de_DE", "Objekte");
+    UA_Server_setNodeAttribute_displayName(server, UA_NODEID_NUMERIC(0, UA_NS0ID_OBJECTSFOLDER), &objectsName);
   
-  //start server
-  UA_StatusCode retval = UA_Server_run(server, 1, &running); //blocks until running=false
+    //start server
+    UA_StatusCode retval = UA_Server_run(server, 1, &running); //blocks until running=false
 
-  //ctrl-c received -> clean up
-  UA_Server_delete(server);
+    //ctrl-c received -> clean up
+    UA_Server_delete(server);
 
-  if(temperatureFile)
-      fclose(temperatureFile);
+    if(temperatureFile)
+        fclose(temperatureFile);
 
-  if(triggerFile) {
-          fseek(triggerFile, 0, SEEK_SET);
-          //setting led mode to default
-          fprintf(triggerFile, "%s", "mmc0");
-          fclose(triggerFile);
-  }
+    if(triggerFile) {
+        fseek(triggerFile, 0, SEEK_SET);
+        //setting led mode to default
+        fprintf(triggerFile, "%s", "mmc0");
+        fclose(triggerFile);
+    }
   
-  if(ledFile)
-    fclose(ledFile);
+    if(ledFile)
+        fclose(ledFile);
 
 #ifdef UA_MULTITHREADING
-  pthread_rwlock_destroy(&writeLock);
+    pthread_rwlock_destroy(&writeLock);
 #endif
 
-  return retval;
+    return retval;
 }

+ 35 - 20
examples/server_method.c

@@ -18,7 +18,9 @@
 UA_Boolean running = UA_TRUE;
 UA_Logger logger;
 
-static UA_StatusCode helloWorldMethod(const UA_NodeId objectId, const UA_Variant *input, UA_Variant *output, void *handle) {
+static UA_StatusCode
+helloWorldMethod(const UA_NodeId objectId, const UA_Variant *input,
+                 UA_Variant *output, void *handle) {
         UA_String *inputStr = (UA_String*)input->data;
         UA_String tmp = UA_STRING_ALLOC("Hello ");
         if(inputStr->length > 0) {
@@ -32,15 +34,13 @@ static UA_StatusCode helloWorldMethod(const UA_NodeId objectId, const UA_Variant
         return UA_STATUSCODE_GOOD;
 } 
 
-static UA_StatusCode IncInt32ArrayValuesMethod(const UA_NodeId objectId,
-                                         const UA_Variant *input, UA_Variant *output, void *handle) {
-
-
+static UA_StatusCode
+IncInt32ArrayValuesMethod(const UA_NodeId objectId, const UA_Variant *input,
+                          UA_Variant *output, void *handle) {
 	UA_Variant_setArrayCopy(output,input->data,5,&UA_TYPES[UA_TYPES_INT32]);
-	for(int i = 0; i< input->arrayLength; i++){
+	for(int i = 0; i< input->arrayLength; i++) {
 		((UA_Int32*)output->data)[i] = ((UA_Int32*)input->data)[i] + 1;
 	}
-
 	return UA_STATUSCODE_GOOD;
 }
 
@@ -77,10 +77,18 @@ int main(int argc, char** argv) {
     outputArguments.name = UA_STRING("MyOutput");
     outputArguments.valueRank = -1;
         
-    UA_Server_addMethodNode(server, UA_NODEID_NUMERIC(1,62541), UA_QUALIFIEDNAME(1, "hello world"), 
-                            UA_LOCALIZEDTEXT("en_US","Hello World"), UA_LOCALIZEDTEXT("en_US","Say `Hello World`"),
-                            UA_NODEID_NUMERIC(0, UA_NS0ID_OBJECTSFOLDER), UA_NODEID_NUMERIC(0, UA_NS0ID_HASCOMPONENT),
-                            0, 0, &helloWorldMethod, NULL, 1, &inputArguments, 1, &outputArguments, NULL);
+    UA_MethodAttributes helloAttr;
+    UA_MethodAttributes_init(&helloAttr);
+    helloAttr.description = UA_LOCALIZEDTEXT("en_US","Say `Hello World`");
+    helloAttr.displayName = UA_LOCALIZEDTEXT("en_US","Hello World");
+    helloAttr.executable = UA_TRUE;
+    helloAttr.userExecutable = UA_TRUE;
+    UA_Server_addMethodNode(server, UA_NODEID_NUMERIC(1,62541),
+                            UA_NODEID_NUMERIC(0, UA_NS0ID_OBJECTSFOLDER),
+                            UA_NODEID_NUMERIC(0, UA_NS0ID_HASCOMPONENT),
+                            UA_QUALIFIEDNAME(1, "hello world"), 
+                            helloAttr, &helloWorldMethod, NULL,
+                            1, &inputArguments, 1, &outputArguments);
 
     //END OF EXAMPLE 1
 
@@ -105,20 +113,27 @@ int main(int argc, char** argv) {
     pOutputDimensions[0] = 5;
     outputArguments.arrayDimensions = pOutputDimensions;
     outputArguments.dataType = UA_TYPES[UA_TYPES_INT32].typeId;
-    outputArguments.description = UA_LOCALIZEDTEXT("en_US",
-                    "increment each array index");
-    outputArguments.name = UA_STRING(
-                    "output is the array, each index is incremented by one");
+    outputArguments.description = UA_LOCALIZEDTEXT("en_US", "increment each array index");
+    outputArguments.name = UA_STRING("output is the array, each index is incremented by one");
     outputArguments.valueRank = 1;
 
-    UA_Server_addMethodNode(server, UA_NODEID_STRING(1, "IncInt32ArrayValues"), UA_QUALIFIEDNAME(1, "IncInt32ArrayValues"),
-                            UA_LOCALIZEDTEXT("en_US","1dArrayExample"), UA_LOCALIZEDTEXT("en_US","1dArrayExample"),
-                            UA_NODEID_NUMERIC(0, UA_NS0ID_OBJECTSFOLDER), UA_NODEID_NUMERIC(0, UA_NS0ID_HASCOMPONENT), 
-                            0, 0, &IncInt32ArrayValuesMethod, NULL, 1, &inputArguments, 1, &outputArguments, NULL);
+    
+    UA_MethodAttributes incAttr;
+    UA_MethodAttributes_init(&incAttr);
+    incAttr.description = UA_LOCALIZEDTEXT("en_US","1dArrayExample");
+    incAttr.displayName = UA_LOCALIZEDTEXT("en_US","1dArrayExample");
+    incAttr.executable = UA_TRUE;
+    incAttr.userExecutable = UA_TRUE;
+    UA_Server_addMethodNode(server, UA_NODEID_STRING(1, "IncInt32ArrayValues"),
+                            UA_NODEID_NUMERIC(0, UA_NS0ID_OBJECTSFOLDER),
+                            UA_NODEID_NUMERIC(0, UA_NS0ID_HASCOMPONENT), 
+                            UA_QUALIFIEDNAME(1, "IncInt32ArrayValues"),
+                            incAttr, &IncInt32ArrayValuesMethod, NULL,
+                            1, &inputArguments, 1, &outputArguments);
     //END OF EXAMPLE 2
 
     /* start server */
-    UA_StatusCode retval = UA_Server_run(server, 1, &running); //blocks until running=false
+    UA_StatusCode retval = UA_Server_run(server, 1, &running);
 
     /* ctrl-c received -> clean up */
     UA_UInt32_delete(pInputDimensions);

+ 13 - 7
examples/server_variable.c

@@ -22,12 +22,15 @@ static void stopHandler(int sign) {
     running = 0;
 }
 
-static void onRead(void *handle, const UA_NodeId nodeid,  const UA_Variant *data, const UA_NumericRange *range){
-    UA_LOG_INFO(logger, UA_LOGCATEGORY_USERLAND, "onRead; handle is: %i", (uintptr_t)handle);
+static void onRead(void *handle, const UA_NodeId nodeid, const UA_Variant *data,
+                   const UA_NumericRange *range) {
+    UA_LOG_INFO(logger, UA_LOGCATEGORY_USERLAND,
+                "onRead; handle is: %i", (uintptr_t)handle);
 }
 
-static void onWrite(void *handle, const UA_NodeId nodeid, const UA_Variant *data, const UA_NumericRange *range){
-    UA_LOG_INFO(logger, UA_LOGCATEGORY_USERLAND, "onWrite; handle is: %i", (uintptr_t)handle);
+static void onWrite(void *h, const UA_NodeId nodeid, const UA_Variant *data,
+                    const UA_NumericRange *range) {
+    UA_LOG_INFO(logger, UA_LOGCATEGORY_USERLAND, "onWrite; handle: %i", (uintptr_t)h);
 }
 
 int main(int argc, char** argv) {
@@ -36,7 +39,9 @@ int main(int argc, char** argv) {
     UA_Server *server = UA_Server_new(UA_ServerConfig_standard);
     logger = Logger_Stdout_new();
     UA_Server_setLogger(server, logger);
-    UA_Server_addNetworkLayer(server, ServerNetworkLayerTCP_new(UA_ConnectionConfig_standard, 16664));
+    UA_ServerNetworkLayer *nl;
+    nl = ServerNetworkLayerTCP_new(UA_ConnectionConfig_standard, 16664);
+    UA_Server_addNetworkLayer(server, nl);
 
     /* add a variable node to the address space */
     UA_VariableAttributes attr;
@@ -49,8 +54,9 @@ int main(int argc, char** argv) {
     UA_QualifiedName myIntegerName = UA_QUALIFIEDNAME(1, "the answer");
     UA_NodeId parentNodeId = UA_NODEID_NUMERIC(0, UA_NS0ID_OBJECTSFOLDER);
     UA_NodeId parentReferenceNodeId = UA_NODEID_NUMERIC(0, UA_NS0ID_ORGANIZES);
-    UA_Server_addVariableNode(server, myIntegerNodeId, parentNodeId, parentReferenceNodeId,
-                              myIntegerName, UA_NODEID_NULL, attr);
+    UA_Server_addVariableNode(server, myIntegerNodeId, parentNodeId,
+                              parentReferenceNodeId, myIntegerName,
+                              UA_NODEID_NULL, attr);
 
     UA_ValueCallback callback = {(void*)7, onRead, onWrite};
     UA_Server_setAttribute_value_callback(server, myIntegerNodeId, callback);

+ 3 - 3
include/ua_server.h

@@ -213,8 +213,6 @@ typedef struct {
 UA_StatusCode UA_EXPORT UA_Server_addReference(UA_Server *server, const UA_NodeId *sourceId,
                                                const UA_NodeId *refTypeId, const UA_ExpandedNodeId *targetId);
 
-UA_StatusCode UA_EXPORT UA_Server_deleteNode(UA_Server *server, UA_NodeId nodeId);
-
 /* Don't use this function. There are typed versions as inline functions. */
 UA_AddNodesResult UA_EXPORT
 UA_Server_addNode(UA_Server *server, const UA_NodeClass nodeClass, const UA_NodeId requestedNewNodeId,
@@ -296,12 +294,14 @@ typedef UA_StatusCode (*UA_MethodCallback)(const UA_NodeId objectId, const UA_Va
 UA_AddNodesResult UA_EXPORT
 UA_Server_addMethodNode(UA_Server *server, const UA_NodeId requestedNewNodeId,
                         const UA_NodeId parentNodeId, const UA_NodeId referenceTypeId,
-                        const UA_QualifiedName browseName, const UA_NodeAttributes attr,
+                        const UA_QualifiedName browseName, const UA_MethodAttributes attr,
                         UA_MethodCallback method, void *handle,
                         UA_Int32 inputArgumentsSize, const UA_Argument* inputArguments, 
                         UA_Int32 outputArgumentsSize, const UA_Argument* outputArguments);
 #endif
 
+UA_StatusCode UA_EXPORT UA_Server_deleteNode(UA_Server *server, UA_NodeId nodeId);
+
 typedef UA_StatusCode (*UA_NodeIteratorCallback) (UA_NodeId childId, UA_Boolean isInverse, UA_NodeId referenceTypeId, void *handle);
 
 /** Iterate over all nodes referenced by parentNodeId by calling the callback function for each

+ 109 - 73
src/server/ua_server.c

@@ -39,9 +39,6 @@ static const UA_ExpandedNodeId expandedNodeIdBaseDataVariabletype = {
     .nodeId = {.namespaceIndex = 0, .identifierType = UA_NODEIDTYPE_NUMERIC,
                .identifier.numeric = UA_NS0ID_HASTYPEDEFINITION},
     .namespaceUri = {.length = -1, .data = UA_NULL}, .serverIndex = 0};
-static const UA_NodeId nodeIdBaseDataVariabletype = {
-    .namespaceIndex = 0, .identifierType = UA_NODEIDTYPE_NUMERIC,
-    .identifier.numeric = UA_NS0ID_HASTYPEDEFINITION};
 
 #ifndef ENABLE_GENERATE_NAMESPACE0
 static const UA_ExpandedNodeId expandedNodeIdNonHierarchicalReferences = {
@@ -68,7 +65,7 @@ static void UA_ExternalNamespace_deleteMembers(UA_ExternalNamespace *ens) {
     ens->externalNodeStore.destroy(ens->externalNodeStore.ensHandle);
 }
 
-static void UA_Server_deleteExternalNamespaces(UA_Server *server){
+static void UA_Server_deleteExternalNamespaces(UA_Server *server) {
 	for(UA_UInt32 i = 0; i < server->externalNamespacesSize; i++){
 		UA_ExternalNamespace_deleteMembers(&(server->externalNamespaces[i]));
 	}
@@ -79,39 +76,43 @@ static void UA_Server_deleteExternalNamespaces(UA_Server *server){
 	}
 }
 
-UA_StatusCode UA_EXPORT UA_Server_addExternalNamespace(UA_Server *server, UA_UInt16 namespaceIndex,
-                                                       const UA_String *url, UA_ExternalNodeStore *nodeStore) {
+UA_StatusCode UA_EXPORT
+UA_Server_addExternalNamespace(UA_Server *server, UA_UInt16 namespaceIndex,
+                               const UA_String *url, UA_ExternalNodeStore *nodeStore) {
 	if(nodeStore == UA_NULL)
 		return UA_STATUSCODE_BADARGUMENTSMISSING;
 
+    UA_UInt32 size = server->externalNamespacesSize;
 	//do not allow double indices
-	for(UA_UInt32 i = 0; i < server->externalNamespacesSize; i++){
+	for(UA_UInt32 i = 0; i < size; i++) {
 		if(server->externalNamespaces[i].index == namespaceIndex)
 			return UA_STATUSCODE_BADINDEXRANGEINVALID;
 	}
-    server->externalNamespaces = UA_realloc(server->externalNamespaces,
-                                            sizeof(UA_ExternalNamespace) * (server->externalNamespacesSize+1));
-    server->externalNamespaces[server->externalNamespacesSize].externalNodeStore = *nodeStore;
-    server->externalNamespaces[server->externalNamespacesSize].index = namespaceIndex;
-    UA_String_copy(url,&server->externalNamespaces[server->externalNamespacesSize].url);
+    server->externalNamespaces =
+        UA_realloc(server->externalNamespaces, sizeof(UA_ExternalNamespace) * (size+1));
+    server->externalNamespaces[size].externalNodeStore = *nodeStore;
+    server->externalNamespaces[size].index = namespaceIndex;
+    UA_String_copy(url, &server->externalNamespaces[size].url);
     server->externalNamespacesSize++;
     return UA_STATUSCODE_GOOD;
 }
 #endif /* UA_EXTERNAL_NAMESPACES*/
 
 UA_UInt16 UA_Server_addNamespace(UA_Server *server, const char* name) {
-    server->namespaces = UA_realloc(server->namespaces, sizeof(UA_String) * (server->namespacesSize+1));
+    server->namespaces = UA_realloc(server->namespaces,
+                                    sizeof(UA_String) * (server->namespacesSize+1));
     server->namespaces[server->namespacesSize] = UA_STRING_ALLOC(name);
     server->namespacesSize++;
-    return ((UA_UInt16)server->namespacesSize - 1);
+    return (UA_UInt16)server->namespacesSize - 1;
 }
 
 UA_StatusCode UA_Server_deleteNode(UA_Server *server, UA_NodeId nodeId) {
     return Service_DeleteNodes_single(server, &adminSession, nodeId, UA_TRUE);
 }
 
-UA_StatusCode UA_Server_forEachChildNodeCall(UA_Server *server, UA_NodeId parentNodeId,
-                                             UA_NodeIteratorCallback callback, void *handle) {
+UA_StatusCode
+UA_Server_forEachChildNodeCall(UA_Server *server, UA_NodeId parentNodeId,
+                               UA_NodeIteratorCallback callback, void *handle) {
     UA_StatusCode retval = UA_STATUSCODE_GOOD;
     const UA_Node *parent = UA_NodeStore_get(server->nodestore, &parentNodeId);
     if(!parent)
@@ -119,7 +120,8 @@ UA_StatusCode UA_Server_forEachChildNodeCall(UA_Server *server, UA_NodeId parent
     
     for(int i=0; i<parent->referencesSize; i++) {
         UA_ReferenceNode *ref = &parent->references[i];
-        retval |= callback(ref->targetId.nodeId, ref->isInverse, ref->referenceTypeId, handle);
+        retval |= callback(ref->targetId.nodeId, ref->isInverse,
+                           ref->referenceTypeId, handle);
     }
     
     UA_NodeStore_release(parent);
@@ -127,15 +129,15 @@ UA_StatusCode UA_Server_forEachChildNodeCall(UA_Server *server, UA_NodeId parent
 }
 
 UA_StatusCode
-UA_Server_addReference(UA_Server *server, const UA_NodeId *sourceId, const UA_NodeId *refTypeId,
-                       const UA_ExpandedNodeId *targetId) {
+UA_Server_addReference(UA_Server *server, const UA_NodeId *sourceId,
+                       const UA_NodeId *refTypeId, const UA_ExpandedNodeId *targetId) {
     UA_AddReferencesItem item;
     UA_AddReferencesItem_init(&item);
     item.sourceNodeId = *sourceId;
     item.referenceTypeId = *refTypeId;
     item.isForward = UA_TRUE;
     item.targetNodeId = *targetId;
-    return Service_AddReferences_single(server, &adminSession, (const UA_AddReferencesItem*)&item);
+    return Service_AddReferences_single(server, &adminSession, &item);
 }
 
 static UA_AddNodesResult
@@ -143,15 +145,17 @@ addNodeInternal(UA_Server *server, UA_Node *node, const UA_NodeId *parentNodeId,
                 const UA_NodeId *referenceTypeId) {
     UA_AddNodesResult res;
     UA_AddNodesResult_init(&res);
-    Service_AddNodes_single(server, &adminSession, node, parentNodeId, referenceTypeId, &res);
+    Service_AddNodes_single(server, &adminSession, node, parentNodeId,
+                            referenceTypeId, &res);
     return res;
 }
 
 UA_AddNodesResult
-UA_Server_addNode(UA_Server *server, const UA_NodeClass nodeClass, const UA_NodeId requestedNewNodeId,
-                  const UA_NodeId parentNodeId, const UA_NodeId referenceTypeId,
-                  const UA_QualifiedName browseName, const UA_NodeId typeDefinition,
-                  const UA_NodeAttributes *attr, const UA_DataType *attributeType) {
+UA_Server_addNode(UA_Server *server, const UA_NodeClass nodeClass,
+                  const UA_NodeId requestedNewNodeId, const UA_NodeId parentNodeId,
+                  const UA_NodeId referenceTypeId, const UA_QualifiedName browseName,
+                  const UA_NodeId typeDefinition, const UA_NodeAttributes *attr,
+                  const UA_DataType *attributeType) {
     UA_AddNodesResult result;
     UA_AddNodesResult_init(&result);
 
@@ -161,12 +165,14 @@ UA_Server_addNode(UA_Server *server, const UA_NodeClass nodeClass, const UA_Node
     item.nodeClass = nodeClass;
     result.statusCode |= UA_NodeId_copy(&parentNodeId, &item.parentNodeId.nodeId);
     result.statusCode |= UA_NodeId_copy(&referenceTypeId, &item.referenceTypeId);
-    result.statusCode |= UA_NodeId_copy(&requestedNewNodeId, &item.requestedNewNodeId.nodeId);
+    result.statusCode |= UA_NodeId_copy(&requestedNewNodeId,
+                                        &item.requestedNewNodeId.nodeId);
     result.statusCode |= UA_NodeId_copy(&typeDefinition, &item.typeDefinition.nodeId);
     UA_NodeAttributes *attrCopy = UA_alloca(attributeType->memSize);
     result.statusCode |= UA_copy(attr, attrCopy, attributeType);
     if(result.statusCode == UA_STATUSCODE_GOOD)
-        Service_AddNodes_single_fromAttributes(server, &adminSession, &item, attrCopy, attributeType, &result);
+        Service_AddNodes_single_fromAttributes(server, &adminSession, &item,
+                                               attrCopy, attributeType, &result);
 
     UA_AddNodesItem_deleteMembers(&item);
     UA_deleteMembers(attrCopy, attributeType);
@@ -190,8 +196,9 @@ void UA_Server_addNetworkLayer(UA_Server *server, UA_ServerNetworkLayer *network
 
     if(server->description.discoveryUrlsSize < 0)
         server->description.discoveryUrlsSize = 0;
-    UA_String* newUrls = UA_realloc(server->description.discoveryUrls,
-                                    sizeof(UA_String)*(server->description.discoveryUrlsSize+1));
+    UA_String* newUrls;
+    newUrls = UA_realloc(server->description.discoveryUrls,
+                         sizeof(UA_String)*(server->description.discoveryUrlsSize+1));
     if(!newUrls) {
         UA_LOG_ERROR(server->logger, UA_LOGCATEGORY_SERVER, "Adding discoveryUrl");
         return;
@@ -200,14 +207,17 @@ void UA_Server_addNetworkLayer(UA_Server *server, UA_ServerNetworkLayer *network
     UA_String_copy(&networkLayer->discoveryUrl,
                    &server->description.discoveryUrls[server->description.discoveryUrlsSize]);
     server->description.discoveryUrlsSize++;
-    for(UA_Int32 i = 0; i < server->endpointDescriptionsSize; i++)
+    for(UA_Int32 i = 0; i < server->endpointDescriptionsSize; i++) {
         if(!server->endpointDescriptions[i].endpointUrl.data)
-            UA_String_copy(&networkLayer->discoveryUrl, &server->endpointDescriptions[i].endpointUrl);
+            UA_String_copy(&networkLayer->discoveryUrl,
+                           &server->endpointDescriptions[i].endpointUrl);
+    }
 }
 
 void UA_Server_setServerCertificate(UA_Server *server, UA_ByteString certificate) {
     for(UA_Int32 i = 0; i < server->endpointDescriptionsSize; i++)
-        UA_ByteString_copy(&certificate, &server->endpointDescriptions[i].serverCertificate);
+        UA_ByteString_copy(&certificate,
+                           &server->endpointDescriptions[i].serverCertificate);
 }
 
 void UA_Server_setLogger(UA_Server *server, UA_Logger logger) {
@@ -233,8 +243,10 @@ void UA_Server_delete(UA_Server *server) {
     UA_Server_deleteExternalNamespaces(server);
 #endif
     UA_ByteString_deleteMembers(&server->serverCertificate);
-    UA_Array_delete(server->namespaces, &UA_TYPES[UA_TYPES_STRING], server->namespacesSize);
-    UA_Array_delete(server->endpointDescriptions, &UA_TYPES[UA_TYPES_ENDPOINTDESCRIPTION],
+    UA_Array_delete(server->namespaces, &UA_TYPES[UA_TYPES_STRING],
+                    server->namespacesSize);
+    UA_Array_delete(server->endpointDescriptions,
+                    &UA_TYPES[UA_TYPES_ENDPOINTDESCRIPTION],
                     server->endpointDescriptionsSize);
 
     // Delete the network layers
@@ -246,7 +258,8 @@ void UA_Server_delete(UA_Server *server) {
     UA_free(server->networkLayers);
 
 #ifdef UA_MULTITHREADING
-    pthread_cond_destroy(&server->dispatchQueue_condition); // so the workers don't spin if the queue is empty
+    /* so the workers don't spin if the queue is empty */
+    pthread_cond_destroy(&server->dispatchQueue_condition);
     rcu_barrier(); // wait for all scheduled call_rcu work to complete
    	rcu_unregister_thread();
 #endif
@@ -314,8 +327,9 @@ readNamespaces(void *handle, const UA_NodeId nodeid, UA_Boolean sourceTimestamp,
         return UA_STATUSCODE_GOOD;
     }
     UA_Server *server = (UA_Server*)handle;
-    UA_StatusCode retval = UA_Variant_setArrayCopy(&value->value, server->namespaces, server->namespacesSize,
-                                                   &UA_TYPES[UA_TYPES_STRING]);
+    UA_StatusCode retval;
+    retval = UA_Variant_setArrayCopy(&value->value, server->namespaces,
+                                     server->namespacesSize, &UA_TYPES[UA_TYPES_STRING]);
     if(retval != UA_STATUSCODE_GOOD)
         return retval;
     value->hasValue = UA_TRUE;
@@ -326,8 +340,9 @@ readNamespaces(void *handle, const UA_NodeId nodeid, UA_Boolean sourceTimestamp,
     return UA_STATUSCODE_GOOD;
 }
 
-static UA_StatusCode readCurrentTime(void *handle, const UA_NodeId nodeid, UA_Boolean sourceTimeStamp,
-                                     const UA_NumericRange *range, UA_DataValue *value) {
+static UA_StatusCode
+readCurrentTime(void *handle, const UA_NodeId nodeid, UA_Boolean sourceTimeStamp,
+                const UA_NumericRange *range, UA_DataValue *value) {
     if(range) {
         value->hasStatus = UA_TRUE;
         value->status = UA_STATUSCODE_BADINDEXRANGEINVALID;
@@ -353,20 +368,23 @@ static void copyNames(UA_Node *node, char *name) {
     node->description = UA_LOCALIZEDTEXT_ALLOC("en_US", name);
 }
 
-static void addDataTypeNode(UA_Server *server, char* name, UA_UInt32 datatypeid, UA_Int32 parent) {
+static void
+addDataTypeNode(UA_Server *server, char* name, UA_UInt32 datatypeid, UA_Int32 parent) {
     UA_DataTypeNode *datatype = UA_DataTypeNode_new();
     copyNames((UA_Node*)datatype, name);
     datatype->nodeId.identifier.numeric = datatypeid;
-    addNodeInternal(server, (UA_Node*)datatype, &UA_NODEID_NUMERIC(0, parent), &nodeIdOrganizes);
+    addNodeInternal(server, (UA_Node*)datatype, &UA_NODEID_NUMERIC(0, parent),
+                    &nodeIdOrganizes);
 }
 
-static void addObjectTypeNode(UA_Server *server, char* name, UA_UInt32 objecttypeid, UA_Int32 parent,
-                              UA_Int32 parentreference) {
+static void
+addObjectTypeNode(UA_Server *server, char* name, UA_UInt32 objecttypeid,
+                  UA_Int32 parent, UA_Int32 parentreference) {
     UA_ObjectTypeNode *objecttype = UA_ObjectTypeNode_new();
     copyNames((UA_Node*)objecttype, name);
     objecttype->nodeId.identifier.numeric = objecttypeid;
     addNodeInternal(server, (UA_Node*)objecttype, &UA_NODEID_NUMERIC(0, parent),
-                      &UA_NODEID_NUMERIC(0, parentreference));
+                    &UA_NODEID_NUMERIC(0, parentreference));
 }
 
 static UA_VariableTypeNode*
@@ -380,16 +398,20 @@ createVariableTypeNode(UA_Server *server, char* name, UA_UInt32 variabletypeid,
     return variabletype;
 }
 
-static void addVariableTypeNode_organized(UA_Server *server, char* name, UA_UInt32 variabletypeid,
-                                          UA_Int32 parent, UA_Boolean abstract) {
+static void
+addVariableTypeNode_organized(UA_Server *server, char* name, UA_UInt32 variabletypeid,
+                              UA_Int32 parent, UA_Boolean abstract) {
     UA_VariableTypeNode *variabletype = createVariableTypeNode(server, name, variabletypeid, parent, abstract);
     addNodeInternal(server, (UA_Node*)variabletype, &UA_NODEID_NUMERIC(0, parent), &nodeIdOrganizes);
 }
 
-static void addVariableTypeNode_subtype(UA_Server *server, char* name, UA_UInt32 variabletypeid,
-                                        UA_Int32 parent, UA_Boolean abstract) {
-    UA_VariableTypeNode *variabletype = createVariableTypeNode(server, name, variabletypeid, parent, abstract);
-    addNodeInternal(server, (UA_Node*)variabletype, &UA_NODEID_NUMERIC(0, parent), &nodeIdHasSubType);
+static void
+addVariableTypeNode_subtype(UA_Server *server, char* name, UA_UInt32 variabletypeid,
+                            UA_Int32 parent, UA_Boolean abstract) {
+    UA_VariableTypeNode *variabletype =
+        createVariableTypeNode(server, name, variabletypeid, parent, abstract);
+    addNodeInternal(server, (UA_Node*)variabletype, &UA_NODEID_NUMERIC(0, parent),
+                    &nodeIdHasSubType);
 }
 
 UA_Server * UA_Server_new(UA_ServerConfig config) {
@@ -424,10 +446,12 @@ UA_Server * UA_Server_new(UA_ServerConfig config) {
     // mockup application description
     UA_ApplicationDescription_init(&server->description);
     server->description.productUri = UA_STRING_ALLOC(PRODUCT_URI);
-    server->description.applicationUri = UA_STRING_ALLOC(server->config.Application_applicationURI);
+    server->description.applicationUri =
+        UA_STRING_ALLOC(server->config.Application_applicationURI);
     server->description.discoveryUrlsSize = 0;
 
-    server->description.applicationName = UA_LOCALIZEDTEXT_ALLOC("en_US", server->config.Application_applicationName);
+    server->description.applicationName =
+        UA_LOCALIZEDTEXT_ALLOC("en_US", server->config.Application_applicationName);
     server->description.applicationType = UA_APPLICATIONTYPE_SERVER;
     server->externalNamespacesSize = 0;
     server->externalNamespaces = UA_NULL;
@@ -647,7 +671,8 @@ UA_Server * UA_Server_new(UA_ServerConfig config) {
     generatesevent->nodeId.identifier.numeric = UA_NS0ID_GENERATESEVENT;
     generatesevent->isAbstract = UA_FALSE;
     generatesevent->symmetric  = UA_FALSE;
-    addNodeInternal(server, (UA_Node*)generatesevent, &nodeIdNonHierarchicalReferences, &nodeIdHasSubType);
+    addNodeInternal(server, (UA_Node*)generatesevent, &nodeIdNonHierarchicalReferences,
+                    &nodeIdHasSubType);
 
     UA_ReferenceTypeNode *aggregates = UA_ReferenceTypeNode_new();
     copyNames((UA_Node*)aggregates, "Aggregates");
@@ -655,10 +680,12 @@ UA_Server * UA_Server_new(UA_ServerConfig config) {
     aggregates->nodeId.identifier.numeric = UA_NS0ID_AGGREGATES;
     aggregates->isAbstract = UA_TRUE;
     aggregates->symmetric  = UA_FALSE;
-    addNodeInternal(server, (UA_Node*)aggregates, &UA_NODEID_NUMERIC(0, UA_NS0ID_HASCHILD), &nodeIdHasSubType);
+    addNodeInternal(server, (UA_Node*)aggregates,
+                    &UA_NODEID_NUMERIC(0, UA_NS0ID_HASCHILD), &nodeIdHasSubType);
 
     // complete bootstrap of hassubtype
-    UA_Server_addReference(server, &UA_NODEID_NUMERIC(0, UA_NS0ID_HASCHILD), &nodeIdHasSubType,
+    UA_Server_addReference(server, &UA_NODEID_NUMERIC(0, UA_NS0ID_HASCHILD),
+                           &nodeIdHasSubType,
                            &UA_EXPANDEDNODEID_NUMERIC(0, UA_NS0ID_HASSUBTYPE));
 
     UA_ReferenceTypeNode *hasproperty = UA_ReferenceTypeNode_new();
@@ -667,8 +694,8 @@ UA_Server * UA_Server_new(UA_ServerConfig config) {
     hasproperty->nodeId.identifier.numeric = UA_NS0ID_HASPROPERTY;
     hasproperty->isAbstract = UA_FALSE;
     hasproperty->symmetric  = UA_FALSE;
-    addNodeInternal(server, (UA_Node*)hasproperty, &UA_NODEID_NUMERIC(0, UA_NS0ID_AGGREGATES),
-                    &nodeIdHasSubType);
+    addNodeInternal(server, (UA_Node*)hasproperty,
+                    &UA_NODEID_NUMERIC(0, UA_NS0ID_AGGREGATES), &nodeIdHasSubType);
 
     UA_ReferenceTypeNode *hascomponent = UA_ReferenceTypeNode_new();
     copyNames((UA_Node*)hascomponent, "HasComponent");
@@ -676,8 +703,8 @@ UA_Server * UA_Server_new(UA_ServerConfig config) {
     hascomponent->nodeId.identifier.numeric = UA_NS0ID_HASCOMPONENT;
     hascomponent->isAbstract = UA_FALSE;
     hascomponent->symmetric  = UA_FALSE;
-    addNodeInternal(server, (UA_Node*)hascomponent, &UA_NODEID_NUMERIC(0, UA_NS0ID_AGGREGATES),
-                    &nodeIdHasSubType);
+    addNodeInternal(server, (UA_Node*)hascomponent,
+                    &UA_NODEID_NUMERIC(0, UA_NS0ID_AGGREGATES), &nodeIdHasSubType);
 
     UA_ReferenceTypeNode *hasnotifier = UA_ReferenceTypeNode_new();
     copyNames((UA_Node*)hasnotifier, "HasNotifier");
@@ -1147,7 +1174,8 @@ UA_Server * UA_Server_new(UA_ServerConfig config) {
        shutdownreason->value.variant.value.data = UA_LocalizedText_new();
        shutdownreason->value.variant.value.type = &UA_TYPES[UA_TYPES_LOCALIZEDTEXT];
        addNodeInternal(server, (UA_Node*)shutdownreason,
-                       &UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_SERVERSTATUS), &nodeIdHasComponent);
+                       &UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_SERVERSTATUS),
+                       &nodeIdHasComponent);
        UA_Server_addReference(server, &UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_SERVERSTATUS_SHUTDOWNREASON),
                               &nodeIdHasTypeDefinition, &expandedNodeIdBaseDataVariabletype);
 
@@ -1155,8 +1183,9 @@ UA_Server * UA_Server_new(UA_ServerConfig config) {
 }
 
 UA_StatusCode
-UA_Server_setNodeAttribute(UA_Server *server, const UA_NodeId nodeId, const UA_AttributeId attributeId,
-                           const UA_DataType *type, const void *value) {
+UA_Server_setNodeAttribute(UA_Server *server, const UA_NodeId nodeId,
+                           const UA_AttributeId attributeId, const UA_DataType *type,
+                           const void *value) {
     UA_WriteValue wvalue;
     UA_WriteValue_init(&wvalue);
     wvalue.nodeId = nodeId;
@@ -1170,8 +1199,8 @@ UA_Server_setNodeAttribute(UA_Server *server, const UA_NodeId nodeId, const UA_A
 }
 
 UA_StatusCode
-UA_Server_setNodeAttribute_value(UA_Server *server, const UA_NodeId nodeId, const UA_DataType *type,
-                                 const UA_Variant *value) {
+UA_Server_setNodeAttribute_value(UA_Server *server, const UA_NodeId nodeId,
+                                 const UA_DataType *type, const UA_Variant *value) {
     UA_WriteValue wvalue;
     UA_WriteValue_init(&wvalue);
     wvalue.nodeId = nodeId;
@@ -1204,8 +1233,8 @@ UA_Server_setNodeAttribute_value_destructive(UA_Server *server, const UA_NodeId
 
 #ifdef ENABLE_METHODCALLS
 UA_StatusCode
-UA_Server_setNodeAttribute_method(UA_Server *server, UA_NodeId methodNodeId, UA_MethodCallback method,
-                                  void *handle) {
+UA_Server_setNodeAttribute_method(UA_Server *server, UA_NodeId methodNodeId,
+                                  UA_MethodCallback method, void *handle) {
     UA_StatusCode retval;
  retrySetMethod:
     retval = UA_STATUSCODE_GOOD;
@@ -1245,7 +1274,8 @@ UA_Server_setNodeAttribute_method(UA_Server *server, UA_NodeId methodNodeId, UA_
 #endif
 
 UA_StatusCode UA_EXPORT
-UA_Server_setAttribute_value_callback(UA_Server *server, UA_NodeId nodeId, UA_ValueCallback callback) {
+UA_Server_setAttribute_value_callback(UA_Server *server, UA_NodeId nodeId,
+                                      UA_ValueCallback callback) {
     const UA_Node *orig;
  retrySetValueCallback:
     orig = UA_NodeStore_get(server->nodestore, &nodeId);
@@ -1272,7 +1302,8 @@ UA_Server_setAttribute_value_callback(UA_Server *server, UA_NodeId nodeId, UA_Va
     editable->value.variant.callback = callback;
   
 #ifdef UA_MULTITHREADING
-    UA_StatusCode retval = UA_NodeStore_replace(server->nodestore, orig, (UA_Node*)editable, UA_NULL);
+    UA_StatusCode retval;
+    retval = UA_NodeStore_replace(server->nodestore, orig, (UA_Node*)editable, UA_NULL);
     if(retval != UA_STATUSCODE_GOOD) {
         /* The node was replaced in the background */
         UA_NodeStore_release(orig);
@@ -1316,7 +1347,8 @@ UA_Server_setNodeAttribute_value_dataSource(UA_Server *server, const UA_NodeId n
     editable->valueSource = UA_VALUESOURCE_DATASOURCE;
   
 #ifdef UA_MULTITHREADING
-    UA_StatusCode retval = UA_NodeStore_replace(server->nodestore, orig, (UA_Node*)editable, UA_NULL);
+    UA_StatusCode retval;
+    retval = UA_NodeStore_replace(server->nodestore, orig, (UA_Node*)editable, UA_NULL);
     if(retval != UA_STATUSCODE_GOOD) {
         /* The node was replaced in the background */
         UA_NodeStore_release(orig);
@@ -1332,7 +1364,8 @@ UA_Server_getNodeAttribute(UA_Server *server, const UA_NodeId nodeId,
                            const UA_AttributeId attributeId, void *v) {
     UA_Variant out;
     UA_Variant_init(&out);
-    UA_StatusCode retval = UA_Server_getNodeAttribute(server, nodeId, attributeId, &out); 
+    UA_StatusCode retval;
+    retval = UA_Server_getNodeAttribute(server, nodeId, attributeId, &out); 
     if(retval != UA_STATUSCODE_GOOD)
         return retval;
     if(attributeId == UA_ATTRIBUTEID_VALUE)
@@ -1348,7 +1381,8 @@ UA_Server_getNodeAttribute(UA_Server *server, const UA_NodeId nodeId,
 
 #ifdef ENABLE_METHODCALLS
 UA_StatusCode
-UA_Server_getNodeAttribute_method(UA_Server *server, UA_NodeId nodeId, UA_MethodCallback *method) {
+UA_Server_getNodeAttribute_method(UA_Server *server, UA_NodeId nodeId,
+                                  UA_MethodCallback *method) {
     const UA_Node *node = UA_NodeStore_get(server->nodestore, &nodeId);
     if(!node)
         return UA_STATUSCODE_BADNODEIDUNKNOWN;
@@ -1365,8 +1399,10 @@ UA_Server_getNodeAttribute_method(UA_Server *server, UA_NodeId nodeId, UA_Method
 #endif
 
 UA_StatusCode
-UA_Server_getNodeAttribute_value_dataSource(UA_Server *server, UA_NodeId nodeId, UA_DataSource *dataSource) {
-    const UA_VariableNode *node = (const UA_VariableNode*)UA_NodeStore_get(server->nodestore, &nodeId);
+UA_Server_getNodeAttribute_value_dataSource(UA_Server *server, UA_NodeId nodeId,
+                                            UA_DataSource *dataSource) {
+    const UA_VariableNode *node =
+        (const UA_VariableNode*)UA_NodeStore_get(server->nodestore, &nodeId);
     if(!node)
         return UA_STATUSCODE_BADNODEIDUNKNOWN;
 

+ 14 - 11
src/server/ua_services_call.c

@@ -5,8 +5,9 @@
 #include "ua_nodestore.h"
 #include "ua_nodes.h"
 
-static const UA_VariableNode *getArgumentsVariableNode(UA_Server *server, const UA_MethodNode *ofMethod,
-                                                       UA_String withBrowseName) {
+static const UA_VariableNode
+*getArgumentsVariableNode(UA_Server *server, const UA_MethodNode *ofMethod,
+                          UA_String withBrowseName) {
     const UA_Node *refTarget;
     UA_NodeId hasProperty = UA_NODEID_NUMERIC(0, UA_NS0ID_HASPROPERTY);
     
@@ -27,7 +28,8 @@ static const UA_VariableNode *getArgumentsVariableNode(UA_Server *server, const
     return UA_NULL;
 }
 
-static UA_StatusCode statisfySignature(UA_Variant *var, UA_Argument arg) {
+static UA_StatusCode
+statisfySignature(UA_Variant *var, UA_Argument arg) {
     if(!UA_NodeId_equal(&var->type->typeId, &arg.dataType) )
         return UA_STATUSCODE_BADINVALIDARGUMENT;
     
@@ -72,7 +74,8 @@ static UA_StatusCode statisfySignature(UA_Variant *var, UA_Argument arg) {
     return UA_STATUSCODE_GOOD;
 }
 
-static UA_StatusCode argConformsToDefinition(UA_CallMethodRequest *rs, const UA_VariableNode *argDefinition) {
+static UA_StatusCode
+argConformsToDefinition(UA_CallMethodRequest *rs, const UA_VariableNode *argDefinition) {
     if(argDefinition->value.variant.value.type != &UA_TYPES[UA_TYPES_ARGUMENT] &&
         argDefinition->value.variant.value.type != &UA_TYPES[UA_TYPES_EXTENSIONOBJECT])
         return UA_STATUSCODE_BADINTERNALERROR;
@@ -104,17 +107,16 @@ static UA_StatusCode argConformsToDefinition(UA_CallMethodRequest *rs, const UA_
     return retval;
 }
 
-static void callMethod(UA_Server *server, UA_Session *session, UA_CallMethodRequest *request,
-                       UA_CallMethodResult *result) {
-    const UA_MethodNode *methodCalled = (const UA_MethodNode*) UA_NodeStore_get(server->nodestore,
-                                                                                &request->methodId);
+static void
+callMethod(UA_Server *server, UA_Session *session, UA_CallMethodRequest *request,
+           UA_CallMethodResult *result) {
+    const UA_MethodNode *methodCalled = (const UA_MethodNode*)UA_NodeStore_get(server->nodestore, &request->methodId);
     if(!methodCalled) {
         result->statusCode = UA_STATUSCODE_BADMETHODINVALID;
         return;
     }
     
-    const UA_ObjectNode *withObject = (const UA_ObjectNode *) UA_NodeStore_get(server->nodestore,
-                                                                               &request->objectId);
+    const UA_ObjectNode *withObject = (const UA_ObjectNode*)UA_NodeStore_get(server->nodestore, &request->objectId);
     if(!withObject) {
         result->statusCode = UA_STATUSCODE_BADNODEIDINVALID;
         goto releaseMethodReturn;
@@ -203,7 +205,8 @@ void Service_Call(UA_Server *server, UA_Session *session, const UA_CallRequest *
         return;
     }
 
-    response->results = UA_Array_new(&UA_TYPES[UA_TYPES_CALLMETHODRESULT], request->methodsToCallSize);
+    response->results = UA_Array_new(&UA_TYPES[UA_TYPES_CALLMETHODRESULT],
+                                     request->methodsToCallSize);
     if(!response->results) {
         response->responseHeader.serviceResult = UA_STATUSCODE_BADOUTOFMEMORY;
         return;

+ 54 - 51
src/server/ua_services_nodemanagement.c

@@ -64,9 +64,7 @@ void Service_AddNodes_single(UA_Server *server, UA_Session *session, UA_Node *no
     //FIXME: a bit dirty workaround of preserving namespace
     //namespace index is assumed to be valid
     const UA_Node *managed = UA_NULL;
-    UA_NodeId tempNodeid;
-    UA_NodeId_init(&tempNodeid);
-    UA_NodeId_copy(&node->nodeId, &tempNodeid);
+    UA_NodeId tempNodeid = node->nodeId;
     tempNodeid.namespaceIndex = 0;
     if(UA_NodeId_isNull(&tempNodeid)) {
         if(UA_NodeStore_insert(server->nodestore, node, &managed) != UA_STATUSCODE_GOOD) {
@@ -81,7 +79,7 @@ void Service_AddNodes_single(UA_Server *server, UA_Session *session, UA_Node *no
         }
 
         if(UA_NodeStore_insert(server->nodestore, node, &managed) != UA_STATUSCODE_GOOD) {
-            result->statusCode = UA_STATUSCODE_BADNODEIDEXISTS;  // todo: differentiate out of memory
+            result->statusCode = UA_STATUSCODE_BADNODEIDEXISTS;
             UA_NodeId_deleteMembers(&result->addedNodeId);
             goto ret2;
         }
@@ -100,7 +98,6 @@ void Service_AddNodes_single(UA_Server *server, UA_Session *session, UA_Node *no
     UA_NodeStore_release(managed);
     
  ret2:
-    UA_NodeId_deleteMembers(&tempNodeid);
     UA_NodeStore_release((const UA_Node*)referenceType);
  ret:
     UA_NodeStore_release(parent);
@@ -111,7 +108,7 @@ static void moveStandardAttributes(UA_Node *node, UA_AddNodesItem *item, UA_Node
     UA_NodeId_init(&item->requestedNewNodeId.nodeId);
 
     node->browseName = item->browseName;
-    UA_QualifiedName_deleteMembers(&item->browseName);
+    UA_QualifiedName_init(&item->browseName);
 
     node->displayName = attr->displayName;
     UA_LocalizedText_init(&attr->displayName);
@@ -139,6 +136,8 @@ Service_AddNodes_single_fromVariableAttributes(UA_Server *server, UA_Session *se
     vnode->historizing = attr->historizing;
     vnode->minimumSamplingInterval = attr->minimumSamplingInterval;
     vnode->valueRank = attr->valueRank;
+    vnode->value.variant.value = attr->value;
+    UA_Variant_init(&attr->value);
 
     // don't use extra dimension spec. This comes from the value.
     /* if(attr.specifiedAttributes & UA_NODEATTRIBUTESMASK_ARRAYDIMENSIONS) { */
@@ -421,7 +420,7 @@ UA_Server_addDataSourceVariableNode(UA_Server *server, const UA_NodeId requested
     UA_AddNodesItem item;
     UA_AddNodesItem_init(&item);
     result.statusCode = UA_QualifiedName_copy(&browseName, &item.browseName);
-    item.nodeClass = UA_NODECLASS_METHOD;
+    item.nodeClass = UA_NODECLASS_VARIABLE;
     result.statusCode |= UA_NodeId_copy(&parentNodeId, &item.parentNodeId.nodeId);
     result.statusCode |= UA_NodeId_copy(&referenceTypeId, &item.referenceTypeId);
     result.statusCode |= UA_NodeId_copy(&requestedNewNodeId, &item.requestedNewNodeId.nodeId);
@@ -464,9 +463,9 @@ UA_Server_addDataSourceVariableNode(UA_Server *server, const UA_NodeId requested
 
 #ifdef ENABLE_METHODCALLS
 UA_AddNodesResult UA_EXPORT
-UA_Server_addMethodNode(UA_Server *server, const UA_ExpandedNodeId requestedNewNodeId,
-                        const UA_ExpandedNodeId parentNodeId, const UA_NodeId referenceTypeId,
-                        const UA_QualifiedName browseName, const UA_NodeAttributes attr,
+UA_Server_addMethodNode(UA_Server *server, const UA_NodeId requestedNewNodeId,
+                        const UA_NodeId parentNodeId, const UA_NodeId referenceTypeId,
+                        const UA_QualifiedName browseName, const UA_MethodAttributes attr,
                         UA_MethodCallback method, void *handle,
                         UA_Int32 inputArgumentsSize, const UA_Argument* inputArguments, 
                         UA_Int32 outputArgumentsSize, const UA_Argument* outputArguments) {
@@ -477,15 +476,15 @@ UA_Server_addMethodNode(UA_Server *server, const UA_ExpandedNodeId requestedNewN
     UA_AddNodesItem_init(&item);
     result.statusCode = UA_QualifiedName_copy(&browseName, &item.browseName);
     item.nodeClass = UA_NODECLASS_METHOD;
-    result.statusCode |= UA_ExpandedNodeId_copy(&parentNodeId, &item.parentNodeId);
+    result.statusCode |= UA_NodeId_copy(&parentNodeId, &item.parentNodeId.nodeId);
     result.statusCode |= UA_NodeId_copy(&referenceTypeId, &item.referenceTypeId);
-    result.statusCode |= UA_ExpandedNodeId_copy(&requestedNewNodeId, &item.requestedNewNodeId);
+    result.statusCode |= UA_NodeId_copy(&requestedNewNodeId, &item.requestedNewNodeId.nodeId);
     
-    UA_NodeAttributes attrCopy;
-    result.statusCode |= UA_NodeAttributes_copy(&attr, &attrCopy);
+    UA_MethodAttributes attrCopy;
+    result.statusCode |= UA_MethodAttributes_copy(&attr, &attrCopy);
     if(result.statusCode != UA_STATUSCODE_GOOD) {
         UA_AddNodesItem_deleteMembers(&item);
-        UA_NodeAttributes_deleteMembers(&attrCopy);
+        UA_MethodAttributes_deleteMembers(&attrCopy);
         return result;
     }
 
@@ -493,17 +492,20 @@ UA_Server_addMethodNode(UA_Server *server, const UA_ExpandedNodeId requestedNewN
     if(!node) {
         result.statusCode = UA_STATUSCODE_BADOUTOFMEMORY;
         UA_AddNodesItem_deleteMembers(&item);
-        UA_NodeAttributes_deleteMembers(&attrCopy);
+        UA_MethodAttributes_deleteMembers(&attrCopy);
         return result;
     }
     
-    moveStandardAttributes((UA_Node*)node, &item, &attrCopy);
-    node->executable = UA_TRUE;
-    node->userExecutable = UA_TRUE;
+    moveStandardAttributes((UA_Node*)node, &item, (UA_NodeAttributes*)&attrCopy);
+    node->executable = attrCopy.executable;
+    node->userExecutable = attrCopy.executable;
+    node->attachedMethod = method;
+    node->methodHandle = handle;
     UA_AddNodesItem_deleteMembers(&item);
-    UA_NodeAttributes_deleteMembers(&attrCopy);
+    UA_MethodAttributes_deleteMembers(&attrCopy);
 
-    Service_AddNodes_single(server, &adminSession, (UA_Node*)node, &item.parentNodeId,
+    Service_AddNodes_single(server, &adminSession, (UA_Node*)node,
+                            &item.parentNodeId.nodeId,
                             &item.referenceTypeId, &result);
     if(result.statusCode != UA_STATUSCODE_GOOD) {
         UA_MethodNode_delete(node);
@@ -532,8 +534,8 @@ UA_Server_addMethodNode(UA_Server *server, const UA_ExpandedNodeId requestedNewN
     UA_Variant_setArrayCopy(&inputArgumentsVariableNode->value.variant.value, inputArguments,
                             inputArgumentsSize, &UA_TYPES[UA_TYPES_ARGUMENT]);
     UA_AddNodesResult inputAddRes;
-    Service_AddNodes_single(server, &adminSession, (UA_Node*)inputArgumentsVariableNode, &parent,
-                            &UA_NODEID_NUMERIC(0, UA_NS0ID_HASPROPERTY), &inputAddRes);
+    Service_AddNodes_single(server, &adminSession, (UA_Node*)inputArgumentsVariableNode,
+                            &parent.nodeId, &UA_NODEID_NUMERIC(0, UA_NS0ID_HASPROPERTY), &inputAddRes);
     // todo: check if adding succeeded
     UA_AddNodesResult_deleteMembers(&inputAddRes);
 
@@ -547,8 +549,9 @@ UA_Server_addMethodNode(UA_Server *server, const UA_ExpandedNodeId requestedNewN
     UA_Variant_setArrayCopy(&outputArgumentsVariableNode->value.variant.value, outputArguments,
                             outputArgumentsSize, &UA_TYPES[UA_TYPES_ARGUMENT]);
     UA_AddNodesResult outputAddRes;
-    Service_AddNodes_single(server, &adminSession, (UA_Node*)inputArgumentsVariableNode, &parent,
-                            &UA_NODEID_NUMERIC(0, UA_NS0ID_HASPROPERTY), &outputAddRes);
+    Service_AddNodes_single(server, &adminSession, (UA_Node*)outputArgumentsVariableNode,
+                            &parent.nodeId, &UA_NODEID_NUMERIC(0, UA_NS0ID_HASPROPERTY),
+                            &outputAddRes);
     // todo: check if adding succeeded
     UA_AddNodesResult_deleteMembers(&outputAddRes);
 
@@ -709,7 +712,7 @@ void Service_AddReferences(UA_Server *server, UA_Session *session, const UA_AddR
 		size_t indicesSize = 0;
 		for(size_t i = 0;i < size;i++) {
 			if(request->referencesToAdd[i].sourceNodeId.namespaceIndex
-					!= server->externalNamespaces[j].index)
+               != server->externalNamespaces[j].index)
 				continue;
 			isExternal[i] = UA_TRUE;
 			indices[indicesSize] = i;
@@ -740,39 +743,39 @@ void Service_AddReferences(UA_Server *server, UA_Session *session, const UA_AddR
 
 UA_StatusCode Service_DeleteNodes_single(UA_Server *server, UA_Session *session, UA_NodeId nodeId,
                                          UA_Boolean deleteReferences) {
-  const UA_Node *delNode = UA_NodeStore_get(server->nodestore, &nodeId);
-  if (!delNode)
-    return UA_STATUSCODE_BADNODEIDINVALID;
+    const UA_Node *delNode = UA_NodeStore_get(server->nodestore, &nodeId);
+    if (!delNode)
+        return UA_STATUSCODE_BADNODEIDINVALID;
   
-  // Find and remove all References to this node if so requested.
-  if(deleteReferences == UA_TRUE) {
-    UA_DeleteReferencesItem *delItem = UA_DeleteReferencesItem_new();
-    delItem->deleteBidirectional = UA_TRUE; // WARNING: Current semantics in deleteOneWayReference is 'delete forward or inverse'
-    UA_NodeId_copy(&nodeId, &delItem->targetNodeId.nodeId);
+    // Find and remove all References to this node if so requested.
+    if(deleteReferences == UA_TRUE) {
+        UA_DeleteReferencesItem *delItem = UA_DeleteReferencesItem_new();
+        delItem->deleteBidirectional = UA_TRUE; // WARNING: Current semantics in deleteOneWayReference is 'delete forward or inverse'
+        UA_NodeId_copy(&nodeId, &delItem->targetNodeId.nodeId);
     
-    for(int i=0; i<delNode->referencesSize; i++) {
-        UA_NodeId_copy(&delNode->references[i].targetId.nodeId, &delItem->sourceNodeId);
-        UA_NodeId_deleteMembers(&delItem->sourceNodeId);
+        for(int i=0; i<delNode->referencesSize; i++) {
+            UA_NodeId_copy(&delNode->references[i].targetId.nodeId, &delItem->sourceNodeId);
+            UA_NodeId_deleteMembers(&delItem->sourceNodeId);
+        }
+        UA_DeleteReferencesItem_delete(delItem);
     }
-    UA_DeleteReferencesItem_delete(delItem);
-  }
   
-  UA_NodeStore_release(delNode);
-  return UA_NodeStore_remove(server->nodestore, &nodeId);
+    UA_NodeStore_release(delNode);
+    return UA_NodeStore_remove(server->nodestore, &nodeId);
 }
 
 void Service_DeleteNodes(UA_Server *server, UA_Session *session, const UA_DeleteNodesRequest *request,
                          UA_DeleteNodesResponse *response) {
-  response->results = UA_malloc(sizeof(UA_StatusCode) * request->nodesToDeleteSize);
-  if(!response->results) {
-      response->responseHeader.serviceResult = UA_STATUSCODE_BADOUTOFMEMORY;;
-      return;
-  }
-  response->resultsSize = request->nodesToDeleteSize;
-  for(int i=0; i<request->nodesToDeleteSize; i++) {
-      UA_DeleteNodesItem *item = &request->nodesToDelete[i];
-      response->results[i] = Service_DeleteNodes_single(server, session, item->nodeId, item->deleteTargetReferences);
-  }
+    response->results = UA_malloc(sizeof(UA_StatusCode) * request->nodesToDeleteSize);
+    if(!response->results) {
+        response->responseHeader.serviceResult = UA_STATUSCODE_BADOUTOFMEMORY;;
+        return;
+    }
+    response->resultsSize = request->nodesToDeleteSize;
+    for(int i=0; i<request->nodesToDeleteSize; i++) {
+        UA_DeleteNodesItem *item = &request->nodesToDelete[i];
+        response->results[i] = Service_DeleteNodes_single(server, session, item->nodeId, item->deleteTargetReferences);
+    }
 }
 
 /*********************/

Plik diff jest za duży
+ 701 - 689
tests/check_services_attributes.c


+ 1 - 1
tools/generate_datatypes.py

@@ -54,7 +54,7 @@ minimal_types = ["InvalidType", "Node", "NodeClass", "ReferenceNode", "Applicati
                  "AddReferencesItem","DeleteReferencesItem", "VariableNode", "MethodNode", "VariableTypeNode",
                  "ViewNode", "ReferenceTypeNode", "BrowseResultMask", "ServerState", "ServerStatusDataType", "BuildInfo",
                  "ObjectNode", "DataTypeNode", "ObjectTypeNode", "IdType", "NodeAttributes",
-                 "VariableAttributes", "ObjectAttributes", "ReferenceTypeAttributes", "ViewAttributes",
+                 "VariableAttributes", "ObjectAttributes", "ReferenceTypeAttributes", "ViewAttributes", "MethodAttributes",
                  "ObjectTypeAttributes", "VariableTypeAttributes", "DataTypeAttributes", "NodeAttributesMask",
                  "DeleteNodesItem", "DeleteNodesRequest", "DeleteNodesResponse",
                  "DeleteReferencesItem", "DeleteReferencesRequest", "DeleteReferencesResponse",