Browse Source

Extend external nodestore API to retrieve references in returnRelevantNodeExternal

pschoppe 8 years ago
parent
commit
3299b5c29a
2 changed files with 22 additions and 17 deletions
  1. 6 4
      include/ua_server_external_ns.h
  2. 16 13
      src/server/ua_services_view.c

+ 6 - 4
include/ua_server_external_ns.h

@@ -19,8 +19,6 @@ extern "C" {
  * If no external nodestore is defined for a nodeid, it is always looked up in
  * the "local" nodestore of open62541. Namespace Zero is always in the local
  * nodestore.
- *
- * @{
  */
 
 typedef UA_Int32 (*UA_ExternalNodeStore_addNodes)
@@ -32,10 +30,13 @@ typedef UA_Int32 (*UA_ExternalNodeStore_addReferences)
  UA_UInt32 *indices,UA_UInt32 indicesSize, UA_StatusCode *addReferencesResults,
  UA_DiagnosticInfo *diagnosticInfos);
  
- typedef UA_Int32 (*UA_ExternalNodeStore_addOneWayReference)
+typedef UA_StatusCode (*UA_ExternalNodeStore_addOneWayReference)
 (void *ensHandle, const UA_AddReferencesItem *item);
 
-typedef UA_Int32 (*UA_ExternalNodeStore_deleteNodes)
+typedef UA_StatusCode (*UA_ExternalNodeStore_getOneWayReferences)
+(void *ensHandle, UA_NodeId *nodeId, UA_UInt32 *referencesSize, UA_ReferenceNode **references);
+
+typedef UA_StatusCode (*UA_ExternalNodeStore_deleteNodes)
 (void *ensHandle, const UA_RequestHeader *requestHeader, UA_DeleteNodesItem *nodesToDelete, UA_UInt32 *indices,
  UA_UInt32 indicesSize, UA_StatusCode *deleteNodesResults, UA_DiagnosticInfo *diagnosticInfos);
 
@@ -80,6 +81,7 @@ typedef struct UA_ExternalNodeStore {
     UA_ExternalNodeStore_deleteReferences deleteReferences;
     UA_ExternalNodeStore_call call;
     UA_ExternalNodeStore_addOneWayReference addOneWayReference;
+    UA_ExternalNodeStore_getOneWayReferences getOneWayReferences;
     UA_ExternalNodeStore_delete destroy;
 } UA_ExternalNodeStore;
 

+ 16 - 13
src/server/ua_services_view.c

@@ -39,12 +39,12 @@ static const UA_Node *
 returnRelevantNodeExternal(UA_ExternalNodeStore *ens, const UA_BrowseDescription *descr,
                            const UA_ReferenceNode *reference) {
     /* prepare a read request in the external nodestore */
-    UA_ReadValueId *readValueIds = UA_Array_new(6,&UA_TYPES[UA_TYPES_READVALUEID]);
-    UA_UInt32 *indices = UA_Array_new(6,&UA_TYPES[UA_TYPES_UINT32]);
-    UA_UInt32 indicesSize = 6;
-    UA_DataValue *readNodesResults = UA_Array_new(6,&UA_TYPES[UA_TYPES_DATAVALUE]);
-    UA_DiagnosticInfo *diagnosticInfos = UA_Array_new(6,&UA_TYPES[UA_TYPES_DIAGNOSTICINFO]);
-    for(UA_UInt32 i = 0; i < 6; ++i) {
+    UA_ReadValueId *readValueIds = UA_Array_new(5,&UA_TYPES[UA_TYPES_READVALUEID]);
+    UA_UInt32 *indices = UA_Array_new(5,&UA_TYPES[UA_TYPES_UINT32]);
+    UA_UInt32 indicesSize = 5;
+    UA_DataValue *readNodesResults = UA_Array_new(5,&UA_TYPES[UA_TYPES_DATAVALUE]);
+    UA_DiagnosticInfo *diagnosticInfos = UA_Array_new(5,&UA_TYPES[UA_TYPES_DIAGNOSTICINFO]);
+    for(UA_UInt32 i = 0; i < 5; ++i) {
         readValueIds[i].nodeId = reference->targetId.nodeId;
         indices[i] = i;
     }
@@ -53,7 +53,6 @@ returnRelevantNodeExternal(UA_ExternalNodeStore *ens, const UA_BrowseDescription
     readValueIds[2].attributeId = UA_ATTRIBUTEID_DISPLAYNAME;
     readValueIds[3].attributeId = UA_ATTRIBUTEID_DESCRIPTION;
     readValueIds[4].attributeId = UA_ATTRIBUTEID_WRITEMASK;
-    readValueIds[5].attributeId = UA_ATTRIBUTEID_USERWRITEMASK;
 
     ens->readNodes(ens->ensHandle, NULL, readValueIds, indices,
                    indicesSize, readNodesResults, false, diagnosticInfos);
@@ -71,12 +70,16 @@ returnRelevantNodeExternal(UA_ExternalNodeStore *ens, const UA_BrowseDescription
         UA_LocalizedText_copy((UA_LocalizedText*)readNodesResults[3].value.data, &(node->description));
     if(readNodesResults[4].status == UA_STATUSCODE_GOOD)
         UA_UInt32_copy((UA_UInt32*)readNodesResults[4].value.data, &(node->writeMask));
-    if(readNodesResults[5].status == UA_STATUSCODE_GOOD)
-        UA_UInt32_copy((UA_UInt32*)readNodesResults[5].value.data, &(node->userWriteMask));
-    UA_Array_delete(readValueIds,6, &UA_TYPES[UA_TYPES_READVALUEID]);
-    UA_Array_delete(indices,6, &UA_TYPES[UA_TYPES_UINT32]);
-    UA_Array_delete(readNodesResults,6, &UA_TYPES[UA_TYPES_DATAVALUE]);
-    UA_Array_delete(diagnosticInfos,6, &UA_TYPES[UA_TYPES_DIAGNOSTICINFO]);
+
+    UA_ReferenceNode **references = &node->references;
+    UA_UInt32 *referencesSize = (UA_UInt32*)&node->referencesSize;
+    
+    ens->getOneWayReferences (ens->ensHandle, &node->nodeId, referencesSize, references);
+
+    UA_Array_delete(readValueIds,5, &UA_TYPES[UA_TYPES_READVALUEID]);
+    UA_Array_delete(indices,5, &UA_TYPES[UA_TYPES_UINT32]);
+    UA_Array_delete(readNodesResults,5, &UA_TYPES[UA_TYPES_DATAVALUE]);
+    UA_Array_delete(diagnosticInfos,5, &UA_TYPES[UA_TYPES_DIAGNOSTICINFO]);
     if(node && descr->nodeClassMask != 0 && (node->nodeClass & descr->nodeClassMask) == 0) {
         UA_NodeStore_deleteNode(node);
         return NULL;