Pārlūkot izejas kodu

UA_Client_forEachChildNodeCall had somehow vanished from the otherwise symmetric API - and is now back.

ichrispa 9 gadi atpakaļ
vecāks
revīzija
3dcae4daea
3 mainītis faili ar 56 papildinājumiem un 0 dzēšanām
  1. 16 0
      examples/client.c
  2. 7 0
      include/ua_client_highlevel.h
  3. 33 0
      src/client/ua_client_highlevel.c

+ 16 - 0
examples/client.c

@@ -19,6 +19,16 @@ static void handler_TheAnswerChanged(UA_UInt32 monId, UA_DataValue *value, void
     return;
 }
 
+static UA_StatusCode
+nodeIter(UA_NodeId childId, UA_Boolean isInverse, UA_NodeId referenceTypeId, void *handle) {  
+  UA_NodeId *parent = (UA_NodeId *) handle;
+  
+  if (!isInverse) {
+    printf("%d, %d --- %d ---> NodeId %d, %d\n", parent->namespaceIndex, parent->identifier.numeric, referenceTypeId.identifier.numeric, childId.namespaceIndex, childId.identifier.numeric);
+  }
+  return UA_STATUSCODE_GOOD;
+}
+
 int main(int argc, char *argv[]) {
     UA_Client *client = UA_Client_new(UA_ClientConfig_standard, Logger_Stdout);
 
@@ -86,6 +96,12 @@ int main(int argc, char *argv[]) {
     UA_BrowseRequest_deleteMembers(&bReq);
     UA_BrowseResponse_deleteMembers(&bResp);
     
+    // Same thing, less code:
+    UA_NodeId *parent = UA_NodeId_new();
+    *parent = UA_NODEID_NUMERIC(0, UA_NS0ID_OBJECTSFOLDER);
+    UA_Client_forEachChildNodeCall(client, UA_NODEID_NUMERIC(0, UA_NS0ID_OBJECTSFOLDER), nodeIter, (void *) parent);
+    UA_NodeId_delete(parent);
+    
 #ifdef UA_ENABLE_SUBSCRIPTIONS
     // Create a subscription with interval 0 (immediate)...
     UA_UInt32 subId=0;

+ 7 - 0
include/ua_client_highlevel.h

@@ -17,6 +17,13 @@ extern "C" {
  */
 UA_StatusCode UA_EXPORT UA_Client_NamespaceGetIndex(UA_Client *client, UA_String *namespaceUri, UA_UInt16 *namespaceIndex);
 
+/* Iterate over all nodes referenced by parentNodeId by calling the callback
+ f unction for each child node */                                                        
+ typedef UA_StatusCode (*UA_NodeIteratorCallback)(UA_NodeId childId, UA_Boolean isInverse,
+                                                  UA_NodeId referenceTypeId, void *handle);
+ 
+UA_StatusCode UA_EXPORT UA_Client_forEachChildNodeCall(UA_Client *client, UA_NodeId parentNodeId, UA_NodeIteratorCallback callback, void *handle) ;
+
 /*******************/
 /* Node Management */
 /*******************/

+ 33 - 0
src/client/ua_client_highlevel.c

@@ -43,6 +43,39 @@ UA_Client_NamespaceGetIndex(UA_Client *client, UA_String *namespaceUri, UA_UInt1
 	return retval;
 }
 
+UA_StatusCode
+UA_Client_forEachChildNodeCall(UA_Client *client, UA_NodeId parentNodeId, UA_NodeIteratorCallback callback, void *handle) {
+  UA_StatusCode retval = UA_STATUSCODE_GOOD;
+  
+  UA_BrowseRequest bReq;
+  UA_BrowseRequest_init(&bReq);
+  bReq.requestedMaxReferencesPerNode = 0;
+  bReq.nodesToBrowse = UA_BrowseDescription_new();
+  bReq.nodesToBrowseSize = 1;
+  UA_NodeId_copy(&parentNodeId, &bReq.nodesToBrowse[0].nodeId);
+  bReq.nodesToBrowse[0].resultMask = UA_BROWSERESULTMASK_ALL; //return everything
+  bReq.nodesToBrowse[0].browseDirection = UA_BROWSEDIRECTION_BOTH;
+  
+  UA_BrowseResponse bResp = UA_Client_Service_browse(client, bReq);
+  
+  if(bResp.responseHeader.serviceResult == UA_STATUSCODE_GOOD) {
+    for (size_t i = 0; i < bResp.resultsSize; ++i) {
+      for (size_t j = 0; j < bResp.results[i].referencesSize; ++j) {
+        UA_ReferenceDescription *ref = &(bResp.results[i].references[j]);
+        retval |= callback(ref->nodeId.nodeId, ! ref->isForward, ref->referenceTypeId, handle);
+      }
+    }
+  }
+  else
+    retval = bResp.responseHeader.serviceResult;
+  
+  
+  UA_BrowseRequest_deleteMembers(&bReq);
+  UA_BrowseResponse_deleteMembers(&bResp);
+  
+  return retval;
+}
+
 /*******************/
 /* Node Management */
 /*******************/