Pārlūkot izejas kodu

fix the unit tests

Julius Pfrommer 9 gadi atpakaļ
vecāks
revīzija
8514dc7703

+ 2 - 2
CMakeLists.txt

@@ -429,8 +429,8 @@ if(BUILD_EXAMPLES)
 					           ${PROJECT_SOURCE_DIR}/tools/pyUANamespace/NodeID_Blacklist_FullNS0.txt
 					           ${PROJECT_SOURCE_DIR}/tools/pyUANamespace/NodeID_Blacklist_FullNS0.txt
 					           ${PROJECT_SOURCE_DIR}/examples/server_nodeset.xml)
 					           ${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)
 	if(ENABLE_METHODCALLS)
 	  add_executable(server_method ${PROJECT_SOURCE_DIR}/examples/server_method.c $<TARGET_OBJECTS:open62541-object>)
 	  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 */
 /* 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) {
     if(range) {
         value->hasStatus = UA_TRUE;
         value->hasStatus = UA_TRUE;
         value->status = UA_STATUSCODE_BADINDEXRANGEINVALID;
         value->status = UA_STATUSCODE_BADINDEXRANGEINVALID;
@@ -72,7 +74,9 @@ static UA_StatusCode readTimeData(void *handle, const UA_NodeId nodeId, UA_Boole
 /*      Only on Linux        */
 /*      Only on Linux        */
 /*****************************/
 /*****************************/
 FILE* temperatureFile = NULL;
 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) {
     if(range) {
         value->hasStatus = UA_TRUE;
         value->hasStatus = UA_TRUE;
         value->status = UA_STATUSCODE_BADINDEXRANGEINVALID;
         value->status = UA_STATUSCODE_BADINDEXRANGEINVALID;
@@ -115,24 +119,29 @@ FILE* triggerFile = NULL;
 FILE* ledFile = NULL;
 FILE* ledFile = NULL;
 UA_Boolean ledStatus = 0;
 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)
     if(range)
         return UA_STATUSCODE_BADINDEXRANGEINVALID;
         return UA_STATUSCODE_BADINDEXRANGEINVALID;
 
 
@@ -159,9 +168,10 @@ static UA_StatusCode writeLedStatus(void *handle, const UA_NodeId nodeid, const
 }
 }
 
 
 #ifdef ENABLE_METHODCALLS
 #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_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]);
     UA_Variant_setScalarCopy(output, &tmp, &UA_TYPES[UA_TYPES_STRING]);
     printf("getMonitoredItems was called\n");
     printf("getMonitoredItems was called\n");
     return UA_STATUSCODE_GOOD;
     return UA_STATUSCODE_GOOD;
@@ -197,243 +207,251 @@ static UA_ByteString loadCertificate(void) {
     return certificate;
     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) {
 int main(int argc, char** argv) {
-  signal(SIGINT, stopHandler); /* catches ctrl-c */
+    signal(SIGINT, stopHandler); /* catches ctrl-c */
 #ifdef UA_MULTITHREADING
 #ifdef UA_MULTITHREADING
-  pthread_rwlock_init(&writeLock, 0);
+    pthread_rwlock_init(&writeLock, 0);
 #endif
 #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_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
 #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
 #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
 #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
 #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
 #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
 #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
 #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
 #ifdef UA_MULTITHREADING
-  pthread_rwlock_destroy(&writeLock);
+    pthread_rwlock_destroy(&writeLock);
 #endif
 #endif
 
 
-  return retval;
+    return retval;
 }
 }

+ 35 - 20
examples/server_method.c

@@ -18,7 +18,9 @@
 UA_Boolean running = UA_TRUE;
 UA_Boolean running = UA_TRUE;
 UA_Logger logger;
 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 *inputStr = (UA_String*)input->data;
         UA_String tmp = UA_STRING_ALLOC("Hello ");
         UA_String tmp = UA_STRING_ALLOC("Hello ");
         if(inputStr->length > 0) {
         if(inputStr->length > 0) {
@@ -32,15 +34,13 @@ static UA_StatusCode helloWorldMethod(const UA_NodeId objectId, const UA_Variant
         return UA_STATUSCODE_GOOD;
         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]);
 	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;
 		((UA_Int32*)output->data)[i] = ((UA_Int32*)input->data)[i] + 1;
 	}
 	}
-
 	return UA_STATUSCODE_GOOD;
 	return UA_STATUSCODE_GOOD;
 }
 }
 
 
@@ -77,10 +77,18 @@ int main(int argc, char** argv) {
     outputArguments.name = UA_STRING("MyOutput");
     outputArguments.name = UA_STRING("MyOutput");
     outputArguments.valueRank = -1;
     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
     //END OF EXAMPLE 1
 
 
@@ -105,20 +113,27 @@ int main(int argc, char** argv) {
     pOutputDimensions[0] = 5;
     pOutputDimensions[0] = 5;
     outputArguments.arrayDimensions = pOutputDimensions;
     outputArguments.arrayDimensions = pOutputDimensions;
     outputArguments.dataType = UA_TYPES[UA_TYPES_INT32].typeId;
     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;
     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
     //END OF EXAMPLE 2
 
 
     /* start server */
     /* 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 */
     /* ctrl-c received -> clean up */
     UA_UInt32_delete(pInputDimensions);
     UA_UInt32_delete(pInputDimensions);

+ 13 - 7
examples/server_variable.c

@@ -22,12 +22,15 @@ static void stopHandler(int sign) {
     running = 0;
     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) {
 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);
     UA_Server *server = UA_Server_new(UA_ServerConfig_standard);
     logger = Logger_Stdout_new();
     logger = Logger_Stdout_new();
     UA_Server_setLogger(server, logger);
     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 */
     /* add a variable node to the address space */
     UA_VariableAttributes attr;
     UA_VariableAttributes attr;
@@ -49,8 +54,9 @@ int main(int argc, char** argv) {
     UA_QualifiedName myIntegerName = UA_QUALIFIEDNAME(1, "the answer");
     UA_QualifiedName myIntegerName = UA_QUALIFIEDNAME(1, "the answer");
     UA_NodeId parentNodeId = UA_NODEID_NUMERIC(0, UA_NS0ID_OBJECTSFOLDER);
     UA_NodeId parentNodeId = UA_NODEID_NUMERIC(0, UA_NS0ID_OBJECTSFOLDER);
     UA_NodeId parentReferenceNodeId = UA_NODEID_NUMERIC(0, UA_NS0ID_ORGANIZES);
     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_ValueCallback callback = {(void*)7, onRead, onWrite};
     UA_Server_setAttribute_value_callback(server, myIntegerNodeId, callback);
     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,
 UA_StatusCode UA_EXPORT UA_Server_addReference(UA_Server *server, const UA_NodeId *sourceId,
                                                const UA_NodeId *refTypeId, const UA_ExpandedNodeId *targetId);
                                                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. */
 /* Don't use this function. There are typed versions as inline functions. */
 UA_AddNodesResult UA_EXPORT
 UA_AddNodesResult UA_EXPORT
 UA_Server_addNode(UA_Server *server, const UA_NodeClass nodeClass, const UA_NodeId requestedNewNodeId,
 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_AddNodesResult UA_EXPORT
 UA_Server_addMethodNode(UA_Server *server, const UA_NodeId requestedNewNodeId,
 UA_Server_addMethodNode(UA_Server *server, const UA_NodeId requestedNewNodeId,
                         const UA_NodeId parentNodeId, const UA_NodeId referenceTypeId,
                         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_MethodCallback method, void *handle,
                         UA_Int32 inputArgumentsSize, const UA_Argument* inputArguments, 
                         UA_Int32 inputArgumentsSize, const UA_Argument* inputArguments, 
                         UA_Int32 outputArgumentsSize, const UA_Argument* outputArguments);
                         UA_Int32 outputArgumentsSize, const UA_Argument* outputArguments);
 #endif
 #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);
 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
 /** 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,
     .nodeId = {.namespaceIndex = 0, .identifierType = UA_NODEIDTYPE_NUMERIC,
                .identifier.numeric = UA_NS0ID_HASTYPEDEFINITION},
                .identifier.numeric = UA_NS0ID_HASTYPEDEFINITION},
     .namespaceUri = {.length = -1, .data = UA_NULL}, .serverIndex = 0};
     .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
 #ifndef ENABLE_GENERATE_NAMESPACE0
 static const UA_ExpandedNodeId expandedNodeIdNonHierarchicalReferences = {
 static const UA_ExpandedNodeId expandedNodeIdNonHierarchicalReferences = {
@@ -68,7 +65,7 @@ static void UA_ExternalNamespace_deleteMembers(UA_ExternalNamespace *ens) {
     ens->externalNodeStore.destroy(ens->externalNodeStore.ensHandle);
     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++){
 	for(UA_UInt32 i = 0; i < server->externalNamespacesSize; i++){
 		UA_ExternalNamespace_deleteMembers(&(server->externalNamespaces[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)
 	if(nodeStore == UA_NULL)
 		return UA_STATUSCODE_BADARGUMENTSMISSING;
 		return UA_STATUSCODE_BADARGUMENTSMISSING;
 
 
+    UA_UInt32 size = server->externalNamespacesSize;
 	//do not allow double indices
 	//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)
 		if(server->externalNamespaces[i].index == namespaceIndex)
 			return UA_STATUSCODE_BADINDEXRANGEINVALID;
 			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++;
     server->externalNamespacesSize++;
     return UA_STATUSCODE_GOOD;
     return UA_STATUSCODE_GOOD;
 }
 }
 #endif /* UA_EXTERNAL_NAMESPACES*/
 #endif /* UA_EXTERNAL_NAMESPACES*/
 
 
 UA_UInt16 UA_Server_addNamespace(UA_Server *server, const char* name) {
 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->namespaces[server->namespacesSize] = UA_STRING_ALLOC(name);
     server->namespacesSize++;
     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) {
 UA_StatusCode UA_Server_deleteNode(UA_Server *server, UA_NodeId nodeId) {
     return Service_DeleteNodes_single(server, &adminSession, nodeId, UA_TRUE);
     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;
     UA_StatusCode retval = UA_STATUSCODE_GOOD;
     const UA_Node *parent = UA_NodeStore_get(server->nodestore, &parentNodeId);
     const UA_Node *parent = UA_NodeStore_get(server->nodestore, &parentNodeId);
     if(!parent)
     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++) {
     for(int i=0; i<parent->referencesSize; i++) {
         UA_ReferenceNode *ref = &parent->references[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);
     UA_NodeStore_release(parent);
@@ -127,15 +129,15 @@ UA_StatusCode UA_Server_forEachChildNodeCall(UA_Server *server, UA_NodeId parent
 }
 }
 
 
 UA_StatusCode
 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 item;
     UA_AddReferencesItem_init(&item);
     UA_AddReferencesItem_init(&item);
     item.sourceNodeId = *sourceId;
     item.sourceNodeId = *sourceId;
     item.referenceTypeId = *refTypeId;
     item.referenceTypeId = *refTypeId;
     item.isForward = UA_TRUE;
     item.isForward = UA_TRUE;
     item.targetNodeId = *targetId;
     item.targetNodeId = *targetId;
-    return Service_AddReferences_single(server, &adminSession, (const UA_AddReferencesItem*)&item);
+    return Service_AddReferences_single(server, &adminSession, &item);
 }
 }
 
 
 static UA_AddNodesResult
 static UA_AddNodesResult
@@ -143,15 +145,17 @@ addNodeInternal(UA_Server *server, UA_Node *node, const UA_NodeId *parentNodeId,
                 const UA_NodeId *referenceTypeId) {
                 const UA_NodeId *referenceTypeId) {
     UA_AddNodesResult res;
     UA_AddNodesResult res;
     UA_AddNodesResult_init(&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;
     return res;
 }
 }
 
 
 UA_AddNodesResult
 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 result;
     UA_AddNodesResult_init(&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;
     item.nodeClass = nodeClass;
     result.statusCode |= UA_NodeId_copy(&parentNodeId, &item.parentNodeId.nodeId);
     result.statusCode |= UA_NodeId_copy(&parentNodeId, &item.parentNodeId.nodeId);
     result.statusCode |= UA_NodeId_copy(&referenceTypeId, &item.referenceTypeId);
     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);
     result.statusCode |= UA_NodeId_copy(&typeDefinition, &item.typeDefinition.nodeId);
     UA_NodeAttributes *attrCopy = UA_alloca(attributeType->memSize);
     UA_NodeAttributes *attrCopy = UA_alloca(attributeType->memSize);
     result.statusCode |= UA_copy(attr, attrCopy, attributeType);
     result.statusCode |= UA_copy(attr, attrCopy, attributeType);
     if(result.statusCode == UA_STATUSCODE_GOOD)
     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_AddNodesItem_deleteMembers(&item);
     UA_deleteMembers(attrCopy, attributeType);
     UA_deleteMembers(attrCopy, attributeType);
@@ -190,8 +196,9 @@ void UA_Server_addNetworkLayer(UA_Server *server, UA_ServerNetworkLayer *network
 
 
     if(server->description.discoveryUrlsSize < 0)
     if(server->description.discoveryUrlsSize < 0)
         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) {
     if(!newUrls) {
         UA_LOG_ERROR(server->logger, UA_LOGCATEGORY_SERVER, "Adding discoveryUrl");
         UA_LOG_ERROR(server->logger, UA_LOGCATEGORY_SERVER, "Adding discoveryUrl");
         return;
         return;
@@ -200,14 +207,17 @@ void UA_Server_addNetworkLayer(UA_Server *server, UA_ServerNetworkLayer *network
     UA_String_copy(&networkLayer->discoveryUrl,
     UA_String_copy(&networkLayer->discoveryUrl,
                    &server->description.discoveryUrls[server->description.discoveryUrlsSize]);
                    &server->description.discoveryUrls[server->description.discoveryUrlsSize]);
     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)
         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) {
 void UA_Server_setServerCertificate(UA_Server *server, UA_ByteString certificate) {
     for(UA_Int32 i = 0; i < server->endpointDescriptionsSize; i++)
     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) {
 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);
     UA_Server_deleteExternalNamespaces(server);
 #endif
 #endif
     UA_ByteString_deleteMembers(&server->serverCertificate);
     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);
                     server->endpointDescriptionsSize);
 
 
     // Delete the network layers
     // Delete the network layers
@@ -246,7 +258,8 @@ void UA_Server_delete(UA_Server *server) {
     UA_free(server->networkLayers);
     UA_free(server->networkLayers);
 
 
 #ifdef UA_MULTITHREADING
 #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_barrier(); // wait for all scheduled call_rcu work to complete
    	rcu_unregister_thread();
    	rcu_unregister_thread();
 #endif
 #endif
@@ -314,8 +327,9 @@ readNamespaces(void *handle, const UA_NodeId nodeid, UA_Boolean sourceTimestamp,
         return UA_STATUSCODE_GOOD;
         return UA_STATUSCODE_GOOD;
     }
     }
     UA_Server *server = (UA_Server*)handle;
     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)
     if(retval != UA_STATUSCODE_GOOD)
         return retval;
         return retval;
     value->hasValue = UA_TRUE;
     value->hasValue = UA_TRUE;
@@ -326,8 +340,9 @@ readNamespaces(void *handle, const UA_NodeId nodeid, UA_Boolean sourceTimestamp,
     return UA_STATUSCODE_GOOD;
     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) {
     if(range) {
         value->hasStatus = UA_TRUE;
         value->hasStatus = UA_TRUE;
         value->status = UA_STATUSCODE_BADINDEXRANGEINVALID;
         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);
     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();
     UA_DataTypeNode *datatype = UA_DataTypeNode_new();
     copyNames((UA_Node*)datatype, name);
     copyNames((UA_Node*)datatype, name);
     datatype->nodeId.identifier.numeric = datatypeid;
     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();
     UA_ObjectTypeNode *objecttype = UA_ObjectTypeNode_new();
     copyNames((UA_Node*)objecttype, name);
     copyNames((UA_Node*)objecttype, name);
     objecttype->nodeId.identifier.numeric = objecttypeid;
     objecttype->nodeId.identifier.numeric = objecttypeid;
     addNodeInternal(server, (UA_Node*)objecttype, &UA_NODEID_NUMERIC(0, parent),
     addNodeInternal(server, (UA_Node*)objecttype, &UA_NODEID_NUMERIC(0, parent),
-                      &UA_NODEID_NUMERIC(0, parentreference));
+                    &UA_NODEID_NUMERIC(0, parentreference));
 }
 }
 
 
 static UA_VariableTypeNode*
 static UA_VariableTypeNode*
@@ -380,16 +398,20 @@ createVariableTypeNode(UA_Server *server, char* name, UA_UInt32 variabletypeid,
     return variabletype;
     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);
     UA_VariableTypeNode *variabletype = createVariableTypeNode(server, name, variabletypeid, parent, abstract);
     addNodeInternal(server, (UA_Node*)variabletype, &UA_NODEID_NUMERIC(0, parent), &nodeIdOrganizes);
     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) {
 UA_Server * UA_Server_new(UA_ServerConfig config) {
@@ -424,10 +446,12 @@ UA_Server * UA_Server_new(UA_ServerConfig config) {
     // mockup application description
     // mockup application description
     UA_ApplicationDescription_init(&server->description);
     UA_ApplicationDescription_init(&server->description);
     server->description.productUri = UA_STRING_ALLOC(PRODUCT_URI);
     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.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->description.applicationType = UA_APPLICATIONTYPE_SERVER;
     server->externalNamespacesSize = 0;
     server->externalNamespacesSize = 0;
     server->externalNamespaces = UA_NULL;
     server->externalNamespaces = UA_NULL;
@@ -647,7 +671,8 @@ UA_Server * UA_Server_new(UA_ServerConfig config) {
     generatesevent->nodeId.identifier.numeric = UA_NS0ID_GENERATESEVENT;
     generatesevent->nodeId.identifier.numeric = UA_NS0ID_GENERATESEVENT;
     generatesevent->isAbstract = UA_FALSE;
     generatesevent->isAbstract = UA_FALSE;
     generatesevent->symmetric  = 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();
     UA_ReferenceTypeNode *aggregates = UA_ReferenceTypeNode_new();
     copyNames((UA_Node*)aggregates, "Aggregates");
     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->nodeId.identifier.numeric = UA_NS0ID_AGGREGATES;
     aggregates->isAbstract = UA_TRUE;
     aggregates->isAbstract = UA_TRUE;
     aggregates->symmetric  = UA_FALSE;
     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
     // 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_EXPANDEDNODEID_NUMERIC(0, UA_NS0ID_HASSUBTYPE));
 
 
     UA_ReferenceTypeNode *hasproperty = UA_ReferenceTypeNode_new();
     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->nodeId.identifier.numeric = UA_NS0ID_HASPROPERTY;
     hasproperty->isAbstract = UA_FALSE;
     hasproperty->isAbstract = UA_FALSE;
     hasproperty->symmetric  = 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();
     UA_ReferenceTypeNode *hascomponent = UA_ReferenceTypeNode_new();
     copyNames((UA_Node*)hascomponent, "HasComponent");
     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->nodeId.identifier.numeric = UA_NS0ID_HASCOMPONENT;
     hascomponent->isAbstract = UA_FALSE;
     hascomponent->isAbstract = UA_FALSE;
     hascomponent->symmetric  = 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();
     UA_ReferenceTypeNode *hasnotifier = UA_ReferenceTypeNode_new();
     copyNames((UA_Node*)hasnotifier, "HasNotifier");
     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.data = UA_LocalizedText_new();
        shutdownreason->value.variant.value.type = &UA_TYPES[UA_TYPES_LOCALIZEDTEXT];
        shutdownreason->value.variant.value.type = &UA_TYPES[UA_TYPES_LOCALIZEDTEXT];
        addNodeInternal(server, (UA_Node*)shutdownreason,
        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),
        UA_Server_addReference(server, &UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_SERVERSTATUS_SHUTDOWNREASON),
                               &nodeIdHasTypeDefinition, &expandedNodeIdBaseDataVariabletype);
                               &nodeIdHasTypeDefinition, &expandedNodeIdBaseDataVariabletype);
 
 
@@ -1155,8 +1183,9 @@ UA_Server * UA_Server_new(UA_ServerConfig config) {
 }
 }
 
 
 UA_StatusCode
 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 wvalue;
     UA_WriteValue_init(&wvalue);
     UA_WriteValue_init(&wvalue);
     wvalue.nodeId = nodeId;
     wvalue.nodeId = nodeId;
@@ -1170,8 +1199,8 @@ UA_Server_setNodeAttribute(UA_Server *server, const UA_NodeId nodeId, const UA_A
 }
 }
 
 
 UA_StatusCode
 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 wvalue;
     UA_WriteValue_init(&wvalue);
     UA_WriteValue_init(&wvalue);
     wvalue.nodeId = nodeId;
     wvalue.nodeId = nodeId;
@@ -1204,8 +1233,8 @@ UA_Server_setNodeAttribute_value_destructive(UA_Server *server, const UA_NodeId
 
 
 #ifdef ENABLE_METHODCALLS
 #ifdef ENABLE_METHODCALLS
 UA_StatusCode
 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;
     UA_StatusCode retval;
  retrySetMethod:
  retrySetMethod:
     retval = UA_STATUSCODE_GOOD;
     retval = UA_STATUSCODE_GOOD;
@@ -1245,7 +1274,8 @@ UA_Server_setNodeAttribute_method(UA_Server *server, UA_NodeId methodNodeId, UA_
 #endif
 #endif
 
 
 UA_StatusCode UA_EXPORT
 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;
     const UA_Node *orig;
  retrySetValueCallback:
  retrySetValueCallback:
     orig = UA_NodeStore_get(server->nodestore, &nodeId);
     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;
     editable->value.variant.callback = callback;
   
   
 #ifdef UA_MULTITHREADING
 #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) {
     if(retval != UA_STATUSCODE_GOOD) {
         /* The node was replaced in the background */
         /* The node was replaced in the background */
         UA_NodeStore_release(orig);
         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;
     editable->valueSource = UA_VALUESOURCE_DATASOURCE;
   
   
 #ifdef UA_MULTITHREADING
 #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) {
     if(retval != UA_STATUSCODE_GOOD) {
         /* The node was replaced in the background */
         /* The node was replaced in the background */
         UA_NodeStore_release(orig);
         UA_NodeStore_release(orig);
@@ -1332,7 +1364,8 @@ UA_Server_getNodeAttribute(UA_Server *server, const UA_NodeId nodeId,
                            const UA_AttributeId attributeId, void *v) {
                            const UA_AttributeId attributeId, void *v) {
     UA_Variant out;
     UA_Variant out;
     UA_Variant_init(&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)
     if(retval != UA_STATUSCODE_GOOD)
         return retval;
         return retval;
     if(attributeId == UA_ATTRIBUTEID_VALUE)
     if(attributeId == UA_ATTRIBUTEID_VALUE)
@@ -1348,7 +1381,8 @@ UA_Server_getNodeAttribute(UA_Server *server, const UA_NodeId nodeId,
 
 
 #ifdef ENABLE_METHODCALLS
 #ifdef ENABLE_METHODCALLS
 UA_StatusCode
 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);
     const UA_Node *node = UA_NodeStore_get(server->nodestore, &nodeId);
     if(!node)
     if(!node)
         return UA_STATUSCODE_BADNODEIDUNKNOWN;
         return UA_STATUSCODE_BADNODEIDUNKNOWN;
@@ -1365,8 +1399,10 @@ UA_Server_getNodeAttribute_method(UA_Server *server, UA_NodeId nodeId, UA_Method
 #endif
 #endif
 
 
 UA_StatusCode
 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)
     if(!node)
         return UA_STATUSCODE_BADNODEIDUNKNOWN;
         return UA_STATUSCODE_BADNODEIDUNKNOWN;
 
 

+ 14 - 11
src/server/ua_services_call.c

@@ -5,8 +5,9 @@
 #include "ua_nodestore.h"
 #include "ua_nodestore.h"
 #include "ua_nodes.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;
     const UA_Node *refTarget;
     UA_NodeId hasProperty = UA_NODEID_NUMERIC(0, UA_NS0ID_HASPROPERTY);
     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;
     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) )
     if(!UA_NodeId_equal(&var->type->typeId, &arg.dataType) )
         return UA_STATUSCODE_BADINVALIDARGUMENT;
         return UA_STATUSCODE_BADINVALIDARGUMENT;
     
     
@@ -72,7 +74,8 @@ static UA_StatusCode statisfySignature(UA_Variant *var, UA_Argument arg) {
     return UA_STATUSCODE_GOOD;
     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] &&
     if(argDefinition->value.variant.value.type != &UA_TYPES[UA_TYPES_ARGUMENT] &&
         argDefinition->value.variant.value.type != &UA_TYPES[UA_TYPES_EXTENSIONOBJECT])
         argDefinition->value.variant.value.type != &UA_TYPES[UA_TYPES_EXTENSIONOBJECT])
         return UA_STATUSCODE_BADINTERNALERROR;
         return UA_STATUSCODE_BADINTERNALERROR;
@@ -104,17 +107,16 @@ static UA_StatusCode argConformsToDefinition(UA_CallMethodRequest *rs, const UA_
     return retval;
     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) {
     if(!methodCalled) {
         result->statusCode = UA_STATUSCODE_BADMETHODINVALID;
         result->statusCode = UA_STATUSCODE_BADMETHODINVALID;
         return;
         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) {
     if(!withObject) {
         result->statusCode = UA_STATUSCODE_BADNODEIDINVALID;
         result->statusCode = UA_STATUSCODE_BADNODEIDINVALID;
         goto releaseMethodReturn;
         goto releaseMethodReturn;
@@ -203,7 +205,8 @@ void Service_Call(UA_Server *server, UA_Session *session, const UA_CallRequest *
         return;
         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) {
     if(!response->results) {
         response->responseHeader.serviceResult = UA_STATUSCODE_BADOUTOFMEMORY;
         response->responseHeader.serviceResult = UA_STATUSCODE_BADOUTOFMEMORY;
         return;
         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
     //FIXME: a bit dirty workaround of preserving namespace
     //namespace index is assumed to be valid
     //namespace index is assumed to be valid
     const UA_Node *managed = UA_NULL;
     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;
     tempNodeid.namespaceIndex = 0;
     if(UA_NodeId_isNull(&tempNodeid)) {
     if(UA_NodeId_isNull(&tempNodeid)) {
         if(UA_NodeStore_insert(server->nodestore, node, &managed) != UA_STATUSCODE_GOOD) {
         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) {
         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);
             UA_NodeId_deleteMembers(&result->addedNodeId);
             goto ret2;
             goto ret2;
         }
         }
@@ -100,7 +98,6 @@ void Service_AddNodes_single(UA_Server *server, UA_Session *session, UA_Node *no
     UA_NodeStore_release(managed);
     UA_NodeStore_release(managed);
     
     
  ret2:
  ret2:
-    UA_NodeId_deleteMembers(&tempNodeid);
     UA_NodeStore_release((const UA_Node*)referenceType);
     UA_NodeStore_release((const UA_Node*)referenceType);
  ret:
  ret:
     UA_NodeStore_release(parent);
     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);
     UA_NodeId_init(&item->requestedNewNodeId.nodeId);
 
 
     node->browseName = item->browseName;
     node->browseName = item->browseName;
-    UA_QualifiedName_deleteMembers(&item->browseName);
+    UA_QualifiedName_init(&item->browseName);
 
 
     node->displayName = attr->displayName;
     node->displayName = attr->displayName;
     UA_LocalizedText_init(&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->historizing = attr->historizing;
     vnode->minimumSamplingInterval = attr->minimumSamplingInterval;
     vnode->minimumSamplingInterval = attr->minimumSamplingInterval;
     vnode->valueRank = attr->valueRank;
     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.
     // don't use extra dimension spec. This comes from the value.
     /* if(attr.specifiedAttributes & UA_NODEATTRIBUTESMASK_ARRAYDIMENSIONS) { */
     /* 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 item;
     UA_AddNodesItem_init(&item);
     UA_AddNodesItem_init(&item);
     result.statusCode = UA_QualifiedName_copy(&browseName, &item.browseName);
     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(&parentNodeId, &item.parentNodeId.nodeId);
     result.statusCode |= UA_NodeId_copy(&referenceTypeId, &item.referenceTypeId);
     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);
@@ -464,9 +463,9 @@ UA_Server_addDataSourceVariableNode(UA_Server *server, const UA_NodeId requested
 
 
 #ifdef ENABLE_METHODCALLS
 #ifdef ENABLE_METHODCALLS
 UA_AddNodesResult UA_EXPORT
 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_MethodCallback method, void *handle,
                         UA_Int32 inputArgumentsSize, const UA_Argument* inputArguments, 
                         UA_Int32 inputArgumentsSize, const UA_Argument* inputArguments, 
                         UA_Int32 outputArgumentsSize, const UA_Argument* outputArguments) {
                         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);
     UA_AddNodesItem_init(&item);
     result.statusCode = UA_QualifiedName_copy(&browseName, &item.browseName);
     result.statusCode = UA_QualifiedName_copy(&browseName, &item.browseName);
     item.nodeClass = UA_NODECLASS_METHOD;
     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_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) {
     if(result.statusCode != UA_STATUSCODE_GOOD) {
         UA_AddNodesItem_deleteMembers(&item);
         UA_AddNodesItem_deleteMembers(&item);
-        UA_NodeAttributes_deleteMembers(&attrCopy);
+        UA_MethodAttributes_deleteMembers(&attrCopy);
         return result;
         return result;
     }
     }
 
 
@@ -493,17 +492,20 @@ UA_Server_addMethodNode(UA_Server *server, const UA_ExpandedNodeId requestedNewN
     if(!node) {
     if(!node) {
         result.statusCode = UA_STATUSCODE_BADOUTOFMEMORY;
         result.statusCode = UA_STATUSCODE_BADOUTOFMEMORY;
         UA_AddNodesItem_deleteMembers(&item);
         UA_AddNodesItem_deleteMembers(&item);
-        UA_NodeAttributes_deleteMembers(&attrCopy);
+        UA_MethodAttributes_deleteMembers(&attrCopy);
         return result;
         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_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);
                             &item.referenceTypeId, &result);
     if(result.statusCode != UA_STATUSCODE_GOOD) {
     if(result.statusCode != UA_STATUSCODE_GOOD) {
         UA_MethodNode_delete(node);
         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,
     UA_Variant_setArrayCopy(&inputArgumentsVariableNode->value.variant.value, inputArguments,
                             inputArgumentsSize, &UA_TYPES[UA_TYPES_ARGUMENT]);
                             inputArgumentsSize, &UA_TYPES[UA_TYPES_ARGUMENT]);
     UA_AddNodesResult inputAddRes;
     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
     // todo: check if adding succeeded
     UA_AddNodesResult_deleteMembers(&inputAddRes);
     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,
     UA_Variant_setArrayCopy(&outputArgumentsVariableNode->value.variant.value, outputArguments,
                             outputArgumentsSize, &UA_TYPES[UA_TYPES_ARGUMENT]);
                             outputArgumentsSize, &UA_TYPES[UA_TYPES_ARGUMENT]);
     UA_AddNodesResult outputAddRes;
     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
     // todo: check if adding succeeded
     UA_AddNodesResult_deleteMembers(&outputAddRes);
     UA_AddNodesResult_deleteMembers(&outputAddRes);
 
 
@@ -709,7 +712,7 @@ void Service_AddReferences(UA_Server *server, UA_Session *session, const UA_AddR
 		size_t indicesSize = 0;
 		size_t indicesSize = 0;
 		for(size_t i = 0;i < size;i++) {
 		for(size_t i = 0;i < size;i++) {
 			if(request->referencesToAdd[i].sourceNodeId.namespaceIndex
 			if(request->referencesToAdd[i].sourceNodeId.namespaceIndex
-					!= server->externalNamespaces[j].index)
+               != server->externalNamespaces[j].index)
 				continue;
 				continue;
 			isExternal[i] = UA_TRUE;
 			isExternal[i] = UA_TRUE;
 			indices[indicesSize] = i;
 			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_StatusCode Service_DeleteNodes_single(UA_Server *server, UA_Session *session, UA_NodeId nodeId,
                                          UA_Boolean deleteReferences) {
                                          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,
 void Service_DeleteNodes(UA_Server *server, UA_Session *session, const UA_DeleteNodesRequest *request,
                          UA_DeleteNodesResponse *response) {
                          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);
+    }
 }
 }
 
 
 /*********************/
 /*********************/

Failā izmaiņas netiks attēlotas, jo tās ir par lielu
+ 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",
                  "AddReferencesItem","DeleteReferencesItem", "VariableNode", "MethodNode", "VariableTypeNode",
                  "ViewNode", "ReferenceTypeNode", "BrowseResultMask", "ServerState", "ServerStatusDataType", "BuildInfo",
                  "ViewNode", "ReferenceTypeNode", "BrowseResultMask", "ServerState", "ServerStatusDataType", "BuildInfo",
                  "ObjectNode", "DataTypeNode", "ObjectTypeNode", "IdType", "NodeAttributes",
                  "ObjectNode", "DataTypeNode", "ObjectTypeNode", "IdType", "NodeAttributes",
-                 "VariableAttributes", "ObjectAttributes", "ReferenceTypeAttributes", "ViewAttributes",
+                 "VariableAttributes", "ObjectAttributes", "ReferenceTypeAttributes", "ViewAttributes", "MethodAttributes",
                  "ObjectTypeAttributes", "VariableTypeAttributes", "DataTypeAttributes", "NodeAttributesMask",
                  "ObjectTypeAttributes", "VariableTypeAttributes", "DataTypeAttributes", "NodeAttributesMask",
                  "DeleteNodesItem", "DeleteNodesRequest", "DeleteNodesResponse",
                  "DeleteNodesItem", "DeleteNodesRequest", "DeleteNodesResponse",
                  "DeleteReferencesItem", "DeleteReferencesRequest", "DeleteReferencesResponse",
                  "DeleteReferencesItem", "DeleteReferencesRequest", "DeleteReferencesResponse",