소스 검색

simplify the API. less expandednodeids

Julius Pfrommer 9 년 전
부모
커밋
ae7332d944
7개의 변경된 파일353개의 추가작업 그리고 316개의 파일을 삭제
  1. 33 39
      examples/server.c
  2. 12 13
      examples/server_datasource.c
  3. 9 9
      examples/server_variable.c
  4. 153 165
      include/ua_server.h
  5. 121 72
      src/server/ua_server.c
  6. 2 2
      src/server/ua_services.h
  7. 23 16
      src/server/ua_services_nodemanagement.c

+ 33 - 39
examples/server.c

@@ -230,10 +230,10 @@ int main(int argc, char** argv) {
   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_EXPANDEDNODEID_NULL,
-                                            UA_EXPANDEDNODEID_NUMERIC(0, UA_NS0ID_OBJECTSFOLDER),
+  res = UA_Server_addDataSourceVariableNode(server, UA_NODEID_NULL,
+                                            UA_NODEID_NUMERIC(0, UA_NS0ID_OBJECTSFOLDER),
                                             UA_NODEID_NUMERIC(0, UA_NS0ID_ORGANIZES), dateName,
-                                            UA_EXPANDEDNODEID_NULL, v_attr, dateDataSource);
+                                            UA_NODEID_NULL, v_attr, dateDataSource);
 
   // Get and reattach the datasource
   UA_DataSource dataSourceCopy;
@@ -251,10 +251,10 @@ int main(int argc, char** argv) {
           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_EXPANDEDNODEID_NULL,
-                                              UA_EXPANDEDNODEID_NUMERIC(0, UA_NS0ID_OBJECTSFOLDER),
+          UA_Server_addDataSourceVariableNode(server, UA_NODEID_NULL,
+                                              UA_NODEID_NUMERIC(0, UA_NS0ID_OBJECTSFOLDER),
                                               UA_NODEID_NUMERIC(0, UA_NS0ID_ORGANIZES), tempName,
-                                              UA_EXPANDEDNODEID_NULL, v_attr, temperatureDataSource);
+                                              UA_NODEID_NULL, v_attr, temperatureDataSource);
   }
 
   /* LED control for rpi */
@@ -274,10 +274,10 @@ int main(int argc, char** argv) {
       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_EXPANDEDNODEID_NULL,
-                                          UA_EXPANDEDNODEID_NUMERIC(0, UA_NS0ID_OBJECTSFOLDER),
+      UA_Server_addDataSourceVariableNode(server, UA_NODEID_NULL,
+                                          UA_NODEID_NUMERIC(0, UA_NS0ID_OBJECTSFOLDER),
                                           UA_NODEID_NUMERIC(0, UA_NS0ID_ORGANIZES), statusName,
-                                          UA_EXPANDEDNODEID_NULL, v_attr, ledStatusDataSource);
+                                          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)");
@@ -292,11 +292,11 @@ int main(int argc, char** argv) {
   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_ExpandedNodeId myIntegerNodeId = UA_EXPANDEDNODEID_STRING(1, "the.answer");
-  UA_ExpandedNodeId parentNodeId = UA_EXPANDEDNODEID_NUMERIC(0, UA_NS0ID_OBJECTSFOLDER);
+  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_EXPANDEDNODEID_NULL, myVar);
+                            myIntegerName, UA_NODEID_NULL, myVar);
   UA_Variant_deleteMembers(&myVar.value);
 
   /**************/
@@ -308,30 +308,30 @@ int main(int argc, char** argv) {
   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_EXPANDEDNODEID_NUMERIC(1, DEMOID),
-                          UA_EXPANDEDNODEID_NUMERIC(0, UA_NS0ID_OBJECTSFOLDER), UA_NODEID_NUMERIC(0, UA_NS0ID_ORGANIZES),
-                          UA_QUALIFIEDNAME(1, "Demo"), UA_EXPANDEDNODEID_NULL, object_attr);
+  UA_Server_addObjectNode(server, UA_NODEID_NUMERIC(1, DEMOID), UA_NODEID_NUMERIC(0, UA_NS0ID_OBJECTSFOLDER),
+                          UA_NODEID_NUMERIC(0, UA_NS0ID_ORGANIZES), UA_QUALIFIEDNAME(1, "Demo"),
+                          UA_NODEID_NULL, object_attr);
 
 #define SCALARID 50001
   object_attr.description = UA_LOCALIZEDTEXT("en_US","Scalar");
   object_attr.displayName = UA_LOCALIZEDTEXT("en_US","Scalar");
-  UA_Server_addObjectNode(server, UA_EXPANDEDNODEID_NUMERIC(1, SCALARID),
-                          UA_EXPANDEDNODEID_NUMERIC(1, DEMOID), UA_NODEID_NUMERIC(0, UA_NS0ID_ORGANIZES),
-                          UA_QUALIFIEDNAME(1, "Scalar"), UA_EXPANDEDNODEID_NULL, object_attr);
+  UA_Server_addObjectNode(server, UA_NODEID_NUMERIC(1, SCALARID),
+                          UA_NODEID_NUMERIC(1, DEMOID), UA_NODEID_NUMERIC(0, UA_NS0ID_ORGANIZES),
+                          UA_QUALIFIEDNAME(1, "Scalar"), UA_NODEID_NULL, object_attr);
 
 #define ARRAYID 50002
   object_attr.description = UA_LOCALIZEDTEXT("en_US","Array");
   object_attr.displayName = UA_LOCALIZEDTEXT("en_US","Array");
-  UA_Server_addObjectNode(server, UA_EXPANDEDNODEID_NUMERIC(1, ARRAYID),
-                          UA_EXPANDEDNODEID_NUMERIC(1, DEMOID), UA_NODEID_NUMERIC(0, UA_NS0ID_ORGANIZES),
-                          UA_QUALIFIEDNAME(1, "Array"), UA_EXPANDEDNODEID_NULL, object_attr);
+  UA_Server_addObjectNode(server, UA_NODEID_NUMERIC(1, ARRAYID),
+                          UA_NODEID_NUMERIC(1, DEMOID), UA_NODEID_NUMERIC(0, UA_NS0ID_ORGANIZES),
+                          UA_QUALIFIEDNAME(1, "Array"), UA_NODEID_NULL, object_attr);
 
 #define MATRIXID 50003
   object_attr.description = UA_LOCALIZEDTEXT("en_US","Matrix");
   object_attr.displayName = UA_LOCALIZEDTEXT("en_US","Matrix");
-  UA_Server_addObjectNode(server, UA_EXPANDEDNODEID_NUMERIC(1, MATRIXID),
-                          UA_EXPANDEDNODEID_NUMERIC(1, DEMOID), UA_NODEID_NUMERIC(0, UA_NS0ID_ORGANIZES),
-                          UA_QUALIFIEDNAME(1, "Matrix"), UA_EXPANDEDNODEID_NULL, object_attr);
+  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++) {
@@ -348,18 +348,14 @@ int main(int argc, char** argv) {
     /* 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_EXPANDEDNODEID_NUMERIC(1, ++id),
-                              UA_EXPANDEDNODEID_NUMERIC(1, SCALARID),
-                              UA_NODEID_NUMERIC(0, UA_NS0ID_ORGANIZES),
-                              qualifiedName, UA_EXPANDEDNODEID_NULL, attr);
+    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_EXPANDEDNODEID_NUMERIC(1, ++id),
-                              UA_EXPANDEDNODEID_NUMERIC(1, ARRAYID),
-                              UA_NODEID_NUMERIC(0, UA_NS0ID_ORGANIZES),
-                              qualifiedName, UA_EXPANDEDNODEID_NULL, attr);
+    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 */
@@ -371,10 +367,8 @@ int main(int argc, char** argv) {
     attr.value.arrayLength = 9;
     attr.value.data = myMultiArray;
     attr.value.type = &UA_TYPES[type];
-    UA_Server_addVariableNode(server, UA_EXPANDEDNODEID_NUMERIC(1, ++id),
-                              UA_EXPANDEDNODEID_NUMERIC(1, MATRIXID),
-                              UA_NODEID_NUMERIC(0, UA_NS0ID_ORGANIZES),
-                              qualifiedName, UA_EXPANDEDNODEID_NULL, attr);
+    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);
   }
 
@@ -401,8 +395,8 @@ int main(int argc, char** argv) {
   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_EXPANDEDNODEID_NUMERIC(1,62541),
-                          UA_EXPANDEDNODEID_NUMERIC(0, UA_NS0ID_OBJECTSFOLDER),
+  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
@@ -425,7 +419,7 @@ int main(int argc, char** argv) {
   UA_Server_delete(server);
 
   if(temperatureFile)
-          fclose(temperatureFile);
+      fclose(temperatureFile);
 
   if(triggerFile) {
           fseek(triggerFile, 0, SEEK_SET);

+ 12 - 13
examples/server_datasource.c

@@ -54,20 +54,19 @@ int main(int argc, char** argv) {
     UA_Int32 myInteger = 42;
 
     /* add a variable node to the address space */
-    UA_NodeId myIntegerNodeId = UA_NODEID_STRING(1, "the.answer"); /* UA_NODEID_NULL would assign a random free nodeid */
+    UA_NodeId myIntegerNodeId = UA_NODEID_STRING(1, "the.answer");
     UA_QualifiedName myIntegerName = UA_QUALIFIEDNAME(1, "the answer");
-    UA_LocalizedText myIntegerBrowseName = UA_LOCALIZEDTEXT("en_US","the answer");
-
-    UA_DataSource dateDataSource = (UA_DataSource) {.handle = &myInteger, .read = readInteger, .write = writeInteger};
-
-    UA_Server_addDataSourceVariableNode(server, myIntegerNodeId, myIntegerName, myIntegerBrowseName, myIntegerBrowseName, 0, 0,
-
-                                    UA_NODEID_NUMERIC(0, UA_NS0ID_OBJECTSFOLDER),
-                                    UA_NODEID_NUMERIC(0, UA_NS0ID_ORGANIZES),
-
-                                    dateDataSource,
-
-                                    NULL);
+    UA_DataSource dateDataSource = (UA_DataSource) {
+        .handle = &myInteger, .read = readInteger, .write = writeInteger};
+    UA_VariableAttributes attr;
+    UA_VariableAttributes_init(&attr);
+    attr.description = UA_LOCALIZEDTEXT("en_US","the answer");
+    attr.displayName = UA_LOCALIZEDTEXT("en_US","the answer");
+
+    UA_Server_addDataSourceVariableNode(server, myIntegerNodeId,
+                                        UA_NODEID_NUMERIC(0, UA_NS0ID_OBJECTSFOLDER),
+                                        UA_NODEID_NUMERIC(0, UA_NS0ID_ORGANIZES),
+                                        myIntegerName, UA_NODEID_NULL, attr, dateDataSource);
 
     UA_StatusCode retval = UA_Server_run(server, 1, &running);
     UA_Server_delete(server);

+ 9 - 9
examples/server_variable.c

@@ -39,21 +39,21 @@ int main(int argc, char** argv) {
     UA_Server_addNetworkLayer(server, ServerNetworkLayerTCP_new(UA_ConnectionConfig_standard, 16664));
 
     /* add a variable node to the address space */
-    UA_Variant *myIntegerVariant = UA_Variant_new();
+    UA_VariableAttributes attr;
+    UA_VariableAttributes_init(&attr);
     UA_Int32 myInteger = 42;
-    UA_Variant_setScalarCopy(myIntegerVariant, &myInteger, &UA_TYPES[UA_TYPES_INT32]);
-    //NOTE: the link between myInteger and the value of the node is lost here, you can safely reuse myInteger
+    UA_Variant_setScalarCopy(&attr.value, &myInteger, &UA_TYPES[UA_TYPES_INT32]);
+    attr.description = UA_LOCALIZEDTEXT("en_US","the answer");
+    attr.displayName = UA_LOCALIZEDTEXT("en_US","the answer");
+    UA_NodeId myIntegerNodeId = UA_NODEID_STRING(1, "the.answer");
     UA_QualifiedName myIntegerName = UA_QUALIFIEDNAME(1, "the answer");
-    UA_NodeId myIntegerNodeId = UA_NODEID_STRING(1, "the.answer"); /* UA_NODEID_NULL would assign a random free nodeid */
-    UA_LocalizedText myIntegerBrowseName = UA_LOCALIZEDTEXT("en_US","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, myIntegerBrowseName, myIntegerBrowseName, 0, 0,
-                              parentNodeId, parentReferenceNodeId, myIntegerVariant, NULL);
+    UA_Server_addVariableNode(server, myIntegerNodeId, parentNodeId, parentReferenceNodeId,
+                              myIntegerName, UA_NODEID_NULL, attr);
 
     UA_ValueCallback callback = {(void*)7, onRead, onWrite};
-    UA_Server_setAttribute_valueCallback(server, myIntegerNodeId, callback);
+    UA_Server_setAttribute_value_callback(server, myIntegerNodeId, callback);
 
     UA_StatusCode retval = UA_Server_run(server, 1, &running);
     UA_Server_delete(server);

+ 153 - 165
include/ua_server.h

@@ -28,11 +28,9 @@ extern "C" {
 #include "ua_job.h"
 #include "ua_connection.h"
 
-/**
- * @defgroup server Server
- *
- * @{
- */
+/*********************************/
+/* Initialize and run the server */
+/*********************************/
 
 typedef struct UA_ServerConfig {
     UA_Boolean  Login_enableAnonymous;
@@ -54,31 +52,112 @@ void UA_EXPORT UA_Server_delete(UA_Server *server);
 
 /** Sets the logger used by the server */
 void UA_EXPORT UA_Server_setLogger(UA_Server *server, UA_Logger logger);
-UA_Logger UA_EXPORT UA_Server_getLogger(UA_Server *server);
 
 /**
  * Runs the main loop of the server. In each iteration, this calls into the networklayers to see if
  * jobs have arrived and checks if repeated jobs need to be triggered.
  *
  * @param server The server object
- *
  * @param nThreads The number of worker threads. Is ignored if MULTITHREADING is not activated.
- *
  * @param running Points to a boolean value on the heap. When running is set to false, the worker
- * threads and the main loop close and the server is shut down.
- *
+ *        threads and the main loop close and the server is shut down.
  * @return Indicates whether the server shut down cleanly
- *
  */
 UA_StatusCode UA_EXPORT UA_Server_run(UA_Server *server, UA_UInt16 nThreads, UA_Boolean *running);
 
-/* The prologue part of UA_Server_run (no need to use if you call UA_Server_run) */
+/** The prologue part of UA_Server_run (no need to use if you call UA_Server_run) */
 UA_StatusCode UA_EXPORT UA_Server_run_startup(UA_Server *server, UA_UInt16 nThreads, UA_Boolean *running);
-/* The epilogue part of UA_Server_run (no need to use if you call UA_Server_run) */
+
+/** The epilogue part of UA_Server_run (no need to use if you call UA_Server_run) */
 UA_StatusCode UA_EXPORT UA_Server_run_shutdown(UA_Server *server, UA_UInt16 nThreads);
-/* One iteration of UA_Server_run (no need to use if you call UA_Server_run) */
+
+/** One iteration of UA_Server_run (no need to use if you call UA_Server_run) */
 UA_StatusCode UA_EXPORT UA_Server_run_mainloop(UA_Server *server, UA_Boolean *running);
 
+/**
+ * @param server The server object.
+ * @param job The job that shall be added.
+ * @param interval The job shall be repeatedly executed with the given interval (in ms). The
+ *        interval must be larger than 5ms. The first execution occurs at now() + interval at the
+ *        latest.
+ * @param jobId Set to the guid of the repeated job. This can be used to cancel the job later on. If
+ *        the pointer is null, the guid is not set.
+ * @return Upon success, UA_STATUSCODE_GOOD is returned. An error code otherwise.
+ */
+UA_StatusCode UA_EXPORT UA_Server_addRepeatedJob(UA_Server *server, UA_Job job, UA_UInt32 interval,
+                                                 UA_Guid *jobId);
+
+/**
+ * Remove repeated job. The entry will be removed asynchronously during the next iteration of the
+ * server main loop.
+ *
+ * @param server The server object.
+ * @param jobId The id of the job that shall be removed.
+ * @return Upon sucess, UA_STATUSCODE_GOOD is returned. An error code otherwise.
+ */
+UA_StatusCode UA_EXPORT UA_Server_removeRepeatedJob(UA_Server *server, UA_Guid jobId);
+
+/**
+ * Interface to the binary network layers. This structure is returned from the
+ * function that initializes the network layer. The layer is already bound to a
+ * specific port and listening. The functions in the structure are never called
+ * in parallel but only sequentially from the server's main loop. So the network
+ * layer does not need to be thread-safe.
+ */
+typedef struct UA_ServerNetworkLayer {
+    UA_String discoveryUrl;
+    UA_Logger logger; ///< Set during _start
+
+    /**
+     * Starts listening on the the networklayer.
+     *
+     * @param nl The network layer
+     * @param logger The logger
+     * @return Returns UA_STATUSCODE_GOOD or an error code.
+     */
+    UA_StatusCode (*start)(struct UA_ServerNetworkLayer *nl, UA_Logger logger);
+    
+    /**
+     * Gets called from the main server loop and returns the jobs (accumulated messages and close
+     * events) for dispatch.
+     *
+     * @param nl The network layer
+     * @param jobs When the returned integer is >0, *jobs points to an array of UA_Job of the
+     * returned size.
+     * @param timeout The timeout during which an event must arrive in microseconds
+     * @return The size of the jobs array. If the result is negative, an error has occurred.
+     */
+    size_t (*getJobs)(struct UA_ServerNetworkLayer *nl, UA_Job **jobs, UA_UInt16 timeout);
+
+    /**
+     * Closes the network connection and returns all the jobs that need to be finished before the
+     * network layer can be safely deleted.
+     *
+     * @param nl The network layer
+     * @param jobs When the returned integer is >0, jobs points to an array of UA_Job of the
+     * returned size.
+     * @return The size of the jobs array. If the result is negative, an error has occurred.
+     */
+    size_t (*stop)(struct UA_ServerNetworkLayer *nl, UA_Job **jobs);
+
+    /** Deletes the network layer. Call only after a successful shutdown. */
+    void (*deleteMembers)(struct UA_ServerNetworkLayer *nl);
+} UA_ServerNetworkLayer;
+
+/**
+ * Adds a network layer to the server. The network layer is destroyed together
+ * with the server. Do not use it after adding it as it might be moved around on
+ * the heap.
+ */
+void UA_EXPORT UA_Server_addNetworkLayer(UA_Server *server, UA_ServerNetworkLayer *networkLayer);
+
+/** @brief Add a new namespace to the server. Returns the index of the new namespace */
+UA_UInt16 UA_EXPORT UA_Server_addNamespace(UA_Server *server, const char* name);
+
+/***************/
+/* Data Source */
+/***************/
+
 /**
  * Datasources are the interface to local data providers. It is expected that
  * the read and release callbacks are implemented. The write callback can be set
@@ -126,115 +205,107 @@ typedef struct {
     void (*onWrite)(void *handle, const UA_NodeId nodeid, const UA_Variant *data, const UA_NumericRange *range);
 } UA_ValueCallback;
 
-/** @brief Add a new namespace to the server. Returns the index of the new namespace */
-UA_UInt16 UA_EXPORT UA_Server_addNamespace(UA_Server *server, const char* name);
+/*******************/
+/* Node Management */
+/*******************/
 
 /** Add a reference to the server's address space */
 UA_StatusCode UA_EXPORT UA_Server_addReference(UA_Server *server, const UA_NodeId *sourceId,
                                                const UA_NodeId *refTypeId, const UA_ExpandedNodeId *targetId);
 
-/** Deletes a node from the nodestore.
- *
- * @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_StatusCode UA_EXPORT UA_Server_deleteNode(UA_Server *server, UA_NodeId nodeId);
 
 /* Don't use this function. There are typed versions as inline functions. */
 UA_AddNodesResult UA_EXPORT
-UA_Server_addNode(UA_Server *server, const UA_NodeClass nodeClass, const UA_ExpandedNodeId requestedNewNodeId,
-                  const UA_ExpandedNodeId parentNodeId, const UA_NodeId referenceTypeId,
-                  const UA_QualifiedName browseName, const UA_ExpandedNodeId typeDefinition,
+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);
 
-static inline UA_AddNodesResult
-UA_Server_addVariableNode(UA_Server *server, const UA_ExpandedNodeId requestedNewNodeId,
-                          const UA_ExpandedNodeId parentNodeId, const UA_NodeId referenceTypeId,
-                          const UA_QualifiedName browseName, const UA_ExpandedNodeId typeDefinition,
+static UA_INLINE UA_AddNodesResult
+UA_Server_addVariableNode(UA_Server *server, const UA_NodeId requestedNewNodeId,
+                          const UA_NodeId parentNodeId, const UA_NodeId referenceTypeId,
+                          const UA_QualifiedName browseName, const UA_NodeId typeDefinition,
                           const UA_VariableAttributes attr) {
     return UA_Server_addNode(server, UA_NODECLASS_VARIABLE, requestedNewNodeId, parentNodeId,
                              referenceTypeId, browseName, typeDefinition, (const UA_NodeAttributes*)&attr,
                              &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES]); }
 
-static inline UA_AddNodesResult
-UA_Server_addVariableTypeNode(UA_Server *server, const UA_ExpandedNodeId requestedNewNodeId,
-                          const UA_ExpandedNodeId parentNodeId, const UA_NodeId referenceTypeId,
-                          const UA_QualifiedName browseName, const UA_VariableTypeAttributes attr) {
+static UA_INLINE UA_AddNodesResult
+UA_Server_addVariableTypeNode(UA_Server *server, const UA_NodeId requestedNewNodeId,
+                              const UA_NodeId parentNodeId, const UA_NodeId referenceTypeId,
+                              const UA_QualifiedName browseName, const UA_VariableTypeAttributes attr) {
     return UA_Server_addNode(server, UA_NODECLASS_VARIABLETYPE, requestedNewNodeId, parentNodeId,
-                             referenceTypeId, browseName, UA_EXPANDEDNODEID_NULL, (const UA_NodeAttributes*)&attr,
-                             &UA_TYPES[UA_TYPES_VARIABLETYPEATTRIBUTES]); }
-
-static inline UA_AddNodesResult
-UA_Server_addObjectNode(UA_Server *server, const UA_ExpandedNodeId requestedNewNodeId,
-                          const UA_ExpandedNodeId parentNodeId, const UA_NodeId referenceTypeId,
-                          const UA_QualifiedName browseName, const UA_ExpandedNodeId typeDefinition,
-                          const UA_ObjectAttributes attr) {
+                             referenceTypeId, browseName, UA_NODEID_NULL,
+                             (const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLETYPEATTRIBUTES]); }
+
+static UA_INLINE UA_AddNodesResult
+UA_Server_addObjectNode(UA_Server *server, const UA_NodeId requestedNewNodeId,
+                        const UA_NodeId parentNodeId, const UA_NodeId referenceTypeId,
+                        const UA_QualifiedName browseName, const UA_NodeId typeDefinition,
+                        const UA_ObjectAttributes attr) {
     return UA_Server_addNode(server, UA_NODECLASS_OBJECT, requestedNewNodeId, parentNodeId,
                              referenceTypeId, browseName, typeDefinition, (const UA_NodeAttributes*)&attr,
                              &UA_TYPES[UA_TYPES_OBJECTATTRIBUTES]); }
 
-static inline UA_AddNodesResult
-UA_Server_addObjectTypeNode(UA_Server *server, const UA_ExpandedNodeId requestedNewNodeId,
-                          const UA_ExpandedNodeId parentNodeId, const UA_NodeId referenceTypeId,
-                          const UA_QualifiedName browseName, const UA_ObjectTypeAttributes attr) {
+static UA_INLINE UA_AddNodesResult
+UA_Server_addObjectTypeNode(UA_Server *server, const UA_NodeId requestedNewNodeId,
+                            const UA_NodeId parentNodeId, const UA_NodeId referenceTypeId,
+                            const UA_QualifiedName browseName, const UA_ObjectTypeAttributes attr) {
     return UA_Server_addNode(server, UA_NODECLASS_OBJECTTYPE, requestedNewNodeId, parentNodeId,
-                             referenceTypeId, browseName, UA_EXPANDEDNODEID_NULL, (const UA_NodeAttributes*)&attr,
-                             &UA_TYPES[UA_TYPES_OBJECTTYPEATTRIBUTES]); }
+                             referenceTypeId, browseName, UA_NODEID_NULL,
+                             (const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_OBJECTTYPEATTRIBUTES]); }
 
-static inline UA_AddNodesResult
-UA_Server_addViewNode(UA_Server *server, const UA_ExpandedNodeId requestedNewNodeId,
-                          const UA_ExpandedNodeId parentNodeId, const UA_NodeId referenceTypeId,
-                          const UA_QualifiedName browseName, const UA_ViewAttributes attr) {
+static UA_INLINE UA_AddNodesResult
+UA_Server_addViewNode(UA_Server *server, const UA_NodeId requestedNewNodeId,
+                      const UA_NodeId parentNodeId, const UA_NodeId referenceTypeId,
+                      const UA_QualifiedName browseName, const UA_ViewAttributes attr) {
     return UA_Server_addNode(server, UA_NODECLASS_VIEW, requestedNewNodeId, parentNodeId,
-                             referenceTypeId, browseName, UA_EXPANDEDNODEID_NULL, (const UA_NodeAttributes*)&attr,
-                             &UA_TYPES[UA_TYPES_VIEWATTRIBUTES]); }
+                             referenceTypeId, browseName, UA_NODEID_NULL,
+                             (const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VIEWATTRIBUTES]); }
 
-static inline UA_AddNodesResult
-UA_Server_addReferenceTypeNode(UA_Server *server, const UA_ExpandedNodeId requestedNewNodeId,
-                          const UA_ExpandedNodeId parentNodeId, const UA_NodeId referenceTypeId,
-                          const UA_QualifiedName browseName, const UA_ReferenceTypeAttributes attr) {
+static UA_INLINE UA_AddNodesResult
+UA_Server_addReferenceTypeNode(UA_Server *server, const UA_NodeId requestedNewNodeId,
+                               const UA_NodeId parentNodeId, const UA_NodeId referenceTypeId,
+                               const UA_QualifiedName browseName, const UA_ReferenceTypeAttributes attr) {
     return UA_Server_addNode(server, UA_NODECLASS_REFERENCETYPE, requestedNewNodeId, parentNodeId,
-                             referenceTypeId, browseName, UA_EXPANDEDNODEID_NULL, (const UA_NodeAttributes*)&attr,
-                             &UA_TYPES[UA_TYPES_REFERENCETYPEATTRIBUTES]); }
+                             referenceTypeId, browseName, UA_NODEID_NULL,
+                             (const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_REFERENCETYPEATTRIBUTES]); }
 
-static inline UA_AddNodesResult
-UA_Server_addDataTypeNode(UA_Server *server, const UA_ExpandedNodeId requestedNewNodeId,
-                          const UA_ExpandedNodeId parentNodeId, const UA_NodeId referenceTypeId,
+static UA_INLINE UA_AddNodesResult
+UA_Server_addDataTypeNode(UA_Server *server, const UA_NodeId requestedNewNodeId,
+                          const UA_NodeId parentNodeId, const UA_NodeId referenceTypeId,
                           const UA_QualifiedName browseName, const UA_DataTypeAttributes attr) {
     return UA_Server_addNode(server, UA_NODECLASS_DATATYPE, requestedNewNodeId, parentNodeId,
-                             referenceTypeId, browseName, UA_EXPANDEDNODEID_NULL, (const UA_NodeAttributes*)&attr,
-                             &UA_TYPES[UA_TYPES_DATATYPEATTRIBUTES]); }
+                             referenceTypeId, browseName, UA_NODEID_NULL,
+                             (const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_DATATYPEATTRIBUTES]); }
 
 UA_AddNodesResult UA_EXPORT
-UA_Server_addDataSourceVariableNode(UA_Server *server, const UA_ExpandedNodeId requestedNewNodeId,
-                                    const UA_ExpandedNodeId parentNodeId, const UA_NodeId referenceTypeId,
-                                    const UA_QualifiedName browseName, const UA_ExpandedNodeId typeDefinition,
+UA_Server_addDataSourceVariableNode(UA_Server *server, const UA_NodeId requestedNewNodeId,
+                                    const UA_NodeId parentNodeId, const UA_NodeId referenceTypeId,
+                                    const UA_QualifiedName browseName, const UA_NodeId typeDefinition,
                                     const UA_VariableAttributes attr, const UA_DataSource dataSource);
 
 UA_StatusCode UA_EXPORT
-UA_Server_addMonodirectionalReference(UA_Server *server, UA_NodeId sourceNodeId, UA_ExpandedNodeId targetNodeId,
+UA_Server_addMonodirectionalReference(UA_Server *server, UA_NodeId sourceNodeId, UA_NodeId 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, void *handle);
 UA_AddNodesResult UA_EXPORT
-UA_Server_addMethodNode(UA_Server *server, const UA_ExpandedNodeId requestedNewNodeId,
-                        const UA_ExpandedNodeId parentNodeId, const UA_NodeId referenceTypeId,
+UA_Server_addMethodNode(UA_Server *server, const UA_NodeId requestedNewNodeId,
+                        const UA_NodeId parentNodeId, const UA_NodeId referenceTypeId,
                         const UA_QualifiedName browseName, const UA_NodeAttributes attr,
                         UA_MethodCallback method, void *handle,
                         UA_Int32 inputArgumentsSize, const UA_Argument* inputArguments, 
                         UA_Int32 outputArgumentsSize, const UA_Argument* outputArguments);
 #endif
 
-#ifndef _HAVE_UA_NODEITERATORCALLBACK_D
-#define _HAVE_UA_NODEITERATORCALLBACK_D
-typedef UA_StatusCode (*UA_NodeIteratorCallback)(UA_NodeId childId, UA_Boolean isInverse, UA_NodeId referenceTypeId, void *handle);
-#endif
+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 child node
+/** Iterate over all nodes referenced by parentNodeId by calling the callback function for each
+ * child node
  * 
  * @param server The server object.
  *
@@ -244,7 +315,8 @@ typedef UA_StatusCode (*UA_NodeIteratorCallback)(UA_NodeId childId, UA_Boolean i
  *
  * @return Upon success, UA_STATUSCODE_GOOD is returned. An error code otherwise.
  */
-UA_StatusCode UA_EXPORT UA_Server_forEachChildNodeCall(UA_Server *server, UA_NodeId parentNodeId, UA_NodeIteratorCallback callback, void *handle);
+UA_StatusCode UA_EXPORT
+UA_Server_forEachChildNodeCall(UA_Server *server, UA_NodeId parentNodeId, UA_NodeIteratorCallback callback, void *handle);
 
 /***********************/
 /* Set Node Attributes */
@@ -320,8 +392,10 @@ UA_Server_setNodeAttribute_eventNotifier(UA_Server *server, const UA_NodeId node
     return UA_Server_setNodeAttribute(server, nodeId, UA_ATTRIBUTEID_EVENTNOTIFIER, &UA_TYPES[UA_TYPES_BYTE], eventNotifier); }
 
 static UA_INLINE UA_StatusCode
-UA_Server_setNodeAttribute_minimumSamplingInterval(UA_Server *server, const UA_NodeId nodeId, const UA_Double *miniumSamplingInterval) {
-    return UA_Server_setNodeAttribute(server, nodeId, UA_ATTRIBUTEID_MINIMUMSAMPLINGINTERVAL, &UA_TYPES[UA_TYPES_DOUBLE], miniumSamplingInterval); }
+UA_Server_setNodeAttribute_minimumSamplingInterval(UA_Server *server, const UA_NodeId nodeId,
+                                                   const UA_Double *miniumSamplingInterval) {
+    return UA_Server_setNodeAttribute(server, nodeId, UA_ATTRIBUTEID_MINIMUMSAMPLINGINTERVAL,
+                                      &UA_TYPES[UA_TYPES_DOUBLE], miniumSamplingInterval); }
 
 static UA_INLINE UA_StatusCode
 UA_Server_setNodeAttribute_executable(UA_Server *server, const UA_NodeId nodeId, const UA_Boolean *executable) {
@@ -431,92 +505,6 @@ UA_StatusCode UA_EXPORT
 UA_Server_getNodeAttribute_method(UA_Server *server, UA_NodeId methodNodeId, UA_MethodCallback *method);
 #endif
 
-/**
- * @param server The server object.
- *
- * @param job Pointer to the job that shall be added. The pointer is not freed but copied to an
- *        internal representation.
- *
- * @param interval The job shall be repeatedly executed with the given interval (in ms). The
- *        interval must be larger than 5ms. The first execution occurs at now() + interval at the
- *        latest.
- *
- * @param jobId Set to the guid of the repeated job. This can be used to cancel the job later on. If
- *        the pointer is null, the guid is not set.
- *
- * @return Upon success, UA_STATUSCODE_GOOD is returned. An error code otherwise.
- */
-UA_StatusCode UA_EXPORT UA_Server_addRepeatedJob(UA_Server *server, UA_Job job, UA_UInt32 interval,
-                                                 UA_Guid *jobId);
-
-/**
- * Remove repeated job. The entry will be removed asynchronously during the next iteration of the
- * server main loop.
- *
- * @param server The server object.
- *
- * @param jobId The id of the job that shall be removed.
- *
- * @return Upon sucess, UA_STATUSCODE_GOOD is returned. An error code otherwise.
- */
-UA_StatusCode UA_EXPORT UA_Server_removeRepeatedJob(UA_Server *server, UA_Guid jobId);
-
-/**
- * Interface to the binary network layers. This structure is returned from the
- * function that initializes the network layer. The layer is already bound to a
- * specific port and listening. The functions in the structure are never called
- * in parallel but only sequentially from the server's main loop. So the network
- * layer does not need to be thread-safe.
- */
-typedef struct UA_ServerNetworkLayer {
-    UA_String discoveryUrl;
-    UA_Logger logger; ///< Set during _start
-
-    /**
-     * Starts listening on the the networklayer.
-     *
-     * @param nl The network layer
-     * @param logger The logger
-     * @return Returns UA_STATUSCODE_GOOD or an error code.
-     */
-    UA_StatusCode (*start)(struct UA_ServerNetworkLayer *nl, UA_Logger logger);
-    
-    /**
-     * Gets called from the main server loop and returns the jobs (accumulated messages and close
-     * events) for dispatch.
-     *
-     * @param nl The network layer
-     * @param jobs When the returned integer is >0, *jobs points to an array of UA_Job of the
-     * returned size.
-     * @param timeout The timeout during which an event must arrive in microseconds
-     * @return The size of the jobs array. If the result is negative, an error has occurred.
-     */
-    size_t (*getJobs)(struct UA_ServerNetworkLayer *nl, UA_Job **jobs, UA_UInt16 timeout);
-
-    /**
-     * Closes the network connection and returns all the jobs that need to be finished before the
-     * network layer can be safely deleted.
-     *
-     * @param nl The network layer
-     * @param jobs When the returned integer is >0, jobs points to an array of UA_Job of the
-     * returned size.
-     * @return The size of the jobs array. If the result is negative, an error has occurred.
-     */
-    size_t (*stop)(struct UA_ServerNetworkLayer *nl, UA_Job **jobs);
-
-    /** Deletes the network layer. Call only after a successful shutdown. */
-    void (*deleteMembers)(struct UA_ServerNetworkLayer *nl);
-} UA_ServerNetworkLayer;
-
-/**
- * Adds a network layer to the server. The network layer is destroyed together
- * with the server. Do not use it after adding it as it might be moved around on
- * the heap.
- */
-void UA_EXPORT UA_Server_addNetworkLayer(UA_Server *server, UA_ServerNetworkLayer *networkLayer);
-
-/** @} */
-
 #ifndef __cplusplus /* the external nodestore does not work with c++ so far */
 
 /**

+ 121 - 72
src/server/ua_server.c

@@ -39,11 +39,18 @@ static const UA_ExpandedNodeId expandedNodeIdBaseDataVariabletype = {
     .nodeId = {.namespaceIndex = 0, .identifierType = UA_NODEIDTYPE_NUMERIC,
                .identifier.numeric = UA_NS0ID_HASTYPEDEFINITION},
     .namespaceUri = {.length = -1, .data = UA_NULL}, .serverIndex = 0};
+static const UA_NodeId nodeIdBaseDataVariabletype = {
+    .namespaceIndex = 0, .identifierType = UA_NODEIDTYPE_NUMERIC,
+    .identifier.numeric = UA_NS0ID_HASTYPEDEFINITION};
+
 #ifndef ENABLE_GENERATE_NAMESPACE0
 static const UA_ExpandedNodeId expandedNodeIdNonHierarchicalReferences = {
     .nodeId = {.namespaceIndex = 0, .identifierType = UA_NODEIDTYPE_NUMERIC,
                .identifier.numeric = UA_NS0ID_NONHIERARCHICALREFERENCES},
     .namespaceUri = {.length = -1, .data = UA_NULL}, .serverIndex = 0};
+static const UA_NodeId nodeIdNonHierarchicalReferences = {
+        .namespaceIndex = 0, .identifierType = UA_NODEIDTYPE_NUMERIC,
+        .identifier.numeric = UA_NS0ID_NONHIERARCHICALREFERENCES};
 #endif
 
 /**********************/
@@ -132,7 +139,7 @@ UA_Server_addReference(UA_Server *server, const UA_NodeId *sourceId, const UA_No
 }
 
 static UA_AddNodesResult
-addNodeInternal(UA_Server *server, UA_Node *node, const UA_ExpandedNodeId *parentNodeId,
+addNodeInternal(UA_Server *server, UA_Node *node, const UA_NodeId *parentNodeId,
                 const UA_NodeId *referenceTypeId) {
     UA_AddNodesResult res;
     UA_AddNodesResult_init(&res);
@@ -141,9 +148,9 @@ addNodeInternal(UA_Server *server, UA_Node *node, const UA_ExpandedNodeId *paren
 }
 
 UA_AddNodesResult
-UA_Server_addNode(UA_Server *server, const UA_NodeClass nodeClass, const UA_ExpandedNodeId requestedNewNodeId,
-                  const UA_ExpandedNodeId parentNodeId, const UA_NodeId referenceTypeId,
-                  const UA_QualifiedName browseName, const UA_ExpandedNodeId typeDefinition,
+UA_Server_addNode(UA_Server *server, const UA_NodeClass nodeClass, const UA_NodeId requestedNewNodeId,
+                  const UA_NodeId parentNodeId, const UA_NodeId referenceTypeId,
+                  const UA_QualifiedName browseName, const UA_NodeId typeDefinition,
                   const UA_NodeAttributes *attr, const UA_DataType *attributeType) {
     UA_AddNodesResult result;
     UA_AddNodesResult_init(&result);
@@ -152,10 +159,10 @@ UA_Server_addNode(UA_Server *server, const UA_NodeClass nodeClass, const UA_Expa
     UA_AddNodesItem_init(&item);
     result.statusCode = UA_QualifiedName_copy(&browseName, &item.browseName);
     item.nodeClass = nodeClass;
-    result.statusCode |= UA_ExpandedNodeId_copy(&parentNodeId, &item.parentNodeId);
+    result.statusCode |= UA_NodeId_copy(&parentNodeId, &item.parentNodeId.nodeId);
     result.statusCode |= UA_NodeId_copy(&referenceTypeId, &item.referenceTypeId);
-    result.statusCode |= UA_ExpandedNodeId_copy(&requestedNewNodeId, &item.requestedNewNodeId);
-    result.statusCode |= UA_ExpandedNodeId_copy(&typeDefinition, &item.typeDefinition);
+    result.statusCode |= UA_NodeId_copy(&requestedNewNodeId, &item.requestedNewNodeId.nodeId);
+    result.statusCode |= UA_NodeId_copy(&typeDefinition, &item.typeDefinition.nodeId);
     UA_NodeAttributes *attrCopy = UA_alloca(attributeType->memSize);
     result.statusCode |= UA_copy(attr, attrCopy, attributeType);
     if(result.statusCode == UA_STATUSCODE_GOOD)
@@ -170,10 +177,6 @@ UA_Server_addNode(UA_Server *server, const UA_NodeClass nodeClass, const UA_Expa
 /* Configuration */
 /*****************/
 
-UA_Logger UA_Server_getLogger(UA_Server *server) {
-    return server->logger;
-}
-
 void UA_Server_addNetworkLayer(UA_Server *server, UA_ServerNetworkLayer *networkLayer) {
     UA_ServerNetworkLayer **newlayers =
         UA_realloc(server->networkLayers, sizeof(void*)*(server->networkLayersSize+1));
@@ -354,7 +357,7 @@ static void addDataTypeNode(UA_Server *server, char* name, UA_UInt32 datatypeid,
     UA_DataTypeNode *datatype = UA_DataTypeNode_new();
     copyNames((UA_Node*)datatype, name);
     datatype->nodeId.identifier.numeric = datatypeid;
-    addNodeInternal(server, (UA_Node*)datatype, &UA_EXPANDEDNODEID_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,
@@ -362,7 +365,7 @@ static void addObjectTypeNode(UA_Server *server, char* name, UA_UInt32 objecttyp
     UA_ObjectTypeNode *objecttype = UA_ObjectTypeNode_new();
     copyNames((UA_Node*)objecttype, name);
     objecttype->nodeId.identifier.numeric = objecttypeid;
-    addNodeInternal(server, (UA_Node*)objecttype, &UA_EXPANDEDNODEID_NUMERIC(0, parent),
+    addNodeInternal(server, (UA_Node*)objecttype, &UA_NODEID_NUMERIC(0, parent),
                       &UA_NODEID_NUMERIC(0, parentreference));
 }
 
@@ -380,13 +383,13 @@ createVariableTypeNode(UA_Server *server, char* name, UA_UInt32 variabletypeid,
 static void addVariableTypeNode_organized(UA_Server *server, char* name, UA_UInt32 variabletypeid,
                                           UA_Int32 parent, UA_Boolean abstract) {
     UA_VariableTypeNode *variabletype = createVariableTypeNode(server, name, variabletypeid, parent, abstract);
-    addNodeInternal(server, (UA_Node*)variabletype, &UA_EXPANDEDNODEID_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_EXPANDEDNODEID_NUMERIC(0, parent), &nodeIdHasSubType);
+    addNodeInternal(server, (UA_Node*)variabletype, &UA_NODEID_NUMERIC(0, parent), &nodeIdHasSubType);
 }
 
 UA_Server * UA_Server_new(UA_ServerConfig config) {
@@ -570,7 +573,7 @@ UA_Server * UA_Server_new(UA_ServerConfig config) {
     hierarchicalreferences->isAbstract = UA_TRUE;
     hierarchicalreferences->symmetric  = UA_FALSE;
     addNodeInternal(server, (UA_Node*)hierarchicalreferences,
-                    &UA_EXPANDEDNODEID_NUMERIC(0, UA_NS0ID_REFERENCES), &nodeIdHasSubType);
+                    &UA_NODEID_NUMERIC(0, UA_NS0ID_REFERENCES), &nodeIdHasSubType);
 
     UA_ReferenceTypeNode *nonhierarchicalreferences = UA_ReferenceTypeNode_new();
     copyNames((UA_Node*)nonhierarchicalreferences, "NonHierarchicalReferences");
@@ -578,7 +581,7 @@ UA_Server * UA_Server_new(UA_ServerConfig config) {
     nonhierarchicalreferences->isAbstract = UA_TRUE;
     nonhierarchicalreferences->symmetric  = UA_FALSE;
     addNodeInternal(server, (UA_Node*)nonhierarchicalreferences,
-                    &UA_EXPANDEDNODEID_NUMERIC(0, UA_NS0ID_REFERENCES), &nodeIdHasSubType);
+                    &UA_NODEID_NUMERIC(0, UA_NS0ID_REFERENCES), &nodeIdHasSubType);
 
     UA_ReferenceTypeNode *haschild = UA_ReferenceTypeNode_new();
     copyNames((UA_Node*)haschild, "HasChild");
@@ -586,7 +589,7 @@ UA_Server * UA_Server_new(UA_ServerConfig config) {
     haschild->isAbstract = UA_TRUE;
     haschild->symmetric  = UA_FALSE;
     addNodeInternal(server, (UA_Node*)haschild,
-                    &UA_EXPANDEDNODEID_NUMERIC(0, UA_NS0ID_HIERARCHICALREFERENCES), &nodeIdHasSubType);
+                    &UA_NODEID_NUMERIC(0, UA_NS0ID_HIERARCHICALREFERENCES), &nodeIdHasSubType);
 
     UA_ReferenceTypeNode *organizes = UA_ReferenceTypeNode_new();
     copyNames((UA_Node*)organizes, "Organizes");
@@ -595,7 +598,7 @@ UA_Server * UA_Server_new(UA_ServerConfig config) {
     organizes->isAbstract = UA_FALSE;
     organizes->symmetric  = UA_FALSE;
     addNodeInternal(server, (UA_Node*)organizes,
-                    &UA_EXPANDEDNODEID_NUMERIC(0, UA_NS0ID_HIERARCHICALREFERENCES), &nodeIdHasSubType);
+                    &UA_NODEID_NUMERIC(0, UA_NS0ID_HIERARCHICALREFERENCES), &nodeIdHasSubType);
 
     UA_ReferenceTypeNode *haseventsource = UA_ReferenceTypeNode_new();
     copyNames((UA_Node*)haseventsource, "HasEventSource");
@@ -604,7 +607,7 @@ UA_Server * UA_Server_new(UA_ServerConfig config) {
     haseventsource->isAbstract = UA_FALSE;
     haseventsource->symmetric  = UA_FALSE;
     addNodeInternal(server, (UA_Node*)haseventsource,
-                    &UA_EXPANDEDNODEID_NUMERIC(0, UA_NS0ID_HIERARCHICALREFERENCES), &nodeIdHasSubType);
+                    &UA_NODEID_NUMERIC(0, UA_NS0ID_HIERARCHICALREFERENCES), &nodeIdHasSubType);
 
     UA_ReferenceTypeNode *hasmodellingrule = UA_ReferenceTypeNode_new();
     copyNames((UA_Node*)hasmodellingrule, "HasModellingRule");
@@ -612,7 +615,7 @@ UA_Server * UA_Server_new(UA_ServerConfig config) {
     hasmodellingrule->nodeId.identifier.numeric = UA_NS0ID_HASMODELLINGRULE;
     hasmodellingrule->isAbstract = UA_FALSE;
     hasmodellingrule->symmetric  = UA_FALSE;
-    addNodeInternal(server, (UA_Node*)hasmodellingrule, &expandedNodeIdNonHierarchicalReferences, &nodeIdHasSubType);
+    addNodeInternal(server, (UA_Node*)hasmodellingrule, &nodeIdNonHierarchicalReferences, &nodeIdHasSubType);
 
     UA_ReferenceTypeNode *hasencoding = UA_ReferenceTypeNode_new();
     copyNames((UA_Node*)hasencoding, "HasEncoding");
@@ -620,7 +623,7 @@ UA_Server * UA_Server_new(UA_ServerConfig config) {
     hasencoding->nodeId.identifier.numeric = UA_NS0ID_HASENCODING;
     hasencoding->isAbstract = UA_FALSE;
     hasencoding->symmetric  = UA_FALSE;
-    addNodeInternal(server, (UA_Node*)hasencoding, &expandedNodeIdNonHierarchicalReferences, &nodeIdHasSubType);
+    addNodeInternal(server, (UA_Node*)hasencoding, &nodeIdNonHierarchicalReferences, &nodeIdHasSubType);
 
     UA_ReferenceTypeNode *hasdescription = UA_ReferenceTypeNode_new();
     copyNames((UA_Node*)hasdescription, "HasDescription");
@@ -628,7 +631,7 @@ UA_Server * UA_Server_new(UA_ServerConfig config) {
     hasdescription->nodeId.identifier.numeric = UA_NS0ID_HASDESCRIPTION;
     hasdescription->isAbstract = UA_FALSE;
     hasdescription->symmetric  = UA_FALSE;
-    addNodeInternal(server, (UA_Node*)hasdescription, &expandedNodeIdNonHierarchicalReferences, &nodeIdHasSubType);
+    addNodeInternal(server, (UA_Node*)hasdescription, &nodeIdNonHierarchicalReferences, &nodeIdHasSubType);
 
     UA_ReferenceTypeNode *hastypedefinition = UA_ReferenceTypeNode_new();
     copyNames((UA_Node*)hastypedefinition, "HasTypeDefinition");
@@ -636,7 +639,7 @@ UA_Server * UA_Server_new(UA_ServerConfig config) {
     hastypedefinition->nodeId.identifier.numeric = UA_NS0ID_HASTYPEDEFINITION;
     hastypedefinition->isAbstract = UA_FALSE;
     hastypedefinition->symmetric  = UA_FALSE;
-    addNodeInternal(server, (UA_Node*)hastypedefinition, &expandedNodeIdNonHierarchicalReferences, &nodeIdHasSubType);
+    addNodeInternal(server, (UA_Node*)hastypedefinition, &nodeIdNonHierarchicalReferences, &nodeIdHasSubType);
 
     UA_ReferenceTypeNode *generatesevent = UA_ReferenceTypeNode_new();
     copyNames((UA_Node*)generatesevent, "GeneratesEvent");
@@ -644,7 +647,7 @@ UA_Server * UA_Server_new(UA_ServerConfig config) {
     generatesevent->nodeId.identifier.numeric = UA_NS0ID_GENERATESEVENT;
     generatesevent->isAbstract = UA_FALSE;
     generatesevent->symmetric  = UA_FALSE;
-    addNodeInternal(server, (UA_Node*)generatesevent, &expandedNodeIdNonHierarchicalReferences, &nodeIdHasSubType);
+    addNodeInternal(server, (UA_Node*)generatesevent, &nodeIdNonHierarchicalReferences, &nodeIdHasSubType);
 
     UA_ReferenceTypeNode *aggregates = UA_ReferenceTypeNode_new();
     copyNames((UA_Node*)aggregates, "Aggregates");
@@ -652,7 +655,7 @@ UA_Server * UA_Server_new(UA_ServerConfig config) {
     aggregates->nodeId.identifier.numeric = UA_NS0ID_AGGREGATES;
     aggregates->isAbstract = UA_TRUE;
     aggregates->symmetric  = UA_FALSE;
-    addNodeInternal(server, (UA_Node*)aggregates, &UA_EXPANDEDNODEID_NUMERIC(0, UA_NS0ID_HASCHILD), &nodeIdHasSubType);
+    addNodeInternal(server, (UA_Node*)aggregates, &UA_NODEID_NUMERIC(0, UA_NS0ID_HASCHILD), &nodeIdHasSubType);
 
     // complete bootstrap of hassubtype
     UA_Server_addReference(server, &UA_NODEID_NUMERIC(0, UA_NS0ID_HASCHILD), &nodeIdHasSubType,
@@ -664,7 +667,8 @@ UA_Server * UA_Server_new(UA_ServerConfig config) {
     hasproperty->nodeId.identifier.numeric = UA_NS0ID_HASPROPERTY;
     hasproperty->isAbstract = UA_FALSE;
     hasproperty->symmetric  = UA_FALSE;
-    addNodeInternal(server, (UA_Node*)hasproperty, &UA_EXPANDEDNODEID_NUMERIC(0, UA_NS0ID_AGGREGATES), &nodeIdHasSubType);
+    addNodeInternal(server, (UA_Node*)hasproperty, &UA_NODEID_NUMERIC(0, UA_NS0ID_AGGREGATES),
+                    &nodeIdHasSubType);
 
     UA_ReferenceTypeNode *hascomponent = UA_ReferenceTypeNode_new();
     copyNames((UA_Node*)hascomponent, "HasComponent");
@@ -672,7 +676,8 @@ UA_Server * UA_Server_new(UA_ServerConfig config) {
     hascomponent->nodeId.identifier.numeric = UA_NS0ID_HASCOMPONENT;
     hascomponent->isAbstract = UA_FALSE;
     hascomponent->symmetric  = UA_FALSE;
-    addNodeInternal(server, (UA_Node*)hascomponent, &UA_EXPANDEDNODEID_NUMERIC(0, UA_NS0ID_AGGREGATES), &nodeIdHasSubType);
+    addNodeInternal(server, (UA_Node*)hascomponent, &UA_NODEID_NUMERIC(0, UA_NS0ID_AGGREGATES),
+                    &nodeIdHasSubType);
 
     UA_ReferenceTypeNode *hasnotifier = UA_ReferenceTypeNode_new();
     copyNames((UA_Node*)hasnotifier, "HasNotifier");
@@ -680,7 +685,8 @@ UA_Server * UA_Server_new(UA_ServerConfig config) {
     hasnotifier->nodeId.identifier.numeric = UA_NS0ID_HASNOTIFIER;
     hasnotifier->isAbstract = UA_FALSE;
     hasnotifier->symmetric  = UA_FALSE;
-    addNodeInternal(server, (UA_Node*)hasnotifier, &UA_EXPANDEDNODEID_NUMERIC(0, UA_NS0ID_HASEVENTSOURCE), &nodeIdHasSubType);
+    addNodeInternal(server, (UA_Node*)hasnotifier, &UA_NODEID_NUMERIC(0, UA_NS0ID_HASEVENTSOURCE),
+                    &nodeIdHasSubType);
 
     UA_ReferenceTypeNode *hasorderedcomponent = UA_ReferenceTypeNode_new();
     copyNames((UA_Node*)hasorderedcomponent, "HasOrderedComponent");
@@ -688,7 +694,8 @@ UA_Server * UA_Server_new(UA_ServerConfig config) {
     hasorderedcomponent->nodeId.identifier.numeric = UA_NS0ID_HASORDEREDCOMPONENT;
     hasorderedcomponent->isAbstract = UA_FALSE;
     hasorderedcomponent->symmetric  = UA_FALSE;
-    addNodeInternal(server, (UA_Node*)hasorderedcomponent, &UA_EXPANDEDNODEID_NUMERIC(0, UA_NS0ID_HASCOMPONENT), &nodeIdHasSubType);
+    addNodeInternal(server, (UA_Node*)hasorderedcomponent, &UA_NODEID_NUMERIC(0, UA_NS0ID_HASCOMPONENT),
+                    &nodeIdHasSubType);
 
     UA_ReferenceTypeNode *hasmodelparent = UA_ReferenceTypeNode_new();
     copyNames((UA_Node*)hasmodelparent, "HasModelParent");
@@ -696,7 +703,7 @@ UA_Server * UA_Server_new(UA_ServerConfig config) {
     hasmodelparent->nodeId.identifier.numeric = UA_NS0ID_HASMODELPARENT;
     hasmodelparent->isAbstract = UA_FALSE;
     hasmodelparent->symmetric  = UA_FALSE;
-    addNodeInternal(server, (UA_Node*)hasmodelparent, &expandedNodeIdNonHierarchicalReferences, &nodeIdHasSubType);
+    addNodeInternal(server, (UA_Node*)hasmodelparent, &nodeIdNonHierarchicalReferences, &nodeIdHasSubType);
 
     UA_ReferenceTypeNode *fromstate = UA_ReferenceTypeNode_new();
     copyNames((UA_Node*)fromstate, "FromState");
@@ -704,7 +711,7 @@ UA_Server * UA_Server_new(UA_ServerConfig config) {
     fromstate->nodeId.identifier.numeric = UA_NS0ID_FROMSTATE;
     fromstate->isAbstract = UA_FALSE;
     fromstate->symmetric  = UA_FALSE;
-    addNodeInternal(server, (UA_Node*)fromstate, &expandedNodeIdNonHierarchicalReferences, &nodeIdHasSubType);
+    addNodeInternal(server, (UA_Node*)fromstate, &nodeIdNonHierarchicalReferences, &nodeIdHasSubType);
 
     UA_ReferenceTypeNode *tostate = UA_ReferenceTypeNode_new();
     copyNames((UA_Node*)tostate, "ToState");
@@ -712,7 +719,7 @@ UA_Server * UA_Server_new(UA_ServerConfig config) {
     tostate->nodeId.identifier.numeric = UA_NS0ID_TOSTATE;
     tostate->isAbstract = UA_FALSE;
     tostate->symmetric  = UA_FALSE;
-    addNodeInternal(server, (UA_Node*)tostate, &expandedNodeIdNonHierarchicalReferences, &nodeIdHasSubType);
+    addNodeInternal(server, (UA_Node*)tostate, &nodeIdNonHierarchicalReferences, &nodeIdHasSubType);
 
     UA_ReferenceTypeNode *hascause = UA_ReferenceTypeNode_new();
     copyNames((UA_Node*)hascause, "HasCause");
@@ -720,7 +727,7 @@ UA_Server * UA_Server_new(UA_ServerConfig config) {
     hascause->nodeId.identifier.numeric = UA_NS0ID_HASCAUSE;
     hascause->isAbstract = UA_FALSE;
     hascause->symmetric  = UA_FALSE;
-    addNodeInternal(server, (UA_Node*)hascause, &expandedNodeIdNonHierarchicalReferences, &nodeIdHasSubType);
+    addNodeInternal(server, (UA_Node*)hascause, &nodeIdNonHierarchicalReferences, &nodeIdHasSubType);
     
     UA_ReferenceTypeNode *haseffect = UA_ReferenceTypeNode_new();
     copyNames((UA_Node*)haseffect, "HasEffect");
@@ -728,7 +735,7 @@ UA_Server * UA_Server_new(UA_ServerConfig config) {
     haseffect->nodeId.identifier.numeric = UA_NS0ID_HASEFFECT;
     haseffect->isAbstract = UA_FALSE;
     haseffect->symmetric  = UA_FALSE;
-    addNodeInternal(server, (UA_Node*)haseffect, &expandedNodeIdNonHierarchicalReferences, &nodeIdHasSubType);
+    addNodeInternal(server, (UA_Node*)haseffect, &nodeIdNonHierarchicalReferences, &nodeIdHasSubType);
 
     UA_ReferenceTypeNode *hashistoricalconfiguration = UA_ReferenceTypeNode_new();
     copyNames((UA_Node*)hashistoricalconfiguration, "HasHistoricalConfiguration");
@@ -737,7 +744,7 @@ UA_Server * UA_Server_new(UA_ServerConfig config) {
     hashistoricalconfiguration->isAbstract = UA_FALSE;
     hashistoricalconfiguration->symmetric  = UA_FALSE;
     addNodeInternal(server, (UA_Node*)hashistoricalconfiguration,
-                      &UA_EXPANDEDNODEID_NUMERIC(0, UA_NS0ID_AGGREGATES), &nodeIdHasSubType);
+                      &UA_NODEID_NUMERIC(0, UA_NS0ID_AGGREGATES), &nodeIdHasSubType);
 
     /*****************/
     /* Basic Folders */
@@ -751,25 +758,25 @@ UA_Server * UA_Server_new(UA_ServerConfig config) {
     UA_ObjectNode *objects = UA_ObjectNode_new();
     copyNames((UA_Node*)objects, "Objects");
     objects->nodeId.identifier.numeric = UA_NS0ID_OBJECTSFOLDER;
-    addNodeInternal(server, (UA_Node*)objects, &UA_EXPANDEDNODEID_NUMERIC(0, UA_NS0ID_ROOTFOLDER),
+    addNodeInternal(server, (UA_Node*)objects, &UA_NODEID_NUMERIC(0, UA_NS0ID_ROOTFOLDER),
                     &nodeIdOrganizes);
 
     UA_ObjectNode *types = UA_ObjectNode_new();
     copyNames((UA_Node*)types, "Types");
     types->nodeId.identifier.numeric = UA_NS0ID_TYPESFOLDER;
-    addNodeInternal(server, (UA_Node*)types, &UA_EXPANDEDNODEID_NUMERIC(0, UA_NS0ID_ROOTFOLDER),
+    addNodeInternal(server, (UA_Node*)types, &UA_NODEID_NUMERIC(0, UA_NS0ID_ROOTFOLDER),
                     &nodeIdOrganizes);
 
     UA_ObjectNode *views = UA_ObjectNode_new();
     copyNames((UA_Node*)views, "Views");
     views->nodeId.identifier.numeric = UA_NS0ID_VIEWSFOLDER;
-    addNodeInternal(server, (UA_Node*)views, &UA_EXPANDEDNODEID_NUMERIC(0, UA_NS0ID_ROOTFOLDER),
+    addNodeInternal(server, (UA_Node*)views, &UA_NODEID_NUMERIC(0, UA_NS0ID_ROOTFOLDER),
                     &nodeIdOrganizes);
 
     UA_ObjectNode *referencetypes = UA_ObjectNode_new();
     copyNames((UA_Node*)referencetypes, "ReferenceTypes");
     referencetypes->nodeId.identifier.numeric = UA_NS0ID_REFERENCETYPESFOLDER;
-    addNodeInternal(server, (UA_Node*)referencetypes, &UA_EXPANDEDNODEID_NUMERIC(0, UA_NS0ID_TYPESFOLDER),
+    addNodeInternal(server, (UA_Node*)referencetypes, &UA_NODEID_NUMERIC(0, UA_NS0ID_TYPESFOLDER),
                     &nodeIdOrganizes);
 
     UA_Server_addReference(server, &UA_NODEID_NUMERIC(0, UA_NS0ID_REFERENCETYPESFOLDER), &nodeIdOrganizes,
@@ -782,9 +789,11 @@ UA_Server * UA_Server_new(UA_ServerConfig config) {
     UA_ObjectNode *objecttypes = UA_ObjectNode_new();
     copyNames((UA_Node*)objecttypes, "ObjectTypes");
     objecttypes->nodeId.identifier.numeric = UA_NS0ID_OBJECTTYPESFOLDER;
-    addNodeInternal(server, (UA_Node*)objecttypes, &UA_EXPANDEDNODEID_NUMERIC(0, UA_NS0ID_TYPESFOLDER), &nodeIdOrganizes);
+    addNodeInternal(server, (UA_Node*)objecttypes, &UA_NODEID_NUMERIC(0, UA_NS0ID_TYPESFOLDER),
+                    &nodeIdOrganizes);
 
-    addObjectTypeNode(server, "BaseObjectType", UA_NS0ID_BASEOBJECTTYPE, UA_NS0ID_OBJECTTYPESFOLDER, UA_NS0ID_ORGANIZES);
+    addObjectTypeNode(server, "BaseObjectType", UA_NS0ID_BASEOBJECTTYPE, UA_NS0ID_OBJECTTYPESFOLDER,
+                      UA_NS0ID_ORGANIZES);
     addObjectTypeNode(server, "FolderType", UA_NS0ID_FOLDERTYPE, UA_NS0ID_BASEOBJECTTYPE, UA_NS0ID_HASSUBTYPE);
     UA_Server_addReference(server, &UA_NODEID_NUMERIC(0, UA_NS0ID_OBJECTTYPESFOLDER), &nodeIdHasTypeDefinition,
                            &UA_EXPANDEDNODEID_NUMERIC(0, UA_NS0ID_FOLDERTYPE));
@@ -815,7 +824,7 @@ UA_Server * UA_Server_new(UA_ServerConfig config) {
     UA_ObjectNode *datatypes = UA_ObjectNode_new();
     copyNames((UA_Node*)datatypes, "DataTypes");
     datatypes->nodeId.identifier.numeric = UA_NS0ID_DATATYPESFOLDER;
-    addNodeInternal(server, (UA_Node*)datatypes, &UA_EXPANDEDNODEID_NUMERIC(0, UA_NS0ID_TYPESFOLDER),
+    addNodeInternal(server, (UA_Node*)datatypes, &UA_NODEID_NUMERIC(0, UA_NS0ID_TYPESFOLDER),
                       &nodeIdOrganizes);
     UA_Server_addReference(server, &UA_NODEID_NUMERIC(0, UA_NS0ID_DATATYPESFOLDER), &nodeIdHasTypeDefinition,
                            &UA_EXPANDEDNODEID_NUMERIC(0, UA_NS0ID_FOLDERTYPE));
@@ -856,7 +865,7 @@ UA_Server * UA_Server_new(UA_ServerConfig config) {
    UA_ObjectNode *variabletypes = UA_ObjectNode_new();
    copyNames((UA_Node*)variabletypes, "VariableTypes");
    variabletypes->nodeId.identifier.numeric = UA_NS0ID_VARIABLETYPESFOLDER;
-   addNodeInternal(server, (UA_Node*)variabletypes, &UA_EXPANDEDNODEID_NUMERIC(0, UA_NS0ID_TYPESFOLDER),
+   addNodeInternal(server, (UA_Node*)variabletypes, &UA_NODEID_NUMERIC(0, UA_NS0ID_TYPESFOLDER),
                      &nodeIdOrganizes);
    UA_Server_addReference(server, &UA_NODEID_NUMERIC(0, UA_NS0ID_VARIABLETYPESFOLDER), &nodeIdHasTypeDefinition,
                           &UA_EXPANDEDNODEID_NUMERIC(0, UA_NS0ID_FOLDERTYPE));
@@ -880,7 +889,7 @@ UA_Server * UA_Server_new(UA_ServerConfig config) {
    UA_ObjectNode *servernode = UA_ObjectNode_new();
    copyNames((UA_Node*)servernode, "Server");
    servernode->nodeId.identifier.numeric = UA_NS0ID_SERVER;
-   addNodeInternal(server, (UA_Node*)servernode, &UA_EXPANDEDNODEID_NUMERIC(0, UA_NS0ID_OBJECTSFOLDER),
+   addNodeInternal(server, (UA_Node*)servernode, &UA_NODEID_NUMERIC(0, UA_NS0ID_OBJECTSFOLDER),
                      &nodeIdOrganizes);
    UA_Server_addReference(server, &UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER), &nodeIdHasTypeDefinition,
                           &UA_EXPANDEDNODEID_NUMERIC(0, UA_NS0ID_SERVERTYPE));
@@ -893,7 +902,7 @@ UA_Server * UA_Server_new(UA_ServerConfig config) {
                                                        .write = UA_NULL};
    namespaceArray->valueRank = 1;
    namespaceArray->minimumSamplingInterval = 1.0;
-   addNodeInternal(server, (UA_Node*)namespaceArray, &UA_EXPANDEDNODEID_NUMERIC(0, UA_NS0ID_SERVER), &nodeIdHasProperty);
+   addNodeInternal(server, (UA_Node*)namespaceArray, &UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER), &nodeIdHasProperty);
    UA_Server_addReference(server, &UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_NAMESPACEARRAY), &nodeIdHasTypeDefinition,
                           &UA_EXPANDEDNODEID_NUMERIC(0, UA_NS0ID_PROPERTYTYPE));
 
@@ -906,14 +915,14 @@ UA_Server * UA_Server_new(UA_ServerConfig config) {
    *(UA_String *)serverArray->value.variant.value.data = UA_STRING_ALLOC(server->config.Application_applicationURI);
    serverArray->valueRank = 1;
    serverArray->minimumSamplingInterval = 1.0;
-   addNodeInternal(server, (UA_Node*)serverArray, &UA_EXPANDEDNODEID_NUMERIC(0, UA_NS0ID_SERVER), &nodeIdHasProperty);
+   addNodeInternal(server, (UA_Node*)serverArray, &UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER), &nodeIdHasProperty);
    UA_Server_addReference(server, &UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_SERVERARRAY), &nodeIdHasTypeDefinition,
                           &UA_EXPANDEDNODEID_NUMERIC(0, UA_NS0ID_PROPERTYTYPE));
 
    UA_ObjectNode *servercapablities = UA_ObjectNode_new();
    copyNames((UA_Node*)servercapablities, "ServerCapabilities");
    servercapablities->nodeId.identifier.numeric = UA_NS0ID_SERVER_SERVERCAPABILITIES;
-   addNodeInternal(server, (UA_Node*)servercapablities, &UA_EXPANDEDNODEID_NUMERIC(0, UA_NS0ID_SERVER),
+   addNodeInternal(server, (UA_Node*)servercapablities, &UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER),
                      &nodeIdHasComponent);
    UA_Server_addReference(server, &UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_SERVERCAPABILITIES), &nodeIdHasTypeDefinition,
                           &UA_EXPANDEDNODEID_NUMERIC(0, UA_NS0ID_SERVERCAPABILITIESTYPE));
@@ -928,7 +937,7 @@ UA_Server * UA_Server_new(UA_ServerConfig config) {
    localeIdArray->valueRank = 1;
    localeIdArray->minimumSamplingInterval = 1.0;
    addNodeInternal(server, (UA_Node*)localeIdArray,
-                     &UA_EXPANDEDNODEID_NUMERIC(0, UA_NS0ID_SERVER_SERVERCAPABILITIES), &nodeIdHasProperty);
+                     &UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_SERVERCAPABILITIES), &nodeIdHasProperty);
    UA_Server_addReference(server, &UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_SERVERCAPABILITIES_LOCALEIDARRAY),
                           &nodeIdHasTypeDefinition, &UA_EXPANDEDNODEID_NUMERIC(0, UA_NS0ID_PROPERTYTYPE));
 
@@ -940,7 +949,7 @@ UA_Server * UA_Server_new(UA_ServerConfig config) {
     *((UA_UInt16*)maxBrowseContinuationPoints->value.variant.value.data) = MAXCONTINUATIONPOINTS;
     maxBrowseContinuationPoints->value.variant.value.type = &UA_TYPES[UA_TYPES_UINT16];
     addNodeInternal(server, (UA_Node*)maxBrowseContinuationPoints,
-                      &UA_EXPANDEDNODEID_NUMERIC(0, UA_NS0ID_SERVER_SERVERCAPABILITIES), &nodeIdHasProperty);
+                      &UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_SERVERCAPABILITIES), &nodeIdHasProperty);
     UA_Server_addReference(server,
                            &UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_SERVERCAPABILITIES_MAXBROWSECONTINUATIONPOINTS),
                            &nodeIdHasTypeDefinition, &UA_EXPANDEDNODEID_NUMERIC(0, UA_NS0ID_PROPERTYTYPE));
@@ -974,7 +983,7 @@ UA_Server * UA_Server_new(UA_ServerConfig config) {
     serverProfileArray->valueRank = 1;
     serverProfileArray->minimumSamplingInterval = 1.0;
     addNodeInternal(server, (UA_Node*)serverProfileArray,
-                    &UA_EXPANDEDNODEID_NUMERIC(0, UA_NS0ID_SERVER_SERVERCAPABILITIES), &nodeIdHasProperty);
+                    &UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_SERVERCAPABILITIES), &nodeIdHasProperty);
     UA_Server_addReference(server, &UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_SERVERCAPABILITIES_SERVERPROFILEARRAY),
                            &nodeIdHasTypeDefinition, &UA_EXPANDEDNODEID_NUMERIC(0, UA_NS0ID_PROPERTYTYPE));
 
@@ -982,7 +991,7 @@ UA_Server * UA_Server_new(UA_ServerConfig config) {
     copyNames((UA_Node*)serverdiagnostics, "ServerDiagnostics");
     serverdiagnostics->nodeId.identifier.numeric = UA_NS0ID_SERVER_SERVERDIAGNOSTICS;
     addNodeInternal(server, (UA_Node*)serverdiagnostics,
-                    &UA_EXPANDEDNODEID_NUMERIC(0, UA_NS0ID_SERVER), &nodeIdHasComponent);
+                    &UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER), &nodeIdHasComponent);
     UA_Server_addReference(server, &UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_SERVERDIAGNOSTICS), &nodeIdHasTypeDefinition,
                            &UA_EXPANDEDNODEID_NUMERIC(0, UA_NS0ID_SERVERDIAGNOSTICSTYPE));
 
@@ -994,7 +1003,7 @@ UA_Server * UA_Server_new(UA_ServerConfig config) {
      enabledFlag->valueRank = 1;
      enabledFlag->minimumSamplingInterval = 1.0;
      addNodeInternal(server, (UA_Node*)enabledFlag,
-                     &UA_EXPANDEDNODEID_NUMERIC(0, UA_NS0ID_SERVER_SERVERDIAGNOSTICS), &nodeIdHasProperty);
+                     &UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_SERVERDIAGNOSTICS), &nodeIdHasProperty);
      UA_Server_addReference(server, &UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_SERVERDIAGNOSTICS_ENABLEDFLAG),
                             &nodeIdHasTypeDefinition, &UA_EXPANDEDNODEID_NUMERIC(0, UA_NS0ID_PROPERTYTYPE));
 
@@ -1003,7 +1012,7 @@ UA_Server * UA_Server_new(UA_ServerConfig config) {
       serverstatus->nodeId = UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_SERVERSTATUS);
       serverstatus->valueSource = UA_VALUESOURCE_DATASOURCE;
       serverstatus->value.dataSource = (UA_DataSource) {.handle = server, .read = readStatus, .write = UA_NULL};
-      addNodeInternal(server, (UA_Node*)serverstatus, &UA_EXPANDEDNODEID_NUMERIC(0, UA_NS0ID_SERVER),
+      addNodeInternal(server, (UA_Node*)serverstatus, &UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER),
                       &nodeIdHasComponent);
       UA_Server_addReference(server, &UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_SERVERSTATUS), &nodeIdHasTypeDefinition,
                              &UA_EXPANDEDNODEID_NUMERIC(0, UA_NS0ID_SERVERSTATUSTYPE));
@@ -1014,10 +1023,10 @@ UA_Server * UA_Server_new(UA_ServerConfig config) {
       starttime->value.variant.value.storageType = UA_VARIANT_DATA_NODELETE;
       starttime->value.variant.value.data = &server->startTime;
       starttime->value.variant.value.type = &UA_TYPES[UA_TYPES_DATETIME];
-      addNodeInternal(server, (UA_Node*)starttime, &UA_EXPANDEDNODEID_NUMERIC(0, UA_NS0ID_SERVER_SERVERSTATUS),
+      addNodeInternal(server, (UA_Node*)starttime, &UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_SERVERSTATUS),
                       &nodeIdHasComponent);
-      UA_Server_addReference(server, &UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_SERVERSTATUS_STARTTIME), &nodeIdHasTypeDefinition,
-                             &expandedNodeIdBaseDataVariabletype);
+      UA_Server_addReference(server, &UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_SERVERSTATUS_STARTTIME),
+                             &nodeIdHasTypeDefinition, &expandedNodeIdBaseDataVariabletype);
 
      UA_VariableNode *currenttime = UA_VariableNode_new();
       copyNames((UA_Node*)currenttime, "CurrentTime");
@@ -1026,9 +1035,9 @@ UA_Server * UA_Server_new(UA_ServerConfig config) {
       currenttime->value.dataSource = (UA_DataSource) {.handle = NULL, .read = readCurrentTime,
                                                        .write = UA_NULL};
       addNodeInternal(server, (UA_Node*)currenttime,
-                      &UA_EXPANDEDNODEID_NUMERIC(0, UA_NS0ID_SERVER_SERVERSTATUS), &nodeIdHasComponent);
-      UA_Server_addReference(server, &UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_SERVERSTATUS_CURRENTTIME), &nodeIdHasTypeDefinition,
-                             &expandedNodeIdBaseDataVariabletype);
+                      &UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_SERVERSTATUS), &nodeIdHasComponent);
+      UA_Server_addReference(server, &UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_SERVERSTATUS_CURRENTTIME),
+                             &nodeIdHasTypeDefinition, &expandedNodeIdBaseDataVariabletype);
 
      UA_VariableNode *state = UA_VariableNode_new();
      UA_ServerState *stateEnum = UA_ServerState_new();
@@ -1038,10 +1047,10 @@ UA_Server * UA_Server_new(UA_ServerConfig config) {
       state->value.variant.value.type = &UA_TYPES[UA_TYPES_SERVERSTATE];
       state->value.variant.value.arrayLength = -1;
       state->value.variant.value.data = stateEnum; // points into the other object.
-      addNodeInternal(server, (UA_Node*)state, &UA_EXPANDEDNODEID_NUMERIC(0, UA_NS0ID_SERVER_SERVERSTATUS),
+      addNodeInternal(server, (UA_Node*)state, &UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_SERVERSTATUS),
                       &nodeIdHasComponent);
-      UA_Server_addReference(server, &UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_SERVERSTATUS_STATE), &nodeIdHasTypeDefinition,
-                             &expandedNodeIdBaseDataVariabletype);
+      UA_Server_addReference(server, &UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_SERVERSTATUS_STATE),
+                             &nodeIdHasTypeDefinition, &expandedNodeIdBaseDataVariabletype);
 
       UA_VariableNode *buildinfo = UA_VariableNode_new();
        copyNames((UA_Node*)buildinfo, "BuildInfo");
@@ -1050,7 +1059,7 @@ UA_Server * UA_Server_new(UA_ServerConfig config) {
        buildinfo->value.variant.value.type = &UA_TYPES[UA_TYPES_BUILDINFO];
        getBulidInfo(server, (UA_BuildInfo*)buildinfo->value.variant.value.data);
        addNodeInternal(server, (UA_Node*)buildinfo,
-                       &UA_EXPANDEDNODEID_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_BUILDINFO),
                               &nodeIdHasTypeDefinition, &UA_EXPANDEDNODEID_NUMERIC(0, UA_NS0ID_BUILDINFOTYPE));
 
@@ -1061,7 +1070,7 @@ UA_Server * UA_Server_new(UA_ServerConfig config) {
        *((UA_String*)producturi->value.variant.value.data) = UA_STRING_ALLOC(PRODUCT_URI);
        producturi->value.variant.value.type = &UA_TYPES[UA_TYPES_STRING];
        addNodeInternal(server, (UA_Node*)producturi,
-                       &UA_EXPANDEDNODEID_NUMERIC(0, UA_NS0ID_SERVER_SERVERSTATUS_BUILDINFO), &nodeIdHasComponent);
+                       &UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_SERVERSTATUS_BUILDINFO), &nodeIdHasComponent);
        UA_Server_addReference(server, &UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_SERVERSTATUS_BUILDINFO_PRODUCTURI),
                               &nodeIdHasTypeDefinition, &expandedNodeIdBaseDataVariabletype);
 
@@ -1072,7 +1081,7 @@ UA_Server * UA_Server_new(UA_ServerConfig config) {
        *((UA_String*)manufacturername->value.variant.value.data) = UA_STRING_ALLOC(MANUFACTURER_NAME);
        manufacturername->value.variant.value.type = &UA_TYPES[UA_TYPES_STRING];
        addNodeInternal(server, (UA_Node*)manufacturername,
-                       &UA_EXPANDEDNODEID_NUMERIC(0, UA_NS0ID_SERVER_SERVERSTATUS_BUILDINFO), &nodeIdHasComponent);
+                       &UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_SERVERSTATUS_BUILDINFO), &nodeIdHasComponent);
        UA_Server_addReference(server,
                               &UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_SERVERSTATUS_BUILDINFO_MANUFACTURERNAME),
                               &nodeIdHasTypeDefinition, &expandedNodeIdBaseDataVariabletype);
@@ -1084,7 +1093,7 @@ UA_Server * UA_Server_new(UA_ServerConfig config) {
        *((UA_String*)productname->value.variant.value.data) = UA_STRING_ALLOC(PRODUCT_NAME);
        productname->value.variant.value.type = &UA_TYPES[UA_TYPES_STRING];
        addNodeInternal(server, (UA_Node*)productname,
-                       &UA_EXPANDEDNODEID_NUMERIC(0, UA_NS0ID_SERVER_SERVERSTATUS_BUILDINFO), &nodeIdHasComponent);
+                       &UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_SERVERSTATUS_BUILDINFO), &nodeIdHasComponent);
        UA_Server_addReference(server, &UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_SERVERSTATUS_BUILDINFO_PRODUCTNAME),
                               &nodeIdHasTypeDefinition, &expandedNodeIdBaseDataVariabletype);
 
@@ -1095,7 +1104,7 @@ UA_Server * UA_Server_new(UA_ServerConfig config) {
        *((UA_String*)softwareversion->value.variant.value.data) = UA_STRING_ALLOC(SOFTWARE_VERSION);
        softwareversion->value.variant.value.type = &UA_TYPES[UA_TYPES_STRING];
        addNodeInternal(server, (UA_Node*)softwareversion,
-                       &UA_EXPANDEDNODEID_NUMERIC(0, UA_NS0ID_SERVER_SERVERSTATUS_BUILDINFO), &nodeIdHasComponent);
+                       &UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_SERVERSTATUS_BUILDINFO), &nodeIdHasComponent);
        UA_Server_addReference(server,
                               &UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_SERVERSTATUS_BUILDINFO_SOFTWAREVERSION),
                               &nodeIdHasTypeDefinition, &expandedNodeIdBaseDataVariabletype);
@@ -1107,7 +1116,7 @@ UA_Server * UA_Server_new(UA_ServerConfig config) {
        *((UA_String*)buildnumber->value.variant.value.data) = UA_STRING_ALLOC(BUILD_NUMBER);
        buildnumber->value.variant.value.type = &UA_TYPES[UA_TYPES_STRING];
        addNodeInternal(server, (UA_Node*)buildnumber,
-                       &UA_EXPANDEDNODEID_NUMERIC(0, UA_NS0ID_SERVER_SERVERSTATUS_BUILDINFO), &nodeIdHasComponent);
+                       &UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_SERVERSTATUS_BUILDINFO), &nodeIdHasComponent);
        UA_Server_addReference(server, &UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_SERVERSTATUS_BUILDINFO_BUILDNUMBER),
                               &nodeIdHasTypeDefinition, &expandedNodeIdBaseDataVariabletype);
 
@@ -1118,7 +1127,7 @@ UA_Server * UA_Server_new(UA_ServerConfig config) {
        builddate->value.variant.value.data = &server->buildDate;
        builddate->value.variant.value.type = &UA_TYPES[UA_TYPES_DATETIME];
        addNodeInternal(server, (UA_Node*)builddate,
-                       &UA_EXPANDEDNODEID_NUMERIC(0, UA_NS0ID_SERVER_SERVERSTATUS_BUILDINFO), &nodeIdHasComponent);
+                       &UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_SERVERSTATUS_BUILDINFO), &nodeIdHasComponent);
        UA_Server_addReference(server, &UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_SERVERSTATUS_BUILDINFO_BUILDNUMBER),
                               &nodeIdHasTypeDefinition, &expandedNodeIdBaseDataVariabletype);
 
@@ -1128,7 +1137,7 @@ UA_Server * UA_Server_new(UA_ServerConfig config) {
        secondstillshutdown->value.variant.value.data = UA_UInt32_new();
        secondstillshutdown->value.variant.value.type = &UA_TYPES[UA_TYPES_UINT32];
        addNodeInternal(server, (UA_Node*)secondstillshutdown,
-                       &UA_EXPANDEDNODEID_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_SECONDSTILLSHUTDOWN),
                               &nodeIdHasTypeDefinition, &expandedNodeIdBaseDataVariabletype);
 
@@ -1138,7 +1147,7 @@ UA_Server * UA_Server_new(UA_ServerConfig config) {
        shutdownreason->value.variant.value.data = UA_LocalizedText_new();
        shutdownreason->value.variant.value.type = &UA_TYPES[UA_TYPES_LOCALIZEDTEXT];
        addNodeInternal(server, (UA_Node*)shutdownreason,
-                       &UA_EXPANDEDNODEID_NUMERIC(0, UA_NS0ID_SERVER_SERVERSTATUS), &nodeIdHasComponent);
+                       &UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_SERVERSTATUS), &nodeIdHasComponent);
        UA_Server_addReference(server, &UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_SERVERSTATUS_SHUTDOWNREASON),
                               &nodeIdHasTypeDefinition, &expandedNodeIdBaseDataVariabletype);
 
@@ -1235,6 +1244,46 @@ UA_Server_setNodeAttribute_method(UA_Server *server, UA_NodeId methodNodeId, UA_
 }
 #endif
 
+UA_StatusCode UA_EXPORT
+UA_Server_setAttribute_value_callback(UA_Server *server, UA_NodeId nodeId, UA_ValueCallback callback) {
+    const UA_Node *orig;
+ retrySetValueCallback:
+    orig = UA_NodeStore_get(server->nodestore, &nodeId);
+    if(!orig)
+        return UA_STATUSCODE_BADNODEIDUNKNOWN;
+
+    if(orig->nodeClass != UA_NODECLASS_VARIABLE &&
+       orig->nodeClass != UA_NODECLASS_VARIABLETYPE) {
+        UA_NodeStore_release(orig);
+        return UA_STATUSCODE_BADNODECLASSINVALID;
+    }
+    
+#ifndef UA_MULTITHREADING
+    /* We cheat if multithreading is not enabled and treat the node as mutable. */
+    UA_VariableNode *editable = (UA_VariableNode*)(uintptr_t)orig;
+#else
+    UA_VariableNode *editable = (UA_VariableNode*)UA_Node_copyAnyNodeClass(orig);
+    if(!editable) {
+        UA_NodeStore_release(orig);
+        return UA_STATUSCODE_BADOUTOFMEMORY;
+    }
+#endif
+
+    editable->value.variant.callback = callback;
+  
+#ifdef UA_MULTITHREADING
+    UA_StatusCode retval = UA_NodeStore_replace(server->nodestore, orig, (UA_Node*)editable, UA_NULL);
+    if(retval != UA_STATUSCODE_GOOD) {
+        /* The node was replaced in the background */
+        UA_NodeStore_release(orig);
+        goto retrySetValueCallback;
+    }
+#endif
+    UA_NodeStore_release(orig);
+    return UA_STATUSCODE_GOOD;
+    
+}
+
 UA_StatusCode
 UA_Server_setNodeAttribute_value_dataSource(UA_Server *server, const UA_NodeId nodeId,
                                             UA_DataSource dataSource) {

+ 2 - 2
src/server/ua_services.h

@@ -110,8 +110,8 @@ void Service_CloseSession(UA_Server *server, UA_Session *session, const UA_Close
 void Service_AddNodes(UA_Server *server, UA_Session *session, const UA_AddNodesRequest *request,
                       UA_AddNodesResponse *response);
 void Service_AddNodes_single(UA_Server *server, UA_Session *session, UA_Node *node,
-                             const UA_ExpandedNodeId *parentNodeId,
-                             const UA_NodeId *referenceTypeId, UA_AddNodesResult *result);
+                             const UA_NodeId *parentNodeId, const UA_NodeId *referenceTypeId,
+                             UA_AddNodesResult *result);
 void Service_AddNodes_single_fromAttributes(UA_Server *server, UA_Session *session, UA_AddNodesItem *item,
                                             UA_NodeAttributes *attr, const UA_DataType *attributeType, UA_AddNodesResult *result);
 

+ 23 - 16
src/server/ua_services_nodemanagement.c

@@ -30,14 +30,14 @@
 /************/
 
 void Service_AddNodes_single(UA_Server *server, UA_Session *session, UA_Node *node,
-                             const UA_ExpandedNodeId *parentNodeId,
+                             const UA_NodeId *parentNodeId,
                              const UA_NodeId *referenceTypeId, UA_AddNodesResult *result) {
     if(node->nodeId.namespaceIndex >= server->namespacesSize) {
         result->statusCode = UA_STATUSCODE_BADNODEIDINVALID;
         return;
     }
 
-    const UA_Node *parent = UA_NodeStore_get(server->nodestore, &parentNodeId->nodeId);
+    const UA_Node *parent = UA_NodeStore_get(server->nodestore, parentNodeId);
     if(!parent) {
         result->statusCode = UA_STATUSCODE_BADPARENTNODEIDINVALID;
         return;
@@ -155,7 +155,8 @@ Service_AddNodes_single_fromVariableAttributes(UA_Server *server, UA_Session *se
     /*     UA_NodeId_init(&attr.dataType); */
     /* } */
 
-    Service_AddNodes_single(server, session, (UA_Node*)vnode, &item->parentNodeId, &item->referenceTypeId, result);
+    Service_AddNodes_single(server, session, (UA_Node*)vnode, &item->parentNodeId.nodeId,
+                            &item->referenceTypeId, result);
     if(result->statusCode != UA_STATUSCODE_GOOD)
         UA_VariableNode_delete(vnode);
 }
@@ -172,7 +173,8 @@ Service_AddNodes_single_fromObjectAttributes(UA_Server *server, UA_Session *sess
     moveStandardAttributes((UA_Node*)onode, item, (UA_NodeAttributes*)attr);
     onode->eventNotifier = attr->eventNotifier;
 
-    Service_AddNodes_single(server, session, (UA_Node*)onode, &item->parentNodeId, &item->referenceTypeId, result);
+    Service_AddNodes_single(server, session, (UA_Node*)onode, &item->parentNodeId.nodeId,
+                            &item->referenceTypeId, result);
     if(result->statusCode != UA_STATUSCODE_GOOD)
         UA_ObjectNode_delete(onode);
 }
@@ -192,7 +194,8 @@ Service_AddNodes_single_fromReferenceTypeAttributes(UA_Server *server, UA_Sessio
     rtnode->inverseName = attr->inverseName;
     UA_LocalizedText_init(&attr->inverseName);
 
-    Service_AddNodes_single(server, session, (UA_Node*)rtnode, &item->parentNodeId, &item->referenceTypeId, result);
+    Service_AddNodes_single(server, session, (UA_Node*)rtnode, &item->parentNodeId.nodeId,
+                            &item->referenceTypeId, result);
     if(result->statusCode != UA_STATUSCODE_GOOD)
         UA_ReferenceTypeNode_delete(rtnode);
 }
@@ -209,7 +212,8 @@ Service_AddNodes_single_fromObjectTypeAttributes(UA_Server *server, UA_Session *
     moveStandardAttributes((UA_Node*)otnode, item, (UA_NodeAttributes*)attr);
     otnode->isAbstract = attr->isAbstract;
 
-    Service_AddNodes_single(server, session, (UA_Node*)otnode, &item->parentNodeId, &item->referenceTypeId, result);
+    Service_AddNodes_single(server, session, (UA_Node*)otnode, &item->parentNodeId.nodeId,
+                            &item->referenceTypeId, result);
     if(result->statusCode != UA_STATUSCODE_GOOD)
         UA_ObjectTypeNode_delete(otnode);
 }
@@ -231,7 +235,8 @@ Service_AddNodes_single_fromVariableTypeAttributes(UA_Server *server, UA_Session
     // array dimensions are taken from the value
     vtnode->isAbstract = attr->isAbstract;
 
-    Service_AddNodes_single(server, session, (UA_Node*)vtnode, &item->parentNodeId, &item->referenceTypeId, result);
+    Service_AddNodes_single(server, session, (UA_Node*)vtnode, &item->parentNodeId.nodeId,
+                            &item->referenceTypeId, result);
     if(result->statusCode != UA_STATUSCODE_GOOD)
         UA_VariableTypeNode_delete(vtnode);
 }
@@ -249,7 +254,8 @@ Service_AddNodes_single_fromViewAttributes(UA_Server *server, UA_Session *sessio
     vnode->containsNoLoops = attr->containsNoLoops;
     vnode->eventNotifier = attr->eventNotifier;
 
-    Service_AddNodes_single(server, session, (UA_Node*)vnode, &item->parentNodeId, &item->referenceTypeId, result);
+    Service_AddNodes_single(server, session, (UA_Node*)vnode, &item->parentNodeId.nodeId,
+                            &item->referenceTypeId, result);
     if(result->statusCode != UA_STATUSCODE_GOOD)
         UA_ViewNode_delete(vnode);
 }
@@ -266,7 +272,8 @@ Service_AddNodes_single_fromDataTypeAttributes(UA_Server *server, UA_Session *se
     moveStandardAttributes((UA_Node*)dtnode, item, (UA_NodeAttributes*)attr);
     dtnode->isAbstract = attr->isAbstract;
 
-    Service_AddNodes_single(server, session, (UA_Node*)dtnode, &item->parentNodeId, &item->referenceTypeId, result);
+    Service_AddNodes_single(server, session, (UA_Node*)dtnode,
+                            &item->parentNodeId.nodeId, &item->referenceTypeId, result);
     if(result->statusCode != UA_STATUSCODE_GOOD)
         UA_DataTypeNode_delete(dtnode);
 }
@@ -404,9 +411,9 @@ void Service_AddNodes(UA_Server *server, UA_Session *session, const UA_AddNodesR
 /**************************************************/
 
 UA_AddNodesResult
-UA_Server_addDataSourceVariableNode(UA_Server *server, const UA_ExpandedNodeId requestedNewNodeId,
-                                    const UA_ExpandedNodeId parentNodeId, const UA_NodeId referenceTypeId,
-                                    const UA_QualifiedName browseName, const UA_ExpandedNodeId typeDefinition,
+UA_Server_addDataSourceVariableNode(UA_Server *server, const UA_NodeId requestedNewNodeId,
+                                    const UA_NodeId parentNodeId, const UA_NodeId referenceTypeId,
+                                    const UA_QualifiedName browseName, const UA_NodeId typeDefinition,
                                     const UA_VariableAttributes attr, const UA_DataSource dataSource) {
     UA_AddNodesResult result;
     UA_AddNodesResult_init(&result);
@@ -415,10 +422,10 @@ UA_Server_addDataSourceVariableNode(UA_Server *server, const UA_ExpandedNodeId r
     UA_AddNodesItem_init(&item);
     result.statusCode = UA_QualifiedName_copy(&browseName, &item.browseName);
     item.nodeClass = UA_NODECLASS_METHOD;
-    result.statusCode |= UA_ExpandedNodeId_copy(&parentNodeId, &item.parentNodeId);
+    result.statusCode |= UA_NodeId_copy(&parentNodeId, &item.parentNodeId.nodeId);
     result.statusCode |= UA_NodeId_copy(&referenceTypeId, &item.referenceTypeId);
-    result.statusCode |= UA_ExpandedNodeId_copy(&requestedNewNodeId, &item.requestedNewNodeId);
-    result.statusCode |= UA_ExpandedNodeId_copy(&typeDefinition, &item.typeDefinition);
+    result.statusCode |= UA_NodeId_copy(&requestedNewNodeId, &item.requestedNewNodeId.nodeId);
+    result.statusCode |= UA_NodeId_copy(&typeDefinition, &item.typeDefinition.nodeId);
     
     UA_VariableAttributes attrCopy;
     result.statusCode |= UA_VariableAttributes_copy(&attr, &attrCopy);
@@ -445,7 +452,7 @@ UA_Server_addDataSourceVariableNode(UA_Server *server, const UA_ExpandedNodeId r
     node->minimumSamplingInterval = attr.minimumSamplingInterval;
     node->valueRank = attr.valueRank;
 
-    Service_AddNodes_single(server, &adminSession, (UA_Node*)node, &item.parentNodeId,
+    Service_AddNodes_single(server, &adminSession, (UA_Node*)node, &item.parentNodeId.nodeId,
                             &item.referenceTypeId, &result);
     UA_AddNodesItem_deleteMembers(&item);
     UA_VariableAttributes_deleteMembers(&attrCopy);