Browse Source

One way reference ofr external namespaces (#635)

* modified addReferencesSingle to support targets in external nodestores
* fixed an unused variable error for loglevels greater 300
* extended the external nodestore interface with an addOneWayReference
Function
* resolved an analyzer error and a Bug with it
I like those analyzers :-)
LEvertz 8 years ago
parent
commit
478d555ed1
2 changed files with 52 additions and 7 deletions
  1. 4 0
      include/ua_server_external_ns.h
  2. 48 7
      src/server/ua_services_nodemanagement.c

+ 4 - 0
include/ua_server_external_ns.h

@@ -42,6 +42,9 @@ typedef UA_Int32 (*UA_ExternalNodeStore_addReferences)
 (void *ensHandle, const UA_RequestHeader *requestHeader, UA_AddReferencesItem* referencesToAdd,
  UA_UInt32 *indices,UA_UInt32 indicesSize, UA_StatusCode *addReferencesResults,
  UA_DiagnosticInfo *diagnosticInfos);
+ 
+ typedef UA_Int32 (*UA_ExternalNodeStore_addOneWayReference)
+(void *ensHandle, const UA_AddReferencesItem *item);
 
 typedef UA_Int32 (*UA_ExternalNodeStore_deleteNodes)
 (void *ensHandle, const UA_RequestHeader *requestHeader, UA_DeleteNodesItem *nodesToDelete, UA_UInt32 *indices,
@@ -82,6 +85,7 @@ typedef struct UA_ExternalNodeStore {
 	UA_ExternalNodeStore_translateBrowsePathsToNodeIds translateBrowsePathsToNodeIds;
 	UA_ExternalNodeStore_addReferences addReferences;
 	UA_ExternalNodeStore_deleteReferences deleteReferences;
+	UA_ExternalNodeStore_addOneWayReference addOneWayReference;
 	UA_ExternalNodeStore_delete destroy;
 } UA_ExternalNodeStore;
 

+ 48 - 7
src/server/ua_services_nodemanagement.c

@@ -853,23 +853,64 @@ addOneWayReference(UA_Server *server, UA_Session *session, UA_Node *node, const
 
 UA_StatusCode
 Service_AddReferences_single(UA_Server *server, UA_Session *session, const UA_AddReferencesItem *item) {
-    if(item->targetServerUri.length > 0)
+UA_StatusCode retval = UA_STATUSCODE_GOOD;
+#ifdef UA_ENABLE_EXTERNAL_NAMESPACES
+	UA_Boolean handledExternally = UA_FALSE;
+#endif  
+	if(item->targetServerUri.length > 0)
         return UA_STATUSCODE_BADNOTIMPLEMENTED; // currently no expandednodeids are allowed
 
-    /* cast away the const to loop the call through UA_Server_editNode */
-    UA_StatusCode retval = UA_Server_editNode(server, session, &item->sourceNodeId,
+#ifdef UA_ENABLE_EXTERNAL_NAMESPACES
+    for(size_t j = 0; j <server->externalNamespacesSize; j++) {
+        if(item->sourceNodeId.namespaceIndex != server->externalNamespaces[j].index) {
+                continue;
+		} else {
+			UA_ExternalNodeStore *ens = &server->externalNamespaces[j].externalNodeStore;
+			retval = ens->addOneWayReference(ens->ensHandle, item);
+			handledExternally = UA_TRUE;
+			break;
+        }
+        
+    }
+	if(handledExternally == UA_FALSE) {
+#endif
+    /* cast away the const to loop the call through UA_Server_editNode 
+		beware the "if" above for external nodestores	*/
+    retval = UA_Server_editNode(server, session, &item->sourceNodeId,
                                               (UA_EditNodeCallback)addOneWayReference, item);
-    if(retval != UA_STATUSCODE_GOOD)
-        return retval;
+#ifdef UA_ENABLE_EXTERNAL_NAMESPACES
+	}
+#endif
 
+    if(retval != UA_STATUSCODE_GOOD){
+		return retval;
+	}
+	
     UA_AddReferencesItem secondItem;
     secondItem = *item;
     secondItem.targetNodeId.nodeId = item->sourceNodeId;
     secondItem.sourceNodeId = item->targetNodeId.nodeId;
     secondItem.isForward = !item->isForward;
-    retval = UA_Server_editNode(server, session, &secondItem.sourceNodeId,
+#ifdef UA_ENABLE_EXTERNAL_NAMESPACES
+    handledExternally = UA_FALSE;
+	for(size_t j = 0; j <server->externalNamespacesSize; j++) {
+        if(secondItem.sourceNodeId.namespaceIndex != server->externalNamespaces[j].index) {
+                continue;
+		} else {
+			UA_ExternalNodeStore *ens = &server->externalNamespaces[j].externalNodeStore;
+			retval = ens->addOneWayReference(ens->ensHandle, &secondItem);
+			handledExternally = UA_TRUE;
+			break;
+        }
+        
+    }
+	if(handledExternally == UA_FALSE) {
+#endif
+	retval = UA_Server_editNode(server, session, &secondItem.sourceNodeId,
                                 (UA_EditNodeCallback)addOneWayReference, &secondItem);
-
+#ifdef UA_ENABLE_EXTERNAL_NAMESPACES
+	}
+#endif
     // todo: remove reference if the second direction failed
     return retval;
 }