|
@@ -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);
|
|
|
}
|
|
|
|
|
|
|