Przeglądaj źródła

Created missing serverside API calls for creating and deleting all nodetypes. Clientside API calls was matched (symmetry) to the call structure of the server API. Tutorial on adding nodes was started (WIP).

ichrispa 9 lat temu
rodzic
commit
b481cc3a94

+ 2 - 2
doc/firstSteps.rst

@@ -163,7 +163,7 @@ open62541 is a highly configurable stack that lets you turn several features on
 
 A detailed list of all configuration options is given in the documentation of open62541. This tutorial will introduce you to some of these options one by one in due course, but I will mention a couple of non-feature related options at this point to give readers a heads-up on the advantages and consequences of using them.
 
-A word of warning: If you change cmake options, always make sure that you have a clean build directory first (unless you know what you are doing). CMake will *not* reliably detect changes to non-source files, such as source files for scripts and generators. Always run ``make clean`` between builds.
+**Warning:** If you change cmake options, always make sure that you have a clean build directory first (unless you know what you are doing). CMake will *not* reliably detect changes to non-source files, such as source files for scripts and generators. Always run ``make clean`` between builds, and remove the ``CMakeCache.txt`` file from your build directory to make super-double-extra-sure that your build is clean before executing cmake.
 
 **ENABLE_AMALGAMATION**
 
@@ -258,7 +258,7 @@ There are several ways of building open62541, and all have their advantages and
  * RelWithDebInfo: Will run mediocre optimization and include debugging symbols (-O2 -g)
  * MinSizeRel: Will run string optimziation and include no debugging info (-Os -DNBEBUG)
 
-**WARNING:** If you are generating namespaces (please read the following sections), the compiler will try to optimize a function with 32k lines of generated code. This will propably result in a compilation run of >60Minutes (79min; 8-Core AMD FX; 16GB RAM; 64Bit Linux). Please ping build type ``Debug`` if you intend to compile large namespaces.
+**WARNING:** If you are generating namespaces (please read the following sections), the compiler will try to optimize a function with 32k lines of generated code. This will propably result in a compilation run of >60Minutes (79min; 8-Core AMD FX; 16GB RAM; 64Bit Linux). Please pick build type ``Debug`` if you intend to compile large namespaces.
 
 Conclusion
 ----------

Plik diff jest za duży
+ 240 - 0
doc/tutorial_nodes.rst


+ 28 - 29
examples/client.c

@@ -160,8 +160,10 @@ int main(int argc, char *argv[]) {
 #ifdef ENABLE_ADDNODES 
     /* Create a new object type node */
     // New ReferenceType
-    UA_AddNodesResponse *adResp = UA_Client_createReferenceTypeNode(client,
-        UA_EXPANDEDNODEID_NUMERIC(1, 12133), // Assign this NodeId (will fail if client is called multiple times)
+    UA_StatusCode addRes;
+    UA_NodeId retNodeId;
+    addRes = UA_Client_addReferenceTypeNode(client,
+        UA_NODEID_NUMERIC(1, 12133), // Assign this NodeId (will fail if client is called multiple times)
         UA_QUALIFIEDNAME(0, "NewReference"),
         UA_LOCALIZEDTEXT("en_US", "TheNewReference"),
         UA_LOCALIZEDTEXT("en_US", "References something that might or might not exist."),
@@ -169,44 +171,43 @@ int main(int argc, char *argv[]) {
         UA_NODEID_NUMERIC(0, UA_NS0ID_ORGANIZES),
         (UA_UInt32) 0, (UA_UInt32) 0, 
         UA_EXPANDEDNODEID_NUMERIC(0, UA_NS0ID_OBJECTSFOLDER),
-        UA_LOCALIZEDTEXT("en_US", "IsNewlyReferencedBy"));
-    if (adResp->resultsSize > 0 && adResp->results[0].statusCode == UA_STATUSCODE_GOOD ) {
-        printf("Created 'NewReference' with numeric NodeID %u\n", adResp->results[0].addedNodeId.identifier.numeric );
+        UA_LOCALIZEDTEXT("en_US", "IsNewlyReferencedBy"),
+        &retNodeId);
+    if (addRes == UA_STATUSCODE_GOOD ) {
+      printf("Created 'NewReference' with numeric NodeID %u\n", retNodeId.identifier.numeric );
     }
-    UA_AddNodesResponse_deleteMembers(adResp);
-    free(adResp);
     
     // New ObjectType
-    adResp = UA_Client_createObjectTypeNode(client,    
-        UA_EXPANDEDNODEID_NUMERIC(1, 12134), // Assign this NodeId (will fail if client is called multiple times)
+    addRes = UA_Client_addObjectTypeNode(client,    
+        UA_NODEID_NUMERIC(1, 12134), // Assign this NodeId (will fail if client is called multiple times)
         UA_QUALIFIEDNAME(0, "NewObjectType"),
         UA_LOCALIZEDTEXT("en_US", "TheNewObjectType"),
         UA_LOCALIZEDTEXT("en_US", "Put innovative description here."),
         UA_EXPANDEDNODEID_NUMERIC(0, UA_NS0ID_OBJECTSFOLDER),
         UA_NODEID_NUMERIC(0, UA_NS0ID_ORGANIZES),
         (UA_UInt32) 0, (UA_UInt32) 0, 
-        UA_EXPANDEDNODEID_NUMERIC(0, UA_NS0ID_OBJECTSFOLDER));
-        if (adResp->resultsSize > 0 && adResp->results[0].statusCode == UA_STATUSCODE_GOOD ) {
-        printf("Created 'NewObjectType' with numeric NodeID %u\n", adResp->results[0].addedNodeId.identifier.numeric );
+        UA_EXPANDEDNODEID_NUMERIC(0, UA_NS0ID_OBJECTSFOLDER), 
+        UA_FALSE,
+        &retNodeId);
+    if (addRes == UA_STATUSCODE_GOOD ) {
+      printf("Created 'NewObjectType' with numeric NodeID %u\n", retNodeId.identifier.numeric );
     }
     
     // New Object
-    adResp = UA_Client_createObjectNode(client,    
-        UA_EXPANDEDNODEID_NUMERIC(1, 0), // Assign new/random NodeID  
+    addRes = UA_Client_addObjectNode(client,    
+        UA_NODEID_NUMERIC(1, 0), // Assign new/random NodeID  
         UA_QUALIFIEDNAME(0, "TheNewGreatNodeBrowseName"),
         UA_LOCALIZEDTEXT("en_US", "TheNewGreatNode"),
         UA_LOCALIZEDTEXT("de_DE", "Hier koennte Ihre Webung stehen!"),
         UA_EXPANDEDNODEID_NUMERIC(0, UA_NS0ID_OBJECTSFOLDER),
         UA_NODEID_NUMERIC(0, UA_NS0ID_ORGANIZES),
         (UA_UInt32) 0, (UA_UInt32) 0, 
-        UA_EXPANDEDNODEID_NUMERIC(0, UA_NS0ID_OBJECTSFOLDER));
-    if (adResp->resultsSize > 0 && adResp->results[0].statusCode == UA_STATUSCODE_GOOD ) {
-        printf("Created 'NewObject' with numeric NodeID %u\n", adResp->results[0].addedNodeId.identifier.numeric );
+        UA_EXPANDEDNODEID_NUMERIC(0, UA_NS0ID_OBJECTSFOLDER), 
+        &retNodeId);
+    if (addRes == UA_STATUSCODE_GOOD ) {
+      printf("Created 'NewObject' with numeric NodeID %u\n", retNodeId.identifier.numeric );
     }
     
-    UA_AddNodesResponse_deleteMembers(adResp);
-    free(adResp);
-    
     // New Integer Variable
     UA_Variant *theValue = UA_Variant_new();
     UA_Int32 *theValueDate = UA_Int32_new();
@@ -214,22 +215,20 @@ int main(int argc, char *argv[]) {
     theValue->type = &UA_TYPES[UA_TYPES_INT32];
     theValue->data = theValueDate;
     
-    adResp = UA_Client_createVariableNode(client,
-        UA_EXPANDEDNODEID_NUMERIC(1, 0), // Assign new/random NodeID  
+    addRes = UA_Client_addVariableNode(client,
+        UA_NODEID_NUMERIC(1, 0), // Assign new/random NodeID  
         UA_QUALIFIEDNAME(0, "VariableNode"),
         UA_LOCALIZEDTEXT("en_US", "TheNewVariableNode"),
         UA_LOCALIZEDTEXT("en_US", "This integer is just amazing - it has digits and everything."),
         UA_EXPANDEDNODEID_NUMERIC(0, UA_NS0ID_OBJECTSFOLDER),
         UA_NODEID_NUMERIC(0, UA_NS0ID_ORGANIZES),
         (UA_UInt32) 0, (UA_UInt32) 0, 
-        UA_EXPANDEDNODEID_NUMERIC(0, UA_NS0ID_OBJECTSFOLDER),
-        UA_NODEID_NUMERIC(0, UA_NS0ID_INT32),
-        theValue);
-    if (adResp->resultsSize > 0 && adResp->results[0].statusCode == UA_STATUSCODE_GOOD ) {
-        printf("Created 'NewVariable' with numeric NodeID %u\n", adResp->results[0].addedNodeId.identifier.numeric );
+        theValue, 
+        &retNodeId);
+    if (addRes == UA_STATUSCODE_GOOD ) {
+      printf("Created 'NewVariable' with numeric NodeID %u\n", retNodeId.identifier.numeric );
     }
-    UA_AddNodesResponse_deleteMembers(adResp);
-    free(adResp);
+
     free(theValue);
     /* Done creating a new node*/
 #endif

+ 144 - 140
examples/server.c

@@ -203,174 +203,178 @@ UA_StatusCode nodeIter(UA_NodeId childId, UA_Boolean isInverse, UA_NodeId refere
 }
 
 int main(int argc, char** argv) {
-	signal(SIGINT, stopHandler); /* catches ctrl-c */
+  signal(SIGINT, stopHandler); /* catches ctrl-c */
 #ifdef UA_MULTITHREADING
-	pthread_rwlock_init(&writeLock, 0);
+  pthread_rwlock_init(&writeLock, 0);
 #endif
 
-    UA_Server *server; = UA_Server_new(UA_ServerConfig_standard);
-    logger = Logger_Stdout_new();
-    UA_Server_setLogger(server, logger);
-    UA_ByteString certificate = loadCertificate();
-    UA_Server_setServerCertificate(server, certificate);
-    UA_ByteString_deleteMembers(&certificate);
-	UA_Server_addNetworkLayer(server, ServerNetworkLayerTCP_new(UA_ConnectionConfig_standard, 16664));
+  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};
-	const UA_QualifiedName dateName = UA_QUALIFIEDNAME(1, "current time");
-	UA_Server_addDataSourceVariableNode(server, dateDataSource, dateName, UA_NODEID_NULL,
-                                        UA_NODEID_NUMERIC(0, UA_NS0ID_OBJECTSFOLDER), UA_NODEID_NUMERIC(0, UA_NS0ID_ORGANIZES), NULL);
+      // add node with the datetime data source
+      UA_DataSource dateDataSource = (UA_DataSource) {.handle = NULL, .read = readTimeData, .write = NULL};
+      const UA_QualifiedName dateName = UA_QUALIFIEDNAME(1, "current time");
+      UA_Server_addDataSourceVariableNode(server, dateDataSource, dateName, UA_NODEID_NULL,
+                                      UA_NODEID_NUMERIC(0, UA_NS0ID_OBJECTSFOLDER), UA_NODEID_NUMERIC(0, UA_NS0ID_ORGANIZES), NULL);
 
 #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_Server_addDataSourceVariableNode(server, temperatureDataSource, tempName, UA_NODEID_NULL,
-                                                    UA_NODEID_NUMERIC(0, UA_NS0ID_OBJECTSFOLDER), UA_NODEID_NUMERIC(0, UA_NS0ID_ORGANIZES), NULL);
-	}
+  //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_Server_addDataSourceVariableNode(server, temperatureDataSource, tempName, UA_NODEID_NULL,
+                                              UA_NODEID_NUMERIC(0, UA_NS0ID_OBJECTSFOLDER), UA_NODEID_NUMERIC(0, UA_NS0ID_ORGANIZES), NULL);
+  }
 
-	//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};
-            const UA_QualifiedName statusName = UA_QUALIFIEDNAME(0, "status LED");
-            UA_Server_addDataSourceVariableNode(server, ledStatusDataSource, statusName, UA_NODEID_NULL,
-                                                UA_NODEID_NUMERIC(0, UA_NS0ID_OBJECTSFOLDER),
-                                                UA_NODEID_NUMERIC(0, UA_NS0ID_ORGANIZES), NULL);
-        } else {
-            UA_LOG_WARNING(logger, UA_LOGCATEGORY_USERLAND, "[Raspberry Pi] LED file exist, but I have no access (try to run server with sudo)");
-        }
+  //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};
+      const UA_QualifiedName statusName = UA_QUALIFIEDNAME(0, "status LED");
+      UA_Server_addDataSourceVariableNode(server, ledStatusDataSource, statusName, UA_NODEID_NULL,
+                                          UA_NODEID_NUMERIC(0, UA_NS0ID_OBJECTSFOLDER),
+                                          UA_NODEID_NUMERIC(0, UA_NS0ID_ORGANIZES), NULL);
+    } else {
+      UA_LOG_WARNING(logger, UA_LOGCATEGORY_USERLAND, "[Raspberry Pi] LED file exist, but I have no access (try to run server with sudo)");
     }
+  }
 #endif
 
-	// add a static variable node to the adresspace
-    UA_Variant *myIntegerVariant = UA_Variant_new();
-    UA_Int32 myInteger = 42;
-    UA_Variant_setScalarCopy(myIntegerVariant, &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, myIntegerVariant, myIntegerName,
-                              myIntegerNodeId, parentNodeId, parentReferenceNodeId, NULL);
-
-   /**************/
-   /* Demo Nodes */
-   /**************/
+  // add a static variable node to the adresspace
+  UA_Variant *myIntegerVariant = UA_Variant_new();
+  UA_Int32 myInteger = 42;
+  UA_Variant_setScalarCopy(myIntegerVariant, &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, myIntegerName, UA_LOCALIZEDTEXT("en_US","My Integer"), UA_LOCALIZEDTEXT("en_US","My Integer"),
+                            parentNodeId, parentReferenceNodeId, 0, 0, myIntegerVariant, NULL);
+
+  /**************/
+  /* Demo Nodes */
+  /**************/
 
 #define DEMOID 50000
-   UA_Server_addObjectNode(server,UA_QUALIFIEDNAME(1, "Demo"), UA_NODEID_NUMERIC(1, DEMOID), UA_NODEID_NUMERIC(0, UA_NS0ID_OBJECTSFOLDER),
-                           UA_NODEID_NUMERIC(0, UA_NS0ID_ORGANIZES), UA_NODEID_NUMERIC(0, UA_NS0ID_FOLDERTYPE), NULL);
+  UA_Server_addObjectNode(server, UA_NODEID_NUMERIC(1, DEMOID), UA_QUALIFIEDNAME(1, "Demo"), UA_LOCALIZEDTEXT("en_US","Demo"), 
+                          UA_LOCALIZEDTEXT("en_US","Demo"), UA_NODEID_NUMERIC(0, UA_NS0ID_OBJECTSFOLDER), UA_NODEID_NUMERIC(0, UA_NS0ID_ORGANIZES), 
+                          0, 0, UA_EXPANDEDNODEID_NUMERIC(0, UA_NS0ID_FOLDERTYPE), NULL);
 
 #define SCALARID 50001
-   UA_Server_addObjectNode(server,UA_QUALIFIEDNAME(1, "Scalar"), UA_NODEID_NUMERIC(1, SCALARID), UA_NODEID_NUMERIC(1, DEMOID),
-                           UA_NODEID_NUMERIC(0, UA_NS0ID_ORGANIZES), UA_NODEID_NUMERIC(0, UA_NS0ID_FOLDERTYPE), NULL);
+  UA_Server_addObjectNode(server, UA_NODEID_NUMERIC(1, SCALARID), UA_QUALIFIEDNAME(1, "Scalar"), UA_LOCALIZEDTEXT("en_US","Demo"), 
+                          UA_LOCALIZEDTEXT("en_US","Demo"), UA_NODEID_NUMERIC(1, DEMOID), UA_NODEID_NUMERIC(0, UA_NS0ID_ORGANIZES), 
+                          0, 0, UA_EXPANDEDNODEID_NUMERIC(0, UA_NS0ID_FOLDERTYPE), NULL);
 
 #define ARRAYID 50002
-   UA_Server_addObjectNode(server,UA_QUALIFIEDNAME(1, "Array"), UA_NODEID_NUMERIC(1, ARRAYID), UA_NODEID_NUMERIC(1, DEMOID),
-                           UA_NODEID_NUMERIC(0, UA_NS0ID_ORGANIZES), UA_NODEID_NUMERIC(0, UA_NS0ID_FOLDERTYPE), NULL);
+  UA_Server_addObjectNode(server, UA_NODEID_NUMERIC(1, ARRAYID), UA_QUALIFIEDNAME(1, "Array"), UA_LOCALIZEDTEXT("en_US","Demo"), 
+                          UA_LOCALIZEDTEXT("en_US","Demo"), UA_NODEID_NUMERIC(1, DEMOID), UA_NODEID_NUMERIC(0, UA_NS0ID_ORGANIZES), 
+                          0, 0, UA_EXPANDEDNODEID_NUMERIC(0, UA_NS0ID_FOLDERTYPE), NULL);
 
 #define MATRIXID 50003
-   UA_Server_addObjectNode(server,UA_QUALIFIEDNAME(1, "Matrix"), UA_NODEID_NUMERIC(1, MATRIXID), UA_NODEID_NUMERIC(1, DEMOID),
-                           UA_NODEID_NUMERIC(0, UA_NS0ID_ORGANIZES), UA_NODEID_NUMERIC(0, UA_NS0ID_FOLDERTYPE), NULL);
-
-   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;
-       //add a scalar node for every built-in type
-        void *value = UA_new(&UA_TYPES[type]);
-        UA_Variant *variant = UA_Variant_new();
-        UA_Variant_setScalar(variant, value, &UA_TYPES[type]);
-        char name[15];
-        sprintf(name, "%02d", type);
-        UA_QualifiedName qualifiedName = UA_QUALIFIEDNAME(1, name);
-        UA_Server_addVariableNode(server, variant, qualifiedName, UA_NODEID_NUMERIC(1, ++id),
-                                  UA_NODEID_NUMERIC(1, SCALARID), UA_NODEID_NUMERIC(0, UA_NS0ID_ORGANIZES), NULL);
-
-        //add an array node for every built-in type
-        UA_Variant *arrayvar = UA_Variant_new();
-        UA_Variant_setArray(arrayvar, UA_Array_new(&UA_TYPES[type], 10), 10, &UA_TYPES[type]);
-        UA_Server_addVariableNode(server, arrayvar, qualifiedName, UA_NODEID_NUMERIC(1, ++id),
-                                  UA_NODEID_NUMERIC(1, ARRAYID), UA_NODEID_NUMERIC(0, UA_NS0ID_ORGANIZES), NULL);
-
-        //add an matrix node for every built-in type
-        arrayvar = UA_Variant_new();
-        void* myMultiArray = UA_Array_new(&UA_TYPES[type],9);
-        arrayvar->arrayDimensions = UA_Array_new(&UA_TYPES[UA_TYPES_INT32],2);
-        arrayvar->arrayDimensions[0] = 3;
-        arrayvar->arrayDimensions[1] = 3;
-        arrayvar->arrayDimensionsSize = 2;
-        arrayvar->arrayLength = 9;
-        arrayvar->data = myMultiArray;
-        arrayvar->type = &UA_TYPES[type];
-        UA_Server_addVariableNode(server, arrayvar, qualifiedName, UA_NODEID_NUMERIC(1, ++id),
-                                  UA_NODEID_NUMERIC(1, MATRIXID), UA_NODEID_NUMERIC(0, UA_NS0ID_ORGANIZES), NULL);
-   }
+  UA_Server_addObjectNode(server, UA_NODEID_NUMERIC(1, MATRIXID), UA_QUALIFIEDNAME(1, "Matrix"), UA_LOCALIZEDTEXT("en_US","Demo"), 
+                          UA_LOCALIZEDTEXT("en_US","Demo"), UA_NODEID_NUMERIC(1, DEMOID), UA_NODEID_NUMERIC(0, UA_NS0ID_ORGANIZES), 
+                          0, 0,  UA_EXPANDEDNODEID_NUMERIC(0, UA_NS0ID_FOLDERTYPE), NULL);
+
+  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;
+    //add a scalar node for every built-in type
+    void *value = UA_new(&UA_TYPES[type]);
+    UA_Variant *variant = UA_Variant_new();
+    UA_Variant_setScalar(variant, value, &UA_TYPES[type]);
+    char name[15];
+    sprintf(name, "%02d", type);
+    UA_QualifiedName qualifiedName = UA_QUALIFIEDNAME(1, name);
+    UA_Server_addVariableNode(server, UA_NODEID_NUMERIC(1, ++id), qualifiedName, UA_LOCALIZEDTEXT("en_US",""), UA_LOCALIZEDTEXT("en_US",""),
+                              UA_NODEID_NUMERIC(1, SCALARID), UA_NODEID_NUMERIC(0, UA_NS0ID_ORGANIZES), 0, 0, variant, NULL);
+
+    //add an array node for every built-in type
+    UA_Variant *arrayvar = UA_Variant_new();
+    UA_Variant_setArray(arrayvar, UA_Array_new(&UA_TYPES[type], 10), 10, &UA_TYPES[type]);
+    UA_Server_addVariableNode(server, UA_NODEID_NUMERIC(1, ++id), qualifiedName, UA_LOCALIZEDTEXT("en_US",""), UA_LOCALIZEDTEXT("en_US",""),
+                              UA_NODEID_NUMERIC(1, ARRAYID), UA_NODEID_NUMERIC(0, UA_NS0ID_ORGANIZES), 0, 0, arrayvar, NULL);
+
+    //add an matrix node for every built-in type
+    arrayvar = UA_Variant_new();
+    void* myMultiArray = UA_Array_new(&UA_TYPES[type],9);
+    arrayvar->arrayDimensions = UA_Array_new(&UA_TYPES[UA_TYPES_INT32],2);
+    arrayvar->arrayDimensions[0] = 3;
+    arrayvar->arrayDimensions[1] = 3;
+    arrayvar->arrayDimensionsSize = 2;
+    arrayvar->arrayLength = 9;
+    arrayvar->data = myMultiArray;
+    arrayvar->type = &UA_TYPES[type];
+    UA_Server_addVariableNode(server, UA_NODEID_NUMERIC(1, ++id), qualifiedName, UA_LOCALIZEDTEXT("en_US",""), UA_LOCALIZEDTEXT("en_US",""),
+                              UA_NODEID_NUMERIC(1, MATRIXID), UA_NODEID_NUMERIC(0, UA_NS0ID_ORGANIZES), 0, 0, arrayvar, NULL);
+  }
 
 #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_NodeId methodId; // Retrieve the actual ID if this node if a random id as in UA_NODEID_NUMERIC(1,0) is used
-   UA_Server_addMethodNode(server, UA_QUALIFIEDNAME(1,"ping"), UA_NODEID_NUMERIC(1,62541),
-                           UA_EXPANDEDNODEID_NUMERIC(0, UA_NS0ID_OBJECTSFOLDER), UA_NODEID_NUMERIC(0, UA_NS0ID_ORGANIZES),
-                           &getMonitoredItems, 1, &inputArguments, 1, &outputArguments, &methodId);
+  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_NodeId methodId; // Retrieve the actual ID if this node if a random id as in UA_NODEID_NUMERIC(1,0) is used
+  UA_Server_addMethodNode(server, UA_QUALIFIEDNAME(1,"ping"), UA_NODEID_NUMERIC(1,62541),
+                          UA_EXPANDEDNODEID_NUMERIC(0, UA_NS0ID_OBJECTSFOLDER), UA_NODEID_NUMERIC(0, UA_NS0ID_ORGANIZES),
+                          &getMonitoredItems, 1, &inputArguments, 1, &outputArguments, &methodId);
 #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);
-   
-   //start server
-	UA_StatusCode retval = UA_Server_run(server, 1, &running); //blocks until running=false
+  // 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);
+  
+  //start server
+  UA_StatusCode retval = UA_Server_run(server, 1, &running); //blocks until running=false
 
-	//ctrl-c received -> clean up
-	UA_Server_delete(server);
+  //ctrl-c received -> clean up
+  UA_Server_delete(server);
 
-	if(temperatureFile)
-		fclose(temperatureFile);
+  if(temperatureFile)
+          fclose(temperatureFile);
 
-	if(triggerFile) {
-		fseek(triggerFile, 0, SEEK_SET);
-		//setting led mode to default
-		fprintf(triggerFile, "%s", "mmc0");
-		fclose(triggerFile);
-	}
+  if(triggerFile) {
+          fseek(triggerFile, 0, SEEK_SET);
+          //setting led mode to default
+          fprintf(triggerFile, "%s", "mmc0");
+          fclose(triggerFile);
+  }
 
-	if(ledFile)
-		fclose(ledFile);
+  if(ledFile)
+    fclose(ledFile);
 
 #ifdef UA_MULTITHREADING
-	pthread_rwlock_destroy(&writeLock);
+  pthread_rwlock_destroy(&writeLock);
 #endif
 
-	return retval;
+  return retval;
 }

+ 1 - 1
examples/server_method.c

@@ -67,7 +67,7 @@ int main(int argc, char** argv) {
         
     UA_Server_addMethodNode(server, UA_QUALIFIEDNAME(1, "hello world"), UA_NODEID_NUMERIC(1,62541),
                             UA_EXPANDEDNODEID_NUMERIC(0, UA_NS0ID_OBJECTSFOLDER), UA_NODEID_NUMERIC(0, UA_NS0ID_ORGANIZES),
-                            &helloWorldMethod, 1, &inputArguments, 1, &outputArguments);
+                            &helloWorldMethod, 1, &inputArguments, 1, &outputArguments, NULL);
 
     /* start server */
     UA_StatusCode retval = UA_Server_run(server, 1, &running); //blocks until running=false

+ 2 - 2
examples/server_variable.c

@@ -38,8 +38,8 @@ int main(int argc, char** argv) {
     UA_NodeId myIntegerNodeId = UA_NODEID_STRING(1, "the.answer"); /* UA_NODEID_NULL would assign a random free nodeid */
     UA_NodeId parentNodeId = UA_NODEID_NUMERIC(0, UA_NS0ID_OBJECTSFOLDER);
     UA_NodeId parentReferenceNodeId = UA_NODEID_NUMERIC(0, UA_NS0ID_ORGANIZES);
-    UA_Server_addVariableNode(server, myIntegerVariant, myIntegerName,
-                              myIntegerNodeId, parentNodeId, parentReferenceNodeId);
+    UA_Server_addVariableNode(server, myIntegerNodeId, myIntegerName, UA_LOCALIZEDTEXT("en_US",""), UA_LOCALIZEDTEXT("en_US",""),
+                              parentNodeId, parentReferenceNodeId, 0, 0, myIntegerVariant, NULL);
 
     UA_StatusCode retval = UA_Server_run(server, 1, &running);
     UA_Server_delete(server);

+ 17 - 17
include/ua_client.h

@@ -67,23 +67,23 @@ UA_StatusCode UA_EXPORT UA_Client_CallServerMethod(UA_Client *client, UA_NodeId
                                                    UA_Int32 *outputSize, UA_Variant **output);
 #endif
     
-UA_AddNodesResponse UA_EXPORT *UA_Client_createObjectNode(  UA_Client *client, UA_ExpandedNodeId reqId, UA_QualifiedName browseName, UA_LocalizedText displayName, 
-                                                            UA_LocalizedText description, UA_ExpandedNodeId parentNodeId, UA_NodeId referenceTypeId,
-                                                            UA_UInt32 userWriteMask, UA_UInt32 writeMask, UA_ExpandedNodeId typeDefinition);
-
-UA_AddNodesResponse UA_EXPORT *UA_Client_createVariableNode(UA_Client *client, UA_ExpandedNodeId reqId, UA_QualifiedName browseName, UA_LocalizedText displayName, 
-                                                            UA_LocalizedText description, UA_ExpandedNodeId parentNodeId, UA_NodeId referenceTypeId,
-                                                            UA_UInt32 userWriteMask, UA_UInt32 writeMask, UA_ExpandedNodeId typeDefinition, 
-                                                            UA_NodeId dataType, UA_Variant *value );
-
-UA_AddNodesResponse UA_EXPORT *UA_Client_createReferenceTypeNode(UA_Client *client, UA_ExpandedNodeId reqId, UA_QualifiedName browseName, UA_LocalizedText displayName, 
-                                                            UA_LocalizedText description, UA_ExpandedNodeId parentNodeId, UA_NodeId referenceTypeId,
-                                                            UA_UInt32 userWriteMask, UA_UInt32 writeMask, UA_ExpandedNodeId typeDefinition,
-                                                            UA_LocalizedText inverseName );
-
-UA_AddNodesResponse UA_EXPORT *UA_Client_createObjectTypeNode(UA_Client *client, UA_ExpandedNodeId reqId, UA_QualifiedName browseName, UA_LocalizedText displayName, 
-                                                            UA_LocalizedText description, UA_ExpandedNodeId parentNodeId, UA_NodeId referenceTypeId,
-                                                            UA_UInt32 userWriteMask, UA_UInt32 writeMask, UA_ExpandedNodeId typeDefinition);
+UA_StatusCode UA_EXPORT UA_Client_addObjectNode( UA_Client *client, UA_NodeId reqId, UA_QualifiedName browseName, UA_LocalizedText displayName, 
+                                                 UA_LocalizedText description, UA_ExpandedNodeId parentNodeId, UA_NodeId referenceTypeId,
+                                                 UA_UInt32 userWriteMask, UA_UInt32 writeMask, UA_ExpandedNodeId typeDefinition, UA_NodeId *createdNodeId);
+
+UA_StatusCode UA_EXPORT UA_Client_addVariableNode( UA_Client *client, UA_NodeId reqId, UA_QualifiedName browseName, UA_LocalizedText displayName, 
+                                                   UA_LocalizedText description, UA_ExpandedNodeId parentNodeId, UA_NodeId referenceTypeId,
+                                                   UA_UInt32 userWriteMask, UA_UInt32 writeMask, UA_Variant *value, UA_NodeId *createdNodeId);
+
+UA_StatusCode UA_EXPORT UA_Client_addReferenceTypeNode( UA_Client *client, UA_NodeId reqId, UA_QualifiedName browseName, UA_LocalizedText displayName, 
+                                                        UA_LocalizedText description, UA_ExpandedNodeId parentNodeId, UA_NodeId referenceTypeId,
+                                                        UA_UInt32 userWriteMask, UA_UInt32 writeMask, UA_ExpandedNodeId typeDefinition,
+                                                        UA_LocalizedText inverseName, UA_NodeId *createdNodeId );
+
+UA_StatusCode UA_EXPORT UA_Client_addObjectTypeNode( UA_Client *client, UA_NodeId reqId, UA_QualifiedName browseName, UA_LocalizedText displayName, 
+                                                     UA_LocalizedText description, UA_ExpandedNodeId parentNodeId, UA_NodeId referenceTypeId,
+                                                     UA_UInt32 userWriteMask, UA_UInt32 writeMask, UA_ExpandedNodeId typeDefinition, UA_Boolean isAbstract, 
+                                                     UA_NodeId *createdNodeId);
 
 
 #ifdef ENABLE_SUBSCRIPTIONS

+ 96 - 9
include/ua_server.h

@@ -158,6 +158,46 @@ UA_SERVER_DELETENODEALIAS_DECL(Object)
  */
 UA_SERVER_DELETENODEALIAS_DECL(Variable)
 
+/** Deletes a ReferenceType node from the nodestore. This is a high-level alias for UA_Server_deleteNode()
+ * 
+ * @param server The server object
+ * @param nodeId ID of the node to be deleted
+ * 
+ * @return Return UA_STATUSCODE_GOOD if the node was deleted or an appropriate errorcode if the node was not found
+ *         or cannot be deleted.
+ */
+UA_SERVER_DELETENODEALIAS_DECL(ReferenceType)
+
+/** Deletes a View Node from the nodestore. This is a high-level alias for UA_Server_deleteNode()
+ * 
+ * @param server The server object
+ * @param nodeId ID of the node to be deleted
+ * 
+ * @return Return UA_STATUSCODE_GOOD if the node was deleted or an appropriate errorcode if the node was not found
+ *         or cannot be deleted.
+ */
+UA_SERVER_DELETENODEALIAS_DECL(View)
+
+/** Deletes a VariableType node from the nodestore. This is a high-level alias for UA_Server_deleteNode()
+ * 
+ * @param server The server object
+ * @param nodeId ID of the node to be deleted
+ * 
+ * @return Return UA_STATUSCODE_GOOD if the node was deleted or an appropriate errorcode if the node was not found
+ *         or cannot be deleted.
+ */
+UA_SERVER_DELETENODEALIAS_DECL(VariableType)
+
+/** Deletes a DataType Node from the nodestore. This is a high-level alias for UA_Server_deleteNode()
+ * 
+ * @param server The server object
+ * @param nodeId ID of the node to be deleted
+ * 
+ * @return Return UA_STATUSCODE_GOOD if the node was deleted or an appropriate errorcode if the node was not found
+ *         or cannot be deleted.
+ */
+UA_SERVER_DELETENODEALIAS_DECL(DataType)
+
 #ifdef ENABLE_METHODCALLS
 /** Deletes an MethodNode from the nodestore. This is a high-level alias for UA_Server_deleteNode()
  *
@@ -198,17 +238,65 @@ UA_Server_deleteNodeCopy(UA_Server *server, void **node);
 UA_StatusCode UA_EXPORT 
 UA_Server_getNodeCopy(UA_Server *server, UA_NodeId nodeId, void **copyInto);
 
+/** A new variable Node with a value passed in variant.
+ *
+ * @param server The server object
+ * @param nodeId        The requested nodeId of the new node. Use the numeric id with i=0 to get a new ID from the server.
+ * @param browseName    The qualified name of this node
+ * @param displayName   The localized text shown when displaying the node
+ * @param description   The localized human readable description
+ * @param parentNodeId  The node under which this node exists ("parent")
+ * @param referenceTypeId Reference type used by the parent to reference this node
+ * @param userWriteMask Bitmask defining the user write permissions
+ * @param writeMask     Bitmask defining the write permissions
+ * @param value         A variant containing the value to be assigned to this node.
+ * @param copyInto Pointer to a NULL pointer that will hold the copy of the node on a successfull return.
+ * 
+ * @return Return UA_STATUSCODE_GOOD if the node was created or an appropriate error code if not.
+ */
 UA_StatusCode UA_EXPORT
-UA_Server_addVariableNode(UA_Server *server, UA_Variant *value, const UA_QualifiedName browseName, 
-                          UA_NodeId nodeId, const UA_NodeId parentNodeId, const UA_NodeId referenceTypeId,
-                          UA_NodeId *createdNodeId
-                         );
+UA_Server_addVariableNode(UA_Server *server, UA_NodeId nodeId, const UA_QualifiedName browseName, 
+                          UA_LocalizedText displayName, UA_LocalizedText description, const UA_NodeId parentNodeId, 
+                          const UA_NodeId referenceTypeId, UA_UInt32 userWriteMask, UA_UInt32 writeMask, 
+                          UA_Variant *value, UA_NodeId *createdNodeId);
 
 UA_StatusCode UA_EXPORT
-UA_Server_addObjectNode(UA_Server *server, const UA_QualifiedName browseName,
-                        UA_NodeId nodeId, const UA_NodeId parentNodeId, const UA_NodeId referenceTypeId,
-                        const UA_NodeId typeDefinition,
-                        UA_NodeId *createdNodeId);
+UA_Server_addObjectNode(UA_Server *server, UA_NodeId nodeId, const UA_QualifiedName browseName, 
+                        UA_LocalizedText displayName, UA_LocalizedText description, const UA_NodeId parentNodeId, 
+                        const UA_NodeId referenceTypeId, UA_UInt32 userWriteMask, UA_UInt32 writeMask, 
+                        const UA_ExpandedNodeId typeDefinition, UA_NodeId *createdNodeId);
+
+UA_StatusCode UA_EXPORT 
+UA_Server_addReferenceTypeNode(UA_Server *server, UA_NodeId nodeId, UA_QualifiedName browseName, 
+                               UA_LocalizedText displayName, UA_LocalizedText description, UA_NodeId parentNodeId, 
+                               const UA_NodeId referenceTypeId, UA_UInt32 userWriteMask, UA_UInt32 writeMask, 
+                               const UA_ExpandedNodeId typeDefinition, UA_LocalizedText inverseName, UA_NodeId *createdNodeId );
+
+UA_StatusCode UA_EXPORT
+UA_Server_addObjectTypeNode(UA_Server *server, UA_NodeId nodeId, UA_QualifiedName browseName, 
+                            UA_LocalizedText displayName, UA_LocalizedText description, UA_NodeId parentNodeId, 
+                            UA_NodeId referenceTypeId, UA_UInt32 userWriteMask, UA_UInt32 writeMask, 
+                            UA_ExpandedNodeId typeDefinition, UA_Boolean isAbstract,  
+                            UA_NodeId *createdNodeId );
+
+UA_StatusCode UA_EXPORT 
+UA_Server_addVariableTypeNode(UA_Server *server, UA_NodeId nodeId, const UA_QualifiedName browseName, 
+                              UA_LocalizedText displayName, UA_LocalizedText description, const UA_NodeId parentNodeId, 
+                              const UA_NodeId referenceTypeId, UA_UInt32 userWriteMask, UA_UInt32 writeMask, 
+                              UA_Variant *value,  UA_Int32 valueRank, UA_Boolean isAbstract, UA_NodeId *createdNodeId);
+
+UA_StatusCode UA_EXPORT
+UA_Server_addDataTypeNode(UA_Server *server, UA_NodeId nodeId, const UA_QualifiedName browseName, 
+                          UA_LocalizedText displayName, UA_LocalizedText description, const UA_NodeId parentNodeId, 
+                          const UA_NodeId referenceTypeId, UA_UInt32 userWriteMask, UA_UInt32 writeMask, 
+                          UA_ExpandedNodeId typeDefinition, UA_Boolean isAbstract, UA_NodeId *createdNodeId);
+
+
+UA_StatusCode UA_EXPORT
+UA_Server_addViewNode(UA_Server *server, UA_NodeId nodeId, const UA_QualifiedName browseName, 
+                      UA_LocalizedText displayName, UA_LocalizedText description, const UA_NodeId parentNodeId, 
+                      const UA_NodeId referenceTypeId, UA_UInt32 userWriteMask, UA_UInt32 writeMask, 
+                      UA_ExpandedNodeId typeDefinition, UA_NodeId *createdNodeId);
 
 UA_StatusCode UA_EXPORT
 UA_Server_addDataSourceVariableNode(UA_Server *server, UA_DataSource dataSource,
@@ -221,7 +309,6 @@ UA_Server_AddMonodirectionalReference(UA_Server *server, UA_NodeId sourceNodeId,
                                       UA_ExpandedNodeId targetNodeId, UA_NodeId referenceTypeId,
                                       UA_Boolean isforward);
 
-
 #ifdef ENABLE_METHODCALLS
 typedef UA_StatusCode (*UA_MethodCallback)(const UA_NodeId objectId, const UA_Variant *input,
                                            UA_Variant *output);

+ 57 - 22
src/client/ua_client.c

@@ -1007,7 +1007,10 @@ UA_StatusCode UA_Client_CallServerMethod(UA_Client *client, UA_NodeId objectNode
     UA_ExpandedNodeId_copy(&parentNodeId, &(REQUEST.nodesToAdd[0].parentNodeId));         \
     UA_NodeId_copy(&referenceTypeId, &(REQUEST.nodesToAdd[0].referenceTypeId));           \
     UA_ExpandedNodeId_copy(&typeDefinition, &(REQUEST.nodesToAdd[0].typeDefinition));     \
-    UA_ExpandedNodeId_copy(&reqId, &(REQUEST.nodesToAdd[0].requestedNewNodeId ));         \
+    UA_ExpandedNodeId reqExpNodeId;                                                       \
+    UA_ExpandedNodeId_init(&reqExpNodeId);                                                \
+    UA_NodeId_copy(&reqId, &reqExpNodeId.nodeId);                                         \
+    UA_ExpandedNodeId_copy(&reqExpNodeId, &(REQUEST.nodesToAdd[0].requestedNewNodeId ));  \
     REQUEST.nodesToAddSize = 1;                                                           \
     } while(0)
     
@@ -1023,10 +1026,11 @@ UA_StatusCode UA_Client_CallServerMethod(UA_Client *client, UA_NodeId objectNode
 } while(0)
     
 /* NodeManagement */
-UA_AddNodesResponse *UA_Client_createObjectNode(UA_Client *client, UA_ExpandedNodeId reqId, UA_QualifiedName browseName, UA_LocalizedText displayName, 
-                                                UA_LocalizedText description, UA_ExpandedNodeId parentNodeId, UA_NodeId referenceTypeId,
-                                                UA_UInt32 userWriteMask, UA_UInt32 writeMask, UA_ExpandedNodeId typeDefinition ) {
+UA_StatusCode UA_Client_addObjectNode(UA_Client *client, UA_NodeId reqId, UA_QualifiedName browseName, UA_LocalizedText displayName, 
+                                      UA_LocalizedText description, UA_ExpandedNodeId parentNodeId, UA_NodeId referenceTypeId,
+                                      UA_UInt32 userWriteMask, UA_UInt32 writeMask, UA_ExpandedNodeId typeDefinition, UA_NodeId *createdNodeId) {
     UA_AddNodesRequest adReq;
+    UA_StatusCode retval;
     UA_AddNodesRequest_init(&adReq);
 
     UA_AddNodesResponse *adRes;
@@ -1037,7 +1041,7 @@ UA_AddNodesResponse *UA_Client_createObjectNode(UA_Client *client, UA_ExpandedNo
     UA_ObjectAttributes_init(&vAtt);
     adReq.nodesToAdd = (UA_AddNodesItem *) UA_AddNodesItem_new();
     UA_AddNodesItem_init(adReq.nodesToAdd);
-
+    
     // Default node properties and attributes
     ADDNODES_COPYDEFAULTATTRIBUTES(adReq, vAtt);
     
@@ -1048,14 +1052,20 @@ UA_AddNodesResponse *UA_Client_createObjectNode(UA_Client *client, UA_ExpandedNo
 
     ADDNODES_PACK_AND_SEND(adReq,vAtt,OBJECT); 
     
-    return adRes;
+    if(adRes->responseHeader.serviceResult != UA_STATUSCODE_GOOD || adRes->resultsSize == 0)
+      retval = adRes->responseHeader.serviceResult;
+    retval = adRes->results[0].statusCode;
+    if(createdNodeId != NULL)
+      UA_NodeId_copy(&adRes->results[0].addedNodeId, createdNodeId);
+    UA_AddNodesResponse_deleteMembers(adRes);
+    return retval;
 }
 
-UA_AddNodesResponse *UA_Client_createVariableNode(UA_Client *client, UA_ExpandedNodeId reqId, UA_QualifiedName browseName, UA_LocalizedText displayName, 
-                                                    UA_LocalizedText description, UA_ExpandedNodeId parentNodeId, UA_NodeId referenceTypeId,
-                                                    UA_UInt32 userWriteMask, UA_UInt32 writeMask, UA_ExpandedNodeId typeDefinition, 
-                                                    UA_NodeId dataType, UA_Variant *value) {
+UA_StatusCode UA_Client_addVariableNode(UA_Client *client, UA_NodeId reqId, UA_QualifiedName browseName, UA_LocalizedText displayName, 
+                                        UA_LocalizedText description, UA_ExpandedNodeId parentNodeId, UA_NodeId referenceTypeId,
+                                        UA_UInt32 userWriteMask, UA_UInt32 writeMask, UA_Variant *value, UA_NodeId *createdNodeId) {
     UA_AddNodesRequest adReq;
+    UA_StatusCode retval;
     UA_AddNodesRequest_init(&adReq);
     
     UA_AddNodesResponse *adRes;
@@ -1067,6 +1077,10 @@ UA_AddNodesResponse *UA_Client_createVariableNode(UA_Client *client, UA_Expanded
     adReq.nodesToAdd = (UA_AddNodesItem *) UA_AddNodesItem_new();
     UA_AddNodesItem_init(adReq.nodesToAdd);
     
+    UA_ExpandedNodeId typeDefinition;
+    UA_ExpandedNodeId_init(&typeDefinition);
+    if (value != UA_NULL)
+      UA_NodeId_copy(&value->type->typeId, &typeDefinition.nodeId);
     // Default node properties and attributes
     ADDNODES_COPYDEFAULTATTRIBUTES(adReq, vAtt);
     
@@ -1090,18 +1104,25 @@ UA_AddNodesResponse *UA_Client_createVariableNode(UA_Client *client, UA_Expanded
         //vAtt.arrayDimensionsSize  = value->arrayDimensionsSize;
         //vAtt.arrayDimensions      = NULL;
     }
-    UA_NodeId_copy(&dataType, &(vAtt.dataType));
+    UA_NodeId_copy(&value->type->typeId, &(vAtt.dataType));
     
     ADDNODES_PACK_AND_SEND(adReq,vAtt,VARIABLE);
     
-    return adRes;
+    if(adRes->responseHeader.serviceResult != UA_STATUSCODE_GOOD || adRes->resultsSize == 0)
+      retval = adRes->responseHeader.serviceResult;
+    retval = adRes->results[0].statusCode;
+    if(createdNodeId != NULL)
+      UA_NodeId_copy(&adRes->results[0].addedNodeId, createdNodeId);
+    UA_AddNodesResponse_deleteMembers(adRes);
+    return retval;
 }
 
-UA_AddNodesResponse *UA_Client_createReferenceTypeNode(UA_Client *client, UA_ExpandedNodeId reqId, UA_QualifiedName browseName, UA_LocalizedText displayName, 
-                                                  UA_LocalizedText description, UA_ExpandedNodeId parentNodeId, UA_NodeId referenceTypeId,
-                                                  UA_UInt32 userWriteMask, UA_UInt32 writeMask, UA_ExpandedNodeId typeDefinition,
-                                                  UA_LocalizedText inverseName ) {
+UA_StatusCode UA_Client_addReferenceTypeNode( UA_Client *client, UA_NodeId reqId, UA_QualifiedName browseName, UA_LocalizedText displayName, 
+                                              UA_LocalizedText description, UA_ExpandedNodeId parentNodeId, UA_NodeId referenceTypeId,
+                                              UA_UInt32 userWriteMask, UA_UInt32 writeMask, UA_ExpandedNodeId typeDefinition,
+                                              UA_LocalizedText inverseName, UA_NodeId *createdNodeId ) {
     UA_AddNodesRequest adReq;
+    UA_StatusCode retval;
     UA_AddNodesRequest_init(&adReq);
     
     UA_AddNodesResponse *adRes;
@@ -1128,13 +1149,21 @@ UA_AddNodesResponse *UA_Client_createReferenceTypeNode(UA_Client *client, UA_Exp
     
     ADDNODES_PACK_AND_SEND(adReq,vAtt,REFERENCETYPE);
     
-    return adRes;
+    if(adRes->responseHeader.serviceResult != UA_STATUSCODE_GOOD || adRes->resultsSize == 0)
+      retval = adRes->responseHeader.serviceResult;
+    retval = adRes->results[0].statusCode;
+    if(createdNodeId != NULL)
+      UA_NodeId_copy(&adRes->results[0].addedNodeId, createdNodeId);
+    UA_AddNodesResponse_deleteMembers(adRes);
+    return retval;
 }
 
-UA_AddNodesResponse *UA_Client_createObjectTypeNode(UA_Client *client, UA_ExpandedNodeId reqId, UA_QualifiedName browseName, UA_LocalizedText displayName, 
-                                                    UA_LocalizedText description, UA_ExpandedNodeId parentNodeId, UA_NodeId referenceTypeId,
-                                                    UA_UInt32 userWriteMask, UA_UInt32 writeMask, UA_ExpandedNodeId typeDefinition) {
+UA_StatusCode UA_Client_addObjectTypeNode(UA_Client *client, UA_NodeId reqId, UA_QualifiedName browseName, UA_LocalizedText displayName, 
+                                          UA_LocalizedText description, UA_ExpandedNodeId parentNodeId, UA_NodeId referenceTypeId,
+                                          UA_UInt32 userWriteMask, UA_UInt32 writeMask, UA_ExpandedNodeId typeDefinition, UA_Boolean isAbstract,
+                                          UA_NodeId *createdNodeId) {
     UA_AddNodesRequest adReq;
+    UA_StatusCode retval;
     UA_AddNodesRequest_init(&adReq);
     
     UA_AddNodesResponse *adRes;
@@ -1151,11 +1180,17 @@ UA_AddNodesResponse *UA_Client_createObjectTypeNode(UA_Client *client, UA_Expand
     
     // Specific to referencetypes
     adReq.nodesToAdd[0].nodeClass = UA_NODECLASS_OBJECTTYPE;
-    vAtt.isAbstract = UA_FALSE;
+    vAtt.isAbstract = isAbstract;
     vAtt.specifiedAttributes |= UA_NODEATTRIBUTESMASK_ISABSTRACT;
     
     
     ADDNODES_PACK_AND_SEND(adReq,vAtt,OBJECTTYPE);
     
-    return adRes;
+    if(adRes->responseHeader.serviceResult != UA_STATUSCODE_GOOD || adRes->resultsSize == 0)
+      retval = adRes->responseHeader.serviceResult;
+    retval = adRes->results[0].statusCode;
+    if(createdNodeId != NULL)
+      UA_NodeId_copy(&adRes->results[0].addedNodeId, createdNodeId);
+    UA_AddNodesResponse_deleteMembers(adRes);
+    return retval;
 }

+ 207 - 18
src/server/ua_server_addressspace.c

@@ -30,6 +30,10 @@ UA_Server_deleteNode(UA_Server *server, UA_NodeId nodeId) {
 
 UA_SERVER_DELETENODEALIAS(Object)
 UA_SERVER_DELETENODEALIAS(Variable)
+UA_SERVER_DELETENODEALIAS(ReferenceType)
+UA_SERVER_DELETENODEALIAS(View)
+UA_SERVER_DELETENODEALIAS(VariableType)
+UA_SERVER_DELETENODEALIAS(DataType)
 #ifdef ENABLE_METHODCALLS
 UA_SERVER_DELETENODEALIAS(Method)
 #endif
@@ -141,14 +145,19 @@ UA_Server_forEachChildNodeCall(UA_Server *server, UA_NodeId parentNodeId, UA_Nod
 }
 
 UA_StatusCode
-UA_Server_addVariableNode(UA_Server *server, UA_Variant *value, const UA_QualifiedName browseName, 
-                          UA_NodeId nodeId, const UA_NodeId parentNodeId, const UA_NodeId referenceTypeId,
-                          UA_NodeId *createdNodeId) {
+UA_Server_addVariableNode(UA_Server *server, UA_NodeId nodeId, const UA_QualifiedName browseName, 
+                          UA_LocalizedText displayName, UA_LocalizedText description, const UA_NodeId parentNodeId, 
+                          const UA_NodeId referenceTypeId, UA_UInt32 userWriteMask, UA_UInt32 writeMask, 
+                          UA_Variant *value, UA_NodeId *createdNodeId) {
     UA_VariableNode *node = UA_VariableNode_new();
+    UA_StatusCode retval;
     node->value.variant = *value; // copy content
     UA_NodeId_copy(&nodeId, &node->nodeId);
     UA_QualifiedName_copy(&browseName, &node->browseName);
-    UA_String_copy(&browseName.name, &node->displayName.text);
+    UA_LocalizedText_copy(&displayName, &node->displayName);
+    UA_LocalizedText_copy(&description, &node->description);
+    node->writeMask = writeMask;
+    node->userWriteMask = userWriteMask;
     UA_ExpandedNodeId parentId;
     UA_ExpandedNodeId_init(&parentId);
     UA_NodeId_copy(&parentNodeId, &parentId.nodeId);
@@ -156,26 +165,33 @@ UA_Server_addVariableNode(UA_Server *server, UA_Variant *value, const UA_Qualifi
                                                          parentId, referenceTypeId);
     UA_Server_addReference(server, res.addedNodeId, UA_NODEID_NUMERIC(0, UA_NS0ID_HASTYPEDEFINITION),
                            UA_EXPANDEDNODEID_NUMERIC(0, value->type->typeId.identifier.numeric));
+    
     if(res.statusCode != UA_STATUSCODE_GOOD) {
         UA_Variant_init(&node->value.variant);
         UA_VariableNode_delete(node);
     } else 
         UA_free(value);
+    retval = res.statusCode;
     if (createdNodeId != UA_NULL)
       UA_NodeId_copy(&res.addedNodeId, createdNodeId);
     UA_AddNodesResult_deleteMembers(&res);
-    return res.statusCode;
+    return retval ;
 }
 
 UA_StatusCode
-UA_Server_addObjectNode(UA_Server *server, const UA_QualifiedName browseName, UA_NodeId nodeId,
-                        const UA_NodeId parentNodeId, const UA_NodeId referenceTypeId,
-                        const UA_NodeId typeDefinition,
-                        UA_NodeId *createdNodeId) {
+UA_Server_addObjectNode(UA_Server *server, UA_NodeId nodeId, const UA_QualifiedName browseName, 
+                        UA_LocalizedText displayName, UA_LocalizedText description, const UA_NodeId parentNodeId, 
+                        const UA_NodeId referenceTypeId, UA_UInt32 userWriteMask, 
+                        UA_UInt32 writeMask, const UA_ExpandedNodeId typeDefinition, UA_NodeId *createdNodeId) {
     UA_ObjectNode *node = UA_ObjectNode_new();
+    UA_StatusCode retval;
+    
     UA_NodeId_copy(&nodeId, &node->nodeId);
     UA_QualifiedName_copy(&browseName, &node->browseName);
-    UA_String_copy(&browseName.name, &node->displayName.text);
+    UA_LocalizedText_copy(&displayName, &node->displayName);
+    UA_LocalizedText_copy(&description, &node->description);
+    node->writeMask = writeMask;
+    node->userWriteMask = userWriteMask;
     UA_ExpandedNodeId parentId; // we need an expandednodeid
     UA_ExpandedNodeId_init(&parentId);
     UA_NodeId_copy(&parentNodeId, &parentId.nodeId);
@@ -183,18 +199,15 @@ UA_Server_addObjectNode(UA_Server *server, const UA_QualifiedName browseName, UA
                                                          parentId, referenceTypeId);
     if(res.statusCode != UA_STATUSCODE_GOOD)
         UA_ObjectNode_delete(node);
+    retval = res.statusCode;
     if (createdNodeId != UA_NULL)
       UA_NodeId_copy(&res.addedNodeId, createdNodeId);
     UA_AddNodesResult_deleteMembers(&res);
 
-    if(!UA_NodeId_isNull(&typeDefinition)) {
-        UA_ExpandedNodeId typeDefid; // we need an expandednodeid
-        UA_ExpandedNodeId_init(&typeDefid);
-        UA_NodeId_copy(&typeDefinition, &typeDefid.nodeId);
-        UA_Server_addReference(server, res.addedNodeId, UA_NODEID_NUMERIC(0, UA_NS0ID_HASTYPEDEFINITION),
-                               typeDefid);
+    if(!UA_NodeId_isNull(&typeDefinition.nodeId)) {
+      UA_Server_addReference(server, res.addedNodeId, UA_NODEID_NUMERIC(0, UA_NS0ID_HASTYPEDEFINITION), typeDefinition);
     }
-    return res.statusCode;
+    return retval;
 }
 
 UA_StatusCode
@@ -203,6 +216,8 @@ UA_Server_addDataSourceVariableNode(UA_Server *server, UA_DataSource dataSource,
                                     const UA_NodeId parentNodeId, const UA_NodeId referenceTypeId,
                                     UA_NodeId *createdNodeId) {
     UA_VariableNode *node = UA_VariableNode_new();
+    UA_StatusCode retval;
+    
     node->valueSource = UA_VALUESOURCE_DATASOURCE;
     node->value.dataSource = dataSource;
     UA_NodeId_copy(&nodeId, &node->nodeId);
@@ -217,10 +232,184 @@ UA_Server_addDataSourceVariableNode(UA_Server *server, UA_DataSource dataSource,
                            UA_EXPANDEDNODEID_NUMERIC(0, UA_NS0ID_BASEDATAVARIABLETYPE));
     if(res.statusCode != UA_STATUSCODE_GOOD)
         UA_VariableNode_delete(node);
+    retval = res.statusCode;
+    if (createdNodeId != UA_NULL)
+      UA_NodeId_copy(&res.addedNodeId, createdNodeId);
+    UA_AddNodesResult_deleteMembers(&res);
+    return retval;
+}
+
+                                    
+UA_StatusCode
+UA_Server_addVariableTypeNode(UA_Server *server, UA_NodeId nodeId, const UA_QualifiedName browseName, 
+                              UA_LocalizedText displayName, UA_LocalizedText description, const UA_NodeId parentNodeId, 
+                              const UA_NodeId referenceTypeId, UA_UInt32 userWriteMask, UA_UInt32 writeMask, 
+                              UA_Variant *value,  UA_Int32 valueRank, UA_Boolean isAbstract, UA_NodeId *createdNodeId) {
+    UA_VariableTypeNode *node = UA_VariableTypeNode_new();
+    UA_StatusCode retval;
+    node->value.variant = *value; // copy content
+    UA_NodeId_copy(&nodeId, &node->nodeId);
+    UA_QualifiedName_copy(&browseName, &node->browseName);
+    UA_LocalizedText_copy(&displayName, &node->displayName);
+    UA_LocalizedText_copy(&description, &node->description);
+    node->writeMask = writeMask;
+    node->userWriteMask = userWriteMask;
+    UA_ExpandedNodeId parentId;
+    UA_ExpandedNodeId_init(&parentId);
+    UA_NodeId_copy(&parentNodeId, &parentId.nodeId);
+    node->isAbstract = isAbstract;
+    node->valueRank  = valueRank;
+    UA_AddNodesResult res = UA_Server_addNodeWithSession(server, &adminSession, (UA_Node*)node,
+                                                         parentId, referenceTypeId);
+    UA_Server_addReference(server, res.addedNodeId, UA_NODEID_NUMERIC(0, UA_NS0ID_HASTYPEDEFINITION),
+                           UA_EXPANDEDNODEID_NUMERIC(0, value->type->typeId.identifier.numeric));
+    
+    if(res.statusCode != UA_STATUSCODE_GOOD) {
+        UA_Variant_init(&node->value.variant);
+        UA_VariableTypeNode_delete(node);
+    } else 
+        UA_free(value);
+    retval = res.statusCode;
     if (createdNodeId != UA_NULL)
       UA_NodeId_copy(&res.addedNodeId, createdNodeId);
     UA_AddNodesResult_deleteMembers(&res);
-    return res.statusCode;
+    return retval ;
+}
+
+UA_StatusCode
+UA_Server_addDataTypeNode(UA_Server *server, UA_NodeId nodeId, const UA_QualifiedName browseName, 
+                          UA_LocalizedText displayName, UA_LocalizedText description, const UA_NodeId parentNodeId, 
+                          const UA_NodeId referenceTypeId, UA_UInt32 userWriteMask, UA_UInt32 writeMask, 
+                          UA_ExpandedNodeId typeDefinition, UA_Boolean isAbstract, UA_NodeId *createdNodeId) {
+  UA_DataTypeNode *node = UA_DataTypeNode_new();
+  UA_StatusCode retval;
+  
+  UA_NodeId_copy(&nodeId, &node->nodeId);
+  UA_QualifiedName_copy(&browseName, &node->browseName);
+  UA_LocalizedText_copy(&displayName, &node->displayName);
+  UA_LocalizedText_copy(&description, &node->description);
+  node->writeMask = writeMask;
+  node->userWriteMask = userWriteMask;
+  UA_ExpandedNodeId parentId; // we need an expandednodeid
+  UA_ExpandedNodeId_init(&parentId);
+  UA_NodeId_copy(&parentNodeId, &parentId.nodeId);
+  node->isAbstract = isAbstract;
+  UA_AddNodesResult res = UA_Server_addNodeWithSession(server, &adminSession, (UA_Node*)node,
+                                                       parentId, referenceTypeId);
+  if(res.statusCode != UA_STATUSCODE_GOOD)
+    UA_DataTypeNode_delete(node);
+  retval = res.statusCode;
+  if (createdNodeId != UA_NULL)
+    UA_NodeId_copy(&res.addedNodeId, createdNodeId);
+  UA_AddNodesResult_deleteMembers(&res);
+  
+  if(!UA_NodeId_isNull(&typeDefinition.nodeId)) {
+    UA_Server_addReference(server, res.addedNodeId, UA_NODEID_NUMERIC(0, UA_NS0ID_HASTYPEDEFINITION), typeDefinition);
+  }
+  
+  return retval;
+}
+
+UA_StatusCode
+UA_Server_addViewNode(UA_Server *server, UA_NodeId nodeId, const UA_QualifiedName browseName, 
+                          UA_LocalizedText displayName, UA_LocalizedText description, const UA_NodeId parentNodeId, 
+                          const UA_NodeId referenceTypeId, UA_UInt32 userWriteMask, UA_UInt32 writeMask, 
+                          UA_ExpandedNodeId typeDefinition, UA_NodeId *createdNodeId) {
+  UA_ViewNode *node = UA_ViewNode_new();
+  UA_StatusCode retval;
+  
+  UA_NodeId_copy(&nodeId, &node->nodeId);
+  UA_QualifiedName_copy(&browseName, &node->browseName);
+  UA_LocalizedText_copy(&displayName, &node->displayName);
+  UA_LocalizedText_copy(&description, &node->description);
+  node->writeMask = writeMask;
+  node->userWriteMask = userWriteMask;
+  UA_ExpandedNodeId parentId; // we need an expandednodeid
+  UA_ExpandedNodeId_init(&parentId);
+  UA_NodeId_copy(&parentNodeId, &parentId.nodeId);
+  node->containsNoLoops = UA_TRUE;
+  node->eventNotifier = 0;
+  UA_AddNodesResult res = UA_Server_addNodeWithSession(server, &adminSession, (UA_Node*)node,
+                                                       parentId, referenceTypeId);
+  if(res.statusCode != UA_STATUSCODE_GOOD)
+    UA_ViewNode_delete(node);
+  retval = res.statusCode;
+  if (createdNodeId != UA_NULL)
+    UA_NodeId_copy(&res.addedNodeId, createdNodeId);
+  UA_AddNodesResult_deleteMembers(&res);
+  
+  if(!UA_NodeId_isNull(&typeDefinition.nodeId)) {
+    UA_Server_addReference(server, res.addedNodeId, UA_NODEID_NUMERIC(0, UA_NS0ID_HASTYPEDEFINITION), typeDefinition);
+  }
+  
+  return retval;
+}
+
+UA_StatusCode UA_Server_addReferenceTypeNode (UA_Server *server, UA_NodeId nodeId, UA_QualifiedName browseName, 
+                                              UA_LocalizedText displayName, UA_LocalizedText description, UA_NodeId parentNodeId, 
+                                              UA_NodeId referenceTypeId, UA_UInt32 userWriteMask, UA_UInt32 writeMask, 
+                                              UA_ExpandedNodeId typeDefinition, UA_LocalizedText inverseName, 
+                                              UA_NodeId *createdNodeId ){
+  UA_ReferenceTypeNode *node = UA_ReferenceTypeNode_new();
+  UA_StatusCode retval;
+  
+  UA_NodeId_copy(&nodeId, &node->nodeId);
+  UA_QualifiedName_copy(&browseName, &node->browseName);
+  UA_LocalizedText_copy(&displayName, &node->displayName);
+  UA_LocalizedText_copy(&description, &node->description);
+  node->writeMask = writeMask;
+  node->userWriteMask = userWriteMask;
+  UA_ExpandedNodeId parentId; // we need an expandednodeid
+  UA_ExpandedNodeId_init(&parentId);
+  UA_NodeId_copy(&parentNodeId, &parentId.nodeId);
+  UA_AddNodesResult res = UA_Server_addNodeWithSession(server, &adminSession, (UA_Node*)node,
+                                                       parentId, referenceTypeId);
+  if(res.statusCode != UA_STATUSCODE_GOOD)
+    UA_ReferenceTypeNode_delete(node);
+  retval = res.statusCode;
+  if (createdNodeId != UA_NULL)
+    UA_NodeId_copy(&res.addedNodeId, createdNodeId);
+  UA_AddNodesResult_deleteMembers(&res);
+  
+  if(!UA_NodeId_isNull(&typeDefinition.nodeId)) {
+    UA_Server_addReference(server, res.addedNodeId, UA_NODEID_NUMERIC(0, UA_NS0ID_HASTYPEDEFINITION), typeDefinition);
+  }
+  
+  return retval;
+}
+
+UA_StatusCode UA_Server_addObjectTypeNode ( UA_Server *server, UA_NodeId nodeId, UA_QualifiedName browseName, 
+                                          UA_LocalizedText displayName, UA_LocalizedText description, UA_NodeId parentNodeId, 
+                                          UA_NodeId referenceTypeId, UA_UInt32 userWriteMask, UA_UInt32 writeMask, 
+                                          UA_ExpandedNodeId typeDefinition, UA_Boolean isAbstract, 
+                                          UA_NodeId *createdNodeId ){
+  UA_ObjectTypeNode *node = UA_ObjectTypeNode_new();
+  UA_StatusCode retval;
+  
+  UA_NodeId_copy(&nodeId, &node->nodeId);
+  UA_QualifiedName_copy(&browseName, &node->browseName);
+  UA_LocalizedText_copy(&displayName, &node->displayName);
+  UA_LocalizedText_copy(&description, &node->description);
+  node->writeMask = writeMask;
+  node->userWriteMask = userWriteMask;
+  UA_ExpandedNodeId parentId; // we need an expandednodeid
+  UA_ExpandedNodeId_init(&parentId);
+  UA_NodeId_copy(&parentNodeId, &parentId.nodeId);
+  node->isAbstract = isAbstract;
+  UA_AddNodesResult res = UA_Server_addNodeWithSession(server, &adminSession, (UA_Node*)node,
+                                                       parentId, referenceTypeId);
+  if(res.statusCode != UA_STATUSCODE_GOOD)
+    UA_ObjectTypeNode_delete(node);
+  retval = res.statusCode;
+  if (createdNodeId != UA_NULL)
+    UA_NodeId_copy(&res.addedNodeId, createdNodeId);
+  UA_AddNodesResult_deleteMembers(&res);
+  
+  if(!UA_NodeId_isNull(&typeDefinition.nodeId)) {
+    UA_Server_addReference(server, res.addedNodeId, UA_NODEID_NUMERIC(0, UA_NS0ID_HASTYPEDEFINITION), typeDefinition);
+  }
+  
+  return retval;
 }
 
 /* Userspace Version of addOneWayReferenceWithSession*/

+ 5 - 3
tests/check_services_attributes.c

@@ -39,11 +39,13 @@ static UA_Server* makeTestSequence(void) {
 	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, myIntegerVariant, myIntegerName,
-                                  myIntegerNodeId, parentNodeId, parentReferenceNodeId, NULL);
+        UA_Server_addVariableNode(server, myIntegerNodeId, myIntegerName, UA_LOCALIZEDTEXT("en_US",""), UA_LOCALIZEDTEXT("en_US",""),
+                                  parentNodeId, parentReferenceNodeId, 0, 0, myIntegerVariant, NULL);
 
 	/* ObjectNode */
-	UA_Server_addObjectNode(server,UA_QUALIFIEDNAME(1, "Demo"), UA_NODEID_NUMERIC(1, 50), UA_NODEID_NUMERIC(0, UA_NS0ID_OBJECTSFOLDER), UA_NODEID_NUMERIC(0, UA_NS0ID_ORGANIZES), UA_NODEID_NUMERIC(0, UA_NS0ID_FOLDERTYPE), NULL);
+        UA_Server_addObjectNode(server, UA_NODEID_NUMERIC(1, 50), UA_QUALIFIEDNAME(1, "Demo"), UA_LOCALIZEDTEXT("en_US","Demo"), 
+                                UA_LOCALIZEDTEXT("en_US","Demo"), UA_NODEID_NUMERIC(0, UA_NS0ID_OBJECTSFOLDER), 
+                                UA_NODEID_NUMERIC(0, UA_NS0ID_ORGANIZES), 0, 0, UA_EXPANDEDNODEID_NUMERIC(0, UA_NS0ID_FOLDERTYPE), NULL);
 
 	/* ReferenceTypeNode */
 	UA_ReferenceTypeNode *organizes = UA_ReferenceTypeNode_new();