Bladeren bron

added request header as parameter to nodestore operations signature

FlorianPalm 10 jaren geleden
bovenliggende
commit
5171177c45

+ 1 - 2
CMakeLists.txt

@@ -170,8 +170,7 @@ endif()
 option(EXAMPLESERVER "Build a test server" OFF)
 if(EXAMPLESERVER)
 set(server_sources examples/opcuaServer.c
-                   examples/logger_stdout.c
- 		   examples/nodestoreAccessExample.c)
+                   examples/logger_stdout.c)
 if(NOT ENABLE_MULTITHREADING)
     list(APPEND server_sources examples/networklayer_tcp.c)
 else()

+ 0 - 27
Makefile

@@ -188,30 +188,6 @@ examples/networklayer_tcp.c.s:
 	$(MAKE) -f CMakeFiles/exampleServer.dir/build.make CMakeFiles/exampleServer.dir/examples/networklayer_tcp.c.s
 .PHONY : examples/networklayer_tcp.c.s
 
-examples/nodestoreAccessExample.o: examples/nodestoreAccessExample.c.o
-.PHONY : examples/nodestoreAccessExample.o
-
-# target to build an object file
-examples/nodestoreAccessExample.c.o:
-	$(MAKE) -f CMakeFiles/exampleServer.dir/build.make CMakeFiles/exampleServer.dir/examples/nodestoreAccessExample.c.o
-.PHONY : examples/nodestoreAccessExample.c.o
-
-examples/nodestoreAccessExample.i: examples/nodestoreAccessExample.c.i
-.PHONY : examples/nodestoreAccessExample.i
-
-# target to preprocess a source file
-examples/nodestoreAccessExample.c.i:
-	$(MAKE) -f CMakeFiles/exampleServer.dir/build.make CMakeFiles/exampleServer.dir/examples/nodestoreAccessExample.c.i
-.PHONY : examples/nodestoreAccessExample.c.i
-
-examples/nodestoreAccessExample.s: examples/nodestoreAccessExample.c.s
-.PHONY : examples/nodestoreAccessExample.s
-
-# target to generate assembly for a file
-examples/nodestoreAccessExample.c.s:
-	$(MAKE) -f CMakeFiles/exampleServer.dir/build.make CMakeFiles/exampleServer.dir/examples/nodestoreAccessExample.c.s
-.PHONY : examples/nodestoreAccessExample.c.s
-
 examples/opcuaServer.o: examples/opcuaServer.c.o
 .PHONY : examples/opcuaServer.o
 
@@ -901,9 +877,6 @@ help:
 	@echo "... examples/networklayer_tcp.o"
 	@echo "... examples/networklayer_tcp.i"
 	@echo "... examples/networklayer_tcp.s"
-	@echo "... examples/nodestoreAccessExample.o"
-	@echo "... examples/nodestoreAccessExample.i"
-	@echo "... examples/nodestoreAccessExample.s"
 	@echo "... examples/opcuaServer.o"
 	@echo "... examples/opcuaServer.i"
 	@echo "... examples/opcuaServer.s"

+ 0 - 392
examples/nodestoreAccessExample.c

@@ -1,392 +0,0 @@
-/*
- * nodestoreAccessExample.c
- *
- *  Created on: Oct 16, 2014
- *      Author: opcua
- */
-
-#include "nodestoreAccessExample.h"
-
-
-
-
-
-
-
-enum UA_AttributeId {
-    UA_ATTRIBUTEID_NODEID                  = 1,
-    UA_ATTRIBUTEID_NODECLASS               = 2,
-    UA_ATTRIBUTEID_BROWSENAME              = 3,
-    UA_ATTRIBUTEID_DISPLAYNAME             = 4,
-    UA_ATTRIBUTEID_DESCRIPTION             = 5,
-    UA_ATTRIBUTEID_WRITEMASK               = 6,
-    UA_ATTRIBUTEID_USERWRITEMASK           = 7,
-    UA_ATTRIBUTEID_ISABSTRACT              = 8,
-    UA_ATTRIBUTEID_SYMMETRIC               = 9,
-    UA_ATTRIBUTEID_INVERSENAME             = 10,
-    UA_ATTRIBUTEID_CONTAINSNOLOOPS         = 11,
-    UA_ATTRIBUTEID_EVENTNOTIFIER           = 12,
-    UA_ATTRIBUTEID_VALUE                   = 13,
-    UA_ATTRIBUTEID_DATATYPE                = 14,
-    UA_ATTRIBUTEID_VALUERANK               = 15,
-    UA_ATTRIBUTEID_ARRAYDIMENSIONS         = 16,
-    UA_ATTRIBUTEID_ACCESSLEVEL             = 17,
-    UA_ATTRIBUTEID_USERACCESSLEVEL         = 18,
-    UA_ATTRIBUTEID_MINIMUMSAMPLINGINTERVAL = 19,
-    UA_ATTRIBUTEID_HISTORIZING             = 20,
-    UA_ATTRIBUTEID_EXECUTABLE              = 21,
-    UA_ATTRIBUTEID_USEREXECUTABLE          = 22
-};
-
-static UA_VariableNode *myNode;
-UA_Int32 initMyNode()
-{
-
-    UA_ExpandedNodeId ObjId_NamespaceArray; NS0EXPANDEDNODEID(ObjId_NamespaceArray, 2255);
-
-
-    UA_VariableNode_new(&myNode);
-    myNode->nodeId    = ObjId_NamespaceArray.nodeId;
-    myNode->nodeClass = UA_NODECLASS_VARIABLE; //FIXME: this should go into _new?
-    UA_QualifiedName_copycstring("myNode", &myNode->browseName);
-    UA_LocalizedText_copycstring("myNode", &myNode->displayName);
-    UA_LocalizedText_copycstring("myNode", &myNode->description);
-    UA_Array_new((void **)&myNode->value.storage.data.dataPtr, 2, &UA_[UA_STRING]);
-    myNode->value.vt = &UA_[UA_STRING];
-    myNode->value.storage.data.arrayLength = 2;
-    UA_String_copycstring("http://opcfoundation.org/UA/", &((UA_String *)(myNode->value.storage.data.dataPtr))[0]);
-    UA_String_copycstring("http://localhost:16664/open62541/", &((UA_String *)(myNode->value.storage.data.dataPtr))[1]);
-    myNode->arrayDimensionsSize = 1;
-    UA_UInt32 *dimensions = UA_NULL;
-
-    dimensions = malloc(sizeof(UA_UInt32));
-    *dimensions = 2;
-    myNode->arrayDimensions = dimensions;
-    myNode->dataType = NS0NODEID(UA_STRING_NS0);
-    myNode->valueRank       = 1;
-    myNode->minimumSamplingInterval = 1.0;
-    myNode->historizing     = UA_FALSE;
-    return 0;
-
-}
-
-
-#define CHECK_NODECLASS(CLASS)                                 \
-    if(!(myNode->nodeClass & (CLASS))) {                         \
-        v[readValueIdIndices[i]].encodingMask = UA_DATAVALUE_ENCODINGMASK_STATUSCODE; \
-        v[readValueIdIndices[i]].status       = UA_STATUSCODE_BADNOTREADABLE;         \
-        break;                                                 \
-    }                                                          \
-
-
-UA_Int32 readNodes(UA_ReadValueId * readValueIds, UA_UInt32 *readValueIdIndices, UA_UInt32 readValueIdsSize, UA_DataValue *v, UA_Boolean timeStampToReturn, UA_DiagnosticInfo *diagnosticInfo)
-{
-	UA_ReadValueId *id;
-	UA_Int32 retval = UA_STATUSCODE_GOOD;;
-	for(UA_UInt32 i = 0; i<readValueIdsSize; i++){
-		id = &readValueIds[readValueIdIndices[i]];
-
-
-
-		UA_DataValue_init(&v[readValueIdIndices[i]]);
-
-
-		/*Access Node here */
-
-		/*  */
-		switch(id->attributeId) {
-		case UA_ATTRIBUTEID_NODEID:
-			v[readValueIdIndices[i]].encodingMask = UA_DATAVALUE_ENCODINGMASK_VARIANT;
-			retval |= UA_Variant_copySetValue(&v[readValueIdIndices[i]].value, &UA_[UA_NODEID], &myNode->nodeId);
-			break;
-
-		case UA_ATTRIBUTEID_NODECLASS:
-			v[readValueIdIndices[i]].encodingMask = UA_DATAVALUE_ENCODINGMASK_VARIANT;
-			retval |= UA_Variant_copySetValue(&v[readValueIdIndices[i]].value, &UA_[UA_INT32], &myNode->nodeClass);
-			break;
-
-		case UA_ATTRIBUTEID_BROWSENAME:
-			v[readValueIdIndices[i]].encodingMask = UA_DATAVALUE_ENCODINGMASK_VARIANT;
-			retval |= UA_Variant_copySetValue(&v[readValueIdIndices[i]].value, &UA_[UA_QUALIFIEDNAME], &myNode->browseName);
-			break;
-
-		case UA_ATTRIBUTEID_DISPLAYNAME:
-			v[readValueIdIndices[i]].encodingMask = UA_DATAVALUE_ENCODINGMASK_VARIANT;
-			retval |= UA_Variant_copySetValue(&v[readValueIdIndices[i]].value, &UA_[UA_LOCALIZEDTEXT],
-											  &myNode->displayName);
-			break;
-
-		case UA_ATTRIBUTEID_DESCRIPTION:
-			v[readValueIdIndices[i]].encodingMask = UA_DATAVALUE_ENCODINGMASK_VARIANT;
-			retval |= UA_Variant_copySetValue(&v[readValueIdIndices[i]].value, &UA_[UA_LOCALIZEDTEXT],
-											  &myNode->description);
-			break;
-
-		case UA_ATTRIBUTEID_WRITEMASK:
-			v[readValueIdIndices[i]].encodingMask = UA_DATAVALUE_ENCODINGMASK_VARIANT;
-			retval |= UA_Variant_copySetValue(&v[readValueIdIndices[i]].value, &UA_[UA_UINT32], &myNode->writeMask);
-			break;
-
-		case UA_ATTRIBUTEID_USERWRITEMASK:
-			v[readValueIdIndices[i]].encodingMask = UA_DATAVALUE_ENCODINGMASK_VARIANT;
-			retval |= UA_Variant_copySetValue(&v[readValueIdIndices[i]].value, &UA_[UA_UINT32], &myNode->userWriteMask);
-			break;
-
-		case UA_ATTRIBUTEID_ISABSTRACT:
-			CHECK_NODECLASS(
-				UA_NODECLASS_REFERENCETYPE | UA_NODECLASS_OBJECTTYPE | UA_NODECLASS_VARIABLETYPE |
-				UA_NODECLASS_DATATYPE);
-			v[readValueIdIndices[i]].encodingMask = UA_DATAVALUE_ENCODINGMASK_VARIANT;
-			retval |=
-				UA_Variant_copySetValue(&v[readValueIdIndices[i]].value, &UA_[UA_BOOLEAN],
-										&((UA_ReferenceTypeNode *)myNode)->isAbstract);
-			break;
-
-		case UA_ATTRIBUTEID_SYMMETRIC:
-			CHECK_NODECLASS(UA_NODECLASS_REFERENCETYPE);
-			v[readValueIdIndices[i]].encodingMask = UA_DATAVALUE_ENCODINGMASK_VARIANT;
-			retval |= UA_Variant_copySetValue(&v[readValueIdIndices[i]].value, &UA_[UA_BOOLEAN],
-											  &((UA_ReferenceTypeNode *)myNode)->symmetric);
-			break;
-
-		case UA_ATTRIBUTEID_INVERSENAME:
-			CHECK_NODECLASS(UA_NODECLASS_REFERENCETYPE);
-			v[readValueIdIndices[i]].encodingMask = UA_DATAVALUE_ENCODINGMASK_VARIANT;
-			retval |= UA_Variant_copySetValue(&v[readValueIdIndices[i]].value, &UA_[UA_LOCALIZEDTEXT],
-											  &((UA_ReferenceTypeNode *)myNode)->inverseName);
-			break;
-
-		case UA_ATTRIBUTEID_CONTAINSNOLOOPS:
-			CHECK_NODECLASS(UA_NODECLASS_VIEW);
-			v[readValueIdIndices[i]].encodingMask = UA_DATAVALUE_ENCODINGMASK_VARIANT;
-			retval |= UA_Variant_copySetValue(&v[readValueIdIndices[i]].value, &UA_[UA_BOOLEAN],
-											  &((UA_ViewNode *)myNode)->containsNoLoops);
-			break;
-
-		case UA_ATTRIBUTEID_EVENTNOTIFIER:
-			CHECK_NODECLASS(UA_NODECLASS_VIEW | UA_NODECLASS_OBJECT);
-			v[readValueIdIndices[i]].encodingMask = UA_DATAVALUE_ENCODINGMASK_VARIANT;
-			retval |= UA_Variant_copySetValue(&v[readValueIdIndices[i]].value, &UA_[UA_BYTE],
-											  &((UA_ViewNode *)myNode)->eventNotifier);
-			break;
-
-		case UA_ATTRIBUTEID_VALUE:
-			CHECK_NODECLASS(UA_NODECLASS_VARIABLE | UA_NODECLASS_VARIABLETYPE);
-			v[readValueIdIndices[i]].encodingMask = UA_DATAVALUE_ENCODINGMASK_VARIANT;
-			retval |= UA_Variant_copy(&((UA_VariableNode *)myNode)->value, &v[readValueIdIndices[i]].value); // todo: zero-copy
-			break;
-
-		case UA_ATTRIBUTEID_DATATYPE:
-			CHECK_NODECLASS(UA_NODECLASS_VARIABLE | UA_NODECLASS_VARIABLETYPE);
-			v[readValueIdIndices[i]].encodingMask = UA_DATAVALUE_ENCODINGMASK_VARIANT;
-			retval |= UA_Variant_copySetValue(&v[readValueIdIndices[i]].value, &UA_[UA_NODEID],
-											  &((UA_VariableTypeNode *)myNode)->dataType);
-			break;
-
-		case UA_ATTRIBUTEID_VALUERANK:
-			CHECK_NODECLASS(UA_NODECLASS_VARIABLE | UA_NODECLASS_VARIABLETYPE);
-			v[readValueIdIndices[i]].encodingMask = UA_DATAVALUE_ENCODINGMASK_VARIANT;
-			retval |= UA_Variant_copySetValue(&v[readValueIdIndices[i]].value, &UA_[UA_INT32],
-											  &((UA_VariableTypeNode *)myNode)->valueRank);
-			break;
-
-		case UA_ATTRIBUTEID_ARRAYDIMENSIONS:
-			CHECK_NODECLASS(UA_NODECLASS_VARIABLE | UA_NODECLASS_VARIABLETYPE);
-			v[readValueIdIndices[i]].encodingMask = UA_DATAVALUE_ENCODINGMASK_VARIANT;
-			UA_Variant_copySetArray(&v[readValueIdIndices[i]].value, &UA_[UA_UINT32],
-									((UA_VariableTypeNode *)myNode)->arrayDimensionsSize,
-									&((UA_VariableTypeNode *)myNode)->arrayDimensions);
-			break;
-
-		case UA_ATTRIBUTEID_ACCESSLEVEL:
-			CHECK_NODECLASS(UA_NODECLASS_VARIABLE);
-			v[readValueIdIndices[i]].encodingMask = UA_DATAVALUE_ENCODINGMASK_VARIANT;
-			retval |= UA_Variant_copySetValue(&v[readValueIdIndices[i]].value, &UA_[UA_BYTE],
-											  &((UA_VariableNode *)myNode)->accessLevel);
-			break;
-
-		case UA_ATTRIBUTEID_USERACCESSLEVEL:
-			CHECK_NODECLASS(UA_NODECLASS_VARIABLE);
-			v[readValueIdIndices[i]].encodingMask = UA_DATAVALUE_ENCODINGMASK_VARIANT;
-			retval |= UA_Variant_copySetValue(&v[readValueIdIndices[i]].value, &UA_[UA_BYTE],
-											  &((UA_VariableNode *)myNode)->userAccessLevel);
-			break;
-
-		case UA_ATTRIBUTEID_MINIMUMSAMPLINGINTERVAL:
-			CHECK_NODECLASS(UA_NODECLASS_VARIABLE);
-			v[readValueIdIndices[i]].encodingMask = UA_DATAVALUE_ENCODINGMASK_VARIANT;
-			retval |= UA_Variant_copySetValue(&v[readValueIdIndices[i]].value, &UA_[UA_DOUBLE],
-											  &((UA_VariableNode *)myNode)->minimumSamplingInterval);
-			break;
-
-		case UA_ATTRIBUTEID_HISTORIZING:
-			CHECK_NODECLASS(UA_NODECLASS_VARIABLE);
-			v[readValueIdIndices[i]].encodingMask = UA_DATAVALUE_ENCODINGMASK_VARIANT;
-			retval |= UA_Variant_copySetValue(&v[readValueIdIndices[i]].value, &UA_[UA_BOOLEAN],
-											  &((UA_VariableNode *)myNode)->historizing);
-			break;
-
-		case UA_ATTRIBUTEID_EXECUTABLE:
-			CHECK_NODECLASS(UA_NODECLASS_METHOD);
-			v[readValueIdIndices[i]].encodingMask = UA_DATAVALUE_ENCODINGMASK_VARIANT;
-			retval |= UA_Variant_copySetValue(&v[readValueIdIndices[i]].value, &UA_[UA_BOOLEAN],
-											  &((UA_MethodNode *)myNode)->executable);
-			break;
-
-		case UA_ATTRIBUTEID_USEREXECUTABLE:
-			CHECK_NODECLASS(UA_NODECLASS_METHOD);
-			v[readValueIdIndices[i]].encodingMask = UA_DATAVALUE_ENCODINGMASK_VARIANT;
-			retval |= UA_Variant_copySetValue(&v[readValueIdIndices[i]].value, &UA_[UA_BOOLEAN],
-											  &((UA_MethodNode *)myNode)->userExecutable);
-			break;
-
-		default:
-			v[readValueIdIndices[i]].encodingMask = UA_DATAVALUE_ENCODINGMASK_STATUSCODE;
-			v[readValueIdIndices[i]].status       = UA_STATUSCODE_BADATTRIBUTEIDINVALID;
-			break;
-		}
-
-		if(retval != UA_STATUSCODE_GOOD) {
-			v[readValueIdIndices[i]].encodingMask = UA_DATAVALUE_ENCODINGMASK_STATUSCODE;
-			v[readValueIdIndices[i]].status       = UA_STATUSCODE_BADNOTREADABLE;
-		}
-
-	}
-	return retval;
-}
-
-UA_Int32 writeNodes(UA_WriteValue *writeValues,UA_UInt32 *indices ,UA_UInt32 indicesSize, UA_StatusCode *writeNodesResults, UA_DiagnosticInfo *diagnosticInfos)
-{
-    UA_Int32 retval = UA_STATUSCODE_GOOD;
-    for(UA_UInt32 i=0;i<indicesSize;i++){
-		switch(writeValues[indices[i]].attributeId) {
-		case UA_ATTRIBUTEID_NODEID:
-			/* if(writeValue->value.encodingMask == UA_DATAVALUE_ENCODINGMASK_VARIANT){ } */
-			writeNodesResults[indices[i]] = UA_STATUSCODE_BADWRITENOTSUPPORTED;
-			return UA_STATUSCODE_BADINTERNALERROR;
-			break;
-		case UA_ATTRIBUTEID_NODECLASS:
-			/* if(writeValue->value.encodingMask == UA_DATAVALUE_ENCODINGMASK_VARIANT){ } */
-			writeNodesResults[indices[i]] = UA_STATUSCODE_BADWRITENOTSUPPORTED;
-			return UA_STATUSCODE_BADINTERNALERROR;
-			break;
-
-		case UA_ATTRIBUTEID_BROWSENAME:
-			/* if(writeValue->value.encodingMask == UA_DATAVALUE_ENCODINGMASK_VARIANT){} */
-			writeNodesResults[indices[i]] = UA_STATUSCODE_BADWRITENOTSUPPORTED;
-			return UA_STATUSCODE_BADINTERNALERROR;
-			break;
-
-		case UA_ATTRIBUTEID_DISPLAYNAME:
-			/* if(writeValue->value.encodingMask == UA_DATAVALUE_ENCODINGMASK_VARIANT){} */
-			writeNodesResults[indices[i]] = UA_STATUSCODE_BADWRITENOTSUPPORTED;
-			return UA_STATUSCODE_BADINTERNALERROR;
-			break;
-
-		case UA_ATTRIBUTEID_DESCRIPTION:
-			/* if(writeValue->value.encodingMask == UA_DATAVALUE_ENCODINGMASK_VARIANT){} */
-			writeNodesResults[indices[i]] = UA_STATUSCODE_BADWRITENOTSUPPORTED;
-			return UA_STATUSCODE_BADINTERNALERROR;
-			break;
-
-		case UA_ATTRIBUTEID_WRITEMASK:
-			/* if(writeValue->value.encodingMask == UA_DATAVALUE_ENCODINGMASK_VARIANT){} */
-			break;
-
-		case UA_ATTRIBUTEID_USERWRITEMASK:
-			/* if(writeValue->value.encodingMask == UA_DATAVALUE_ENCODINGMASK_VARIANT){} */
-			writeNodesResults[indices[i]] = UA_STATUSCODE_BADWRITENOTSUPPORTED;
-			return UA_STATUSCODE_BADINTERNALERROR;
-			break;
-
-		case UA_ATTRIBUTEID_ISABSTRACT:
-
-			/* if(writeValue->value.encodingMask == UA_DATAVALUE_ENCODINGMASK_VARIANT){} */
-			writeNodesResults[indices[i]] = UA_STATUSCODE_BADWRITENOTSUPPORTED;
-
-			break;
-
-		case UA_ATTRIBUTEID_SYMMETRIC:
-			/* if(writeValue->value.encodingMask == UA_DATAVALUE_ENCODINGMASK_VARIANT){} */
-			writeNodesResults[indices[i]] = UA_STATUSCODE_BADWRITENOTSUPPORTED;
-			return UA_STATUSCODE_BADINTERNALERROR;
-			break;
-
-		case UA_ATTRIBUTEID_INVERSENAME:
-			/* if(writeValue->value.encodingMask == UA_DATAVALUE_ENCODINGMASK_VARIANT){} */
-			writeNodesResults[indices[i]] = UA_STATUSCODE_BADWRITENOTSUPPORTED;
-			break;
-
-		case UA_ATTRIBUTEID_CONTAINSNOLOOPS:
-			/* if(writeValue->value.encodingMask == UA_DATAVALUE_ENCODINGMASK_VARIANT){} */
-			writeNodesResults[indices[i]] = UA_STATUSCODE_BADWRITENOTSUPPORTED;
-			return UA_STATUSCODE_BADINTERNALERROR;
-			break;
-
-		case UA_ATTRIBUTEID_EVENTNOTIFIER:
-			/* if(writeValue->value.encodingMask == UA_DATAVALUE_ENCODINGMASK_VARIANT){} */
-			writeNodesResults[indices[i]] = UA_STATUSCODE_BADWRITENOTSUPPORTED;
-			break;
-
-		case UA_ATTRIBUTEID_VALUE:
-			if(writeValues[indices[i]].value.encodingMask == UA_DATAVALUE_ENCODINGMASK_VARIANT) {
-				retval |= UA_Variant_copy(&writeValues[indices[i]].value.value, &((UA_VariableNode *)myNode)->value); // todo: zero-copy
-				writeNodesResults[indices[i]] = UA_STATUSCODE_GOOD;
-			}
-
-			break;
-
-		case UA_ATTRIBUTEID_DATATYPE:
-			/* if(writeValue->value.encodingMask == UA_DATAVALUE_ENCODINGMASK_VARIANT){} */
-			writeNodesResults[indices[i]]   = UA_STATUSCODE_BADWRITENOTSUPPORTED;
-			break;
-
-		case UA_ATTRIBUTEID_VALUERANK:
-			/* if(writeValue->value.encodingMask == UA_DATAVALUE_ENCODINGMASK_VARIANT){} */
-			writeNodesResults[indices[i]]   = UA_STATUSCODE_BADWRITENOTSUPPORTED;
-			break;
-
-		case UA_ATTRIBUTEID_ARRAYDIMENSIONS:
-			/* if(writeValue->value.encodingMask == UA_DATAVALUE_ENCODINGMASK_VARIANT){} */
-			writeNodesResults[indices[i]]   = UA_STATUSCODE_BADWRITENOTSUPPORTED;
-			break;
-
-		case UA_ATTRIBUTEID_ACCESSLEVEL:
-			/* if(writeValue->value.encodingMask == UA_DATAVALUE_ENCODINGMASK_VARIANT){} */
-			writeNodesResults[indices[i]]   = UA_STATUSCODE_BADWRITENOTSUPPORTED;
-			break;
-
-		case UA_ATTRIBUTEID_USERACCESSLEVEL:
-			/* if(writeValue->value.encodingMask == UA_DATAVALUE_ENCODINGMASK_VARIANT){} */
-			writeNodesResults[indices[i]]   = UA_STATUSCODE_BADWRITENOTSUPPORTED;
-			return UA_STATUSCODE_BADINTERNALERROR;
-			break;
-
-		case UA_ATTRIBUTEID_MINIMUMSAMPLINGINTERVAL:
-			/* if(writeValue->value.encodingMask == UA_DATAVALUE_ENCODINGMASK_VARIANT){} */
-			writeNodesResults[indices[i]]   = UA_STATUSCODE_BADWRITENOTSUPPORTED;
-			break;
-
-		case UA_ATTRIBUTEID_HISTORIZING:
-			/* if(writeValue->value.encodingMask == UA_DATAVALUE_ENCODINGMASK_VARIANT){} */
-			writeNodesResults[indices[i]]   = UA_STATUSCODE_BADWRITENOTSUPPORTED;
-			break;
-
-		case UA_ATTRIBUTEID_EXECUTABLE:
-			/* if(writeValue->value.encodingMask == UA_DATAVALUE_ENCODINGMASK_VARIANT){} */
-			writeNodesResults[indices[i]]   = UA_STATUSCODE_BADWRITENOTSUPPORTED;
-			break;
-
-		case UA_ATTRIBUTEID_USEREXECUTABLE:
-			/* if(writeValue->value.encodingMask == UA_DATAVALUE_ENCODINGMASK_VARIANT){} */
-			writeNodesResults[indices[i]]   = UA_STATUSCODE_BADWRITENOTSUPPORTED;
-			break;
-
-		default:
-			writeNodesResults[indices[i]]   = UA_STATUSCODE_BADATTRIBUTEIDINVALID;
-			break;
-		}
-    }
-
-    return retval;
-}

+ 0 - 20
examples/nodestoreAccessExample.h

@@ -1,20 +0,0 @@
-/*
- * nodestoreAccessExample.h
- *
- *  Created on: Oct 16, 2014
- *      Author: opcua
- */
-
-#ifndef NODESTOREACCESSEXAMPLE_H_
-#define NODESTOREACCESSEXAMPLE_H_
-#include "ua_types.h"
-#include "ua_statuscodes.h"
-#include "ua_namespace_0.h"
-#include "ua_config.h"
-#include "ua_util.h"
-
-
-UA_Int32 readNodes(UA_ReadValueId * readValueIds, UA_UInt32 *readValueIdIndices, UA_UInt32 readValueIdsSize, UA_DataValue *v, UA_Boolean timeStampToReturn, UA_DiagnosticInfo *diagnosticInfos);
-UA_Int32 writeNodes(UA_WriteValue *writeValues,UA_UInt32 *indices ,UA_UInt32 indicesSize, UA_StatusCode *writeNodesResults, UA_DiagnosticInfo *diagnosticInfos);
-UA_Int32 initMyNode();
-#endif /* NODESTOREACCESSEXAMPLE_H_ */

+ 7 - 7
include/ua_server.h

@@ -55,15 +55,15 @@ typedef struct UA_Namespace
 struct UA_NamespaceManager;
 typedef struct UA_NamespaceManager UA_NamespaceManager;
 
-typedef UA_Int32 (*UA_NodeStore_addNodes)(UA_AddNodesItem *nodesToAdd,UA_UInt32 *indices,UA_UInt32 indicesSize, UA_AddNodesResult* addNodesResults, UA_DiagnosticInfo *diagnosticInfos);
-typedef UA_Int32 (*UA_NodeStore_addReferences)(UA_AddReferencesItem* referencesToAdd,UA_UInt32 *indices,UA_UInt32 indicesSize, UA_StatusCode *addReferencesResults, UA_DiagnosticInfo *diagnosticInfos);
+typedef UA_Int32 (*UA_NodeStore_addNodes)(const UA_RequestHeader *requestHeader, UA_AddNodesItem *nodesToAdd,UA_UInt32 *indices,UA_UInt32 indicesSize, UA_AddNodesResult* addNodesResults, UA_DiagnosticInfo *diagnosticInfos);
+typedef UA_Int32 (*UA_NodeStore_addReferences)(const UA_RequestHeader *requestHeader,UA_AddReferencesItem* referencesToAdd,UA_UInt32 *indices,UA_UInt32 indicesSize, UA_StatusCode *addReferencesResults, UA_DiagnosticInfo *diagnosticInfos);
 
-typedef UA_Int32 (*UA_NodeStore_deleteNodes)(UA_DeleteNodesItem *nodesToDelete,UA_UInt32 *indices,UA_UInt32 indicesSize, UA_StatusCode *deleteNodesResults, UA_DiagnosticInfo *diagnosticInfos);
-typedef UA_Int32 (*UA_NodeStore_deleteReferences)(UA_DeleteReferencesItem *referenceToDelete,UA_UInt32 *indices, UA_UInt32 indicesSize,UA_StatusCode deleteReferencesresults, UA_DiagnosticInfo *diagnosticInfos);
+typedef UA_Int32 (*UA_NodeStore_deleteNodes)(const UA_RequestHeader *requestHeader,UA_DeleteNodesItem *nodesToDelete,UA_UInt32 *indices,UA_UInt32 indicesSize, UA_StatusCode *deleteNodesResults, UA_DiagnosticInfo *diagnosticInfos);
+typedef UA_Int32 (*UA_NodeStore_deleteReferences)(const UA_RequestHeader *requestHeader,UA_DeleteReferencesItem *referenceToDelete,UA_UInt32 *indices, UA_UInt32 indicesSize,UA_StatusCode deleteReferencesresults, UA_DiagnosticInfo *diagnosticInfos);
 
-typedef UA_Int32 (*UA_NodeStore_readNodes)(UA_ReadValueId *readValueIds,UA_UInt32 *indices,UA_UInt32 indicesSize,UA_DataValue *readNodesResults, UA_Boolean timeStampToReturn, UA_DiagnosticInfo *diagnosticInfos);
-typedef UA_Int32 (*UA_NodeStore_writeNodes)(UA_WriteValue *writeValues,UA_UInt32 *indices ,UA_UInt32 indicesSize, UA_StatusCode *writeNodesResults, UA_DiagnosticInfo *diagnosticInfo);
-typedef UA_Int32 (*UA_NodeStore_browseNodes)(UA_BrowseDescription *browseDescriptions,UA_UInt32 *indices,UA_UInt32 indicesSize, UA_UInt32 requestedMaxReferencesPerNode, UA_BrowseResult *browseResults, UA_DiagnosticInfo *diagnosticInfos);
+typedef UA_Int32 (*UA_NodeStore_readNodes)(const UA_RequestHeader *requestHeader,UA_ReadValueId *readValueIds,UA_UInt32 *indices,UA_UInt32 indicesSize,UA_DataValue *readNodesResults, UA_Boolean timeStampToReturn, UA_DiagnosticInfo *diagnosticInfos);
+typedef UA_Int32 (*UA_NodeStore_writeNodes)(const UA_RequestHeader *requestHeader,UA_WriteValue *writeValues,UA_UInt32 *indices ,UA_UInt32 indicesSize, UA_StatusCode *writeNodesResults, UA_DiagnosticInfo *diagnosticInfo);
+typedef UA_Int32 (*UA_NodeStore_browseNodes)(const UA_RequestHeader *requestHeader,UA_BrowseDescription *browseDescriptions,UA_UInt32 *indices,UA_UInt32 indicesSize, UA_UInt32 requestedMaxReferencesPerNode, UA_BrowseResult *browseResults, UA_DiagnosticInfo *diagnosticInfos);
 
 struct UA_NodeStore {
 	//new, set, get, remove,

+ 14 - 6
src/server/nodestore/open62541_nodestore.h

@@ -66,21 +66,29 @@ void open62541NodeStore_iterate(const open62541NodeStore *ns,
 /// @} /* end of group */
 
 //service implementations
-UA_Int32 UA_EXPORT open62541NodeStore_ReadNodes(UA_ReadValueId *readValueIds,
+UA_Int32 UA_EXPORT open62541NodeStore_ReadNodes(const UA_RequestHeader *requestHeader,
+		UA_ReadValueId *readValueIds,
 		UA_UInt32 *indices, UA_UInt32 indicesSize,
 		UA_DataValue *readNodesResults, UA_Boolean timeStampToReturn,
 		UA_DiagnosticInfo *diagnosticInfos);
 
-UA_Int32 UA_EXPORT open62541NodeStore_BrowseNodes(
+UA_Int32 UA_EXPORT open62541NodeStore_WriteNodes(const UA_RequestHeader *requestHeader,
+		UA_WriteValue *writeValues,
+		UA_UInt32 *indices, UA_UInt32 indicesSize,
+		UA_StatusCode *writeNodesResults, UA_DiagnosticInfo *diagnosticInfo);
+
+UA_Int32 UA_EXPORT open62541NodeStore_BrowseNodes(const UA_RequestHeader *requestHeader,
 		UA_BrowseDescription *browseDescriptions, UA_UInt32 *indices,
 		UA_UInt32 indicesSize, UA_UInt32 requestedMaxReferencesPerNode,
 		UA_BrowseResult *browseResults, UA_DiagnosticInfo *diagnosticInfos);
 
-UA_Int32 UA_EXPORT open62541NodeStore_AddNodes(UA_AddNodesItem *nodesToAdd,
+UA_Int32 UA_EXPORT open62541NodeStore_AddNodes(const UA_RequestHeader *requestHeader,
+		UA_AddNodesItem *nodesToAdd,
 		UA_UInt32 *indices, UA_UInt32 indicesSize,
 		UA_AddNodesResult* addNodesResults, UA_DiagnosticInfo *diagnosticInfos);
 
-UA_Int32 UA_EXPORT open62541NodeStore_WriteNodes(UA_WriteValue *writeValues,
-		UA_UInt32 *indices, UA_UInt32 indicesSize,
-		UA_StatusCode *writeNodesResults, UA_DiagnosticInfo *diagnosticInfo);
+UA_Int32 UA_EXPORT open62541NodeStore_AddReferences(const UA_RequestHeader *requestHeader, UA_AddReferencesItem* referencesToAdd,
+		UA_UInt32 *indices,UA_UInt32 indicesSize, UA_StatusCode *addReferencesResults,
+		UA_DiagnosticInfo *diagnosticInfos);
+
 #endif /* UA_OPEN62541_NODESTORE_H_ */

+ 339 - 314
src/server/nodestore/open62541_nodestore_attribute.c

@@ -9,7 +9,6 @@
 #include "open62541_nodestore.h"
 #include "ua_namespace_0.h"
 
-
 #define CHECK_NODECLASS(CLASS)                                 \
     if(!(node->nodeClass & (CLASS))) {                         \
         v.encodingMask = UA_DATAVALUE_ENCODINGMASK_STATUSCODE; \
@@ -17,334 +16,360 @@
         break;                                                 \
     }                                                          \
 
-static UA_DataValue service_read_node(UA_Server *server, const UA_ReadValueId *id) {
-    UA_DataValue v;
-    UA_DataValue_init(&v);
-
-    UA_Node const *node   = UA_NULL;
-    open62541NodeStore *ns =  open62541NodeStore_getNodeStore();
-    UA_Int32       result = open62541NodeStore_get(ns, &(id->nodeId), &node);
-    if(result != UA_STATUSCODE_GOOD || node == UA_NULL) {
-        v.encodingMask = UA_DATAVALUE_ENCODINGMASK_STATUSCODE;
-        v.status       = UA_STATUSCODE_BADNODEIDUNKNOWN;
-        return v;
-    }
-    UA_StatusCode retval = UA_STATUSCODE_GOOD;
-
-    switch(id->attributeId) {
-    case UA_ATTRIBUTEID_NODEID:
-        v.encodingMask = UA_DATAVALUE_ENCODINGMASK_VARIANT;
-        retval |= UA_Variant_copySetValue(&v.value, &UA_[UA_NODEID], &node->nodeId);
-        break;
-
-    case UA_ATTRIBUTEID_NODECLASS:
-
-        retval |= UA_Variant_copySetValue(&v.value, &UA_[UA_INT32], &node->nodeClass);
-        v.encodingMask = UA_DATAVALUE_ENCODINGMASK_VARIANT;
-        break;
-
-    case UA_ATTRIBUTEID_BROWSENAME:
-        v.encodingMask = UA_DATAVALUE_ENCODINGMASK_VARIANT;
-        retval |= UA_Variant_copySetValue(&v.value, &UA_[UA_QUALIFIEDNAME], &node->browseName);
-        break;
-
-    case UA_ATTRIBUTEID_DISPLAYNAME:
-        v.encodingMask = UA_DATAVALUE_ENCODINGMASK_VARIANT;
-        retval |= UA_Variant_copySetValue(&v.value, &UA_[UA_LOCALIZEDTEXT],
-                                          &node->displayName);
-        break;
-
-    case UA_ATTRIBUTEID_DESCRIPTION:
-        v.encodingMask = UA_DATAVALUE_ENCODINGMASK_VARIANT;
-        retval |= UA_Variant_copySetValue(&v.value, &UA_[UA_LOCALIZEDTEXT],
-                                          &node->description);
-        break;
-
-    case UA_ATTRIBUTEID_WRITEMASK:
-        v.encodingMask = UA_DATAVALUE_ENCODINGMASK_VARIANT;
-        retval |= UA_Variant_copySetValue(&v.value, &UA_[UA_UINT32], &node->writeMask);
-        break;
-
-    case UA_ATTRIBUTEID_USERWRITEMASK:
-        v.encodingMask = UA_DATAVALUE_ENCODINGMASK_VARIANT;
-        retval |= UA_Variant_copySetValue(&v.value, &UA_[UA_UINT32], &node->userWriteMask);
-        break;
-
-    case UA_ATTRIBUTEID_ISABSTRACT:
-        CHECK_NODECLASS(
-            UA_NODECLASS_REFERENCETYPE | UA_NODECLASS_OBJECTTYPE | UA_NODECLASS_VARIABLETYPE |
-            UA_NODECLASS_DATATYPE);
-        v.encodingMask = UA_DATAVALUE_ENCODINGMASK_VARIANT;
-        retval |=
-            UA_Variant_copySetValue(&v.value, &UA_[UA_BOOLEAN],
-                                    &((UA_ReferenceTypeNode *)node)->isAbstract);
-        break;
-
-    case UA_ATTRIBUTEID_SYMMETRIC:
-        CHECK_NODECLASS(UA_NODECLASS_REFERENCETYPE);
-        v.encodingMask = UA_DATAVALUE_ENCODINGMASK_VARIANT;
-        retval |= UA_Variant_copySetValue(&v.value, &UA_[UA_BOOLEAN],
-                                          &((UA_ReferenceTypeNode *)node)->symmetric);
-        break;
-
-    case UA_ATTRIBUTEID_INVERSENAME:
-        CHECK_NODECLASS(UA_NODECLASS_REFERENCETYPE);
-        v.encodingMask = UA_DATAVALUE_ENCODINGMASK_VARIANT;
-        retval |= UA_Variant_copySetValue(&v.value, &UA_[UA_LOCALIZEDTEXT],
-                                          &((UA_ReferenceTypeNode *)node)->inverseName);
-        break;
-
-    case UA_ATTRIBUTEID_CONTAINSNOLOOPS:
-        CHECK_NODECLASS(UA_NODECLASS_VIEW);
-        v.encodingMask = UA_DATAVALUE_ENCODINGMASK_VARIANT;
-        retval |= UA_Variant_copySetValue(&v.value, &UA_[UA_BOOLEAN],
-                                          &((UA_ViewNode *)node)->containsNoLoops);
-        break;
-
-    case UA_ATTRIBUTEID_EVENTNOTIFIER:
-        CHECK_NODECLASS(UA_NODECLASS_VIEW | UA_NODECLASS_OBJECT);
-        v.encodingMask = UA_DATAVALUE_ENCODINGMASK_VARIANT;
-        retval |= UA_Variant_copySetValue(&v.value, &UA_[UA_BYTE],
-                                          &((UA_ViewNode *)node)->eventNotifier);
-        break;
-
-    case UA_ATTRIBUTEID_VALUE:
-        CHECK_NODECLASS(UA_NODECLASS_VARIABLE | UA_NODECLASS_VARIABLETYPE);
-        v.encodingMask = UA_DATAVALUE_ENCODINGMASK_VARIANT;
-        retval |= UA_Variant_copy(&((UA_VariableNode *)node)->value, &v.value); // todo: zero-copy
-        break;
-
-    case UA_ATTRIBUTEID_DATATYPE:
-        CHECK_NODECLASS(UA_NODECLASS_VARIABLE | UA_NODECLASS_VARIABLETYPE);
-        v.encodingMask = UA_DATAVALUE_ENCODINGMASK_VARIANT;
-        retval |= UA_Variant_copySetValue(&v.value, &UA_[UA_NODEID],
-                                          &((UA_VariableTypeNode *)node)->dataType);
-        break;
-
-    case UA_ATTRIBUTEID_VALUERANK:
-        CHECK_NODECLASS(UA_NODECLASS_VARIABLE | UA_NODECLASS_VARIABLETYPE);
-        v.encodingMask = UA_DATAVALUE_ENCODINGMASK_VARIANT;
-        retval |= UA_Variant_copySetValue(&v.value, &UA_[UA_INT32],
-                                          &((UA_VariableTypeNode *)node)->valueRank);
-        break;
-
-    case UA_ATTRIBUTEID_ARRAYDIMENSIONS:
-        CHECK_NODECLASS(UA_NODECLASS_VARIABLE | UA_NODECLASS_VARIABLETYPE);
-        v.encodingMask = UA_DATAVALUE_ENCODINGMASK_VARIANT;
-        UA_Variant_copySetArray(&v.value, &UA_[UA_UINT32],
-                                ((UA_VariableTypeNode *)node)->arrayDimensionsSize,
-                                &((UA_VariableTypeNode *)node)->arrayDimensions);
-        break;
-
-    case UA_ATTRIBUTEID_ACCESSLEVEL:
-        CHECK_NODECLASS(UA_NODECLASS_VARIABLE);
-        v.encodingMask = UA_DATAVALUE_ENCODINGMASK_VARIANT;
-        retval |= UA_Variant_copySetValue(&v.value, &UA_[UA_BYTE],
-                                          &((UA_VariableNode *)node)->accessLevel);
-        break;
-
-    case UA_ATTRIBUTEID_USERACCESSLEVEL:
-        CHECK_NODECLASS(UA_NODECLASS_VARIABLE);
-        v.encodingMask = UA_DATAVALUE_ENCODINGMASK_VARIANT;
-        retval |= UA_Variant_copySetValue(&v.value, &UA_[UA_BYTE],
-                                          &((UA_VariableNode *)node)->userAccessLevel);
-        break;
-
-    case UA_ATTRIBUTEID_MINIMUMSAMPLINGINTERVAL:
-        CHECK_NODECLASS(UA_NODECLASS_VARIABLE);
-        v.encodingMask = UA_DATAVALUE_ENCODINGMASK_VARIANT;
-        retval |= UA_Variant_copySetValue(&v.value, &UA_[UA_DOUBLE],
-                                          &((UA_VariableNode *)node)->minimumSamplingInterval);
-        break;
-
-    case UA_ATTRIBUTEID_HISTORIZING:
-        CHECK_NODECLASS(UA_NODECLASS_VARIABLE);
-        v.encodingMask = UA_DATAVALUE_ENCODINGMASK_VARIANT;
-        retval |= UA_Variant_copySetValue(&v.value, &UA_[UA_BOOLEAN],
-                                          &((UA_VariableNode *)node)->historizing);
-        break;
-
-    case UA_ATTRIBUTEID_EXECUTABLE:
-        CHECK_NODECLASS(UA_NODECLASS_METHOD);
-        v.encodingMask = UA_DATAVALUE_ENCODINGMASK_VARIANT;
-        retval |= UA_Variant_copySetValue(&v.value, &UA_[UA_BOOLEAN],
-                                          &((UA_MethodNode *)node)->executable);
-        break;
-
-    case UA_ATTRIBUTEID_USEREXECUTABLE:
-        CHECK_NODECLASS(UA_NODECLASS_METHOD);
-        v.encodingMask = UA_DATAVALUE_ENCODINGMASK_VARIANT;
-        retval |= UA_Variant_copySetValue(&v.value, &UA_[UA_BOOLEAN],
-                                          &((UA_MethodNode *)node)->userExecutable);
-        break;
-
-    default:
-        v.encodingMask = UA_DATAVALUE_ENCODINGMASK_STATUSCODE;
-        v.status       = UA_STATUSCODE_BADATTRIBUTEIDINVALID;
-        break;
-    }
-
-    open62541NodeStore_releaseManagedNode(node);
-
-    if(retval != UA_STATUSCODE_GOOD) {
-        v.encodingMask = UA_DATAVALUE_ENCODINGMASK_STATUSCODE;
-        v.status       = UA_STATUSCODE_BADNOTREADABLE;
-    }
-
-
-    return v;
+static UA_DataValue service_read_node(UA_Server *server,
+		const UA_ReadValueId *id) {
+	UA_DataValue v;
+	UA_DataValue_init(&v);
+
+	UA_Node const *node = UA_NULL;
+	open62541NodeStore *ns = open62541NodeStore_getNodeStore();
+	UA_Int32 result = open62541NodeStore_get(ns, &(id->nodeId), &node);
+	if (result != UA_STATUSCODE_GOOD || node == UA_NULL) {
+		v.encodingMask = UA_DATAVALUE_ENCODINGMASK_STATUSCODE;
+		v.status = UA_STATUSCODE_BADNODEIDUNKNOWN;
+		return v;
+	}
+	UA_StatusCode retval = UA_STATUSCODE_GOOD;
+
+	switch (id->attributeId) {
+	case UA_ATTRIBUTEID_NODEID:
+		v.encodingMask = UA_DATAVALUE_ENCODINGMASK_VARIANT;
+		retval |= UA_Variant_copySetValue(&v.value, &UA_[UA_NODEID],
+				&node->nodeId);
+		break;
+
+	case UA_ATTRIBUTEID_NODECLASS:
+
+		retval |= UA_Variant_copySetValue(&v.value, &UA_[UA_INT32],
+				&node->nodeClass);
+		v.encodingMask = UA_DATAVALUE_ENCODINGMASK_VARIANT;
+		break;
+
+	case UA_ATTRIBUTEID_BROWSENAME:
+		v.encodingMask = UA_DATAVALUE_ENCODINGMASK_VARIANT;
+		retval |= UA_Variant_copySetValue(&v.value, &UA_[UA_QUALIFIEDNAME],
+				&node->browseName);
+		break;
+
+	case UA_ATTRIBUTEID_DISPLAYNAME:
+		v.encodingMask = UA_DATAVALUE_ENCODINGMASK_VARIANT;
+		retval |= UA_Variant_copySetValue(&v.value, &UA_[UA_LOCALIZEDTEXT],
+				&node->displayName);
+		break;
+
+	case UA_ATTRIBUTEID_DESCRIPTION:
+		v.encodingMask = UA_DATAVALUE_ENCODINGMASK_VARIANT;
+		retval |= UA_Variant_copySetValue(&v.value, &UA_[UA_LOCALIZEDTEXT],
+				&node->description);
+		break;
+
+	case UA_ATTRIBUTEID_WRITEMASK:
+		v.encodingMask = UA_DATAVALUE_ENCODINGMASK_VARIANT;
+		retval |= UA_Variant_copySetValue(&v.value, &UA_[UA_UINT32],
+				&node->writeMask);
+		break;
+
+	case UA_ATTRIBUTEID_USERWRITEMASK:
+		v.encodingMask = UA_DATAVALUE_ENCODINGMASK_VARIANT;
+		retval |= UA_Variant_copySetValue(&v.value, &UA_[UA_UINT32],
+				&node->userWriteMask);
+		break;
+
+	case UA_ATTRIBUTEID_ISABSTRACT:
+		CHECK_NODECLASS(
+				UA_NODECLASS_REFERENCETYPE | UA_NODECLASS_OBJECTTYPE
+						| UA_NODECLASS_VARIABLETYPE | UA_NODECLASS_DATATYPE)
+		;
+		v.encodingMask = UA_DATAVALUE_ENCODINGMASK_VARIANT;
+		retval |= UA_Variant_copySetValue(&v.value, &UA_[UA_BOOLEAN],
+				&((UA_ReferenceTypeNode *) node)->isAbstract);
+		break;
+
+	case UA_ATTRIBUTEID_SYMMETRIC:
+		CHECK_NODECLASS(UA_NODECLASS_REFERENCETYPE)
+		;
+		v.encodingMask = UA_DATAVALUE_ENCODINGMASK_VARIANT;
+		retval |= UA_Variant_copySetValue(&v.value, &UA_[UA_BOOLEAN],
+				&((UA_ReferenceTypeNode *) node)->symmetric);
+		break;
+
+	case UA_ATTRIBUTEID_INVERSENAME:
+		CHECK_NODECLASS(UA_NODECLASS_REFERENCETYPE)
+		;
+		v.encodingMask = UA_DATAVALUE_ENCODINGMASK_VARIANT;
+		retval |= UA_Variant_copySetValue(&v.value, &UA_[UA_LOCALIZEDTEXT],
+				&((UA_ReferenceTypeNode *) node)->inverseName);
+		break;
+
+	case UA_ATTRIBUTEID_CONTAINSNOLOOPS:
+		CHECK_NODECLASS(UA_NODECLASS_VIEW)
+		;
+		v.encodingMask = UA_DATAVALUE_ENCODINGMASK_VARIANT;
+		retval |= UA_Variant_copySetValue(&v.value, &UA_[UA_BOOLEAN],
+				&((UA_ViewNode *) node)->containsNoLoops);
+		break;
+
+	case UA_ATTRIBUTEID_EVENTNOTIFIER:
+		CHECK_NODECLASS(UA_NODECLASS_VIEW | UA_NODECLASS_OBJECT)
+		;
+		v.encodingMask = UA_DATAVALUE_ENCODINGMASK_VARIANT;
+		retval |= UA_Variant_copySetValue(&v.value, &UA_[UA_BYTE],
+				&((UA_ViewNode *) node)->eventNotifier);
+		break;
+
+	case UA_ATTRIBUTEID_VALUE:
+		CHECK_NODECLASS(UA_NODECLASS_VARIABLE | UA_NODECLASS_VARIABLETYPE)
+		;
+		v.encodingMask = UA_DATAVALUE_ENCODINGMASK_VARIANT;
+		retval |= UA_Variant_copy(&((UA_VariableNode *) node)->value, &v.value); // todo: zero-copy
+		break;
+
+	case UA_ATTRIBUTEID_DATATYPE:
+		CHECK_NODECLASS(UA_NODECLASS_VARIABLE | UA_NODECLASS_VARIABLETYPE)
+		;
+		v.encodingMask = UA_DATAVALUE_ENCODINGMASK_VARIANT;
+		retval |= UA_Variant_copySetValue(&v.value, &UA_[UA_NODEID],
+				&((UA_VariableTypeNode *) node)->dataType);
+		break;
+
+	case UA_ATTRIBUTEID_VALUERANK:
+		CHECK_NODECLASS(UA_NODECLASS_VARIABLE | UA_NODECLASS_VARIABLETYPE)
+		;
+		v.encodingMask = UA_DATAVALUE_ENCODINGMASK_VARIANT;
+		retval |= UA_Variant_copySetValue(&v.value, &UA_[UA_INT32],
+				&((UA_VariableTypeNode *) node)->valueRank);
+		break;
+
+	case UA_ATTRIBUTEID_ARRAYDIMENSIONS:
+		CHECK_NODECLASS(UA_NODECLASS_VARIABLE | UA_NODECLASS_VARIABLETYPE)
+		;
+		v.encodingMask = UA_DATAVALUE_ENCODINGMASK_VARIANT;
+		UA_Variant_copySetArray(&v.value, &UA_[UA_UINT32],
+				((UA_VariableTypeNode *) node)->arrayDimensionsSize,
+				&((UA_VariableTypeNode *) node)->arrayDimensions);
+		break;
+
+	case UA_ATTRIBUTEID_ACCESSLEVEL:
+		CHECK_NODECLASS(UA_NODECLASS_VARIABLE)
+		;
+		v.encodingMask = UA_DATAVALUE_ENCODINGMASK_VARIANT;
+		retval |= UA_Variant_copySetValue(&v.value, &UA_[UA_BYTE],
+				&((UA_VariableNode *) node)->accessLevel);
+		break;
+
+	case UA_ATTRIBUTEID_USERACCESSLEVEL:
+		CHECK_NODECLASS(UA_NODECLASS_VARIABLE)
+		;
+		v.encodingMask = UA_DATAVALUE_ENCODINGMASK_VARIANT;
+		retval |= UA_Variant_copySetValue(&v.value, &UA_[UA_BYTE],
+				&((UA_VariableNode *) node)->userAccessLevel);
+		break;
+
+	case UA_ATTRIBUTEID_MINIMUMSAMPLINGINTERVAL:
+		CHECK_NODECLASS(UA_NODECLASS_VARIABLE)
+		;
+		v.encodingMask = UA_DATAVALUE_ENCODINGMASK_VARIANT;
+		retval |= UA_Variant_copySetValue(&v.value, &UA_[UA_DOUBLE],
+				&((UA_VariableNode *) node)->minimumSamplingInterval);
+		break;
+
+	case UA_ATTRIBUTEID_HISTORIZING:
+		CHECK_NODECLASS(UA_NODECLASS_VARIABLE)
+		;
+		v.encodingMask = UA_DATAVALUE_ENCODINGMASK_VARIANT;
+		retval |= UA_Variant_copySetValue(&v.value, &UA_[UA_BOOLEAN],
+				&((UA_VariableNode *) node)->historizing);
+		break;
+
+	case UA_ATTRIBUTEID_EXECUTABLE:
+		CHECK_NODECLASS(UA_NODECLASS_METHOD)
+		;
+		v.encodingMask = UA_DATAVALUE_ENCODINGMASK_VARIANT;
+		retval |= UA_Variant_copySetValue(&v.value, &UA_[UA_BOOLEAN],
+				&((UA_MethodNode *) node)->executable);
+		break;
+
+	case UA_ATTRIBUTEID_USEREXECUTABLE:
+		CHECK_NODECLASS(UA_NODECLASS_METHOD)
+		;
+		v.encodingMask = UA_DATAVALUE_ENCODINGMASK_VARIANT;
+		retval |= UA_Variant_copySetValue(&v.value, &UA_[UA_BOOLEAN],
+				&((UA_MethodNode *) node)->userExecutable);
+		break;
+
+	default:
+		v.encodingMask = UA_DATAVALUE_ENCODINGMASK_STATUSCODE;
+		v.status = UA_STATUSCODE_BADATTRIBUTEIDINVALID;
+		break;
+	}
+
+	open62541NodeStore_releaseManagedNode(node);
+
+	if (retval != UA_STATUSCODE_GOOD) {
+		v.encodingMask = UA_DATAVALUE_ENCODINGMASK_STATUSCODE;
+		v.status = UA_STATUSCODE_BADNOTREADABLE;
+	}
+
+	return v;
 }
 
-UA_Int32 open62541NodeStore_ReadNodes(UA_ReadValueId *readValueIds,UA_UInt32 *indices,UA_UInt32 indicesSize,UA_DataValue *readNodesResults, UA_Boolean timeStampToReturn, UA_DiagnosticInfo *diagnosticInfos)
-{
-	for(UA_UInt32 i = 0; i< indicesSize; i++){
-		readNodesResults[indices[i]] = service_read_node(UA_NULL,&readValueIds[indices[i]]);
+UA_Int32 open62541NodeStore_ReadNodes(const UA_RequestHeader *requestHeader,
+		UA_ReadValueId *readValueIds,
+		UA_UInt32 *indices, UA_UInt32 indicesSize,
+		UA_DataValue *readNodesResults, UA_Boolean timeStampToReturn,
+		UA_DiagnosticInfo *diagnosticInfos) {
+	for (UA_UInt32 i = 0; i < indicesSize; i++) {
+		readNodesResults[indices[i]] = service_read_node(UA_NULL,
+				&readValueIds[indices[i]]);
 	}
 	return UA_STATUSCODE_GOOD;
 }
 
+static UA_StatusCode Service_Write_writeNode(open62541NodeStore *nodestore,
+		UA_WriteValue *writeValue) {
+	UA_StatusCode retval = UA_STATUSCODE_GOOD;
+	const UA_Node *node;
+	retval = open62541NodeStore_get(nodestore, &writeValue->nodeId, &node);
+	if (retval)
+		return retval;
+
+	switch (writeValue->attributeId) {
+	case UA_ATTRIBUTEID_NODEID:
+		/* if(writeValue->value.encodingMask == UA_DATAVALUE_ENCODINGMASK_VARIANT){ } */
+		retval = UA_STATUSCODE_BADWRITENOTSUPPORTED;
+		break;
+
+	case UA_ATTRIBUTEID_NODECLASS:
+		/* if(writeValue->value.encodingMask == UA_DATAVALUE_ENCODINGMASK_VARIANT){ } */
+		retval = UA_STATUSCODE_BADWRITENOTSUPPORTED;
+		break;
+
+	case UA_ATTRIBUTEID_BROWSENAME:
+		/* if(writeValue->value.encodingMask == UA_DATAVALUE_ENCODINGMASK_VARIANT){} */
+		retval = UA_STATUSCODE_BADWRITENOTSUPPORTED;
+		break;
+
+	case UA_ATTRIBUTEID_DISPLAYNAME:
+		/* if(writeValue->value.encodingMask == UA_DATAVALUE_ENCODINGMASK_VARIANT){} */
+		retval = UA_STATUSCODE_BADWRITENOTSUPPORTED;
+		break;
+
+	case UA_ATTRIBUTEID_DESCRIPTION:
+		/* if(writeValue->value.encodingMask == UA_DATAVALUE_ENCODINGMASK_VARIANT){} */
+		retval = UA_STATUSCODE_BADWRITENOTSUPPORTED;
+		break;
+
+	case UA_ATTRIBUTEID_WRITEMASK:
+		/* if(writeValue->value.encodingMask == UA_DATAVALUE_ENCODINGMASK_VARIANT){} */
+		retval = UA_STATUSCODE_BADWRITENOTSUPPORTED;
+		break;
+
+	case UA_ATTRIBUTEID_USERWRITEMASK:
+		/* if(writeValue->value.encodingMask == UA_DATAVALUE_ENCODINGMASK_VARIANT){} */
+		retval = UA_STATUSCODE_BADWRITENOTSUPPORTED;
+		break;
+
+	case UA_ATTRIBUTEID_ISABSTRACT:
+
+		/* if(writeValue->value.encodingMask == UA_DATAVALUE_ENCODINGMASK_VARIANT){} */
+		retval = UA_STATUSCODE_BADWRITENOTSUPPORTED;
+		break;
+
+	case UA_ATTRIBUTEID_SYMMETRIC:
+		/* if(writeValue->value.encodingMask == UA_DATAVALUE_ENCODINGMASK_VARIANT){} */
+		retval = UA_STATUSCODE_BADWRITENOTSUPPORTED;
+		break;
+
+	case UA_ATTRIBUTEID_INVERSENAME:
+		/* if(writeValue->value.encodingMask == UA_DATAVALUE_ENCODINGMASK_VARIANT){} */
+		retval = UA_STATUSCODE_BADWRITENOTSUPPORTED;
+		break;
+
+	case UA_ATTRIBUTEID_CONTAINSNOLOOPS:
+		/* if(writeValue->value.encodingMask == UA_DATAVALUE_ENCODINGMASK_VARIANT){} */
+		retval = UA_STATUSCODE_BADWRITENOTSUPPORTED;
+		break;
+
+	case UA_ATTRIBUTEID_EVENTNOTIFIER:
+		/* if(writeValue->value.encodingMask == UA_DATAVALUE_ENCODINGMASK_VARIANT){} */
+		retval = UA_STATUSCODE_BADWRITENOTSUPPORTED;
+		break;
+
+	case UA_ATTRIBUTEID_VALUE:
+		if (writeValue->value.encodingMask
+				== UA_DATAVALUE_ENCODINGMASK_VARIANT) {
+			retval |= UA_Variant_copy(&writeValue->value.value,
+					&((UA_VariableNode *) node)->value); // todo: zero-copy
+		}
+		break;
+
+	case UA_ATTRIBUTEID_DATATYPE:
+		/* if(writeValue->value.encodingMask == UA_DATAVALUE_ENCODINGMASK_VARIANT){} */
+		retval = UA_STATUSCODE_BADWRITENOTSUPPORTED;
+		break;
+
+	case UA_ATTRIBUTEID_VALUERANK:
+		/* if(writeValue->value.encodingMask == UA_DATAVALUE_ENCODINGMASK_VARIANT){} */
+		retval = UA_STATUSCODE_BADWRITENOTSUPPORTED;
+		break;
+
+	case UA_ATTRIBUTEID_ARRAYDIMENSIONS:
+		/* if(writeValue->value.encodingMask == UA_DATAVALUE_ENCODINGMASK_VARIANT){} */
+		retval = UA_STATUSCODE_BADWRITENOTSUPPORTED;
+		break;
+
+	case UA_ATTRIBUTEID_ACCESSLEVEL:
+		/* if(writeValue->value.encodingMask == UA_DATAVALUE_ENCODINGMASK_VARIANT){} */
+		retval = UA_STATUSCODE_BADWRITENOTSUPPORTED;
+		break;
+
+	case UA_ATTRIBUTEID_USERACCESSLEVEL:
+		/* if(writeValue->value.encodingMask == UA_DATAVALUE_ENCODINGMASK_VARIANT){} */
+		retval = UA_STATUSCODE_BADWRITENOTSUPPORTED;
+		break;
+
+	case UA_ATTRIBUTEID_MINIMUMSAMPLINGINTERVAL:
+		/* if(writeValue->value.encodingMask == UA_DATAVALUE_ENCODINGMASK_VARIANT){} */
+		retval = UA_STATUSCODE_BADWRITENOTSUPPORTED;
+		break;
+
+	case UA_ATTRIBUTEID_HISTORIZING:
+		/* if(writeValue->value.encodingMask == UA_DATAVALUE_ENCODINGMASK_VARIANT){} */
+		retval = UA_STATUSCODE_BADWRITENOTSUPPORTED;
+		break;
+
+	case UA_ATTRIBUTEID_EXECUTABLE:
+		/* if(writeValue->value.encodingMask == UA_DATAVALUE_ENCODINGMASK_VARIANT){} */
+		retval = UA_STATUSCODE_BADWRITENOTSUPPORTED;
+		break;
+
+	case UA_ATTRIBUTEID_USEREXECUTABLE:
+		/* if(writeValue->value.encodingMask == UA_DATAVALUE_ENCODINGMASK_VARIANT){} */
+		retval = UA_STATUSCODE_BADWRITENOTSUPPORTED;
+		break;
+
+	default:
+		retval = UA_STATUSCODE_BADATTRIBUTEIDINVALID;
+		break;
+	}
 
-static UA_StatusCode Service_Write_writeNode(open62541NodeStore *nodestore, UA_WriteValue *writeValue) {
-    UA_StatusCode retval = UA_STATUSCODE_GOOD;
-    const UA_Node *node;
-    retval = open62541NodeStore_get(nodestore, &writeValue->nodeId, &node);
-    if(retval)
-        return retval;
-
-    switch(writeValue->attributeId) {
-    case UA_ATTRIBUTEID_NODEID:
-        /* if(writeValue->value.encodingMask == UA_DATAVALUE_ENCODINGMASK_VARIANT){ } */
-        retval = UA_STATUSCODE_BADWRITENOTSUPPORTED;
-        break;
-
-    case UA_ATTRIBUTEID_NODECLASS:
-        /* if(writeValue->value.encodingMask == UA_DATAVALUE_ENCODINGMASK_VARIANT){ } */
-        retval = UA_STATUSCODE_BADWRITENOTSUPPORTED;
-        break;
-
-    case UA_ATTRIBUTEID_BROWSENAME:
-        /* if(writeValue->value.encodingMask == UA_DATAVALUE_ENCODINGMASK_VARIANT){} */
-        retval = UA_STATUSCODE_BADWRITENOTSUPPORTED;
-        break;
-
-    case UA_ATTRIBUTEID_DISPLAYNAME:
-        /* if(writeValue->value.encodingMask == UA_DATAVALUE_ENCODINGMASK_VARIANT){} */
-        retval = UA_STATUSCODE_BADWRITENOTSUPPORTED;
-        break;
-
-    case UA_ATTRIBUTEID_DESCRIPTION:
-        /* if(writeValue->value.encodingMask == UA_DATAVALUE_ENCODINGMASK_VARIANT){} */
-        retval = UA_STATUSCODE_BADWRITENOTSUPPORTED;
-        break;
-
-    case UA_ATTRIBUTEID_WRITEMASK:
-        /* if(writeValue->value.encodingMask == UA_DATAVALUE_ENCODINGMASK_VARIANT){} */
-        retval = UA_STATUSCODE_BADWRITENOTSUPPORTED;
-        break;
-
-    case UA_ATTRIBUTEID_USERWRITEMASK:
-        /* if(writeValue->value.encodingMask == UA_DATAVALUE_ENCODINGMASK_VARIANT){} */
-        retval = UA_STATUSCODE_BADWRITENOTSUPPORTED;
-        break;
-
-    case UA_ATTRIBUTEID_ISABSTRACT:
-
-        /* if(writeValue->value.encodingMask == UA_DATAVALUE_ENCODINGMASK_VARIANT){} */
-        retval = UA_STATUSCODE_BADWRITENOTSUPPORTED;
-        break;
-
-    case UA_ATTRIBUTEID_SYMMETRIC:
-        /* if(writeValue->value.encodingMask == UA_DATAVALUE_ENCODINGMASK_VARIANT){} */
-        retval = UA_STATUSCODE_BADWRITENOTSUPPORTED;
-        break;
-
-    case UA_ATTRIBUTEID_INVERSENAME:
-        /* if(writeValue->value.encodingMask == UA_DATAVALUE_ENCODINGMASK_VARIANT){} */
-        retval = UA_STATUSCODE_BADWRITENOTSUPPORTED;
-        break;
-
-    case UA_ATTRIBUTEID_CONTAINSNOLOOPS:
-        /* if(writeValue->value.encodingMask == UA_DATAVALUE_ENCODINGMASK_VARIANT){} */
-        retval = UA_STATUSCODE_BADWRITENOTSUPPORTED;
-        break;
-
-    case UA_ATTRIBUTEID_EVENTNOTIFIER:
-        /* if(writeValue->value.encodingMask == UA_DATAVALUE_ENCODINGMASK_VARIANT){} */
-        retval = UA_STATUSCODE_BADWRITENOTSUPPORTED;
-        break;
-
-    case UA_ATTRIBUTEID_VALUE:
-        if(writeValue->value.encodingMask == UA_DATAVALUE_ENCODINGMASK_VARIANT) {
-            retval |= UA_Variant_copy(&writeValue->value.value, &((UA_VariableNode *)node)->value); // todo: zero-copy
-        }
-        break;
-
-
-    case UA_ATTRIBUTEID_DATATYPE:
-        /* if(writeValue->value.encodingMask == UA_DATAVALUE_ENCODINGMASK_VARIANT){} */
-        retval = UA_STATUSCODE_BADWRITENOTSUPPORTED;
-        break;
-
-    case UA_ATTRIBUTEID_VALUERANK:
-        /* if(writeValue->value.encodingMask == UA_DATAVALUE_ENCODINGMASK_VARIANT){} */
-        retval = UA_STATUSCODE_BADWRITENOTSUPPORTED;
-        break;
-
-    case UA_ATTRIBUTEID_ARRAYDIMENSIONS:
-        /* if(writeValue->value.encodingMask == UA_DATAVALUE_ENCODINGMASK_VARIANT){} */
-        retval = UA_STATUSCODE_BADWRITENOTSUPPORTED;
-        break;
-
-    case UA_ATTRIBUTEID_ACCESSLEVEL:
-        /* if(writeValue->value.encodingMask == UA_DATAVALUE_ENCODINGMASK_VARIANT){} */
-        retval = UA_STATUSCODE_BADWRITENOTSUPPORTED;
-        break;
-
-    case UA_ATTRIBUTEID_USERACCESSLEVEL:
-        /* if(writeValue->value.encodingMask == UA_DATAVALUE_ENCODINGMASK_VARIANT){} */
-        retval = UA_STATUSCODE_BADWRITENOTSUPPORTED;
-        break;
-
-    case UA_ATTRIBUTEID_MINIMUMSAMPLINGINTERVAL:
-        /* if(writeValue->value.encodingMask == UA_DATAVALUE_ENCODINGMASK_VARIANT){} */
-        retval = UA_STATUSCODE_BADWRITENOTSUPPORTED;
-        break;
-
-    case UA_ATTRIBUTEID_HISTORIZING:
-        /* if(writeValue->value.encodingMask == UA_DATAVALUE_ENCODINGMASK_VARIANT){} */
-        retval = UA_STATUSCODE_BADWRITENOTSUPPORTED;
-        break;
-
-    case UA_ATTRIBUTEID_EXECUTABLE:
-        /* if(writeValue->value.encodingMask == UA_DATAVALUE_ENCODINGMASK_VARIANT){} */
-        retval = UA_STATUSCODE_BADWRITENOTSUPPORTED;
-        break;
-
-    case UA_ATTRIBUTEID_USEREXECUTABLE:
-        /* if(writeValue->value.encodingMask == UA_DATAVALUE_ENCODINGMASK_VARIANT){} */
-        retval = UA_STATUSCODE_BADWRITENOTSUPPORTED;
-        break;
-
-    default:
-        retval = UA_STATUSCODE_BADATTRIBUTEIDINVALID;
-        break;
-    }
-
-    open62541NodeStore_releaseManagedNode(node);
-    return retval;
+	open62541NodeStore_releaseManagedNode(node);
+	return retval;
 
 }
-UA_Int32 UA_EXPORT open62541NodeStore_WriteNodes(UA_WriteValue *writeValues,
+UA_Int32 UA_EXPORT open62541NodeStore_WriteNodes(
+		const UA_RequestHeader *requestHeader, UA_WriteValue *writeValues,
 		UA_UInt32 *indices, UA_UInt32 indicesSize,
-		UA_StatusCode *writeNodesResults, UA_DiagnosticInfo *diagnosticInfo){
+		UA_StatusCode *writeNodesResults, UA_DiagnosticInfo *diagnosticInfo) {
 	open62541NodeStore *nodestore = UA_NULL;
 	nodestore = open62541NodeStore_getNodeStore();
-	if(nodestore == UA_NULL){
+	if (nodestore == UA_NULL) {
 		return UA_STATUSCODE_BADINTERNALERROR;
 	}
 
-	for(UA_UInt32 i =0; i<indicesSize; i++){
-		writeNodesResults[indices[i]] =  Service_Write_writeNode(open62541NodeStore_getNodeStore(),&writeValues[indices[i]]);
+	for (UA_UInt32 i = 0; i < indicesSize; i++) {
+		writeNodesResults[indices[i]] = Service_Write_writeNode(
+				open62541NodeStore_getNodeStore(), &writeValues[indices[i]]);
 	}
 	return UA_STATUSCODE_GOOD; //
 }

+ 3 - 3
src/server/nodestore/open62541_nodestore_nodemanagement.c

@@ -159,7 +159,7 @@ void open62541Nodestore_getNewNodeId(UA_ExpandedNodeId *requestedNodeId){
 	return;
 }
 
-UA_Int32 open62541NodeStore_addReferences(UA_AddReferencesItem* referencesToAdd,
+UA_Int32 open62541NodeStore_AddReferences(const UA_RequestHeader *requestHeader, UA_AddReferencesItem* referencesToAdd,
 		UA_UInt32 *indices,UA_UInt32 indicesSize, UA_StatusCode *addReferencesResults,
 		UA_DiagnosticInfo *diagnosticInfos)
 {
@@ -199,7 +199,7 @@ UA_Int32 open62541NodeStore_addReferences(UA_AddReferencesItem* referencesToAdd,
 UA_Boolean isRootNode(UA_NodeId *nodeId){
 	return nodeId->identifierType == UA_NODEIDTYPE_NUMERIC && nodeId->namespaceIndex == 0 && nodeId->identifier.numeric == 84;
 }
-UA_Int32 open62541NodeStore_AddNodes(UA_AddNodesItem *nodesToAdd,UA_UInt32 *indices,
+UA_Int32 open62541NodeStore_AddNodes(const UA_RequestHeader *requestHeader,UA_AddNodesItem *nodesToAdd,UA_UInt32 *indices,
 		UA_UInt32 indicesSize, UA_AddNodesResult* addNodesResults,
 		UA_DiagnosticInfo *diagnosticInfos){
 
@@ -307,7 +307,7 @@ UA_Int32 open62541NodeStore_AddNodes(UA_AddNodesItem *nodesToAdd,UA_UInt32 *indi
 			UA_UInt32 indSize = 1;
 			UA_StatusCode result;
 			UA_DiagnosticInfo diagnosticInfo;
-			open62541NodeStore_addReferences(&addRefItem, &ind, indSize,
+			open62541NodeStore_AddReferences(requestHeader, &addRefItem, &ind, indSize,
 					&result, &diagnosticInfo);
 		}
 

+ 1 - 1
src/server/nodestore/open62541_nodestore_view.c

@@ -199,7 +199,7 @@ static void NodeStore_Browse_getBrowseResult(open62541NodeStore         *ns,
     UA_Array_delete(relevantReferenceTypes, relevantReferenceTypesCount, &UA_[UA_NODEID]);
 }
 
-UA_Int32 open62541NodeStore_BrowseNodes(UA_BrowseDescription *browseDescriptions,UA_UInt32 *indices,UA_UInt32 indicesSize, UA_UInt32 requestedMaxReferencesPerNode,
+UA_Int32 open62541NodeStore_BrowseNodes(const UA_RequestHeader *requestHeader,UA_BrowseDescription *browseDescriptions,UA_UInt32 *indices,UA_UInt32 indicesSize, UA_UInt32 requestedMaxReferencesPerNode,
 		UA_BrowseResult *browseResults,
 		UA_DiagnosticInfo *diagnosticInfos){
 

+ 5 - 2
src/server/ua_server.c

@@ -22,7 +22,8 @@ void addSingleReference(UA_Namespace *namespace,
 	UA_UInt32 indicesSize = 1;
 	UA_DiagnosticInfo diagnosticInfo;
 	UA_StatusCode result;
-	namespace->nodeStore->addReferences(addReferencesItem, &indices,
+	UA_RequestHeader tmpRequestHeader;
+	namespace->nodeStore->addReferences(&tmpRequestHeader,addReferencesItem, &indices,
 			indicesSize, &result, &diagnosticInfo);
 }
 void addSingleNode(UA_Namespace *namespace, UA_AddNodesItem *addNodesItem) {
@@ -30,7 +31,9 @@ void addSingleNode(UA_Namespace *namespace, UA_AddNodesItem *addNodesItem) {
 	UA_UInt32 indicesSize = 1;
 	UA_DiagnosticInfo diagnosticInfo;
 	UA_AddNodesResult result;
-	namespace->nodeStore->addNodes(addNodesItem, &indices, indicesSize, &result,
+	UA_RequestHeader tmpRequestHeader;
+
+	namespace->nodeStore->addNodes(&tmpRequestHeader,addNodesItem, &indices, indicesSize, &result,
 			&diagnosticInfo);
 }
 

+ 2 - 3
src/server/ua_services_attribute.c

@@ -217,7 +217,6 @@ void Service_Read(UA_Server *server, UA_Session *session,
 		response->responseHeader.serviceResult = UA_STATUSCODE_BADNOTHINGTODO;
 		return;
 	}
-
 	if (UA_Array_new((void **) &response->results, request->nodesToReadSize,
 			&UA_[UA_DATAVALUE]) != UA_STATUSCODE_GOOD) {
 		response->responseHeader.serviceResult = UA_STATUSCODE_BADOUTOFMEMORY;
@@ -273,7 +272,7 @@ void Service_Read(UA_Server *server, UA_Session *session,
 				}
 			}
 			//call read for every namespace
-			tmpNamespace->nodeStore->readNodes(request->nodesToRead,
+			tmpNamespace->nodeStore->readNodes(&request->requestHeader, request->nodesToRead,
 					readValueIdIndices, numberOfFoundIndices[i],
 					response->results, request->timestampsToReturn,
 					response->diagnosticInfos);
@@ -362,7 +361,7 @@ void Service_Write(UA_Server *server, UA_Session *session,
 				}
 			}
 			//call read for every namespace
-			tmpNamespace->nodeStore->writeNodes(request->nodesToWrite,
+			tmpNamespace->nodeStore->writeNodes(&request->requestHeader,request->nodesToWrite,
 					writeValues, numberOfFoundIndices[i],
 					response->results,
 					response->diagnosticInfos);

+ 2 - 2
src/server/ua_services_nodemanagement.c

@@ -71,7 +71,7 @@ void Service_AddNodes(UA_Server *server, UA_Session *session,
 				}
 			}
 			//call read for every namespace
-			tmpNamespace->nodeStore->addNodes(request->nodesToAdd,
+			tmpNamespace->nodeStore->addNodes(&request->requestHeader,request->nodesToAdd,
 					addNodesIndices, numberOfFoundIndices[i],
 					response->results, response->diagnosticInfos);
 		}
@@ -149,7 +149,7 @@ void Service_AddReferences(UA_Server *server, UA_Session *session,
 				}
 			}
 			//call read for every namespace
-			tmpNamespace->nodeStore->addReferences(request->referencesToAdd,
+			tmpNamespace->nodeStore->addReferences(&request->requestHeader,request->referencesToAdd,
 					readValueIdIndices, numberOfFoundIndices[i],
 					response->results, response->diagnosticInfos);
 

+ 1 - 1
src/server/ua_services_view.c

@@ -56,7 +56,7 @@ void Service_Browse(UA_Server *server, UA_Session *session,
     	    	}
     	    }
     	    //call read for every namespace
-    		tmpNamespace->nodeStore->browseNodes(
+    		tmpNamespace->nodeStore->browseNodes(&request->requestHeader,
     				request->nodesToBrowse,
     				browseDescriptionIndices,
     				numberOfFoundIndices[i],