소스 검색

Enable Call for external nodestores (#639)

* part One for calls to external nodestore

* modified addReferencesSingle to support targets in external nodestores

* 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 년 전
부모
커밋
882631a09c
2개의 변경된 파일32개의 추가작업 그리고 2개의 파일을 삭제
  1. 5 0
      include/ua_server_external_ns.h
  2. 27 2
      src/server/ua_services_call.c

+ 5 - 0
include/ua_server_external_ns.h

@@ -73,6 +73,10 @@ typedef UA_Int32 (*UA_ExternalNodeStore_translateBrowsePathsToNodeIds)
 (void *ensHandle, const UA_RequestHeader *requestHeader, UA_BrowsePath *browsePath, UA_UInt32 *indices,
  UA_UInt32 indicesSize, UA_BrowsePathResult *browsePathResults, UA_DiagnosticInfo *diagnosticInfos);
 
+typedef UA_Int32 (*UA_ExternalNodeStore_call)
+(void *ensHandle, const UA_RequestHeader *requestHeader, UA_CallMethodRequest *request, UA_UInt32 *indices,
+ UA_UInt32 indicesSize,UA_CallMethodResult *results);
+ 
 typedef UA_Int32 (*UA_ExternalNodeStore_delete)(void *ensHandle);
 
 typedef struct UA_ExternalNodeStore {
@@ -85,6 +89,7 @@ typedef struct UA_ExternalNodeStore {
 	UA_ExternalNodeStore_translateBrowsePathsToNodeIds translateBrowsePathsToNodeIds;
 	UA_ExternalNodeStore_addReferences addReferences;
 	UA_ExternalNodeStore_deleteReferences deleteReferences;
+	UA_ExternalNodeStore_call call;
 	UA_ExternalNodeStore_addOneWayReference addOneWayReference;
 	UA_ExternalNodeStore_delete destroy;
 } UA_ExternalNodeStore;

+ 27 - 2
src/server/ua_services_call.c

@@ -201,8 +201,33 @@ void Service_Call(UA_Server *server, UA_Session *session, const UA_CallRequest *
     }
     response->resultsSize = request->methodsToCallSize;
 
-    for(size_t i = 0; i < request->methodsToCallSize;i++)
-        Service_Call_single(server, session, &request->methodsToCall[i], &response->results[i]);
+#ifdef UA_ENABLE_EXTERNAL_NAMESPACES
+    UA_Boolean isExternal[request->methodsToCallSize];
+    UA_UInt32 indices[request->methodsToCallSize];
+    memset(isExternal, false, sizeof(UA_Boolean) * request->methodsToCallSize);
+    for(size_t j = 0;j<server->externalNamespacesSize;j++) {
+        size_t indexSize = 0;
+        for(size_t i = 0;i < request->methodsToCallSize;i++) {
+            if(request->methodsToCall[i].methodId.namespaceIndex != server->externalNamespaces[j].index)
+                continue;
+            isExternal[i] = true;
+            indices[indexSize] = (UA_UInt32)i;
+            indexSize++;
+        }
+        if(indexSize == 0)
+            continue;
+        UA_ExternalNodeStore *ens = &server->externalNamespaces[j].externalNodeStore;
+        ens->call(ens->ensHandle, &request->requestHeader, request->methodsToCall,
+                       indices, (UA_UInt32)indexSize, response->results);
+    }
+#endif
+	
+    for(size_t i = 0; i < request->methodsToCallSize;i++){
+#ifdef UA_ENABLE_EXTERNAL_NAMESPACES
+        if(!isExternal[i])
+#endif    
+			Service_Call_single(server, session, &request->methodsToCall[i], &response->results[i]);
+	}
 }
 
 #endif /* UA_ENABLE_METHODCALLS */