Pārlūkot izejas kodu

Merge branch 'dev' of github.com:acplt/open62541 into dev

Julius Pfrommer 9 gadi atpakaļ
vecāks
revīzija
49f0748426

+ 3 - 0
include/ua_server.h

@@ -154,6 +154,9 @@ UA_Server_addMethodNode(UA_Server *server, const UA_QualifiedName browseName, UA
                         UA_MethodCallback method, UA_Int32 inputArgumentsSize,
                         const UA_Argument *inputArguments, UA_Int32 outputArgumentsSize,
                         const UA_Argument *outputArguments);
+
+UA_StatusCode UA_EXPORT
+UA_Server_attachMethod_toNode(UA_Server *server, UA_NodeId methodNodeId, UA_MethodCallback method);
 #endif
 
 /** Jobs describe work that is executed once or repeatedly. */

+ 26 - 0
src/server/ua_server_addressspace.c

@@ -445,4 +445,30 @@ UA_Server_addMethodNode(UA_Server *server, const UA_QualifiedName browseName, UA
     
     return retval;
 }
+
+UA_StatusCode
+UA_Server_attachMethod_toNode(UA_Server *server, UA_NodeId methodNodeId, UA_MethodCallback method) {
+    UA_StatusCode retval = UA_STATUSCODE_GOOD;
+    const UA_Node *attachToMethod;
+    UA_MethodNode *replacementMethod = UA_MethodNode_new();
+    
+    if (!method)
+        return UA_STATUSCODE_BADMETHODINVALID;
+    if (!server)
+        return UA_STATUSCODE_BADSERVERINDEXINVALID;
+    
+    attachToMethod =  UA_NodeStore_get(server->nodestore, &methodNodeId);
+    if (!attachToMethod)
+        return UA_STATUSCODE_BADNODEIDINVALID;
+    
+    if (attachToMethod->nodeClass != UA_NODECLASS_METHOD)
+        return UA_STATUSCODE_BADNODEIDINVALID;
+    
+    UA_MethodNode_copy((const UA_MethodNode *) attachToMethod, replacementMethod);
+    UA_NodeStore_release(attachToMethod);
+    
+    replacementMethod->attachedMethod = method;
+    retval |= UA_NodeStore_replace(server->nodestore, attachToMethod, (UA_Node *) replacementMethod, UA_NULL);
+    return retval;
+}
 #endif

+ 6 - 3
src/server/ua_services_call.c

@@ -181,8 +181,8 @@ void Service_Call(UA_Server *server, UA_Session *session, const UA_CallRequest *
         const UA_VariableNode *outputArguments = getArgumentsVariableNode(server, methodCalled,
                                                                           UA_STRING("OutputArguments"));
         if(!outputArguments) {
+            // A MethodNode must have an OutputArguments variable (which may be empty)
             rs->statusCode = UA_STATUSCODE_BADINTERNALERROR;
-            UA_NodeStore_release((const UA_Node*)outputArguments);
             continue;
         }
         
@@ -196,8 +196,11 @@ void Service_Call(UA_Server *server, UA_Session *session, const UA_CallRequest *
         }
         else
             rs->statusCode = UA_STATUSCODE_BADNOTWRITABLE; // There is no NOTEXECUTABLE?
-
-        UA_NodeStore_release((const UA_Node*)outputArguments);
+            
+        /* FIXME: Verify Output Argument count, types and sizes */
+        if(outputArguments) {
+            UA_NodeStore_release((const UA_Node*)outputArguments);
+        }
         UA_NodeStore_release((const UA_Node *)withObject);
         UA_NodeStore_release((const UA_Node *)methodCalled);
     }

+ 5 - 1
tools/pyUANamespace/open62541_MacroHelper.py

@@ -106,7 +106,11 @@ class open62541_MacroHelper():
 
     code.append(nodetype + " *" + node.getCodePrintableID() + " = " + nodetype + "_new();")
     if not "browsename" in self.supressGenerationOfAttribute:
-      code.append(node.getCodePrintableID() + "->browseName = UA_QUALIFIEDNAME_ALLOC(" +  str(node.id().ns) + ", \"" + node.browseName() + "\");")
+      extrNs = node.browseName().split(":")
+      if len(extrNs) > 1:
+        code.append(node.getCodePrintableID() + "->browseName = UA_QUALIFIEDNAME_ALLOC(" +  str(extrNs[0]) + ", \"" + extrNs[1] + "\");")
+      else:
+        code.append(node.getCodePrintableID() + "->browseName = UA_QUALIFIEDNAME_ALLOC(0, \"" + node.browseName() + "\");")
     if not "displayname" in self.supressGenerationOfAttribute:
       code.append(node.getCodePrintableID() + "->displayName = UA_LOCALIZEDTEXT_ALLOC(\"en_US\", \"" +  node.displayName() + "\");")
     if not "description" in self.supressGenerationOfAttribute: