Forráskód Böngészése

Additional Checks for object->method relation; FIXME: Tree search is necessary to determine all subtypes of HasComponent; may be borrowed from TranslateNodeIdToPaths as @jpfr suggested on IRC.

ichrispa 9 éve
szülő
commit
ab2460f30c
1 módosított fájl, 25 hozzáadás és 3 törlés
  1. 25 3
      src/server/ua_services_call.c

+ 25 - 3
src/server/ua_services_call.c

@@ -14,7 +14,7 @@ void Service_Call(UA_Server *server, UA_Session *session,
     
     if (request->methodsToCall == UA_NULL) return;
     
-    response->responseHeader.serviceResult = UA_STATUSCODE_GOOD;
+    response->responseHeader.serviceResult = UA_STATUSCODE_BADNODECLASSINVALID;
     response->resultsSize=request->methodsToCallSize;
     response->results = (UA_CallMethodResult *) UA_malloc(sizeof(UA_CallMethodResult)*response->resultsSize);
     
@@ -40,15 +40,37 @@ void Service_Call(UA_Server *server, UA_Session *session,
         }
         
         if (methodCalled->nodeClass != UA_NODECLASS_METHOD) {
-            rs->statusCode = UA_STATUSCODE_BADMETHODINVALID;
+            rs->statusCode = UA_STATUSCODE_BADNODECLASSINVALID;
             continue;
         }
         if (withObject->nodeClass != UA_NODECLASS_OBJECT && withObject->nodeClass != UA_NODECLASS_OBJECTTYPE) {
-            rs->statusCode = UA_STATUSCODE_BADNODEIDINVALID;
+            rs->statusCode = UA_STATUSCODE_BADNODECLASSINVALID;
             printf("Obj not found 1\n");
             continue;
         }
+
+        // Object must have a hasComponent reference (or any inherited referenceType from sayd reference) 
+        // to be valid for a methodCall...
+        for(int i=0; i<withObject->referencesSize; i++) {
+            if(withObject->references[i].referenceTypeId.identifier.numeric == UA_NS0ID_HASCOMPONENT) {
+                // FIXME: Not checking any subtypes of HasComponent at the moment
+                if (UA_NodeId_equal(&withObject->references[i].targetId.nodeId, &methodCalled->nodeId)) {
+                    response->responseHeader.serviceResult = UA_STATUSCODE_GOOD;
+                }
+                
+            }
+        }
+        if (response->responseHeader.serviceResult != UA_STATUSCODE_GOOD) {
+            return;
+        }
+        
+        // Lookup Method Hook
+        
+        UA_NodeStore_release(methodCalled);
+        // Call Method right here.
         
+        // Wait for return value
+        UA_NodeStore_release(withObject);
     }