Просмотр исходного кода

external datasource interface - extracted the nodestore, moved read and browse implementation to nodestore

FlorianPalm лет назад: 10
Родитель
Сommit
6e6dbfb5c9

+ 7 - 5
CMakeLists.txt

@@ -19,7 +19,7 @@ set(lib_sources src/ua_types.c
                 ${PROJECT_BINARY_DIR}/src_generated/ua_namespace_0.c
                 src/ua_transport.c
                 ${PROJECT_BINARY_DIR}/src_generated/ua_transport_generated.c
-		src/ua_connection.c
+				src/ua_connection.c
                 src/ua_securechannel.c
                 src/ua_session.c
                 src/ua_util.c
@@ -27,7 +27,7 @@ set(lib_sources src/ua_types.c
                 src/server/ua_securechannel_manager.c
                 src/server/ua_session_manager.c
                 src/server/ua_namespace_manager.c
-		src/server/ua_server_binary.c
+				src/server/ua_server_binary.c
                 src/server/ua_services_attribute.c
                 src/server/ua_services_session.c
                 src/server/ua_services_discovery.c
@@ -35,7 +35,9 @@ set(lib_sources src/ua_types.c
                 src/server/ua_services_nodemanagement.c
                 src/server/ua_services_view.c
                 src/server/ua_services_monitoreditems.c
-		
+				src/server/nodestore/open62541_nodestore_view.c
+				src/server/nodestore/open62541_nodestore_attribute.c
+				src/server/nodestore/open62541_nodestore.c
                 ${headers}
                 ${generated_headers})
 
@@ -110,8 +112,8 @@ if(ENABLE_MULTITHREADING)
     find_package(Threads REQUIRED)
     list(APPEND lib_sources src/server/ua_nodestore_concurrent.c)
 else()
-    list(APPEND lib_sources src/server/ua_nodestore.c)
-    list(APPEND lib_sources src/server/ua_nodestoreExample.c)
+    list(APPEND lib_sources src/server/nodestore/ua_nodestore.c)
+    list(APPEND lib_sources src/server/nodestore/ua_nodestoreExample.c)
 endif()
 
 add_library(open62541-objects OBJECT ${lib_sources}) # static version that exports all symbols

+ 254 - 51
Makefile

@@ -101,6 +101,19 @@ depend:
 	$(CMAKE_COMMAND) -H$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 1
 .PHONY : depend
 
+#=============================================================================
+# Target rules for targets named exampleServer
+
+# Build rule for target.
+exampleServer: cmake_check_build_system
+	$(MAKE) -f CMakeFiles/Makefile2 exampleServer
+.PHONY : exampleServer
+
+# fast build rule for target.
+exampleServer/fast:
+	$(MAKE) -f CMakeFiles/exampleServer.dir/build.make CMakeFiles/exampleServer.dir/build
+.PHONY : exampleServer/fast
+
 #=============================================================================
 # Target rules for targets named open62541
 
@@ -127,77 +140,245 @@ open62541-objects/fast:
 	$(MAKE) -f CMakeFiles/open62541-objects.dir/build.make CMakeFiles/open62541-objects.dir/build
 .PHONY : open62541-objects/fast
 
-src/server/ua_namespace_manager.o: src/server/ua_namespace_manager.c.o
-.PHONY : src/server/ua_namespace_manager.o
+examples/logger_stdout.o: examples/logger_stdout.c.o
+.PHONY : examples/logger_stdout.o
 
 # target to build an object file
-src/server/ua_namespace_manager.c.o:
-	$(MAKE) -f CMakeFiles/open62541-objects.dir/build.make CMakeFiles/open62541-objects.dir/src/server/ua_namespace_manager.c.o
-.PHONY : src/server/ua_namespace_manager.c.o
+examples/logger_stdout.c.o:
+	$(MAKE) -f CMakeFiles/exampleServer.dir/build.make CMakeFiles/exampleServer.dir/examples/logger_stdout.c.o
+.PHONY : examples/logger_stdout.c.o
 
-src/server/ua_namespace_manager.i: src/server/ua_namespace_manager.c.i
-.PHONY : src/server/ua_namespace_manager.i
+examples/logger_stdout.i: examples/logger_stdout.c.i
+.PHONY : examples/logger_stdout.i
 
 # target to preprocess a source file
-src/server/ua_namespace_manager.c.i:
-	$(MAKE) -f CMakeFiles/open62541-objects.dir/build.make CMakeFiles/open62541-objects.dir/src/server/ua_namespace_manager.c.i
-.PHONY : src/server/ua_namespace_manager.c.i
+examples/logger_stdout.c.i:
+	$(MAKE) -f CMakeFiles/exampleServer.dir/build.make CMakeFiles/exampleServer.dir/examples/logger_stdout.c.i
+.PHONY : examples/logger_stdout.c.i
 
-src/server/ua_namespace_manager.s: src/server/ua_namespace_manager.c.s
-.PHONY : src/server/ua_namespace_manager.s
+examples/logger_stdout.s: examples/logger_stdout.c.s
+.PHONY : examples/logger_stdout.s
 
 # target to generate assembly for a file
-src/server/ua_namespace_manager.c.s:
-	$(MAKE) -f CMakeFiles/open62541-objects.dir/build.make CMakeFiles/open62541-objects.dir/src/server/ua_namespace_manager.c.s
-.PHONY : src/server/ua_namespace_manager.c.s
+examples/logger_stdout.c.s:
+	$(MAKE) -f CMakeFiles/exampleServer.dir/build.make CMakeFiles/exampleServer.dir/examples/logger_stdout.c.s
+.PHONY : examples/logger_stdout.c.s
+
+examples/networklayer_tcp.o: examples/networklayer_tcp.c.o
+.PHONY : examples/networklayer_tcp.o
+
+# target to build an object file
+examples/networklayer_tcp.c.o:
+	$(MAKE) -f CMakeFiles/exampleServer.dir/build.make CMakeFiles/exampleServer.dir/examples/networklayer_tcp.c.o
+.PHONY : examples/networklayer_tcp.c.o
+
+examples/networklayer_tcp.i: examples/networklayer_tcp.c.i
+.PHONY : examples/networklayer_tcp.i
 
-src/server/ua_nodestore.o: src/server/ua_nodestore.c.o
-.PHONY : src/server/ua_nodestore.o
+# target to preprocess a source file
+examples/networklayer_tcp.c.i:
+	$(MAKE) -f CMakeFiles/exampleServer.dir/build.make CMakeFiles/exampleServer.dir/examples/networklayer_tcp.c.i
+.PHONY : examples/networklayer_tcp.c.i
+
+examples/networklayer_tcp.s: examples/networklayer_tcp.c.s
+.PHONY : examples/networklayer_tcp.s
+
+# target to generate assembly for a file
+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
-src/server/ua_nodestore.c.o:
-	$(MAKE) -f CMakeFiles/open62541-objects.dir/build.make CMakeFiles/open62541-objects.dir/src/server/ua_nodestore.c.o
-.PHONY : src/server/ua_nodestore.c.o
+examples/nodestoreAccessExample.c.o:
+	$(MAKE) -f CMakeFiles/exampleServer.dir/build.make CMakeFiles/exampleServer.dir/examples/nodestoreAccessExample.c.o
+.PHONY : examples/nodestoreAccessExample.c.o
 
-src/server/ua_nodestore.i: src/server/ua_nodestore.c.i
-.PHONY : src/server/ua_nodestore.i
+examples/nodestoreAccessExample.i: examples/nodestoreAccessExample.c.i
+.PHONY : examples/nodestoreAccessExample.i
 
 # target to preprocess a source file
-src/server/ua_nodestore.c.i:
-	$(MAKE) -f CMakeFiles/open62541-objects.dir/build.make CMakeFiles/open62541-objects.dir/src/server/ua_nodestore.c.i
-.PHONY : src/server/ua_nodestore.c.i
+examples/nodestoreAccessExample.c.i:
+	$(MAKE) -f CMakeFiles/exampleServer.dir/build.make CMakeFiles/exampleServer.dir/examples/nodestoreAccessExample.c.i
+.PHONY : examples/nodestoreAccessExample.c.i
 
-src/server/ua_nodestore.s: src/server/ua_nodestore.c.s
-.PHONY : src/server/ua_nodestore.s
+examples/nodestoreAccessExample.s: examples/nodestoreAccessExample.c.s
+.PHONY : examples/nodestoreAccessExample.s
 
 # target to generate assembly for a file
-src/server/ua_nodestore.c.s:
-	$(MAKE) -f CMakeFiles/open62541-objects.dir/build.make CMakeFiles/open62541-objects.dir/src/server/ua_nodestore.c.s
-.PHONY : src/server/ua_nodestore.c.s
+examples/nodestoreAccessExample.c.s:
+	$(MAKE) -f CMakeFiles/exampleServer.dir/build.make CMakeFiles/exampleServer.dir/examples/nodestoreAccessExample.c.s
+.PHONY : examples/nodestoreAccessExample.c.s
 
-src/server/ua_nodestoreExample.o: src/server/ua_nodestoreExample.c.o
-.PHONY : src/server/ua_nodestoreExample.o
+examples/opcuaServer.o: examples/opcuaServer.c.o
+.PHONY : examples/opcuaServer.o
 
 # target to build an object file
-src/server/ua_nodestoreExample.c.o:
-	$(MAKE) -f CMakeFiles/open62541-objects.dir/build.make CMakeFiles/open62541-objects.dir/src/server/ua_nodestoreExample.c.o
-.PHONY : src/server/ua_nodestoreExample.c.o
+examples/opcuaServer.c.o:
+	$(MAKE) -f CMakeFiles/exampleServer.dir/build.make CMakeFiles/exampleServer.dir/examples/opcuaServer.c.o
+.PHONY : examples/opcuaServer.c.o
 
-src/server/ua_nodestoreExample.i: src/server/ua_nodestoreExample.c.i
-.PHONY : src/server/ua_nodestoreExample.i
+examples/opcuaServer.i: examples/opcuaServer.c.i
+.PHONY : examples/opcuaServer.i
 
 # target to preprocess a source file
-src/server/ua_nodestoreExample.c.i:
-	$(MAKE) -f CMakeFiles/open62541-objects.dir/build.make CMakeFiles/open62541-objects.dir/src/server/ua_nodestoreExample.c.i
-.PHONY : src/server/ua_nodestoreExample.c.i
+examples/opcuaServer.c.i:
+	$(MAKE) -f CMakeFiles/exampleServer.dir/build.make CMakeFiles/exampleServer.dir/examples/opcuaServer.c.i
+.PHONY : examples/opcuaServer.c.i
 
-src/server/ua_nodestoreExample.s: src/server/ua_nodestoreExample.c.s
-.PHONY : src/server/ua_nodestoreExample.s
+examples/opcuaServer.s: examples/opcuaServer.c.s
+.PHONY : examples/opcuaServer.s
 
 # target to generate assembly for a file
-src/server/ua_nodestoreExample.c.s:
-	$(MAKE) -f CMakeFiles/open62541-objects.dir/build.make CMakeFiles/open62541-objects.dir/src/server/ua_nodestoreExample.c.s
-.PHONY : src/server/ua_nodestoreExample.c.s
+examples/opcuaServer.c.s:
+	$(MAKE) -f CMakeFiles/exampleServer.dir/build.make CMakeFiles/exampleServer.dir/examples/opcuaServer.c.s
+.PHONY : examples/opcuaServer.c.s
+
+src/server/nodestore/open62541_nodestore.o: src/server/nodestore/open62541_nodestore.c.o
+.PHONY : src/server/nodestore/open62541_nodestore.o
+
+# target to build an object file
+src/server/nodestore/open62541_nodestore.c.o:
+	$(MAKE) -f CMakeFiles/open62541-objects.dir/build.make CMakeFiles/open62541-objects.dir/src/server/nodestore/open62541_nodestore.c.o
+.PHONY : src/server/nodestore/open62541_nodestore.c.o
+
+src/server/nodestore/open62541_nodestore.i: src/server/nodestore/open62541_nodestore.c.i
+.PHONY : src/server/nodestore/open62541_nodestore.i
+
+# target to preprocess a source file
+src/server/nodestore/open62541_nodestore.c.i:
+	$(MAKE) -f CMakeFiles/open62541-objects.dir/build.make CMakeFiles/open62541-objects.dir/src/server/nodestore/open62541_nodestore.c.i
+.PHONY : src/server/nodestore/open62541_nodestore.c.i
+
+src/server/nodestore/open62541_nodestore.s: src/server/nodestore/open62541_nodestore.c.s
+.PHONY : src/server/nodestore/open62541_nodestore.s
+
+# target to generate assembly for a file
+src/server/nodestore/open62541_nodestore.c.s:
+	$(MAKE) -f CMakeFiles/open62541-objects.dir/build.make CMakeFiles/open62541-objects.dir/src/server/nodestore/open62541_nodestore.c.s
+.PHONY : src/server/nodestore/open62541_nodestore.c.s
+
+src/server/nodestore/open62541_nodestore_attribute.o: src/server/nodestore/open62541_nodestore_attribute.c.o
+.PHONY : src/server/nodestore/open62541_nodestore_attribute.o
+
+# target to build an object file
+src/server/nodestore/open62541_nodestore_attribute.c.o:
+	$(MAKE) -f CMakeFiles/open62541-objects.dir/build.make CMakeFiles/open62541-objects.dir/src/server/nodestore/open62541_nodestore_attribute.c.o
+.PHONY : src/server/nodestore/open62541_nodestore_attribute.c.o
+
+src/server/nodestore/open62541_nodestore_attribute.i: src/server/nodestore/open62541_nodestore_attribute.c.i
+.PHONY : src/server/nodestore/open62541_nodestore_attribute.i
+
+# target to preprocess a source file
+src/server/nodestore/open62541_nodestore_attribute.c.i:
+	$(MAKE) -f CMakeFiles/open62541-objects.dir/build.make CMakeFiles/open62541-objects.dir/src/server/nodestore/open62541_nodestore_attribute.c.i
+.PHONY : src/server/nodestore/open62541_nodestore_attribute.c.i
+
+src/server/nodestore/open62541_nodestore_attribute.s: src/server/nodestore/open62541_nodestore_attribute.c.s
+.PHONY : src/server/nodestore/open62541_nodestore_attribute.s
+
+# target to generate assembly for a file
+src/server/nodestore/open62541_nodestore_attribute.c.s:
+	$(MAKE) -f CMakeFiles/open62541-objects.dir/build.make CMakeFiles/open62541-objects.dir/src/server/nodestore/open62541_nodestore_attribute.c.s
+.PHONY : src/server/nodestore/open62541_nodestore_attribute.c.s
+
+src/server/nodestore/open62541_nodestore_view.o: src/server/nodestore/open62541_nodestore_view.c.o
+.PHONY : src/server/nodestore/open62541_nodestore_view.o
+
+# target to build an object file
+src/server/nodestore/open62541_nodestore_view.c.o:
+	$(MAKE) -f CMakeFiles/open62541-objects.dir/build.make CMakeFiles/open62541-objects.dir/src/server/nodestore/open62541_nodestore_view.c.o
+.PHONY : src/server/nodestore/open62541_nodestore_view.c.o
+
+src/server/nodestore/open62541_nodestore_view.i: src/server/nodestore/open62541_nodestore_view.c.i
+.PHONY : src/server/nodestore/open62541_nodestore_view.i
+
+# target to preprocess a source file
+src/server/nodestore/open62541_nodestore_view.c.i:
+	$(MAKE) -f CMakeFiles/open62541-objects.dir/build.make CMakeFiles/open62541-objects.dir/src/server/nodestore/open62541_nodestore_view.c.i
+.PHONY : src/server/nodestore/open62541_nodestore_view.c.i
+
+src/server/nodestore/open62541_nodestore_view.s: src/server/nodestore/open62541_nodestore_view.c.s
+.PHONY : src/server/nodestore/open62541_nodestore_view.s
+
+# target to generate assembly for a file
+src/server/nodestore/open62541_nodestore_view.c.s:
+	$(MAKE) -f CMakeFiles/open62541-objects.dir/build.make CMakeFiles/open62541-objects.dir/src/server/nodestore/open62541_nodestore_view.c.s
+.PHONY : src/server/nodestore/open62541_nodestore_view.c.s
+
+src/server/nodestore/ua_nodestore.o: src/server/nodestore/ua_nodestore.c.o
+.PHONY : src/server/nodestore/ua_nodestore.o
+
+# target to build an object file
+src/server/nodestore/ua_nodestore.c.o:
+	$(MAKE) -f CMakeFiles/open62541-objects.dir/build.make CMakeFiles/open62541-objects.dir/src/server/nodestore/ua_nodestore.c.o
+.PHONY : src/server/nodestore/ua_nodestore.c.o
+
+src/server/nodestore/ua_nodestore.i: src/server/nodestore/ua_nodestore.c.i
+.PHONY : src/server/nodestore/ua_nodestore.i
+
+# target to preprocess a source file
+src/server/nodestore/ua_nodestore.c.i:
+	$(MAKE) -f CMakeFiles/open62541-objects.dir/build.make CMakeFiles/open62541-objects.dir/src/server/nodestore/ua_nodestore.c.i
+.PHONY : src/server/nodestore/ua_nodestore.c.i
+
+src/server/nodestore/ua_nodestore.s: src/server/nodestore/ua_nodestore.c.s
+.PHONY : src/server/nodestore/ua_nodestore.s
+
+# target to generate assembly for a file
+src/server/nodestore/ua_nodestore.c.s:
+	$(MAKE) -f CMakeFiles/open62541-objects.dir/build.make CMakeFiles/open62541-objects.dir/src/server/nodestore/ua_nodestore.c.s
+.PHONY : src/server/nodestore/ua_nodestore.c.s
+
+src/server/nodestore/ua_nodestoreExample.o: src/server/nodestore/ua_nodestoreExample.c.o
+.PHONY : src/server/nodestore/ua_nodestoreExample.o
+
+# target to build an object file
+src/server/nodestore/ua_nodestoreExample.c.o:
+	$(MAKE) -f CMakeFiles/open62541-objects.dir/build.make CMakeFiles/open62541-objects.dir/src/server/nodestore/ua_nodestoreExample.c.o
+.PHONY : src/server/nodestore/ua_nodestoreExample.c.o
+
+src/server/nodestore/ua_nodestoreExample.i: src/server/nodestore/ua_nodestoreExample.c.i
+.PHONY : src/server/nodestore/ua_nodestoreExample.i
+
+# target to preprocess a source file
+src/server/nodestore/ua_nodestoreExample.c.i:
+	$(MAKE) -f CMakeFiles/open62541-objects.dir/build.make CMakeFiles/open62541-objects.dir/src/server/nodestore/ua_nodestoreExample.c.i
+.PHONY : src/server/nodestore/ua_nodestoreExample.c.i
+
+src/server/nodestore/ua_nodestoreExample.s: src/server/nodestore/ua_nodestoreExample.c.s
+.PHONY : src/server/nodestore/ua_nodestoreExample.s
+
+# target to generate assembly for a file
+src/server/nodestore/ua_nodestoreExample.c.s:
+	$(MAKE) -f CMakeFiles/open62541-objects.dir/build.make CMakeFiles/open62541-objects.dir/src/server/nodestore/ua_nodestoreExample.c.s
+.PHONY : src/server/nodestore/ua_nodestoreExample.c.s
+
+src/server/ua_namespace_manager.o: src/server/ua_namespace_manager.c.o
+.PHONY : src/server/ua_namespace_manager.o
+
+# target to build an object file
+src/server/ua_namespace_manager.c.o:
+	$(MAKE) -f CMakeFiles/open62541-objects.dir/build.make CMakeFiles/open62541-objects.dir/src/server/ua_namespace_manager.c.o
+.PHONY : src/server/ua_namespace_manager.c.o
+
+src/server/ua_namespace_manager.i: src/server/ua_namespace_manager.c.i
+.PHONY : src/server/ua_namespace_manager.i
+
+# target to preprocess a source file
+src/server/ua_namespace_manager.c.i:
+	$(MAKE) -f CMakeFiles/open62541-objects.dir/build.make CMakeFiles/open62541-objects.dir/src/server/ua_namespace_manager.c.i
+.PHONY : src/server/ua_namespace_manager.c.i
+
+src/server/ua_namespace_manager.s: src/server/ua_namespace_manager.c.s
+.PHONY : src/server/ua_namespace_manager.s
+
+# target to generate assembly for a file
+src/server/ua_namespace_manager.c.s:
+	$(MAKE) -f CMakeFiles/open62541-objects.dir/build.make CMakeFiles/open62541-objects.dir/src/server/ua_namespace_manager.c.s
+.PHONY : src/server/ua_namespace_manager.c.s
 
 src/server/ua_securechannel_manager.o: src/server/ua_securechannel_manager.c.o
 .PHONY : src/server/ua_securechannel_manager.o
@@ -710,18 +891,40 @@ help:
 	@echo "... clean"
 	@echo "... depend"
 	@echo "... edit_cache"
+	@echo "... exampleServer"
 	@echo "... open62541"
 	@echo "... open62541-objects"
 	@echo "... rebuild_cache"
+	@echo "... examples/logger_stdout.o"
+	@echo "... examples/logger_stdout.i"
+	@echo "... examples/logger_stdout.s"
+	@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"
+	@echo "... src/server/nodestore/open62541_nodestore.o"
+	@echo "... src/server/nodestore/open62541_nodestore.i"
+	@echo "... src/server/nodestore/open62541_nodestore.s"
+	@echo "... src/server/nodestore/open62541_nodestore_attribute.o"
+	@echo "... src/server/nodestore/open62541_nodestore_attribute.i"
+	@echo "... src/server/nodestore/open62541_nodestore_attribute.s"
+	@echo "... src/server/nodestore/open62541_nodestore_view.o"
+	@echo "... src/server/nodestore/open62541_nodestore_view.i"
+	@echo "... src/server/nodestore/open62541_nodestore_view.s"
+	@echo "... src/server/nodestore/ua_nodestore.o"
+	@echo "... src/server/nodestore/ua_nodestore.i"
+	@echo "... src/server/nodestore/ua_nodestore.s"
+	@echo "... src/server/nodestore/ua_nodestoreExample.o"
+	@echo "... src/server/nodestore/ua_nodestoreExample.i"
+	@echo "... src/server/nodestore/ua_nodestoreExample.s"
 	@echo "... src/server/ua_namespace_manager.o"
 	@echo "... src/server/ua_namespace_manager.i"
 	@echo "... src/server/ua_namespace_manager.s"
-	@echo "... src/server/ua_nodestore.o"
-	@echo "... src/server/ua_nodestore.i"
-	@echo "... src/server/ua_nodestore.s"
-	@echo "... src/server/ua_nodestoreExample.o"
-	@echo "... src/server/ua_nodestoreExample.i"
-	@echo "... src/server/ua_nodestoreExample.s"
 	@echo "... src/server/ua_securechannel_manager.o"
 	@echo "... src/server/ua_securechannel_manager.i"
 	@echo "... src/server/ua_securechannel_manager.s"

+ 12 - 12
examples/nodestoreAccessExample.c

@@ -82,7 +82,7 @@ UA_Int32 initMyNode()
 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_SUCCESS;
+	UA_Int32 retval = UA_STATUSCODE_GOOD;;
 	for(UA_UInt32 i = 0; i<readValueIdsSize; i++){
 		id = &readValueIds[readValueIdIndices[i]];
 
@@ -246,7 +246,7 @@ UA_Int32 readNodes(UA_ReadValueId * readValueIds, UA_UInt32 *readValueIdIndices,
 			break;
 		}
 
-		if(retval != UA_SUCCESS) {
+		if(retval != UA_STATUSCODE_GOOD) {
 			v[readValueIdIndices[i]].encodingMask = UA_DATAVALUE_ENCODINGMASK_STATUSCODE;
 			v[readValueIdIndices[i]].status       = UA_STATUSCODE_BADNOTREADABLE;
 		}
@@ -257,36 +257,36 @@ UA_Int32 readNodes(UA_ReadValueId * readValueIds, UA_UInt32 *readValueIdIndices,
 
 UA_Int32 writeNodes(UA_WriteValue *writeValues,UA_UInt32 *indices ,UA_UInt32 indicesSize, UA_StatusCode *writeNodesResults, UA_DiagnosticInfo *diagnosticInfos)
 {
-    UA_Int32 retval = UA_SUCCESS;
+    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_ERROR;
+			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_ERROR;
+			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_ERROR;
+			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_ERROR;
+			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_ERROR;
+			return UA_STATUSCODE_BADINTERNALERROR;
 			break;
 
 		case UA_ATTRIBUTEID_WRITEMASK:
@@ -296,7 +296,7 @@ UA_Int32 writeNodes(UA_WriteValue *writeValues,UA_UInt32 *indices ,UA_UInt32 ind
 		case UA_ATTRIBUTEID_USERWRITEMASK:
 			/* if(writeValue->value.encodingMask == UA_DATAVALUE_ENCODINGMASK_VARIANT){} */
 			writeNodesResults[indices[i]] = UA_STATUSCODE_BADWRITENOTSUPPORTED;
-			return UA_ERROR;
+			return UA_STATUSCODE_BADINTERNALERROR;
 			break;
 
 		case UA_ATTRIBUTEID_ISABSTRACT:
@@ -309,7 +309,7 @@ UA_Int32 writeNodes(UA_WriteValue *writeValues,UA_UInt32 *indices ,UA_UInt32 ind
 		case UA_ATTRIBUTEID_SYMMETRIC:
 			/* if(writeValue->value.encodingMask == UA_DATAVALUE_ENCODINGMASK_VARIANT){} */
 			writeNodesResults[indices[i]] = UA_STATUSCODE_BADWRITENOTSUPPORTED;
-			return UA_ERROR;
+			return UA_STATUSCODE_BADINTERNALERROR;
 			break;
 
 		case UA_ATTRIBUTEID_INVERSENAME:
@@ -320,7 +320,7 @@ UA_Int32 writeNodes(UA_WriteValue *writeValues,UA_UInt32 *indices ,UA_UInt32 ind
 		case UA_ATTRIBUTEID_CONTAINSNOLOOPS:
 			/* if(writeValue->value.encodingMask == UA_DATAVALUE_ENCODINGMASK_VARIANT){} */
 			writeNodesResults[indices[i]] = UA_STATUSCODE_BADWRITENOTSUPPORTED;
-			return UA_ERROR;
+			return UA_STATUSCODE_BADINTERNALERROR;
 			break;
 
 		case UA_ATTRIBUTEID_EVENTNOTIFIER:
@@ -359,7 +359,7 @@ UA_Int32 writeNodes(UA_WriteValue *writeValues,UA_UInt32 *indices ,UA_UInt32 ind
 		case UA_ATTRIBUTEID_USERACCESSLEVEL:
 			/* if(writeValue->value.encodingMask == UA_DATAVALUE_ENCODINGMASK_VARIANT){} */
 			writeNodesResults[indices[i]]   = UA_STATUSCODE_BADWRITENOTSUPPORTED;
-			return UA_ERROR;
+			return UA_STATUSCODE_BADINTERNALERROR;
 			break;
 
 		case UA_ATTRIBUTEID_MINIMUMSAMPLINGINTERVAL:

+ 6 - 3
examples/opcuaServer.c

@@ -17,10 +17,11 @@
 #include "networklayer_tcp.h"
 
 #include "nodestoreAccessExample.h"
-#include "../src/server/ua_nodestore.h"
+#include "../src/server/nodestore/ua_nodestore.h"
 #include "../src/server/ua_namespace_manager.h"
+#include "../src/server/nodestore/open62541_nodestore.h"
 UA_Boolean running = UA_TRUE;
-UA_Boolean running = 1;
+
 
 void stopHandler(int sign) {
 	running = 0;
@@ -65,7 +66,9 @@ int main(int argc, char** argv) {
 	UA_Server_addNamespace(&server,0,&newNodeStore);
 
 	initMyNode();
-	UA_NodeStore_registerReadNodesOperation(&newNodeStore,readNodes);
+	UA_NodeStore_registerReadNodesOperation(&newNodeStore,open62541NodeStore_ReadNodes);
+	UA_NodeStore_registerBrowseNodesOperation(&newNodeStore,open62541NodeStore_BrowseNodes);
+
 	UA_NodeStore_registerWriteNodesOperation(&newNodeStore,writeNodes);
 
 	Logger_Stdout_init(&server.logger);

src/server/ua_nodestore.c → src/server/nodestore/ua_nodestore.c


src/server/ua_nodestore.h → src/server/nodestore/ua_nodestore.h


src/server/ua_nodestoreExample.c → src/server/nodestore/ua_nodestoreExample.c


src/server/ua_nodestoreExample.h → src/server/nodestore/ua_nodestoreExample.h


+ 1 - 1
src/server/ua_namespace_manager.h

@@ -8,7 +8,7 @@
 #ifndef UA_NAMESPACE_MANAGER_H_
 #define UA_NAMESPACE_MANAGER_H_
 #include "ua_server.h"
-#include "ua_nodestore.h"
+#include "nodestore/ua_nodestore.h"
 
 
 void UA_NamespaceManager_new(UA_NamespaceManager** namespaceManager);

+ 1 - 1
src/server/ua_server.c

@@ -1,5 +1,5 @@
 #include "ua_server.h"
-#include "ua_nodestoreExample.h"
+#include "nodestore/ua_nodestoreExample.h"
 #include "ua_services_internal.h" // AddReferences
 #include "ua_namespace_0.h"
 #include "ua_securechannel_manager.h"

+ 2 - 2
src/server/ua_services_attribute.c

@@ -1,7 +1,7 @@
 #include "ua_services.h"
-#include "ua_nodestoreExample.h"
+#include "nodestore/ua_nodestoreExample.h"
 #include "ua_statuscodes.h"
-#include "ua_nodestore.h"
+#include "nodestore/ua_nodestore.h"
 #include "ua_namespace_manager.h"
 #include "ua_namespace_0.h"
 #include "ua_util.h"

+ 1 - 1
src/server/ua_services_internal.h

@@ -4,7 +4,7 @@
  */
 
 #include "ua_session.h"
-#include "ua_nodestore.h"
+#include "nodestore/ua_nodestore.h"
 #include "ua_types_generated.h"
 
 /* @brief Add a reference (and the inverse reference to the target node).

+ 1 - 1
src/server/ua_services_nodemanagement.c

@@ -1,7 +1,7 @@
 #include "ua_services.h"
 #include "ua_namespace_0.h"
 #include "ua_statuscodes.h"
-#include "ua_nodestoreExample.h"
+#include "nodestore/ua_nodestoreExample.h"
 #include "ua_services_internal.h"
 #include "ua_session.h"
 #include "ua_util.h"

+ 5 - 208
src/server/ua_services_view.c

@@ -1,202 +1,16 @@
 #include "ua_services.h"
 #include "ua_statuscodes.h"
-#include "ua_nodestoreExample.h"
+#include "nodestore/ua_nodestoreExample.h"
 #include "ua_namespace_0.h"
 #include "ua_util.h"
 #include "ua_namespace_manager.h"
-UA_Int32 Service_Browse_getReferenceDescription(UA_NodeStoreExample *ns, UA_ReferenceNode *reference,
-                                                UA_UInt32 nodeClassMask, UA_UInt32 resultMask,
-                                                UA_ReferenceDescription *referenceDescription) {
-    const UA_Node *foundNode;
-    if(UA_NodeStoreExample_get(ns, &reference->targetId.nodeId, &foundNode) != UA_STATUSCODE_GOOD)
-    	return UA_STATUSCODE_BADINTERNALERROR;
-
-    UA_NodeId_copy(&foundNode->nodeId, &referenceDescription->nodeId.nodeId);
-    //TODO ExpandedNodeId is a mockup
-    referenceDescription->nodeId.serverIndex = 0;
-    referenceDescription->nodeId.namespaceUri.length = -1;
-
-    /* UA_UInt32 mask = 0; */
-    /* for(mask = 0x01;mask <= 0x40;mask *= 2) { */
-    /*     switch(mask & (resultMask)) { */
-    if(resultMask & UA_BROWSERESULTMASK_REFERENCETYPEID)
-        UA_NodeId_copy(&reference->referenceTypeId, &referenceDescription->referenceTypeId);
-    if(resultMask & UA_BROWSERESULTMASK_ISFORWARD)
-        referenceDescription->isForward = !reference->isInverse;
-    if(resultMask & UA_BROWSERESULTMASK_NODECLASS)
-        UA_NodeClass_copy(&foundNode->nodeClass, &referenceDescription->nodeClass);
-    if(resultMask & UA_BROWSERESULTMASK_BROWSENAME)
-        UA_QualifiedName_copy(&foundNode->browseName, &referenceDescription->browseName);
-    if(resultMask & UA_BROWSERESULTMASK_DISPLAYNAME)
-        UA_LocalizedText_copy(&foundNode->displayName, &referenceDescription->displayName);
-    if(resultMask & UA_BROWSERESULTMASK_TYPEDEFINITION) {
-        if(foundNode->nodeClass != UA_NODECLASS_OBJECT &&
-           foundNode->nodeClass != UA_NODECLASS_VARIABLE)
-            goto end;
-        
-        for(UA_Int32 i = 0;i < foundNode->referencesSize;i++) {
-            UA_ReferenceNode *ref = &foundNode->references[i];
-            if(ref->referenceTypeId.identifier.numeric == 40 /* hastypedefinition */) {
-                UA_ExpandedNodeId_copy(&ref->targetId, &referenceDescription->typeDefinition);
-                goto end;
-            }
-        }
-    }
- end:
-    UA_NodeStoreExample_releaseManagedNode(foundNode);
-    return UA_STATUSCODE_GOOD;
-}
-
-/* singly-linked list */
-struct SubRefTypeId {
-    UA_NodeId id;
-    SLIST_ENTRY(SubRefTypeId) next;
-};
-SLIST_HEAD(SubRefTypeIdList, SubRefTypeId);
-
-static UA_UInt32 walkReferenceTree(UA_NodeStoreExample *ns, const UA_ReferenceTypeNode *current,
-                                   struct SubRefTypeIdList *list) {
-    // insert the current referencetype
-    struct SubRefTypeId *element = UA_alloc(sizeof(struct SubRefTypeId));
-    element->id = current->nodeId;
-    SLIST_INSERT_HEAD(list, element, next);
-
-    UA_UInt32 count = 1; // the current element
-
-    // walk the tree
-    for(UA_Int32 i = 0;i < current->referencesSize;i++) {
-        if(current->references[i].referenceTypeId.identifier.numeric == 45 /* HasSubtype */ &&
-           current->references[i].isInverse == UA_FALSE) {
-            const UA_Node *node;
-            if(UA_NodeStoreExample_get(ns, &current->references[i].targetId.nodeId, &node) == UA_STATUSCODE_GOOD
-               && node->nodeClass == UA_NODECLASS_REFERENCETYPE) {
-                count += walkReferenceTree(ns, (UA_ReferenceTypeNode *)node, list);
-                UA_NodeStoreExample_releaseManagedNode(node);
-            }
-        }
-    }
-    return count;
-}
-
-/* We do not search across namespaces so far. The id of the father-referencetype is returned in the array also. */
-static UA_Int32 findSubReferenceTypes(UA_NodeStoreExample *ns, UA_NodeId *rootReferenceType,
-                                      UA_NodeId **ids, UA_UInt32 *idcount) {
-    struct SubRefTypeIdList list;
-    UA_UInt32 count;
-    SLIST_INIT(&list);
-
-    // walk the tree
-    const UA_ReferenceTypeNode *root;
-
-    if(UA_NodeStoreExample_get(ns, rootReferenceType, (const UA_Node **)&root) != UA_STATUSCODE_GOOD ||
-       root->nodeClass != UA_NODECLASS_REFERENCETYPE)
-        return UA_STATUSCODE_BADINTERNALERROR;
-    count = walkReferenceTree(ns, root, &list);
-    UA_NodeStoreExample_releaseManagedNode((const UA_Node *)root);
-
-    // copy results into an array
-    *ids = UA_alloc(sizeof(UA_NodeId)*count);
-    for(UA_UInt32 i = 0;i < count;i++) {
-        struct SubRefTypeId *element = SLIST_FIRST(&list);
-        UA_NodeId_copy(&element->id, &(*ids)[i]);
-        SLIST_REMOVE_HEAD(&list, next);
-        UA_free(element);
-    }
-    *idcount = count;
-
-    return UA_STATUSCODE_GOOD;
-}
-
-/* is this a relevant reference? */
-static INLINE UA_Boolean Service_Browse_returnReference(UA_BrowseDescription *browseDescription,
-                                                        UA_ReferenceNode     *reference,
-                                                        UA_NodeId            *relevantRefTypes,
-                                                        UA_UInt32             relevantRefTypesCount) {
-    if(reference->isInverse == UA_TRUE &&
-       browseDescription->browseDirection == UA_BROWSEDIRECTION_FORWARD)
-        return UA_FALSE;
-    else if(reference->isInverse == UA_FALSE &&
-            browseDescription->browseDirection == UA_BROWSEDIRECTION_INVERSE)
-        return UA_FALSE;
-    for(UA_UInt32 i = 0;i < relevantRefTypesCount;i++) {
-        if(UA_NodeId_equal(&browseDescription->referenceTypeId, &relevantRefTypes[i]) == UA_EQUAL)
-            return UA_TRUE;
-    }
-    return UA_FALSE;
-}
-
-/* Return results to a single browsedescription. */
-static void Service_Browse_getBrowseResult(UA_NodeStoreExample         *ns,
-                                           UA_BrowseDescription *browseDescription,
-                                           UA_UInt32             maxReferences,
-                                           UA_BrowseResult      *browseResult) {
-    const UA_Node *node;
-    UA_NodeId     *relevantReferenceTypes = UA_NULL;
-    UA_UInt32      relevantReferenceTypesCount = 0;
-    if(UA_NodeStoreExample_get(ns, &browseDescription->nodeId, &node) != UA_STATUSCODE_GOOD) {
-        browseResult->statusCode = UA_STATUSCODE_BADNODEIDUNKNOWN;
-        return;
-    }
-
-    // 0 => unlimited references
-    if(maxReferences == 0)
-        maxReferences = node->referencesSize;
-
-    // discover the relevant subtypes
-    if(!browseDescription->includeSubtypes ||
-       findSubReferenceTypes(ns, &browseDescription->referenceTypeId, &relevantReferenceTypes,
-                             &relevantReferenceTypesCount) != UA_STATUSCODE_GOOD) {
-        if(!(relevantReferenceTypes = UA_alloc(sizeof(UA_NodeId)))) {
-            return;
-        }
-        UA_NodeId_copy(&browseDescription->referenceTypeId, relevantReferenceTypes);
-        relevantReferenceTypesCount = 1;
-    }
-
-    /* We do not use a linked list but traverse the nodes references list twice
-     * (once for counting, once for generating the referencedescriptions). That
-     * is much faster than using a linked list, since the references are
-     * allocated in a continuous blob and RAM access is predictible/does not
-     * miss cache lines so often. TODO: measure with some huge objects! */
-    UA_UInt32 refs = 0;
-    for(UA_Int32 i = 0;i < node->referencesSize && refs <= maxReferences;i++) {
-        if(Service_Browse_returnReference(browseDescription, &node->references[i], relevantReferenceTypes,
-                                          relevantReferenceTypesCount))
-            refs++;
-    }
-
-    // can we return all relevant references at once?
-    UA_Boolean finished = UA_TRUE;
-    if(refs > maxReferences) {
-        refs--;
-        finished = UA_FALSE;
-    }
-
-    browseResult->referencesSize = refs;
-    UA_Array_new((void **)&browseResult->references, refs, &UA_[UA_REFERENCEDESCRIPTION]);
-
-    for(UA_UInt32 i = 0, j = 0;j < refs;i++) {
-        if(!Service_Browse_returnReference(browseDescription, &node->references[i], relevantReferenceTypes,
-                                           relevantReferenceTypesCount))
-            continue;
-
-        if(Service_Browse_getReferenceDescription(ns, &node->references[i], browseDescription->nodeClassMask,
-                                                  browseDescription->resultMask, &browseResult->references[j]) != UA_STATUSCODE_GOOD)
-            browseResult->statusCode = UA_STATUSCODE_UNCERTAINNOTALLNODESAVAILABLE;
-        j++;
-    }
-
-    if(!finished) {
-        // Todo. Set the Statuscode and the continuation point.
-    }
-
-    UA_NodeStoreExample_releaseManagedNode(node);
-    UA_Array_delete(relevantReferenceTypes, relevantReferenceTypesCount, &UA_[UA_NODEID]);
-}
 
 void Service_Browse(UA_Server *server, UA_Session *session,
                     const UA_BrowseRequest *request, UA_BrowseResponse *response) {
-    UA_assert(server != UA_NULL && session != UA_NULL && request != UA_NULL && response != UA_NULL);
+    UA_Int32 *numberOfFoundIndices;
+    UA_UInt16 *associatedIndices;
+    UA_UInt32 differentNamespaceIndexCount = 0;
+	UA_assert(server != UA_NULL && session != UA_NULL && request != UA_NULL && response != UA_NULL);
 
     if(request->nodesToBrowseSize <= 0) {
         response->responseHeader.serviceResult = UA_STATUSCODE_BADNOTHINGTODO;
@@ -209,16 +23,7 @@ void Service_Browse(UA_Server *server, UA_Session *session,
         return;
     }
 
-
-
-
-
-
     response->resultsSize = request->nodesToBrowseSize;
-
-    UA_Int32 *numberOfFoundIndices;
-    UA_UInt16 *associatedIndices;
-    UA_UInt32 differentNamespaceIndexCount = 0;
     if(UA_Array_new((void **)&numberOfFoundIndices,request->nodesToBrowseSize,&UA_[UA_UINT32]) != UA_STATUSCODE_GOOD){
     	response->responseHeader.serviceResult = UA_STATUSCODE_BADOUTOFMEMORY;
     	return ;
@@ -229,7 +34,6 @@ void Service_Browse(UA_Server *server, UA_Session *session,
     	return ;
     }
     // find out count of different namespace indices
-
    for(UA_Int32 i = 0; i<request->nodesToBrowseSize; i++){
 
     	for(UA_UInt32 j = 0; j <= differentNamespaceIndexCount; j++){
@@ -266,8 +70,6 @@ void Service_Browse(UA_Server *server, UA_Session *session,
     	    		browseDescriptionIndices[n] = j;
     	    	}
     	    }
-
-
     	    //call read for every namespace
     		tmpNamespace->nodeStore->browseNodes(
     				request->nodesToBrowse,
@@ -276,16 +78,11 @@ void Service_Browse(UA_Server *server, UA_Session *session,
     				request->requestedMaxReferencesPerNode,
     				response->results,
     				response->diagnosticInfos);
-
-			//	response->results[i] = service_read_node(server, &request->nodesToRead[i]);
     	}
     }
     UA_free(browseDescriptionIndices);
     UA_free(numberOfFoundIndices);
     UA_free(associatedIndices);
-    // for(UA_Int32 i = 0;i < request->nodesToBrowseSize;i++)
-    //    Service_Browse_getBrowseResult(server->nodestore, &request->nodesToBrowse[i],
-     //                                  request->requestedMaxReferencesPerNode, &response->results[i]);
 }