Browse Source

improvements to the address space and the view service set

Julius Pfrommer 10 years ago
parent
commit
c7368d7d82
3 changed files with 13 additions and 16 deletions
  1. 0 2
      src/server/ua_server.c
  2. 1 1
      src/server/ua_server_addressspace.c
  3. 12 13
      src/server/ua_services_view.c

+ 0 - 2
src/server/ua_server.c

@@ -604,8 +604,6 @@ UA_Server * UA_Server_new(void) {
    UA_Server_addNode(server, (UA_Node*)servernode,
 		   &UA_EXPANDEDNODEID_STATIC(0, UA_NS0ID_OBJECTSFOLDER),
 		   &UA_NODEID_STATIC(0, UA_NS0ID_ORGANIZES));
-   ADDREFERENCE(UA_NODEID_STATIC(0, UA_NS0ID_SERVER), UA_NODEID_STATIC(0, UA_NS0ID_HASCOMPONENT),
-		   UA_EXPANDEDNODEID_STATIC(0, UA_NS0ID_SERVER_SERVERCAPABILITIES));
    ADDREFERENCE(UA_NODEID_STATIC(0, UA_NS0ID_SERVER), UA_NODEID_STATIC(0, UA_NS0ID_HASPROPERTY),
 		   UA_EXPANDEDNODEID_STATIC(0, UA_NS0ID_SERVER_SERVERARRAY));
 

+ 1 - 1
src/server/ua_server_addressspace.c

@@ -15,7 +15,7 @@ UA_StatusCode UA_Server_addVariableNode(UA_Server *server, UA_Variant *value, UA
     UA_AddNodesResult res = UA_Server_addNodeWithSession(server, &adminSession, (UA_Node*)node,
                                                          &parentId, referenceTypeId);
     ADDREFERENCE(res.addedNodeId, UA_NODEID_STATIC(0, UA_NS0ID_HASTYPEDEFINITION),
-                 UA_EXPANDEDNODEID_STATIC(0, UA_NS0ID_BASEDATAVARIABLETYPE));
+                 UA_EXPANDEDNODEID_STATIC(0, value->type->typeId.identifier.numeric));
     if(res.statusCode != UA_STATUSCODE_GOOD) {
         UA_Variant_init(&node->variable.variant);
         UA_VariableNode_delete(node);

+ 12 - 13
src/server/ua_services_view.c

@@ -280,17 +280,14 @@ static UA_StatusCode walkBrowsePath(UA_Server *server, UA_Session *session, cons
     UA_NodeId *referenceTypes;
     size_t referenceTypesSize;
     UA_Boolean allReferences = UA_FALSE;
-    if(elem->includeSubtypes) {
-        if(UA_NodeId_isNull(&elem->referenceTypeId)) {
-            allReferences = UA_TRUE;
-            referenceTypesSize = 1; // so we enter the inner loop once
-        }
-        else {
-            retval = findReferenceTypeSubTypes(server->nodestore, &elem->referenceTypeId, &referenceTypes,
-                                               &referenceTypesSize);
-            if(retval != UA_STATUSCODE_GOOD)
-                return UA_STATUSCODE_BADNOMATCH;
-        }
+    if(UA_NodeId_isNull(&elem->referenceTypeId)) {
+        allReferences = UA_TRUE;
+        referenceTypesSize = 1; // so we enter the inner loop once
+    } else if(elem->includeSubtypes) {
+        retval = findReferenceTypeSubTypes(server->nodestore, &elem->referenceTypeId, &referenceTypes,
+                                           &referenceTypesSize);
+        if(retval != UA_STATUSCODE_GOOD)
+            return UA_STATUSCODE_BADNOMATCH;
     } else {
         uintptr_t ptr = (uintptr_t)&elem->referenceTypeId; // ptr magic due to const cast
         referenceTypes = (UA_NodeId*)ptr;
@@ -299,8 +296,8 @@ static UA_StatusCode walkBrowsePath(UA_Server *server, UA_Session *session, cons
 
     for(UA_Int32 i=0;i<current->referencesSize && retval == UA_STATUSCODE_GOOD;i++) {
         for(size_t j=0;j<referenceTypesSize && retval == UA_STATUSCODE_GOOD;j++) {
-            if((!allReferences && (!UA_NodeId_equal(&current->references[i].referenceTypeId, &referenceTypes[j])
-                                   || current->references[i].isInverse != elem->isInverse)))
+            if(!allReferences && (!UA_NodeId_equal(&current->references[i].referenceTypeId, &referenceTypes[j])
+                                   || current->references[i].isInverse != elem->isInverse))
                 continue;
             // todo: expandednodeid
             const UA_Node *next = UA_NodeStore_get(server->nodestore, &current->references[i].targetId.nodeId);
@@ -325,6 +322,8 @@ static UA_StatusCode walkBrowsePath(UA_Server *server, UA_Session *session, cons
                         UA_NodeId_copy(&next->nodeId, &targets[*currentTargets].targetId.nodeId);
                         targets[*currentTargets].remainingPathIndex = UA_UINT32_MAX;
                         *currentTargets += 1;
+                        UA_NodeStore_release(next);
+                        break; // go to the next node
                     }
                 } else {
                     // recurse deeper into the path