Forráskód Böngészése

rename get/setNodeAttribute; use inline methods for type safety

Julius Pfrommer 9 éve
szülő
commit
a92572789d

+ 4 - 2
examples/CMakeLists.txt

@@ -36,8 +36,10 @@ add_custom_command(OUTPUT ${PROJECT_BINARY_DIR}/src_generated/nodeset.h ${PROJEC
                        ${PROJECT_SOURCE_DIR}/tools/pyUANamespace/NodeID_Blacklist_FullNS0.txt
                        ${PROJECT_SOURCE_DIR}/examples/server_nodeset.xml)
                
-add_executable(server_nodeset server_nodeset.c ${PROJECT_BINARY_DIR}/src_generated/nodeset.c)
-target_link_libraries(server_nodeset ${LIBS})
+if(ENABLE_GENERATE_NAMESPACE0)
+  add_executable(server_nodeset server_nodeset.c ${PROJECT_BINARY_DIR}/src_generated/nodeset.c)
+  target_link_libraries(server_nodeset ${LIBS})
+endif()
 
 if(ENABLE_METHODCALLS)
   add_executable(server_method server_method.c)

+ 9 - 19
examples/server.c

@@ -226,23 +226,18 @@ int main(int argc, char** argv) {
   const UA_QualifiedName dateName = UA_QUALIFIEDNAME(1, "current time");
   const UA_LocalizedText dateNameBrowseName = UA_LOCALIZEDTEXT("en_US","current time");
   UA_Server_addDataSourceVariableNode(server, UA_NODEID_NULL, dateName, dateNameBrowseName, dateNameBrowseName, 0, 0,
-
-                                  UA_NODEID_NUMERIC(0, UA_NS0ID_OBJECTSFOLDER),
-                                  UA_NODEID_NUMERIC(0, UA_NS0ID_ORGANIZES),
-
-                                  dateDataSource,
-
-                                  &nodeId_currentTime);
+                                  UA_NODEID_NUMERIC(0, UA_NS0ID_OBJECTSFOLDER), UA_NODEID_NUMERIC(0, UA_NS0ID_ORGANIZES),
+                                  dateDataSource, &nodeId_currentTime);
 
   // Get and reattach the datasource
   UA_DataSource *dataSourceCopy = NULL;
-  UA_Server_getAttribute_DataSource(server, nodeId_currentTime, &dataSourceCopy);
+  UA_Server_getNodeAttribute_valueDataSource(server, nodeId_currentTime, &dataSourceCopy);
   if (dataSourceCopy == NULL)
     UA_LOG_WARNING(logger, UA_LOGCATEGORY_USERLAND, "The returned dataSource is invalid");
   else if (dataSourceCopy->read != dateDataSource.read)
     UA_LOG_WARNING(logger, UA_LOGCATEGORY_USERLAND, "The returned dataSource is not the same as we set?");
   else
-    UA_Server_setAttribute_DataSource(server, nodeId_currentTime, dataSourceCopy);
+    UA_Server_setNodeAttribute_valueDataSource(server, nodeId_currentTime, dataSourceCopy);
   free(dataSourceCopy);
 #ifndef _WIN32
   //cpu temperature monitoring for linux machines
@@ -252,13 +247,8 @@ int main(int argc, char** argv) {
           const UA_QualifiedName tempName = UA_QUALIFIEDNAME(1, "cpu temperature");
           const UA_LocalizedText tempNameBrowseName = UA_LOCALIZEDTEXT("en_US","temperature");
           UA_Server_addDataSourceVariableNode(server, UA_NODEID_NULL, tempName, tempNameBrowseName, tempNameBrowseName, 0, 0,
-
-                                            UA_NODEID_NUMERIC(0, UA_NS0ID_OBJECTSFOLDER),
-                                            UA_NODEID_NUMERIC(0, UA_NS0ID_ORGANIZES),
-
-                                            temperatureDataSource,
-
-                                            NULL);
+                                            UA_NODEID_NUMERIC(0, UA_NS0ID_OBJECTSFOLDER), UA_NODEID_NUMERIC(0, UA_NS0ID_ORGANIZES),
+                                            temperatureDataSource, NULL);
   }
 
   //LED control for rpi
@@ -387,10 +377,10 @@ int main(int argc, char** argv) {
                           1, &inputArguments, 1, &outputArguments, &methodId);
   
   // Dettach the method from the methodNode
-  UA_Server_setAttribute_method(server, UA_NODEID_NUMERIC(1,62541), NULL, NULL);
+  UA_Server_setNodeAttribute_method(server, UA_NODEID_NUMERIC(1,62541), NULL, NULL);
   
   // Reaettach the method from the methodNode
-  UA_Server_setAttribute_method(server, UA_NODEID_NUMERIC(1,62541), &getMonitoredItems, (void *) server);
+  UA_Server_setNodeAttribute_method(server, UA_NODEID_NUMERIC(1,62541), &getMonitoredItems, (void *) server);
 #endif
    
   // Example for iterating over all nodes referenced by "Objects":
@@ -399,7 +389,7 @@ int main(int argc, char** argv) {
   
   // Some easy localization
   UA_LocalizedText objectsName = UA_LOCALIZEDTEXT("de_DE", "Objekte");
-  UA_Server_setAttribute_displayName(server, UA_NODEID_NUMERIC(0, UA_NS0ID_OBJECTSFOLDER), &objectsName);
+  UA_Server_setNodeAttribute_displayName(server, UA_NODEID_NUMERIC(0, UA_NS0ID_OBJECTSFOLDER), objectsName);
   
   //start server
   UA_StatusCode retval = UA_Server_run(server, 1, &running); //blocks until running=false

+ 92 - 115
include/ua_server.h

@@ -132,8 +132,7 @@ UA_StatusCode UA_EXPORT UA_Server_addReference(UA_Server *server, const UA_NodeI
  * @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);
+UA_StatusCode UA_EXPORT UA_Server_deleteNode(UA_Server *server, UA_NodeId nodeId);
 
 #define UA_SERVER_DELETENODEALIAS_DECL(TYPE) \
 UA_StatusCode UA_EXPORT UA_Server_delete##TYPE##Node(UA_Server *server, UA_NodeId nodeId);
@@ -195,97 +194,66 @@ UA_Server_getNodeCopy(UA_Server *server, UA_NodeId nodeId, void **copyInto);
  */
 UA_StatusCode UA_EXPORT
 UA_Server_addVariableNode(UA_Server *server, const UA_NodeId nodeId, const UA_QualifiedName browseName,
-                          const UA_LocalizedText displayName, const UA_LocalizedText description, const UA_UInt32 userWriteMask, const UA_UInt32 writeMask,
-
+                          const UA_LocalizedText displayName, const UA_LocalizedText description,
+						  const UA_UInt32 userWriteMask, const UA_UInt32 writeMask,
                           const UA_NodeId parentNodeId, const UA_NodeId referenceTypeId,
-
-                          UA_Variant *value,
-
-                          UA_NodeId *createdNodeId);
+                          UA_Variant *value, UA_NodeId *createdNodeId);
 
 // Missing: eventNotifier
 UA_StatusCode UA_EXPORT
 UA_Server_addObjectNode(UA_Server *server, const UA_NodeId nodeId, const UA_QualifiedName browseName,
-                        const UA_LocalizedText displayName, const UA_LocalizedText description, const UA_UInt32 userWriteMask, const UA_UInt32 writeMask,
-
+                        const UA_LocalizedText displayName, const UA_LocalizedText description,
+						const UA_UInt32 userWriteMask, const UA_UInt32 writeMask,
                         const UA_NodeId parentNodeId, const UA_NodeId referenceTypeId,
-
-                        const UA_ExpandedNodeId typeDefinition,
-
-                        UA_NodeId *createdNodeId);
+                        const UA_ExpandedNodeId typeDefinition, UA_NodeId *createdNodeId);
 
 // Missing: isAbstract, symmetric
 UA_StatusCode UA_EXPORT 
 UA_Server_addReferenceTypeNode(UA_Server *server, const UA_NodeId nodeId, const UA_QualifiedName browseName,
-                               const UA_LocalizedText displayName, const UA_LocalizedText description, const UA_UInt32 userWriteMask, const UA_UInt32 writeMask,
-
+                               const UA_LocalizedText displayName, const UA_LocalizedText description,
+							   const UA_UInt32 userWriteMask, const UA_UInt32 writeMask,
                                const UA_NodeId parentNodeId, const UA_NodeId referenceTypeId,
-
-                               const UA_ExpandedNodeId typeDefinition,
-                               const UA_LocalizedText inverseName,
-
+                               const UA_ExpandedNodeId typeDefinition, const UA_LocalizedText inverseName,
                                UA_NodeId *createdNodeId );
 
 UA_StatusCode UA_EXPORT
 UA_Server_addObjectTypeNode(UA_Server *server, const UA_NodeId nodeId, const UA_QualifiedName browseName,
-                            const UA_LocalizedText displayName, const UA_LocalizedText description,  const UA_UInt32 userWriteMask, const UA_UInt32 writeMask,
-
+                            const UA_LocalizedText displayName, const UA_LocalizedText description,
+							const UA_UInt32 userWriteMask, const UA_UInt32 writeMask,
                             const UA_NodeId parentNodeId, const UA_NodeId referenceTypeId,
-
-                            const UA_ExpandedNodeId typeDefinition,
-                            const UA_Boolean isAbstract,
-
+                            const UA_ExpandedNodeId typeDefinition, const UA_Boolean isAbstract,
                             UA_NodeId *createdNodeId );
 
 UA_StatusCode UA_EXPORT 
 UA_Server_addVariableTypeNode(UA_Server *server, const UA_NodeId nodeId, const UA_QualifiedName browseName,
-                              const UA_LocalizedText displayName, const UA_LocalizedText description, const UA_UInt32 userWriteMask, const UA_UInt32 writeMask,
-
-                              const UA_NodeId parentNodeId,
-                              const UA_NodeId referenceTypeId,
-
-                              UA_Variant *value,
-                              const UA_Int32 valueRank,
-                              const UA_Boolean isAbstract,
-
+                              const UA_LocalizedText displayName, const UA_LocalizedText description,
+							  const UA_UInt32 userWriteMask, const UA_UInt32 writeMask,
+                              const UA_NodeId parentNodeId, const UA_NodeId referenceTypeId,
+                              UA_Variant *value, const UA_Int32 valueRank, const UA_Boolean isAbstract,
                               UA_NodeId *createdNodeId);
 
 UA_StatusCode UA_EXPORT
 UA_Server_addDataTypeNode(UA_Server *server, const UA_NodeId nodeId, const UA_QualifiedName browseName,
-                          const UA_LocalizedText displayName, const UA_LocalizedText description, const UA_UInt32 userWriteMask, const UA_UInt32 writeMask,
-
-                          const UA_NodeId parentNodeId,
-                          const UA_NodeId referenceTypeId,
-
-                          const UA_ExpandedNodeId typeDefinition,
-                          const UA_Boolean isAbstract,
-
+                          const UA_LocalizedText displayName, const UA_LocalizedText description,
+						  const UA_UInt32 userWriteMask, const UA_UInt32 writeMask,
+                          const UA_NodeId parentNodeId, const UA_NodeId referenceTypeId,
+                          const UA_ExpandedNodeId typeDefinition, const UA_Boolean isAbstract,
                           UA_NodeId *createdNodeId);
 
 
 UA_StatusCode UA_EXPORT
 UA_Server_addViewNode(UA_Server *server, const UA_NodeId nodeId, const UA_QualifiedName browseName,
-                      const UA_LocalizedText displayName, const UA_LocalizedText description, const UA_UInt32 userWriteMask, const UA_UInt32 writeMask,
-
-                      const UA_NodeId parentNodeId,
-                      const UA_NodeId referenceTypeId,
-
-                      const UA_ExpandedNodeId typeDefinition,
-
-                      UA_NodeId *createdNodeId);
+                      const UA_LocalizedText displayName, const UA_LocalizedText description,
+					  const UA_UInt32 userWriteMask, const UA_UInt32 writeMask,
+                      const UA_NodeId parentNodeId, const UA_NodeId referenceTypeId,
+                      const UA_ExpandedNodeId typeDefinition, UA_NodeId *createdNodeId);
 
 UA_StatusCode UA_EXPORT
 UA_Server_addDataSourceVariableNode(UA_Server *server, const UA_NodeId nodeId, const UA_QualifiedName browseName,
-                                    const UA_LocalizedText displayName, const UA_LocalizedText description,  const UA_UInt32 userWriteMask, const UA_UInt32 writeMask,
-
-                                    const UA_NodeId parentNodeId,
-                                    const UA_NodeId referenceTypeId,
-
-                                    const UA_DataSource dataSource,
-
-                                    UA_NodeId *createdNodeId);
+                                    const UA_LocalizedText displayName, const UA_LocalizedText description,
+									const UA_UInt32 userWriteMask, const UA_UInt32 writeMask, const UA_NodeId parentNodeId,
+                                    const UA_NodeId referenceTypeId, const UA_DataSource dataSource, UA_NodeId *createdNodeId);
 
-/* --------------------- */
 UA_StatusCode UA_EXPORT
 UA_Server_addMonodirectionalReference(UA_Server *server, UA_NodeId sourceNodeId,
                                       UA_ExpandedNodeId targetNodeId, UA_NodeId referenceTypeId,
@@ -300,13 +268,16 @@ typedef UA_StatusCode (*UA_MethodCallback)(const UA_NodeId objectId, const UA_Va
  * 
  * @param browseName BrowseName to be used for the new method.
  * 
- * @param nodeId Requested NodeId for the new method. If a numeric ID with i=0 is used, the server will assign a random unused id.
+ * @param nodeId Requested NodeId for the new method. If a numeric ID with i=0 is used, the server
+ * will assign a random unused id.
  * 
- * @param parentNodeId Parent node containing this method. Note that an ObjectNode needs to reference the method with hasProperty in order for the method to be callable.
+ * @param parentNodeId Parent node containing this method. Note that an ObjectNode needs to
+ * reference the method with hasProperty in order for the method to be callable.
  * 
  * @param referenceTypeId Reference type ID to be used by the parent to reference the new method.
  * 
- * @param method Userspace Method/Function of type UA_MethodCallback to be called when a client invokes the method using the Call Service Set.
+ * @param method Userspace Method/Function of type UA_MethodCallback to be called when a client
+ * invokes the method using the Call Service Set.
  * 
  * @param inputArgumentsSize Number of input arguments expected to be passed by a calling client.
  * 
@@ -316,7 +287,8 @@ typedef UA_StatusCode (*UA_MethodCallback)(const UA_NodeId objectId, const UA_Va
  * 
  * @param outputArguments Description of output arguments expected to be passed by a calling client.
  * 
- * @param createdNodeId Actual nodeId of the new method node if UA_StatusCode indicates success. Can be used to determine the random unique ID assigned by the server if i=0 was passed as a nodeId.
+ * @param createdNodeId Actual nodeId of the new method node if UA_StatusCode indicates success. Can
+ * be used to determine the random unique ID assigned by the server if i=0 was passed as a nodeId.
  * 
  */
 UA_StatusCode UA_EXPORT
@@ -345,71 +317,76 @@ typedef UA_StatusCode (*UA_NodeIteratorCallback)(UA_NodeId childId, UA_Boolean i
  */
 UA_StatusCode UA_EXPORT UA_Server_forEachChildNodeCall(UA_Server *server, UA_NodeId parentNodeId, UA_NodeIteratorCallback callback, void *handle);
 
-UA_StatusCode UA_EXPORT UA_Server_setAttributeValue(UA_Server *server, UA_NodeId nodeId, UA_AttributeId attributeId, void *value);
-// Attribute specific macros for setAttribute_are defined in ua_server_addressspace.c
-#define UA_Server_setAttribute_nodeId(SERVER, NODEID, VALUE) UA_Server_setAttributeValue(SERVER, NODEID, UA_ATTRIBUTEID_NODEID, (UA_NodeId *) VALUE);
-#define UA_Server_setAttribute_nodeClass(SERVER, NODEID, VALUE) UA_Server_setAttributeValue(SERVER, NODEID, UA_ATTRIBUTEID_NODECLASS, (UA_NodeClass *) VALUE);
-#define UA_Server_setAttribute_browseName(SERVER, NODEID, VALUE) UA_Server_setAttributeValue(SERVER, NODEID, UA_ATTRIBUTEID_BROWSENAME, (UA_QualifiedName *) VALUE);
-#define UA_Server_setAttribute_displayName(SERVER, NODEID, VALUE) UA_Server_setAttributeValue(SERVER, NODEID, UA_ATTRIBUTEID_DISPLAYNAME, (UA_LocalizedText *) VALUE);
-#define UA_Server_setAttribute_description(SERVER, NODEID, VALUE) UA_Server_setAttributeValue(SERVER, NODEID, UA_ATTRIBUTEID_DESCRIPTION, (UA_LocalizedText *) VALUE);
-#define UA_Server_setAttribute_writeMask(SERVER, NODEID, VALUE) UA_Server_setAttributeValue(SERVER, NODEID, UA_ATTRIBUTEID_WRITEMASK, (UA_UInt32 *) VALUE);
-#define UA_Server_setAttribute_userWriteMask(SERVER, NODEID, VALUE) UA_Server_setAttributeValue(SERVER, NODEID, UA_ATTRIBUTEID_USERWRITEMASK, (UA_UInt32 *) VALUE);
-#define UA_Server_setAttribute_isAbstract(SERVER, NODEID, VALUE) UA_Server_setAttributeValue(SERVER, NODEID, UA_ATTRIBUTEID_ISABSTRACT, (UA_Boolean *) VALUE);
-#define UA_Server_setAttribute_symmetric(SERVER, NODEID, VALUE) UA_Server_setAttributeValue(SERVER, NODEID, UA_ATTRIBUTEID_SYMMETRIC, (UA_Boolean *) VALUE);
-#define UA_Server_setAttribute_inverseName(SERVER, NODEID, VALUE) UA_Server_setAttributeValue(SERVER, NODEID, UA_ATTRIBUTEID_INVERSENAME, (UA_LocalizedText *) VALUE);
-#define UA_Server_setAttribute_containsNoLoops(SERVER, NODEID, VALUE) UA_Server_setAttributeValue(SERVER, NODEID, UA_ATTRIBUTEID_CONTAINSNOLOOPS, (UA_Boolean *) VALUE);
-#define UA_Server_setAttribute_eventNotifier(SERVER, NODEID, VALUE) UA_Server_setAttributeValue(SERVER, NODEID, UA_ATTRIBUTEID_EVENTNOTIFIER, (UA_Byte *) VALUE);
-#define UA_Server_setAttribute_value(SERVER, NODEID, VALUE) UA_Server_setAttributeValue(SERVER, NODEID, UA_ATTRIBUTEID_VALUE, (UA_Variant *) VALUE);
-#define UA_Server_setAttribute_dataType(SERVER, NODEID, VALUE) UA_Server_setAttributeValue(SERVER, NODEID, UA_ATTRIBUTEID_DATATYPE, (UA_NodeId *) VALUE);
-#define UA_Server_setAttribute_valueRank(SERVER, NODEID, VALUE) UA_Server_setAttributeValue(SERVER, NODEID, UA_ATTRIBUTEID_VALUERANK, (UA_Int32 *) VALUE);
-#define UA_Server_setAttribute_arrayDimensions(SERVER, NODEID, VALUE) UA_Server_setAttributeValue(SERVER, NODEID, UA_ATTRIBUTEID_ARRAYDIMENSIONS, (UA_Int32 *) VALUE);
-#define UA_Server_setAttribute_accessLevel(SERVER, NODEID, VALUE) UA_Server_setAttributeValue(SERVER, NODEID, UA_ATTRIBUTEID_ACCESSLEVEL, (UA_UInt32 *) VALUE);
-#define UA_Server_setAttribute_userAccessLevel(SERVER, NODEID, VALUE) UA_Server_setAttributeValue(SERVER, NODEID, UA_ATTRIBUTEID_USERACCESSLEVEL, (UA_UInt32 *) VALUE);
-#define UA_Server_setAttribute_minimumSamplingInterval(SERVER, NODEID, VALUE) UA_Server_setAttributeValue(SERVER, NODEID, UA_ATTRIBUTEID_MINIMUMSAMPLINGINTERVAL, (UA_Double *) VALUE);
-#define UA_Server_setAttribute_historizing(SERVER, NODEID, VALUE) UA_Server_setAttributeValue(SERVER, NODEID, UA_ATTRIBUTEID_HISTORIZING, (UA_Boolean *) VALUE);
-#define UA_Server_setAttribute_executable(SERVER, NODEID, VALUE) UA_Server_setAttributeValue(SERVER, NODEID, UA_ATTRIBUTEID_EXECUTABLE, (UA_Boolean *) VALUE);
-#define UA_Server_setAttribute_userExecutable(SERVER, NODEID, VALUE) UA_Server_setAttributeValue(SERVER, NODEID, UA_ATTRIBUTEID_USEREXECUTABLE, (UA_Boolean *) VALUE);
+UA_StatusCode UA_EXPORT UA_Server_setNodeAttribute(UA_Server *server, const UA_NodeId nodeId, const UA_AttributeId attributeId, const void *value);
+
+#define UA_SERVER_SETATTRIBUTE_DECL(ATTRIBUTE, ATTRIBUTEID, TYPE) \
+  static inline UA_StatusCode UA_Server_setNodeAttribute_##ATTRIBUTE(UA_Server *server, const UA_NodeId nodeId, const TYPE value) { \
+	return UA_Server_setNodeAttribute(server, nodeId, ATTRIBUTEID, (const void *)&value); \
+  }
+
+UA_SERVER_SETATTRIBUTE_DECL(nodeId, UA_ATTRIBUTEID_NODEID, UA_NodeId)
+// UA_SERVER_SETATTRIBUTE_DECL(nodeClass, UA_ATTRIBUTEID_NODECLASS, UA_NodeClass) // not supported
+UA_SERVER_SETATTRIBUTE_DECL(browseName, UA_ATTRIBUTEID_BROWSENAME, UA_QualifiedName)
+UA_SERVER_SETATTRIBUTE_DECL(displayName, UA_ATTRIBUTEID_DISPLAYNAME, UA_LocalizedText)
+UA_SERVER_SETATTRIBUTE_DECL(description, UA_ATTRIBUTEID_DESCRIPTION, UA_LocalizedText)
+UA_SERVER_SETATTRIBUTE_DECL(writeMask, UA_ATTRIBUTEID_WRITEMASK, UA_UInt32)
+UA_SERVER_SETATTRIBUTE_DECL(userWriteMask, UA_ATTRIBUTEID_USERWRITEMASK, UA_UInt32)
+UA_SERVER_SETATTRIBUTE_DECL(isAbstract, UA_ATTRIBUTEID_ISABSTRACT, UA_Boolean)
+UA_SERVER_SETATTRIBUTE_DECL(symmetric, UA_ATTRIBUTEID_SYMMETRIC, UA_Boolean)
+UA_SERVER_SETATTRIBUTE_DECL(inverseName, UA_ATTRIBUTEID_INVERSENAME, UA_LocalizedText)
+UA_SERVER_SETATTRIBUTE_DECL(containsNoLoops, UA_ATTRIBUTEID_CONTAINSNOLOOPS, UA_Boolean)
+UA_SERVER_SETATTRIBUTE_DECL(eventNotifier, UA_ATTRIBUTEID_EVENTNOTIFIER, UA_Byte)
+UA_SERVER_SETATTRIBUTE_DECL(value, UA_ATTRIBUTEID_VALUE, UA_Variant)
+// UA_SERVER_SETATTRIBUTE_DECL(dataType, UA_ATTRIBUTEID_DATATYPE, UA_NodeId) // not supported. set via the value variant.
+// UA_SERVER_SETATTRIBUTE_DECL(valueRank, UA_ATTRIBUTEID_VALUERANK, UA_Int32) // not supported. set via the value variant.
+// UA_SERVER_SETATTRIBUTE_DECL(arrayDimensions, UA_ATTRIBUTEID_ARRAYDIMENSIONS, UA_Int32) // not supported. set via the value variant.
+UA_SERVER_SETATTRIBUTE_DECL(accessLevel, UA_ATTRIBUTEID_ACCESSLEVEL, UA_UInt32)
+UA_SERVER_SETATTRIBUTE_DECL(userAccessLevel, UA_ATTRIBUTEID_USERACCESSLEVEL, UA_UInt32)
+UA_SERVER_SETATTRIBUTE_DECL(minimumSamplingInterval, UA_ATTRIBUTEID_MINIMUMSAMPLINGINTERVAL, UA_Double)
+UA_SERVER_SETATTRIBUTE_DECL(historizing, UA_ATTRIBUTEID_HISTORIZING, UA_Boolean)
+UA_SERVER_SETATTRIBUTE_DECL(executable, UA_ATTRIBUTEID_EXECUTABLE, UA_Boolean)
+UA_SERVER_SETATTRIBUTE_DECL(userExecutable, UA_ATTRIBUTEID_USEREXECUTABLE, UA_Boolean)
 
 #ifdef ENABLE_METHODCALLS
 UA_StatusCode UA_EXPORT
-UA_Server_setAttribute_method(UA_Server *server, UA_NodeId methodNodeId, UA_MethodCallback method, void *handle);
+UA_Server_setNodeAttribute_method(UA_Server *server, UA_NodeId methodNodeId, UA_MethodCallback method, void *handle);
 #endif
 
 UA_StatusCode UA_EXPORT
-UA_Server_setAttribute_DataSource(UA_Server *server, UA_NodeId nodeId, UA_DataSource *value);
+UA_Server_setNodeAttribute_valueDataSource(UA_Server *server, UA_NodeId nodeId, UA_DataSource *value);
 
 UA_StatusCode UA_EXPORT
-UA_Server_getAttributeValue(UA_Server *server, UA_NodeId nodeId, UA_AttributeId attributeId, void **value);
-#define UA_Server_getAttribute_nodeId(SERVER, NODEID, VALUE) UA_Server_getAttributeValue(SERVER, NODEID, UA_ATTRIBUTEID_NODEID, (UA_NodeId **) VALUE);
-#define UA_Server_getAttribute_nodeClass(SERVER, NODEID, VALUE) UA_Server_getAttributeValue(SERVER, NODEID, UA_ATTRIBUTEID_NODECLASS, (UA_NodeClass **) VALUE);
-#define UA_Server_getAttribute_browseName(SERVER, NODEID, VALUE) UA_Server_getAttributeValue(SERVER, NODEID, UA_ATTRIBUTEID_BROWSENAME, (UA_QualifiedName **) VALUE);
-#define UA_Server_getAttribute_displayName(SERVER, NODEID, VALUE) UA_Server_getAttributeValue(SERVER, NODEID, UA_ATTRIBUTEID_DISPLAYNAME, (UA_LocalizedText **) VALUE);
-#define UA_Server_getAttribute_description(SERVER, NODEID, VALUE) UA_Server_getAttributeValue(SERVER, NODEID, UA_ATTRIBUTEID_DESCRIPTION, (UA_LocalizedText **) VALUE);
-#define UA_Server_getAttribute_writeMask(SERVER, NODEID, VALUE) UA_Server_getAttributeValue(SERVER, NODEID, UA_ATTRIBUTEID_WRITEMASK, (UA_UInt32 **) VALUE);
-#define UA_Server_getAttribute_userWriteMask(SERVER, NODEID, VALUE) UA_Server_getAttributeValue(SERVER, NODEID, UA_ATTRIBUTEID_USERWRITEMASK, (UA_UInt32 **) VALUE);
-#define UA_Server_getAttribute_isAbstract(SERVER, NODEID, VALUE) UA_Server_getAttributeValue(SERVER, NODEID, UA_ATTRIBUTEID_ISABSTRACT, (UA_Boolean **) VALUE);
-#define UA_Server_getAttribute_symmetric(SERVER, NODEID, VALUE) UA_Server_getAttributeValue(SERVER, NODEID, UA_ATTRIBUTEID_SYMMETRIC, (UA_Boolean **) VALUE);
-#define UA_Server_getAttribute_inverseName(SERVER, NODEID, VALUE) UA_Server_getAttributeValue(SERVER, NODEID, UA_ATTRIBUTEID_INVERSENAME, (UA_LocalizedText **) VALUE);
-#define UA_Server_getAttribute_containsNoLoops(SERVER, NODEID, VALUE) UA_Server_getAttributeValue(SERVER, NODEID, UA_ATTRIBUTEID_CONTAINSNOLOOPS, (UA_Boolean **) VALUE);
-#define UA_Server_getAttribute_eventNotifier(SERVER, NODEID, VALUE) UA_Server_getAttributeValue(SERVER, NODEID, UA_ATTRIBUTEID_EVENTNOTIFIER, (UA_Byte **) VALUE);
-#define UA_Server_getAttribute_value(SERVER, NODEID, VALUE) UA_Server_getAttributeValue(SERVER, NODEID, UA_ATTRIBUTEID_VALUE, (UA_Variant **) VALUE);
-#define UA_Server_getAttribute_dataType(SERVER, NODEID, VALUE) UA_Server_getAttributeValue(SERVER, NODEID, UA_ATTRIBUTEID_DATATYPE, (UA_NodeId **) VALUE);
-#define UA_Server_getAttribute_valueRank(SERVER, NODEID, VALUE) UA_Server_getAttributeValue(SERVER, NODEID, UA_ATTRIBUTEID_VALUERANK, (UA_Int32 **) VALUE);
-#define UA_Server_getAttribute_arrayDimensions(SERVER, NODEID, VALUE) UA_Server_getAttributeValue(SERVER, NODEID, UA_ATTRIBUTEID_ARRAYDIMENSIONS, (UA_Int32 **) VALUE);
-#define UA_Server_getAttribute_accessLevel(SERVER, NODEID, VALUE) UA_Server_getAttributeValue(SERVER, NODEID, UA_ATTRIBUTEID_ACCESSLEVEL, (UA_UInt32 **) VALUE);
-#define UA_Server_getAttribute_userAccessLevel(SERVER, NODEID, VALUE) UA_Server_getAttributeValue(SERVER, NODEID, UA_ATTRIBUTEID_USERACCESSLEVEL, (UA_UInt32 **) VALUE);
-#define UA_Server_getAttribute_minimumSamplingInterval(SERVER, NODEID, VALUE) UA_Server_getAttributeValue(SERVER, NODEID, UA_ATTRIBUTEID_MINIMUMSAMPLINGINTERVAL, (UA_Double **) VALUE);
-#define UA_Server_getAttribute_historizing(SERVER, NODEID, VALUE) UA_Server_getAttributeValue(SERVER, NODEID, UA_ATTRIBUTEID_HISTORIZING, (UA_Boolean **) VALUE);
-#define UA_Server_getAttribute_executable(SERVER, NODEID, VALUE) UA_Server_getAttributeValue(SERVER, NODEID, UA_ATTRIBUTEID_EXECUTABLE, (UA_Boolean **) VALUE);
-#define UA_Server_getAttribute_userExecutable(SERVER, NODEID, VALUE) UA_Server_getAttributeValue(SERVER, NODEID, UA_ATTRIBUTEID_USEREXECUTABLE, (UA_Boolean **) VALUE);
+UA_Server_getNodeAttribute(UA_Server *server, UA_NodeId nodeId, UA_AttributeId attributeId, void **value);
+#define UA_Server_getNodeAttribute_nodeId(SERVER, NODEID, VALUE) UA_Server_getAttribute(SERVER, NODEID, UA_ATTRIBUTEID_NODEID, (UA_NodeId **) VALUE);
+#define UA_Server_getNodeAttribute_nodeClass(SERVER, NODEID, VALUE) UA_Server_getAttribute(SERVER, NODEID, UA_ATTRIBUTEID_NODECLASS, (UA_NodeClass **) VALUE);
+#define UA_Server_getNodeAttribute_browseName(SERVER, NODEID, VALUE) UA_Server_getAttribute(SERVER, NODEID, UA_ATTRIBUTEID_BROWSENAME, (UA_QualifiedName **) VALUE);
+#define UA_Server_getNodeAttribute_displayName(SERVER, NODEID, VALUE) UA_Server_getAttribute(SERVER, NODEID, UA_ATTRIBUTEID_DISPLAYNAME, (UA_LocalizedText **) VALUE);
+#define UA_Server_getNodeAttribute_description(SERVER, NODEID, VALUE) UA_Server_getAttribute(SERVER, NODEID, UA_ATTRIBUTEID_DESCRIPTION, (UA_LocalizedText **) VALUE);
+#define UA_Server_getNodeAttribute_writeMask(SERVER, NODEID, VALUE) UA_Server_getNodeAttribute(SERVER, NODEID, UA_ATTRIBUTEID_WRITEMASK, (UA_UInt32 **) VALUE);
+#define UA_Server_getNodeAttribute_userWriteMask(SERVER, NODEID, VALUE) UA_Server_getNodeAttribute(SERVER, NODEID, UA_ATTRIBUTEID_USERWRITEMASK, (UA_UInt32 **) VALUE);
+#define UA_Server_getNodeAttribute_isAbstract(SERVER, NODEID, VALUE) UA_Server_getNodeAttribute(SERVER, NODEID, UA_ATTRIBUTEID_ISABSTRACT, (UA_Boolean **) VALUE);
+#define UA_Server_getNodeAttribute_symmetric(SERVER, NODEID, VALUE) UA_Server_getNodeAttribute(SERVER, NODEID, UA_ATTRIBUTEID_SYMMETRIC, (UA_Boolean **) VALUE);
+#define UA_Server_getNodeAttribute_inverseName(SERVER, NODEID, VALUE) UA_Server_getNodeAttribute(SERVER, NODEID, UA_ATTRIBUTEID_INVERSENAME, (UA_LocalizedText **) VALUE);
+#define UA_Server_getNodeAttribute_containsNoLoops(SERVER, NODEID, VALUE) UA_Server_getNodeAttribute(SERVER, NODEID, UA_ATTRIBUTEID_CONTAINSNOLOOPS, (UA_Boolean **) VALUE);
+#define UA_Server_getNodeAttribute_eventNotifier(SERVER, NODEID, VALUE) UA_Server_getNodeAttribute(SERVER, NODEID, UA_ATTRIBUTEID_EVENTNOTIFIER, (UA_Byte **) VALUE);
+#define UA_Server_getNodeAttribute_value(SERVER, NODEID, VALUE) UA_Server_getNodeAttribute(SERVER, NODEID, UA_ATTRIBUTEID_VALUE, (UA_Variant **) VALUE);
+#define UA_Server_getNodeAttribute_dataType(SERVER, NODEID, VALUE) UA_Server_getNodeAttribute(SERVER, NODEID, UA_ATTRIBUTEID_DATATYPE, (UA_NodeId **) VALUE);
+#define UA_Server_getNodeAttribute_valueRank(SERVER, NODEID, VALUE) UA_Server_getNodeAttribute(SERVER, NODEID, UA_ATTRIBUTEID_VALUERANK, (UA_Int32 **) VALUE);
+#define UA_Server_getNodeAttribute_arrayDimensions(SERVER, NODEID, VALUE) UA_Server_getNodeAttribute(SERVER, NODEID, UA_ATTRIBUTEID_ARRAYDIMENSIONS, (UA_Int32 **) VALUE);
+#define UA_Server_getNodeAttribute_accessLevel(SERVER, NODEID, VALUE) UA_Server_getNodeAttribute(SERVER, NODEID, UA_ATTRIBUTEID_ACCESSLEVEL, (UA_UInt32 **) VALUE);
+#define UA_Server_getNodeAttribute_userAccessLevel(SERVER, NODEID, VALUE) UA_Server_getNodeAttribute(SERVER, NODEID, UA_ATTRIBUTEID_USERACCESSLEVEL, (UA_UInt32 **) VALUE);
+#define UA_Server_getNodeAttribute_minimumSamplingInterval(SERVER, NODEID, VALUE) UA_Server_getNodeAttribute(SERVER, NODEID, UA_ATTRIBUTEID_MINIMUMSAMPLINGINTERVAL, (UA_Double **) VALUE);
+#define UA_Server_getNodeAttribute_historizing(SERVER, NODEID, VALUE) UA_Server_getNodeAttribute(SERVER, NODEID, UA_ATTRIBUTEID_HISTORIZING, (UA_Boolean **) VALUE);
+#define UA_Server_getNodeAttribute_executable(SERVER, NODEID, VALUE) UA_Server_getNodeAttribute(SERVER, NODEID, UA_ATTRIBUTEID_EXECUTABLE, (UA_Boolean **) VALUE);
+#define UA_Server_getNodeAttribute_userExecutable(SERVER, NODEID, VALUE) UA_Server_getNodeAttribute(SERVER, NODEID, UA_ATTRIBUTEID_USEREXECUTABLE, (UA_Boolean **) VALUE);
 
 #ifdef ENABLE_METHODCALLS
 UA_StatusCode UA_EXPORT
-UA_Server_getAttribute_method(UA_Server *server, UA_NodeId methodNodeId, UA_MethodCallback *method);
+UA_Server_getNodeAttribute_method(UA_Server *server, UA_NodeId methodNodeId, UA_MethodCallback *method);
 #endif
 
 UA_StatusCode UA_EXPORT
-UA_Server_getAttribute_DataSource(UA_Server *server, UA_NodeId nodeId, UA_DataSource **value);
+UA_Server_getNodeAttribute_valueDataSource(UA_Server *server, UA_NodeId nodeId, UA_DataSource **value);
 
 /** Jobs describe work that is executed once or repeatedly. */
 typedef struct {

+ 24 - 50
src/server/ua_server_addressspace.c

@@ -910,7 +910,7 @@ if ((anyTypeNode.node->nodeClass & ( CLASS )) == 0) {                     \
   }                                                               \
 }\
     
-UA_StatusCode UA_Server_setAttributeValue(UA_Server *server, UA_NodeId nodeId, UA_AttributeId attributeId, void *value) {
+UA_StatusCode UA_Server_setNodeAttribute(UA_Server *server, const UA_NodeId nodeId, const UA_AttributeId attributeId, const void *value) {
   UA_StatusCode retval = UA_STATUSCODE_GOOD;
   
   if (!value)
@@ -931,11 +931,6 @@ UA_StatusCode UA_Server_setAttributeValue(UA_Server *server, UA_NodeId nodeId, U
   if (retval)
     return retval;
   
-  UA_UInt32  *nInt;
-  UA_Boolean *nBool;
-  UA_Byte    *nByte;
-  UA_Variant *nVariant;
-  UA_Double  *nDouble;
   switch(attributeId) {
     case UA_ATTRIBUTEID_NODEID:
       UA_Server_deleteNodeCopy(server, (void **) &anyTypeNode.node);
@@ -947,39 +942,30 @@ UA_StatusCode UA_Server_setAttributeValue(UA_Server *server, UA_NodeId nodeId, U
       break;
     case UA_ATTRIBUTEID_BROWSENAME:
       UA_QualifiedName_deleteMembers(&anyTypeNode.node->browseName);
-      UA_QualifiedName_copy((UA_QualifiedName *) value, &anyTypeNode.node->browseName);
+      UA_QualifiedName_copy((const UA_QualifiedName *) value, &anyTypeNode.node->browseName);
       break;
     case UA_ATTRIBUTEID_DISPLAYNAME:
       UA_LocalizedText_deleteMembers(&anyTypeNode.node->displayName);
-      UA_LocalizedText_copy((UA_LocalizedText *) value, &anyTypeNode.node->displayName);
+      UA_LocalizedText_copy((const UA_LocalizedText *) value, &anyTypeNode.node->displayName);
       break;
     case UA_ATTRIBUTEID_DESCRIPTION:
       UA_LocalizedText_deleteMembers(&anyTypeNode.node->description);
-      UA_LocalizedText_copy((UA_LocalizedText *) value, &anyTypeNode.node->description);
+      UA_LocalizedText_copy((const UA_LocalizedText *) value, &anyTypeNode.node->description);
       break;
     case UA_ATTRIBUTEID_WRITEMASK:
-      nInt = (UA_UInt32*) value;
-      anyTypeNode.node->writeMask = *nInt;
+      anyTypeNode.node->writeMask = *(const UA_UInt32*) value;
       break;
     case UA_ATTRIBUTEID_USERWRITEMASK:
-      nInt = (UA_UInt32*) value;
-      anyTypeNode.node->userWriteMask = *nInt;
+      anyTypeNode.node->userWriteMask = *(const UA_UInt32*) value;
       break;    
     case UA_ATTRIBUTEID_ISABSTRACT:
       SETATTRIBUTE_ASSERTNODECLASS(UA_NODECLASS_OBJECTTYPE | UA_NODECLASS_REFERENCETYPE | UA_NODECLASS_VARIABLETYPE | UA_NODECLASS_DATATYPE)
-      nBool = (UA_Boolean *) value;
       switch(anyTypeNode.node->nodeClass) {
         case UA_NODECLASS_OBJECTTYPE:
-          anyTypeNode.otObj->isAbstract = *nBool;
-          break;
         case UA_NODECLASS_REFERENCETYPE:
-          anyTypeNode.rtObj->isAbstract = *nBool;
-          break;
         case UA_NODECLASS_VARIABLETYPE:
-          anyTypeNode.vtObj->isAbstract = *nBool;
-          break;
         case UA_NODECLASS_DATATYPE:
-          anyTypeNode.dtObj->isAbstract = *nBool;
+          anyTypeNode.otObj->isAbstract = *(const UA_Boolean *) value;
           break;
         default:
           UA_Server_deleteNodeCopy(server, (void **) &anyTypeNode.node);
@@ -989,28 +975,23 @@ UA_StatusCode UA_Server_setAttributeValue(UA_Server *server, UA_NodeId nodeId, U
       break;
     case UA_ATTRIBUTEID_SYMMETRIC:
       SETATTRIBUTE_ASSERTNODECLASS(UA_NODECLASS_REFERENCETYPE)
-      nBool = (UA_Boolean *) value;
-      anyTypeNode.rtObj->symmetric = *nBool;
+      anyTypeNode.rtObj->symmetric = *(const UA_Boolean *) value;
       break;
     case UA_ATTRIBUTEID_INVERSENAME:
       SETATTRIBUTE_ASSERTNODECLASS(UA_NODECLASS_REFERENCETYPE)
       UA_LocalizedText_deleteMembers(&anyTypeNode.rtObj->inverseName);
-      UA_LocalizedText_copy((UA_LocalizedText *) value, &anyTypeNode.rtObj->inverseName);
+      UA_LocalizedText_copy((const UA_LocalizedText *) value, &anyTypeNode.rtObj->inverseName);
       break;
     case UA_ATTRIBUTEID_CONTAINSNOLOOPS:
       SETATTRIBUTE_ASSERTNODECLASS(UA_NODECLASS_VIEW)
-      nBool = (UA_Boolean *) value;
-      anyTypeNode.vwObj->containsNoLoops = *nBool;
+      anyTypeNode.vwObj->containsNoLoops = *(const UA_Boolean *) value;
       break;
     case UA_ATTRIBUTEID_EVENTNOTIFIER:
       SETATTRIBUTE_ASSERTNODECLASS(UA_NODECLASS_VIEW | UA_NODECLASS_OBJECT)
-      nByte = (UA_Byte *) value;
       switch(anyTypeNode.node->nodeClass) {
         case UA_NODECLASS_VIEW:
-          anyTypeNode.vwObj->eventNotifier = *nByte;
-          break;
         case UA_NODECLASS_OBJECT:
-          anyTypeNode.oObj->eventNotifier = *nByte;
+          anyTypeNode.vwObj->eventNotifier = *(const UA_Byte *) value;
           break;
         default:
           UA_Server_deleteNodeCopy(server, (void **) &anyTypeNode.node);
@@ -1024,9 +1005,8 @@ UA_StatusCode UA_Server_setAttributeValue(UA_Server *server, UA_NodeId nodeId, U
         UA_Server_deleteNodeCopy(server, (void **) &anyTypeNode.node);
         return UA_STATUSCODE_BADATTRIBUTEIDINVALID;
       }
-      nVariant = value;
       UA_Variant_deleteMembers(&anyTypeNode.vObj->value.variant);
-      UA_Variant_copy(nVariant, &anyTypeNode.vObj->value.variant);
+      UA_Variant_copy((const UA_Variant*)value, &anyTypeNode.vObj->value.variant);
       break;
     case UA_ATTRIBUTEID_DATATYPE:
       UA_Server_deleteNodeCopy(server, (void **) &anyTypeNode.node);
@@ -1042,33 +1022,27 @@ UA_StatusCode UA_Server_setAttributeValue(UA_Server *server, UA_NodeId nodeId, U
       break;
     case UA_ATTRIBUTEID_ACCESSLEVEL:
       SETATTRIBUTE_ASSERTNODECLASS(UA_NODECLASS_VARIABLE)
-      nByte = (UA_Byte*) value;
-      anyTypeNode.vObj->accessLevel = *nByte;
+      anyTypeNode.vObj->accessLevel = *(const UA_Byte*) value;
       break;
     case UA_ATTRIBUTEID_USERACCESSLEVEL:
       SETATTRIBUTE_ASSERTNODECLASS(UA_NODECLASS_VARIABLE)
-      nByte = (UA_Byte*) value;
-      anyTypeNode.vObj->userAccessLevel = *nByte;
+      anyTypeNode.vObj->userAccessLevel = *(const UA_Byte*) value;
       break;
     case UA_ATTRIBUTEID_MINIMUMSAMPLINGINTERVAL:
       SETATTRIBUTE_ASSERTNODECLASS(UA_NODECLASS_VARIABLE)
-      nDouble = (UA_Double *) value;
-      anyTypeNode.vObj->minimumSamplingInterval = *nDouble;
+      anyTypeNode.vObj->minimumSamplingInterval = *(const UA_Double *) value;
       break;
     case UA_ATTRIBUTEID_HISTORIZING:
       SETATTRIBUTE_ASSERTNODECLASS(UA_NODECLASS_VARIABLE)
-      nBool = (UA_Boolean *) value;
-      anyTypeNode.vObj->historizing= *nBool;
+      anyTypeNode.vObj->historizing = *(const UA_Boolean *) value;
       break;
     case UA_ATTRIBUTEID_EXECUTABLE:
       SETATTRIBUTE_ASSERTNODECLASS(UA_NODECLASS_METHOD)
-      nBool = (UA_Boolean *) value;
-      anyTypeNode.mObj->executable= *nBool;
+      anyTypeNode.mObj->executable = *(const UA_Boolean *) value;
       break;
     case UA_ATTRIBUTEID_USEREXECUTABLE:
       SETATTRIBUTE_ASSERTNODECLASS(UA_NODECLASS_METHOD)
-      nBool = (UA_Boolean *) value;
-      anyTypeNode.mObj->userExecutable= *nBool;
+      anyTypeNode.mObj->userExecutable = *(const UA_Boolean *) value;
       break;
     default:
       UA_Server_deleteNodeCopy(server, (void **) &anyTypeNode.node);
@@ -1089,7 +1063,7 @@ UA_StatusCode UA_Server_setAttributeValue(UA_Server *server, UA_NodeId nodeId, U
 #ifdef ENABLE_METHODCALLS
 /* Allow userspace to attach a method to one defined via XML or to switch an attached method for another */
 UA_StatusCode
-UA_Server_setAttribute_method(UA_Server *server, UA_NodeId methodNodeId, UA_MethodCallback method, void *handle) {
+UA_Server_setNodeAttribute_method(UA_Server *server, UA_NodeId methodNodeId, UA_MethodCallback method, void *handle) {
   UA_StatusCode retval = UA_STATUSCODE_GOOD;
   const UA_Node *attachToMethod = UA_NULL;
   UA_MethodNode *replacementMethod = UA_NULL;
@@ -1123,7 +1097,7 @@ UA_Server_setAttribute_method(UA_Server *server, UA_NodeId methodNodeId, UA_Meth
 #endif
 
 UA_StatusCode
-UA_Server_setAttribute_DataSource(UA_Server *server, UA_NodeId nodeId, UA_DataSource *value) {
+UA_Server_setNodeAttribute_valueDataSource(UA_Server *server, UA_NodeId nodeId, UA_DataSource *value) {
   union {
     UA_Node *anyNode;
     UA_VariableNode *varNode;
@@ -1171,7 +1145,7 @@ UA_Server_setAttribute_DataSource(UA_Server *server, UA_NodeId nodeId, UA_DataSo
   *value = (void *) UA_##TYPE##_new();               \
   UA_##TYPE##_copy( SRC, (UA_##TYPE *) *value  );    \
   
-UA_StatusCode UA_Server_getAttributeValue(UA_Server *server, UA_NodeId nodeId, UA_AttributeId attributeId, void **value) {
+UA_StatusCode UA_Server_getNodeAttribute(UA_Server *server, UA_NodeId nodeId, UA_AttributeId attributeId, void **value) {
   union {
     UA_Node *node;
     UA_ObjectNode *oObj;
@@ -1335,7 +1309,7 @@ UA_StatusCode UA_Server_getAttributeValue(UA_Server *server, UA_NodeId nodeId, U
 }
 
 #ifdef ENABLE_METHODCALLS
-UA_StatusCode UA_Server_getAttribute_method(UA_Server *server, UA_NodeId methodNodeId, UA_MethodCallback *method) {
+UA_StatusCode UA_Server_getNodeAttribute_method(UA_Server *server, UA_NodeId methodNodeId, UA_MethodCallback *method) {
   union {
     UA_Node *anyNode;
     UA_MethodNode *mNode;
@@ -1362,7 +1336,7 @@ UA_StatusCode UA_Server_getAttribute_method(UA_Server *server, UA_NodeId methodN
 #endif
 
 UA_StatusCode
-UA_Server_getAttribute_DataSource(UA_Server *server, UA_NodeId nodeId, UA_DataSource **value) {
+UA_Server_getNodeAttribute_valueDataSource(UA_Server *server, UA_NodeId nodeId, UA_DataSource **value) {
   union {
     UA_Node *anyNode;
     UA_VariableNode *varNode;
@@ -1530,7 +1504,7 @@ void UA_Server_addInstanceOf_instatiateChildNode(UA_Server *server,
     
     // What type of node is this?
     refClass = UA_NULL;
-    UA_Server_getAttributeValue(server, ref.targetId.nodeId, UA_ATTRIBUTEID_NODECLASS, (void **) &refClass);
+    UA_Server_getNodeAttribute(server, ref.targetId.nodeId, UA_ATTRIBUTEID_NODECLASS, (void **) &refClass);
     switch (*refClass) {
       case UA_NODECLASS_VARIABLE: // Just clone the variable node with a new nodeId
         UA_Server_getNodeCopy(server, ref.targetId.nodeId, (void **) &nodeClone);

+ 1 - 1
src/server/ua_services_attribute.c

@@ -432,7 +432,7 @@ expectType = UA_NODEID_NUMERIC(0, UA_NS0ID_##EXP_DT);
 if (! UA_NodeId_equal(&expectType, &wvalue->value.value.type->typeId))                                                  \
   retval |= UA_STATUSCODE_BADTYPEMISMATCH;                                                                              \
 else                                                                                                                    \
-  retval = UA_Server_setAttributeValue(server, wvalue->nodeId, wvalue->attributeId, (void *) wvalue->value.value.data); \
+  retval = UA_Server_setNodeAttribute(server, wvalue->nodeId, wvalue->attributeId, (void *) wvalue->value.value.data); \
 
 #ifndef BUILD_UNIT_TESTS
 static