Browse Source

partially fixed the view services
(cherry picked from commit efd96b3e3eae358722ef6d2c8e0e0d920f30be2d)

Stasik0 10 years ago
parent
commit
9905c53c4b
2 changed files with 40 additions and 8 deletions
  1. 24 0
      src/server/ua_server.c
  2. 16 8
      src/server/ua_services_view.c

+ 24 - 0
src/server/ua_server.c

@@ -246,6 +246,16 @@ static void addDataTypeNode(UA_Server *server, char* name, UA_UInt32 datatypeid,
                       &UA_NODEID_NUMERIC(0, UA_NS0ID_ORGANIZES));
 }
 
+static void addObjectTypeNode(UA_Server *server, char* name, UA_UInt32 objecttypeid, UA_Int32 parent) {
+    UA_ObjectTypeNode *objecttype = UA_ObjectTypeNode_new();
+    copyNames((UA_Node*)objecttype, name);
+    objecttype->nodeId.identifier.numeric = objecttypeid;
+    printf("parent %i\n", parent);
+    UA_Server_addNode(server, (UA_Node*)objecttype,
+                      &UA_EXPANDEDNODEID_NUMERIC(0, parent),
+                      &UA_NODEID_NUMERIC(0, UA_NS0ID_ORGANIZES));
+}
+
 static UA_VariableTypeNode*
 createVariableTypeNode(UA_Server *server, char* name, UA_UInt32 variabletypeid,
                        UA_Int32 parent, UA_Boolean abstract)
@@ -768,6 +778,20 @@ UA_Server * UA_Server_new(UA_ServerConfig config) {
    addVariableTypeNode_organized(server, "BaseVariableType", UA_NS0ID_BASEVARIABLETYPE, UA_NS0ID_VARIABLETYPESFOLDER, UA_TRUE);
    addVariableTypeNode_subtype(server, "PropertyType", UA_NS0ID_PROPERTYTYPE, UA_NS0ID_BASEVARIABLETYPE, UA_FALSE);
 
+   /****************/
+   /* Object Types */
+   /****************/
+   UA_ObjectNode *objecttypes = UA_ObjectNode_new();
+   copyNames((UA_Node*)objecttypes, "ObjectTypes");
+   objecttypes->nodeId.identifier.numeric = UA_NS0ID_OBJECTTYPESFOLDER;
+   UA_Server_addNode(server, (UA_Node*)objecttypes,
+                     &UA_EXPANDEDNODEID_NUMERIC(0, UA_NS0ID_TYPESFOLDER),
+                     &UA_NODEID_NUMERIC(0, UA_NS0ID_ORGANIZES));
+   ADDREFERENCE(UA_NODEID_NUMERIC(0, UA_NS0ID_OBJECTTYPESFOLDER), UA_NODEID_NUMERIC(0, UA_NS0ID_HASTYPEDEFINITION),
+                UA_EXPANDEDNODEID_NUMERIC(0, UA_NS0ID_FOLDERTYPE));
+
+   addObjectTypeNode(server, "BaseObjectType", UA_NS0ID_BASEOBJECTTYPE, UA_NS0ID_OBJECTTYPESFOLDER);
+
    /*******************/
    /* Further Objects */
    /*******************/

+ 16 - 8
src/server/ua_services_view.c

@@ -24,14 +24,15 @@ static UA_StatusCode fillrefdescr(UA_NodeStore *ns, const UA_Node *curr, UA_Refe
         retval |= UA_QualifiedName_copy(&curr->browseName, &descr->browseName);
     if(mask & UA_BROWSERESULTMASK_DISPLAYNAME)
         retval |= UA_LocalizedText_copy(&curr->displayName, &descr->displayName);
-    if(mask & UA_BROWSERESULTMASK_TYPEDEFINITION &&
-       (curr->nodeClass == UA_NODECLASS_OBJECT || curr->nodeClass == UA_NODECLASS_VARIABLE)) {
-        for(UA_Int32 i = 0; i < curr->referencesSize; i++) {
-            UA_ReferenceNode *refnode = &curr->references[i];
-            if(refnode->referenceTypeId.identifier.numeric != UA_NS0ID_HASTYPEDEFINITION)
-                continue;
-            retval |= UA_ExpandedNodeId_copy(&refnode->targetId, &descr->typeDefinition);
-            break;
+    if(mask & UA_BROWSERESULTMASK_TYPEDEFINITION){
+        if(curr->nodeClass == UA_NODECLASS_OBJECT || curr->nodeClass == UA_NODECLASS_VARIABLE) {
+            for(UA_Int32 i = 0; i < curr->referencesSize; i++) {
+                UA_ReferenceNode *refnode = &curr->references[i];
+                if(refnode->referenceTypeId.identifier.numeric != UA_NS0ID_HASTYPEDEFINITION)
+                    continue;
+                retval |= UA_ExpandedNodeId_copy(&refnode->targetId, &descr->typeDefinition);
+                break;
+            }
         }
     }
 
@@ -161,6 +162,13 @@ static void browse(UA_NodeStore *ns, struct ContinuationPointEntry **cp, const U
     UA_NodeId *relevant_refs = UA_NULL;
     // what are the relevant references?
     UA_Boolean all_refs = UA_NodeId_isNull(&descr->referenceTypeId);
+
+    //check if reference type id exists
+    if(!all_refs && UA_NodeStore_get(ns, &descr->referenceTypeId) == UA_NULL) {
+        result->statusCode = UA_STATUSCODE_BADREFERENCETYPEIDINVALID;
+        return;
+    }
+
     if(!all_refs) {
         if(descr->includeSubtypes) {
             result->statusCode = findsubtypes(ns, &descr->referenceTypeId, &relevant_refs,