瀏覽代碼

Merge pull request #223 from LEvertz/master

Enabling External NodeStores for path translation
Sten 10 年之前
父節點
當前提交
cfed96f412
共有 2 個文件被更改,包括 34 次插入6 次删除
  1. 5 0
      include/ua_server.h
  2. 29 6
      src/server/ua_services_view.c

+ 5 - 0
include/ua_server.h

@@ -269,6 +269,10 @@ typedef UA_Int32 (*UA_ExternalNodeStore_browseNodes)
  UA_UInt32 *indices, UA_UInt32 indicesSize, UA_UInt32 requestedMaxReferencesPerNode,
  UA_BrowseResult *browseResults, UA_DiagnosticInfo *diagnosticInfos);
 
+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_delete)(void *ensHandle);
 
 typedef struct UA_ExternalNodeStore {
@@ -278,6 +282,7 @@ typedef struct UA_ExternalNodeStore {
 	UA_ExternalNodeStore_writeNodes writeNodes;
 	UA_ExternalNodeStore_readNodes readNodes;
 	UA_ExternalNodeStore_browseNodes browseNodes;
+	UA_ExternalNodeStore_translateBrowsePathsToNodeIds translateBrowsePathsToNodeIds;
 	UA_ExternalNodeStore_addReferences addReferences;
 	UA_ExternalNodeStore_deleteReferences deleteReferences;
 	UA_ExternalNodeStore_delete destroy;

+ 29 - 6
src/server/ua_services_view.c

@@ -364,20 +364,43 @@ static void translateBrowsePath(UA_Server *server, UA_Session *session, const UA
 void Service_TranslateBrowsePathsToNodeIds(UA_Server *server, UA_Session *session,
                                            const UA_TranslateBrowsePathsToNodeIdsRequest *request,
                                            UA_TranslateBrowsePathsToNodeIdsResponse *response) {
-    if(request->browsePathsSize <= 0) {
+    size_t size = request->browsePathsSize;
+	if(size <= 0) {
         response->responseHeader.serviceResult = UA_STATUSCODE_BADNOTHINGTODO;
         return;
     }
 
-    response->results = UA_Array_new(&UA_TYPES[UA_TYPES_BROWSEPATHRESULT], request->browsePathsSize);
+    response->results = UA_Array_new(&UA_TYPES[UA_TYPES_BROWSEPATHRESULT], size);
     if(!response->results) {
         response->responseHeader.serviceResult = UA_STATUSCODE_BADOUTOFMEMORY;
         return;
     }
-
-    response->resultsSize = request->browsePathsSize;
-    for(UA_Int32 i = 0;i < response->resultsSize;i++)
-        translateBrowsePath(server, session, &request->browsePaths[i], &response->results[i]);
+    /* ### Begin External Namespaces */
+    UA_Boolean *isExternal = UA_alloca(sizeof(UA_Boolean) * size);
+    UA_memset(isExternal, UA_FALSE, sizeof(UA_Boolean) * size);
+    UA_UInt32 *indices = UA_alloca(sizeof(UA_UInt32) * size);
+    for(UA_Int32 j = 0;j<server->externalNamespacesSize;j++) {
+    	size_t indexSize = 0;
+    	for(size_t i = 0;i < size;i++) {
+    		if(request->browsePaths[i].startingNode.namespaceIndex != server->externalNamespaces[j].index)
+    			continue;
+    		isExternal[i] = UA_TRUE;
+    		indices[indexSize] = i;
+    		indexSize++;
+    	}
+    	if(indexSize == 0)
+    		continue;
+
+    	UA_ExternalNodeStore *ens = &server->externalNamespaces[j].externalNodeStore;
+    	ens->translateBrowsePathsToNodeIds(ens->ensHandle, &request->requestHeader, request->browsePaths,
+    			indices, indexSize, response->results, response->diagnosticInfos);
+    }
+    /* ### End External Namespaces */
+    response->resultsSize = size;
+    for(size_t i = 0;i < size;i++){
+    	if(!isExternal[i])
+    		translateBrowsePath(server, session, &request->browsePaths[i], &response->results[i]);
+    }
 }
 
 void Service_RegisterNodes(UA_Server *server, UA_Session *session,