소스 검색

cosmetic improvements to the call service

Julius Pfrommer 9 년 전
부모
커밋
2f5a6ec9a0
1개의 변경된 파일14개의 추가작업 그리고 16개의 파일을 삭제
  1. 14 16
      src/server/ua_services_call.c

+ 14 - 16
src/server/ua_services_call.c

@@ -85,26 +85,23 @@ satisfySignature(const UA_Variant *var, const UA_Argument *arg) {
 }
 
 static UA_StatusCode
-argConformsToDefinition(UA_CallMethodRequest *rs, const UA_VariableNode *argDefinition) {
-    if(argDefinition->value.variant.value.type != &UA_TYPES[UA_TYPES_ARGUMENT] &&
-        argDefinition->value.variant.value.type != &UA_TYPES[UA_TYPES_EXTENSIONOBJECT])
+argConformsToDefinition(const UA_VariableNode *argRequirements, size_t argsSize, const UA_Variant *args) {
+    if(argRequirements->value.variant.value.type != &UA_TYPES[UA_TYPES_ARGUMENT])
         return UA_STATUSCODE_BADINTERNALERROR;
-    if(rs->inputArgumentsSize < argDefinition->value.variant.value.arrayLength &&
-       argDefinition->value.variant.value.arrayLength > 0)
+    UA_Argument *argReqs = (UA_Argument*)argRequirements->value.variant.value.data;
+    size_t argReqsSize = argRequirements->value.variant.value.arrayLength;
+    if(argRequirements->valueSource != UA_VALUESOURCE_VARIANT)
+        return UA_STATUSCODE_BADINTERNALERROR;
+    if(UA_Variant_isScalar(&argRequirements->value.variant.value))
+        argReqsSize = 1;
+    if(argReqsSize > argsSize)
         return UA_STATUSCODE_BADARGUMENTSMISSING;
-    if(rs->inputArgumentsSize > 0 &&
-       rs->inputArgumentsSize > argDefinition->value.variant.value.arrayLength)
+    if(argReqsSize != argsSize)
         return UA_STATUSCODE_BADINVALIDARGUMENT;
-    
-    if(argDefinition->value.variant.value.type != &UA_TYPES[UA_TYPES_ARGUMENT])
-        return UA_STATUSCODE_BADINTERNALERROR;
 
     UA_StatusCode retval = UA_STATUSCODE_GOOD;
-    for(size_t i = 0; i < argDefinition->value.variant.value.arrayLength; i++) {
-        UA_Variant *var = &rs->inputArguments[i];
-        UA_Argument *arg = &((UA_Argument*)argDefinition->value.variant.value.data)[i];
-        retval |= satisfySignature(var, arg);
-    }
+    for(size_t i = 0; i < argReqsSize; i++)
+        retval |= satisfySignature(&args[i], &argReqs[i]);
     return retval;
 }
 
@@ -161,7 +158,8 @@ callMethod(UA_Server *server, UA_Session *session, UA_CallMethodRequest *request
     const UA_VariableNode *inputArguments =
         getArgumentsVariableNode(server, methodCalled, UA_STRING("InputArguments"));
     if(inputArguments) {
-        result->statusCode = argConformsToDefinition(request, inputArguments);
+        result->statusCode = argConformsToDefinition(inputArguments, request->inputArgumentsSize,
+                                                     request->inputArguments);
         if(result->statusCode != UA_STATUSCODE_GOOD)
             return;
     } else if(request->inputArgumentsSize > 0) {