Browse Source

Fixed argument creation for XML defined methods (Warning: "Dirty" Fix, see #485). Works for now.

ichrispa 9 years ago
parent
commit
5f16e6e97d
1 changed files with 41 additions and 28 deletions
  1. 41 28
      src/server/ua_services_nodemanagement.c

+ 41 - 28
src/server/ua_services_nodemanagement.c

@@ -695,36 +695,49 @@ UA_Server_addMethodNode(UA_Server *server, const UA_NodeId requestedNewNodeId,
     parent.nodeId = result.addedNodeId;
     
     /* create InputArguments */
-    UA_VariableNode *inputArgumentsVariableNode = UA_VariableNode_new();
-    inputArgumentsVariableNode->nodeId.namespaceIndex = result.addedNodeId.namespaceIndex;
-    inputArgumentsVariableNode->browseName = UA_QUALIFIEDNAME_ALLOC(0,"InputArguments");
-    inputArgumentsVariableNode->displayName = UA_LOCALIZEDTEXT_ALLOC("en_US", "InputArguments");
-    inputArgumentsVariableNode->description = UA_LOCALIZEDTEXT_ALLOC("en_US", "InputArguments");
-    inputArgumentsVariableNode->valueRank = 1;
-    UA_Variant_setArrayCopy(&inputArgumentsVariableNode->value.variant.value, inputArguments,
-                            inputArgumentsSize, &UA_TYPES[UA_TYPES_ARGUMENT]);
-    UA_AddNodesResult inputAddRes;
+    /* FIXME:   The namespace compiler does currently not recognize the interdependancy between methods
+     *          and arguments - everything is treated as a standalone node.
+     *          In order to allow the compiler to create methods with arguments from an XML, this routine
+     *          must be coerced into *not* creating arguments, as these will be added by the compiler as
+     *          standalone nodes later. A semantic of inputArgumentsSize < 0 is used to signal this.
+     * 
+     *          This is not a production feature and should be fixed on the compiler side! (@ichrispa)
+     */
     const UA_NodeId hasproperty = UA_NODEID_NUMERIC(0, UA_NS0ID_HASPROPERTY);
-    UA_Server_addExistingNode(server, &adminSession, (UA_Node*)inputArgumentsVariableNode,
-                              &parent.nodeId, &hasproperty, &inputAddRes);
-    // todo: check if adding succeeded
-    UA_AddNodesResult_deleteMembers(&inputAddRes);
-
+    if (inputArgumentsSize >= 0) {
+      UA_VariableNode *inputArgumentsVariableNode = UA_VariableNode_new();
+      inputArgumentsVariableNode->nodeId.namespaceIndex = result.addedNodeId.namespaceIndex;
+      inputArgumentsVariableNode->browseName = UA_QUALIFIEDNAME_ALLOC(0,"InputArguments");
+      inputArgumentsVariableNode->displayName = UA_LOCALIZEDTEXT_ALLOC("en_US", "InputArguments");
+      inputArgumentsVariableNode->description = UA_LOCALIZEDTEXT_ALLOC("en_US", "InputArguments");
+      inputArgumentsVariableNode->valueRank = 1;
+      UA_Variant_setArrayCopy(&inputArgumentsVariableNode->value.variant.value, inputArguments,
+                              inputArgumentsSize, &UA_TYPES[UA_TYPES_ARGUMENT]);
+      UA_AddNodesResult inputAddRes;
+      UA_Server_addExistingNode(server, &adminSession, (UA_Node*)inputArgumentsVariableNode,
+                                &parent.nodeId, &hasproperty, &inputAddRes);
+      // todo: check if adding succeeded
+      UA_AddNodesResult_deleteMembers(&inputAddRes);
+    }
+    
     /* create OutputArguments */
-    UA_VariableNode *outputArgumentsVariableNode  = UA_VariableNode_new();
-    outputArgumentsVariableNode->nodeId.namespaceIndex = result.addedNodeId.namespaceIndex;
-    outputArgumentsVariableNode->browseName  = UA_QUALIFIEDNAME_ALLOC(0,"OutputArguments");
-    outputArgumentsVariableNode->displayName = UA_LOCALIZEDTEXT_ALLOC("en_US", "OutputArguments");
-    outputArgumentsVariableNode->description = UA_LOCALIZEDTEXT_ALLOC("en_US", "OutputArguments");
-    outputArgumentsVariableNode->valueRank = 1;
-    UA_Variant_setArrayCopy(&outputArgumentsVariableNode->value.variant.value, outputArguments,
-                            outputArgumentsSize, &UA_TYPES[UA_TYPES_ARGUMENT]);
-    UA_AddNodesResult outputAddRes;
-    UA_Server_addExistingNode(server, &adminSession, (UA_Node*)outputArgumentsVariableNode,
-                              &parent.nodeId, &hasproperty, &outputAddRes);
-    // todo: check if adding succeeded
-    UA_AddNodesResult_deleteMembers(&outputAddRes);
-
+    /* FIXME:   See comment in inputArguments */
+    if (outputArgumentsSize >= 0) {
+      UA_VariableNode *outputArgumentsVariableNode  = UA_VariableNode_new();
+      outputArgumentsVariableNode->nodeId.namespaceIndex = result.addedNodeId.namespaceIndex;
+      outputArgumentsVariableNode->browseName  = UA_QUALIFIEDNAME_ALLOC(0,"OutputArguments");
+      outputArgumentsVariableNode->displayName = UA_LOCALIZEDTEXT_ALLOC("en_US", "OutputArguments");
+      outputArgumentsVariableNode->description = UA_LOCALIZEDTEXT_ALLOC("en_US", "OutputArguments");
+      outputArgumentsVariableNode->valueRank = 1;
+      UA_Variant_setArrayCopy(&outputArgumentsVariableNode->value.variant.value, outputArguments,
+                              outputArgumentsSize, &UA_TYPES[UA_TYPES_ARGUMENT]);
+      UA_AddNodesResult outputAddRes;
+      UA_Server_addExistingNode(server, &adminSession, (UA_Node*)outputArgumentsVariableNode,
+                                &parent.nodeId, &hasproperty, &outputAddRes);
+      // todo: check if adding succeeded
+      UA_AddNodesResult_deleteMembers(&outputAddRes);
+    }
+    
     if(outNewNodeId)
         *outNewNodeId = result.addedNodeId;
     else