Browse Source

moved nodestore operation registration from opcua.server.c to ua_server.c

FlorianPalm 10 years ago
parent
commit
dc0ebcaa5a

+ 7 - 15
examples/opcuaServer.c

@@ -59,28 +59,20 @@ int main(int argc, char** argv) {
 	UA_Server *server;
 	UA_String endpointUrl;
 	UA_String_copycstring("no endpoint url",&endpointUrl);
-	UA_NodeStore  nodeStore;
 
-	open62541NodeStore *myNodeStore;
-	open62541NodeStore_new(&myNodeStore);
-
-	open62541NodeStore_setNodeStore(myNodeStore);
-
-	UA_NodeStore_registerReadNodesOperation(&nodeStore,open62541NodeStore_ReadNodes);
-	UA_NodeStore_registerBrowseNodesOperation(&nodeStore,open62541NodeStore_BrowseNodes);
-	UA_NodeStore_registerAddNodesOperation(&nodeStore,open62541NodeStore_AddNodes);
-	UA_NodeStore_registerWriteNodesOperation(&nodeStore,open62541NodeStore_WriteNodes);
-	//register more operations/ services here
 	UA_ByteString certificate = loadCertificate();
+	//create a nodestore which holds all nodes
+	open62541NodeStore *open62541NodeStore;
+	open62541NodeStore_new(&open62541NodeStore);
+	open62541NodeStore_setNodeStore(open62541NodeStore);
 
-	server = UA_Server_new(&endpointUrl, &certificate, &nodeStore);
-
+	//create server and use default open62541Nodestore for storing the nodes
+	server = UA_Server_new(&endpointUrl, &certificate, NULL, 1);
 
+	//add a node to the adresspace
     UA_Int32 myInteger = 42;
     UA_QualifiedName myIntegerName;
-
     UA_QualifiedName_copycstring("the answer is",&myIntegerName);
-
     UA_ExpandedNodeId parentNodeId;
     UA_ExpandedNodeId_init(&parentNodeId);
     parentNodeId.namespaceUri.length = 0;

+ 6 - 5
include/ua_server.h

@@ -28,7 +28,7 @@ extern "C" {
 /** @defgroup server Server */
 
 struct UA_NodeStore;
-typedef struct UA_NodeStore UA_NodeStore;
+typedef struct UA_NodeStore UA_NodeStoreInterface;
 
 struct UA_Server;
 typedef struct UA_Server UA_Server;
@@ -41,7 +41,7 @@ typedef struct UA_Namespace
 {
 	UA_UInt16 index;
 	UA_String url;
-	UA_NodeStore *nodeStore;
+	UA_NodeStoreInterface *nodeStore;
 }UA_Namespace;
 
 struct UA_NamespaceManager;
@@ -69,7 +69,8 @@ struct UA_NodeStore {
 };
 
 
-UA_Server UA_EXPORT * UA_Server_new(UA_String *endpointUrl, UA_ByteString *serverCertificate, UA_NodeStore *ns0Nodestore);
+UA_Server UA_EXPORT * UA_Server_new(UA_String *endpointUrl, UA_ByteString *serverCertificate, UA_NodeStoreInterface *ns0Nodestore,UA_Boolean useOpen62541NodeStore);
+
 void UA_EXPORT UA_Server_delete(UA_Server *server);
 void UA_EXPORT UA_Server_processBinaryMessage(UA_Server *server, UA_Connection *connection, const UA_ByteString *msg);
 
@@ -82,11 +83,11 @@ void UA_EXPORT UA_Server_addScalarVariableNode(UA_Server *server, UA_QualifiedNa
 //void UA_EXPORT UA_Server_addReferences(UA_Server *server, const UA_AddReferencesRequest *request,
 //		UA_AddReferencesResponse *response);
 
-UA_Int32 UA_EXPORT UA_Server_addNamespace(UA_Server *server, UA_UInt16 namespaceIndex, UA_NodeStore *nodeStore);
+UA_Int32 UA_EXPORT UA_Server_addNamespace(UA_Server *server, UA_UInt16 namespaceIndex, UA_NodeStoreInterface *nodeStore);
 
 UA_Int32 UA_EXPORT UA_Server_removeNamespace(UA_Server *server, UA_UInt16 namespaceIndex);
 
-UA_Int32 UA_EXPORT UA_Server_setNodeStore(UA_Server *server, UA_UInt16 namespaceIndex, UA_NodeStore *nodeStore);
+UA_Int32 UA_EXPORT UA_Server_setNodeStore(UA_Server *server, UA_UInt16 namespaceIndex, UA_NodeStoreInterface *nodeStore);
 
 #ifdef __cplusplus
 } // extern "C"

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

@@ -269,7 +269,7 @@ static UA_StatusCode expand(open62541NodeStore *ns) {
 UA_StatusCode open62541NodeStore_new(open62541NodeStore **result) {
 	open62541NodeStore *ns;
 	UA_UInt32 sizePrimeIndex, size;
-	if (!(ns = UA_alloc(sizeof(UA_NodeStore))))
+	if (!(ns = UA_alloc(sizeof(UA_NodeStoreInterface))))
 		return UA_STATUSCODE_BADOUTOFMEMORY;
 
 	sizePrimeIndex = higher_prime_index(32);

+ 13 - 4
src/server/ua_namespace_manager.c

@@ -29,13 +29,17 @@ UA_NamespaceManager* UA_NamespaceManager_new()
 
 }
 
-UA_StatusCode UA_NamespaceManager_addNamespace(UA_NamespaceManager *namespaceManager,UA_UInt16 index, UA_NodeStore *nodeStore)
+UA_StatusCode UA_NamespaceManager_addNamespace(UA_NamespaceManager *namespaceManager,UA_UInt16 index, UA_NodeStoreInterface *nodeStore)
 {
 	if(namespaceManager->currentNamespaceCount<UA_UINT16_MAX){
 		namespaceManager->currentNamespaceCount++;
 		struct namespace_list_entry *newentry = UA_alloc(sizeof(struct namespace_list_entry));
 		newentry->namespace.index = index;
-		newentry->namespace.nodeStore = nodeStore;
+		if(nodeStore != UA_NULL ){
+
+			newentry->namespace.nodeStore = UA_NodeStore_new();
+			UA_NodeStore_copy(nodeStore,newentry->namespace.nodeStore);
+		}
 		UA_String_init(&newentry->namespace.url);
 		LIST_INSERT_HEAD(&namespaceManager->namespaces, newentry, pointers);
 		return UA_STATUSCODE_GOOD;
@@ -79,14 +83,19 @@ UA_Int32 UA_NamespaceManager_getNamespace(UA_NamespaceManager *namespaceManager,
     return UA_STATUSCODE_GOOD;
 }
 
-UA_Int32 UA_NamespaceManager_setNodeStore(UA_NamespaceManager *namespaceManager,UA_UInt16 index, UA_NodeStore *nodeStore)
+UA_Int32 UA_NamespaceManager_setNodeStore(UA_NamespaceManager *namespaceManager,UA_UInt16 index, UA_NodeStoreInterface *nodeStore)
 {
 	UA_Namespace *namespace = UA_NULL;
-	UA_NamespaceManager_getNamespace(namespaceManager,index,&namespace);
+	UA_NamespaceManager_getNamespace(namespaceManager, index, &namespace);
 	if(namespace == UA_NULL)
 	{
 		return UA_STATUSCODE_BADNOTFOUND;
 	}
+	if(nodeStore != UA_NULL ){
+		if(namespace->nodeStore == UA_NULL){
+			namespace->nodeStore = UA_NodeStore_new();
+		}
+	}
 	namespace->nodeStore = nodeStore;
 	return UA_STATUSCODE_GOOD;
 }

+ 2 - 2
src/server/ua_namespace_manager.h

@@ -13,13 +13,13 @@
 
 UA_NamespaceManager* UA_NamespaceManager_new();
 
-UA_Int32  UA_NamespaceManager_addNamespace(UA_NamespaceManager *namespaceManager, UA_UInt16 index, UA_NodeStore *nodeStore);
+UA_Int32  UA_NamespaceManager_addNamespace(UA_NamespaceManager *namespaceManager, UA_UInt16 index, UA_NodeStoreInterface *nodeStore);
 
 UA_Int32  UA_NamespaceManager_removeNamespace(UA_NamespaceManager *namespaceManager,UA_UInt16 index);
 
 UA_Int32  UA_NamespaceManager_getNamespace(UA_NamespaceManager *namespaceManager, UA_UInt16 index, UA_Namespace **ns);
 
-UA_Int32  UA_NamespaceManager_setNodeStore(UA_NamespaceManager *namespaceManager,UA_UInt16 index, UA_NodeStore *nodeStore);
+UA_Int32  UA_NamespaceManager_setNodeStore(UA_NamespaceManager *namespaceManager,UA_UInt16 index, UA_NodeStoreInterface *nodeStore);
 
 
 

+ 29 - 7
src/server/ua_nodestore_interface.c

@@ -4,7 +4,7 @@
 
 
 
-UA_StatusCode UA_NodeStore_registerAddNodesOperation(UA_NodeStore *nodeStore, UA_NodeStore_addNodes addNodes)
+UA_StatusCode UA_NodeStoreInterface_registerAddNodesOperation(UA_NodeStoreInterface *nodeStore, UA_NodeStore_addNodes addNodes)
 {
 	if(nodeStore==UA_NULL){
 		return UA_STATUSCODE_BADNOTFOUND;
@@ -13,7 +13,7 @@ UA_StatusCode UA_NodeStore_registerAddNodesOperation(UA_NodeStore *nodeStore, UA
 	return UA_STATUSCODE_GOOD;
 }
 
-UA_StatusCode UA_NodeStore_registerAddReferencesOperation(UA_NodeStore *nodeStore, UA_NodeStore_addReferences addReferences)
+UA_StatusCode UA_NodeStore_registerAddReferencesOperation(UA_NodeStoreInterface *nodeStore, UA_NodeStore_addReferences addReferences)
 {
 	if(nodeStore==UA_NULL){
 		return UA_STATUSCODE_BADNOTFOUND;
@@ -22,7 +22,7 @@ UA_StatusCode UA_NodeStore_registerAddReferencesOperation(UA_NodeStore *nodeStor
 	return UA_STATUSCODE_GOOD;
 }
 
-UA_StatusCode UA_NodeStore_registerDeleteNodesOperation(UA_NodeStore *nodeStore, UA_NodeStore_deleteNodes deleteNodes)
+UA_StatusCode UA_NodeStoreInterface_registerDeleteNodesOperation(UA_NodeStoreInterface *nodeStore, UA_NodeStore_deleteNodes deleteNodes)
 {
 	if(nodeStore==UA_NULL){
 		return UA_STATUSCODE_BADNOTFOUND;
@@ -31,7 +31,7 @@ UA_StatusCode UA_NodeStore_registerDeleteNodesOperation(UA_NodeStore *nodeStore,
 	return UA_STATUSCODE_GOOD;
 }
 
-UA_StatusCode UA_NodeStore_registerDeleteReferencesOperation(UA_NodeStore *nodeStore, UA_NodeStore_deleteReferences deleteReferences)
+UA_StatusCode UA_NodeStoreInterface_registerDeleteReferencesOperation(UA_NodeStoreInterface *nodeStore, UA_NodeStore_deleteReferences deleteReferences)
 {
 	if(nodeStore==UA_NULL){
 		return UA_STATUSCODE_BADNOTFOUND;
@@ -41,7 +41,7 @@ UA_StatusCode UA_NodeStore_registerDeleteReferencesOperation(UA_NodeStore *nodeS
 }
 
 
-UA_StatusCode UA_NodeStore_registerReadNodesOperation(UA_NodeStore *nodeStore, UA_NodeStore_readNodes readNodes)
+UA_StatusCode UA_NodeStoreInterface_registerReadNodesOperation(UA_NodeStoreInterface *nodeStore, UA_NodeStore_readNodes readNodes)
 {
 	if(nodeStore==UA_NULL){
 		return UA_STATUSCODE_BADNOTFOUND;
@@ -50,7 +50,7 @@ UA_StatusCode UA_NodeStore_registerReadNodesOperation(UA_NodeStore *nodeStore, U
 	return UA_STATUSCODE_GOOD;
 }
 
-UA_StatusCode UA_NodeStore_registerWriteNodesOperation(UA_NodeStore *nodeStore, UA_NodeStore_writeNodes writeNodes)
+UA_StatusCode UA_NodeStoreInterface_registerWriteNodesOperation(UA_NodeStoreInterface *nodeStore, UA_NodeStore_writeNodes writeNodes)
 {
 	if(nodeStore==UA_NULL){
 		return UA_STATUSCODE_BADNOTFOUND;
@@ -59,7 +59,7 @@ UA_StatusCode UA_NodeStore_registerWriteNodesOperation(UA_NodeStore *nodeStore,
 	return UA_STATUSCODE_GOOD;
 }
 
-UA_StatusCode UA_NodeStore_registerBrowseNodesOperation(UA_NodeStore *nodeStore, UA_NodeStore_browseNodes browseNodes)
+UA_StatusCode UA_NodeStoreInterface_registerBrowseNodesOperation(UA_NodeStoreInterface *nodeStore, UA_NodeStore_browseNodes browseNodes)
 {
 	if(nodeStore==UA_NULL){
 		return UA_STATUSCODE_BADNOTFOUND;
@@ -68,6 +68,28 @@ UA_StatusCode UA_NodeStore_registerBrowseNodesOperation(UA_NodeStore *nodeStore,
 	return UA_STATUSCODE_GOOD;
 }
 
+UA_NodeStoreInterface* UA_NodeStore_new(){
+	return UA_alloc(sizeof(UA_NodeStoreInterface));
+}
+
+UA_StatusCode UA_NodeStore_copy(const UA_NodeStoreInterface *src,UA_NodeStoreInterface *dst){
+	if(src!=UA_NULL){
+		if(dst!=UA_NULL){
+			dst->addNodes = src->addNodes;
+			dst->addReferences = src->addReferences;
+			dst->browseNodes = src->browseNodes;
+			dst->deleteNodes = src->deleteNodes;
+			dst->deleteReferences = src->deleteReferences;
+			dst->readNodes = src->readNodes;
+			dst->writeNodes = src->writeNodes;
+		return UA_STATUSCODE_GOOD;
+		}
+	}
+	return UA_STATUSCODE_BADINTERNALERROR;
+}
+void UA_NodeStore_delete(UA_NodeStoreInterface *nodestore){
+	UA_free(nodestore);
+}
 //add method to add a 'delete nodestore'
 
 

+ 10 - 7
src/server/ua_nodestore_interface.h

@@ -6,19 +6,22 @@
 #include "ua_server.h"
 
 
-UA_StatusCode UA_EXPORT UA_NodeStore_registerAddNodesOperation(UA_NodeStore *nodeStore, UA_NodeStore_addNodes addNodes);
-UA_StatusCode UA_EXPORT UA_NodeStore_registerAddReferenceOperation(UA_NodeStore *nodeStore, UA_NodeStore_addReferences addReference);
-UA_StatusCode UA_EXPORT UA_NodeStore_registerDeleteNodesOperation(UA_NodeStore *nodeStore, UA_NodeStore_deleteNodes deleteNode);
-UA_StatusCode UA_EXPORT UA_NodeStore_registerDeleteReferencesOperation(UA_NodeStore *nodeStore, UA_NodeStore_deleteReferences deleteReference);
-UA_StatusCode UA_EXPORT UA_NodeStore_registerReadNodesOperation(UA_NodeStore *nodeStore, UA_NodeStore_readNodes readNode);
-UA_StatusCode UA_EXPORT UA_NodeStore_registerWriteNodesOperation(UA_NodeStore *nodeStore, UA_NodeStore_writeNodes writeNode);
-UA_StatusCode UA_EXPORT UA_NodeStore_registerBrowseNodesOperation(UA_NodeStore *nodeStore, UA_NodeStore_browseNodes browseNode);
+UA_StatusCode UA_EXPORT UA_NodeStoreInterface_registerAddNodesOperation(UA_NodeStoreInterface *nodeStore, UA_NodeStore_addNodes addNodes);
+UA_StatusCode UA_EXPORT UA_NodeStoreInterface_registerAddReferenceOperation(UA_NodeStoreInterface *nodeStore, UA_NodeStore_addReferences addReference);
+UA_StatusCode UA_EXPORT UA_NodeStoreInterface_registerDeleteNodesOperation(UA_NodeStoreInterface *nodeStore, UA_NodeStore_deleteNodes deleteNode);
+UA_StatusCode UA_EXPORT UA_NodeStoreInterface_registerDeleteReferencesOperation(UA_NodeStoreInterface *nodeStore, UA_NodeStore_deleteReferences deleteReference);
+UA_StatusCode UA_EXPORT UA_NodeStoreInterface_registerReadNodesOperation(UA_NodeStoreInterface *nodeStore, UA_NodeStore_readNodes readNode);
+UA_StatusCode UA_EXPORT UA_NodeStoreInterface_registerWriteNodesOperation(UA_NodeStoreInterface *nodeStore, UA_NodeStore_writeNodes writeNode);
+UA_StatusCode UA_EXPORT UA_NodeStoreInterface_registerBrowseNodesOperation(UA_NodeStoreInterface *nodeStore, UA_NodeStore_browseNodes browseNode);
 
 #define UA_NODESTORE_INSERT_UNIQUE 1
 #define UA_NODESTORE_INSERT_GETMANAGED 2
 
 
 
+UA_NodeStoreInterface* UA_NodeStore_new();
+UA_StatusCode UA_NodeStore_copy(const UA_NodeStoreInterface *src,UA_NodeStoreInterface *dst);
+void UA_NodeStore_delete(UA_NodeStoreInterface *nodestore);
 
 UA_Boolean UA_NodeStore_nodeExists(UA_NodeId nodeId);
 

+ 22 - 6
src/server/ua_server.c

@@ -6,6 +6,7 @@
 #include "ua_session_manager.h"
 #include "ua_util.h"
 #include "ua_services.h"
+#include "server/nodestore/open62541_nodestore.h"
 
 void UA_Server_delete(UA_Server *server) {
 	UA_ApplicationDescription_deleteMembers(&server->description);
@@ -38,8 +39,15 @@ void addSingleNode(UA_Namespace *namespace, UA_AddNodesItem *addNodesItem) {
 	namespace->nodeStore->addNodes(&tmpRequestHeader, addNodesItem, &indices,
 			indicesSize, &result, &diagnosticInfo);
 }
+static void UA_Server_registerNS0Operations(UA_Server *server, UA_NodeStoreInterface *nodestore){
 
-void ns0_addObjectNode(UA_Server *server, UA_NodeId REFTYPE_NODEID,
+	UA_NodeStoreInterface_registerReadNodesOperation(nodestore,open62541NodeStore_ReadNodes);
+	UA_NodeStoreInterface_registerBrowseNodesOperation(nodestore,open62541NodeStore_BrowseNodes);
+	UA_NodeStoreInterface_registerAddNodesOperation(nodestore,open62541NodeStore_AddNodes);
+	UA_NodeStoreInterface_registerWriteNodesOperation(nodestore,open62541NodeStore_WriteNodes);
+}
+
+static void ns0_addObjectNode(UA_Server *server, UA_NodeId REFTYPE_NODEID,
 		UA_ExpandedNodeId REQ_NODEID, UA_ExpandedNodeId PARENTNODEID,
 		char* BROWSENAME, char* DISPLAYNAME, char* DESCRIPTION) {
 	UA_ObjectAttributes *objAttr = UA_ObjectAttributes_new();
@@ -74,7 +82,7 @@ void ns0_addObjectNode(UA_Server *server, UA_NodeId REFTYPE_NODEID,
 	UA_AddNodesItem_delete(addNodesItem);
 	UA_ObjectAttributes_delete(objAttr);
 }
-void ns0_addVariableNode(UA_Server *server, UA_NodeId refTypeNodeId,
+static void ns0_addVariableNode(UA_Server *server, UA_NodeId refTypeNodeId,
 		UA_ExpandedNodeId requestedNodeId, UA_ExpandedNodeId parentNodeId,
 		UA_QualifiedName browseName, UA_LocalizedText displayName,
 		UA_LocalizedText description, UA_DataValue *dataValue,
@@ -126,7 +134,7 @@ void ns0_addVariableNode(UA_Server *server, UA_NodeId refTypeNodeId,
 	UA_VariableAttributes_delete(varAttr);
 }
 
-void ns0_addReferenceTypeNode(UA_Server *server, UA_NodeId REFTYPE_NODEID,
+static void ns0_addReferenceTypeNode(UA_Server *server, UA_NodeId REFTYPE_NODEID,
 		UA_ExpandedNodeId REQ_NODEID, UA_ExpandedNodeId PARENTNODEID,
 		char* REFTYPE_BROWSENAME, char* REFTYPE_DISPLAYNAME,
 		char*REFTYPE_DESCRIPTION, UA_Boolean IS_ABSTRACT,
@@ -166,7 +174,8 @@ void ns0_addReferenceTypeNode(UA_Server *server, UA_NodeId REFTYPE_NODEID,
 }
 
 UA_Server * UA_Server_new(UA_String *endpointUrl,
-		UA_ByteString *serverCertificate, UA_NodeStore *ns0Nodestore) {
+		UA_ByteString *serverCertificate, UA_NodeStoreInterface *ns0Nodestore,
+		UA_Boolean useOpen62541NodeStore) {
 	UA_Server *server = UA_alloc(sizeof(UA_Server));
 	if (!server)
 		return server;
@@ -174,8 +183,13 @@ UA_Server * UA_Server_new(UA_String *endpointUrl,
 	UA_ApplicationDescription_init(&server->description);
 
 	//add namespace zero
+	UA_NodeStoreInterface nodestoreInterface;
 	server->namespaceManager = UA_NamespaceManager_new();
-	UA_NamespaceManager_addNamespace(server->namespaceManager, 0, ns0Nodestore);
+	if(!useOpen62541NodeStore){
+		nodestoreInterface = *ns0Nodestore;
+	}
+	UA_Server_registerNS0Operations(server,&nodestoreInterface);
+	UA_NamespaceManager_addNamespace(server->namespaceManager, 0, &nodestoreInterface);
 
 	// mockup application description
 	UA_ApplicationDescription_init(&server->description);
@@ -568,8 +582,10 @@ void UA_Server_addScalarVariableNode(UA_Server *server,
 }
 
 UA_Int32 UA_Server_addNamespace(UA_Server *server, UA_UInt16 namespaceIndex,
-		UA_NodeStore *nodeStore) {
+		UA_NodeStoreInterface *nodeStore) {
 
 	return (UA_Int32) UA_NamespaceManager_addNamespace(server->namespaceManager,
 			namespaceIndex, nodeStore);
 }
+
+

+ 1 - 1
src/server/ua_server_internal.h

@@ -14,7 +14,7 @@ struct UA_Server {
     UA_NamespaceManager *namespaceManager;
     UA_SecureChannelManager secureChannelManager;
     UA_SessionManager sessionManager;
-    UA_NodeStore *nodestore;
+    UA_NodeStoreInterface *nodestore;
     UA_Logger logger;
 };