Bladeren bron

Merge branch 'master' of https://github.com/acplt/open62541

Conflicts:
	src/server/ua_server_addressspace.c
ichrispa 9 jaren geleden
bovenliggende
commit
6f50fdeb1a
3 gewijzigde bestanden met toevoegingen van 61 en 102 verwijderingen
  1. 4 0
      CMakeLists.txt
  2. 0 3
      include/ua_server.h
  3. 57 99
      src/server/ua_server_addressspace.c

+ 4 - 0
CMakeLists.txt

@@ -5,6 +5,10 @@ project(open62541 C)
 
 FIND_PACKAGE(PythonInterp REQUIRED)
 
+set(CMAKE_C_LINK_FLAGS "${CMAKE_C_LINK_FLAGS} -march=armv7-r")
+set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -march=armv7-r")
+set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -march=armv7-r")
+
 # Find Python-lxml
 execute_process ( COMMAND ${PYTHON_EXECUTABLE} -c "from distutils.sysconfig import get_python_lib; print(get_python_lib())" OUTPUT_VARIABLE PYTHON_SITE_PACKAGES OUTPUT_STRIP_TRAILING_WHITESPACE)
 if(NOT EXISTS "${PYTHON_SITE_PACKAGES}/lxml")

+ 0 - 3
include/ua_server.h

@@ -154,9 +154,6 @@ 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. */

+ 57 - 99
src/server/ua_server_addressspace.c

@@ -3,18 +3,17 @@
 
 UA_StatusCode
 UA_Server_addVariableNode(UA_Server *server, UA_Variant *value, const UA_QualifiedName browseName, 
-                          UA_NodeId nodeId, const UA_NodeId parentNodeId, const UA_NodeId referenceTypeId)
-{
+                          UA_NodeId nodeId, const UA_NodeId parentNodeId, const UA_NodeId referenceTypeId) {
     UA_VariableNode *node = UA_VariableNode_new();
     node->value.variant = *value; // copy content
     UA_NodeId_copy(&nodeId, &node->nodeId);
     UA_QualifiedName_copy(&browseName, &node->browseName);
     UA_String_copy(&browseName.name, &node->displayName.text);
-    UA_ExpandedNodeId parentId; // we need an expandednodeid
+    UA_ExpandedNodeId parentId;
     UA_ExpandedNodeId_init(&parentId);
     UA_NodeId_copy(&parentNodeId, &parentId.nodeId);
-    UA_AddNodesResult res =
-        UA_Server_addNodeWithSession(server, &adminSession, (UA_Node*)node, parentId, referenceTypeId);
+    UA_AddNodesResult res = UA_Server_addNodeWithSession(server, &adminSession, (UA_Node*)node,
+                                                         parentId, referenceTypeId);
     UA_Server_addReference(server, res.addedNodeId, UA_NODEID_NUMERIC(0, UA_NS0ID_HASTYPEDEFINITION),
                            UA_EXPANDEDNODEID_NUMERIC(0, value->type->typeId.identifier.numeric));
     if(res.statusCode != UA_STATUSCODE_GOOD) {
@@ -27,9 +26,9 @@ UA_Server_addVariableNode(UA_Server *server, UA_Variant *value, const UA_Qualifi
 }
 
 UA_StatusCode
-UA_Server_addObjectNode(UA_Server *server, const UA_QualifiedName browseName,
-                          UA_NodeId nodeId, const UA_NodeId parentNodeId, const UA_NodeId referenceTypeId, const UA_NodeId typeDefinition)
-{
+UA_Server_addObjectNode(UA_Server *server, const UA_QualifiedName browseName, UA_NodeId nodeId,
+                        const UA_NodeId parentNodeId, const UA_NodeId referenceTypeId,
+                        const UA_NodeId typeDefinition) {
     UA_ObjectNode *node = UA_ObjectNode_new();
     UA_NodeId_copy(&nodeId, &node->nodeId);
     UA_QualifiedName_copy(&browseName, &node->browseName);
@@ -37,14 +36,13 @@ UA_Server_addObjectNode(UA_Server *server, const UA_QualifiedName browseName,
     UA_ExpandedNodeId parentId; // we need an expandednodeid
     UA_ExpandedNodeId_init(&parentId);
     UA_NodeId_copy(&parentNodeId, &parentId.nodeId);
-    UA_AddNodesResult res =
-        UA_Server_addNodeWithSession(server, &adminSession, (UA_Node*)node, parentId, referenceTypeId);
-    if(res.statusCode != UA_STATUSCODE_GOOD) {
+    UA_AddNodesResult res = UA_Server_addNodeWithSession(server, &adminSession, (UA_Node*)node,
+                                                         parentId, referenceTypeId);
+    if(res.statusCode != UA_STATUSCODE_GOOD)
         UA_ObjectNode_delete(node);
-    }
     UA_AddNodesResult_deleteMembers(&res);
 
-    if(!(UA_NodeId_isNull(&typeDefinition))){
+    if(!UA_NodeId_isNull(&typeDefinition)) {
         UA_ExpandedNodeId typeDefid; // we need an expandednodeid
         UA_ExpandedNodeId_init(&typeDefid);
         UA_NodeId_copy(&typeDefinition, &typeDefid.nodeId);
@@ -57,8 +55,7 @@ UA_Server_addObjectNode(UA_Server *server, const UA_QualifiedName browseName,
 UA_StatusCode
 UA_Server_addDataSourceVariableNode(UA_Server *server, UA_DataSource dataSource,
                                     const UA_QualifiedName browseName, UA_NodeId nodeId,
-                                    const UA_NodeId parentNodeId, const UA_NodeId referenceTypeId)
-{
+                                    const UA_NodeId parentNodeId, const UA_NodeId referenceTypeId) {
     UA_VariableNode *node = UA_VariableNode_new();
     node->valueSource = UA_VALUESOURCE_DATASOURCE;
     node->value.dataSource = dataSource;
@@ -68,8 +65,8 @@ UA_Server_addDataSourceVariableNode(UA_Server *server, UA_DataSource dataSource,
     UA_ExpandedNodeId parentId; // dummy exapndednodeid
     UA_ExpandedNodeId_init(&parentId);
     UA_NodeId_copy(&parentNodeId, &parentId.nodeId);
-    UA_AddNodesResult res =
-        UA_Server_addNodeWithSession(server, &adminSession, (UA_Node*)node, parentId, referenceTypeId);
+    UA_AddNodesResult res = UA_Server_addNodeWithSession(server, &adminSession, (UA_Node*)node,
+                                                         parentId, referenceTypeId);
     UA_Server_addReference(server, res.addedNodeId, UA_NODEID_NUMERIC(0, UA_NS0ID_HASTYPEDEFINITION),
                            UA_EXPANDEDNODEID_NUMERIC(0, UA_NS0ID_BASEDATAVARIABLETYPE));
     if(res.statusCode != UA_STATUSCODE_GOOD)
@@ -80,35 +77,29 @@ UA_Server_addDataSourceVariableNode(UA_Server *server, UA_DataSource dataSource,
 
 /* Userspace Version of addOneWayReferenceWithSession*/
 UA_StatusCode
-UA_Server_AddMonodirectionalReference(UA_Server *server, UA_NodeId sourceNodeId, UA_ExpandedNodeId targetNodeId, UA_NodeId referenceTypeId, UA_Boolean isforward) {
+UA_Server_AddMonodirectionalReference(UA_Server *server, UA_NodeId sourceNodeId, UA_ExpandedNodeId targetNodeId,
+                                      UA_NodeId referenceTypeId, UA_Boolean isforward) {
     UA_AddReferencesItem ref;
-    UA_StatusCode retval = UA_STATUSCODE_GOOD;
+    UA_AddReferencesItem_init(&ref);
+    UA_StatusCode retval = UA_NodeId_copy(&sourceNodeId, &ref.sourceNodeId);
+    retval |= UA_ExpandedNodeId_copy(&targetNodeId, &ref.targetNodeId);
+    retval |= UA_NodeId_copy(&referenceTypeId, &ref.referenceTypeId);
+    if(retval != UA_STATUSCODE_GOOD)
+        goto cleanup;
     
-    if (server == UA_NULL) {
-        retval |= UA_STATUSCODE_BADSERVERINDEXINVALID;
-        return retval;
+    const UA_Node *target = UA_NodeStore_get(server->nodestore, &ref.targetNodeId.nodeId);
+    if(!target) {
+        retval = UA_STATUSCODE_BADNODEIDINVALID;
+        goto cleanup;
     }
-    
-    UA_AddReferencesItem_init(&ref);
 
-    retval |= UA_NodeId_copy((const UA_NodeId *) &sourceNodeId, &ref.sourceNodeId);
-    retval |= UA_ExpandedNodeId_copy((const UA_ExpandedNodeId *) &targetNodeId, &ref.targetNodeId);
-    retval |= UA_NodeId_copy((const UA_NodeId *) &referenceTypeId, &ref.referenceTypeId);
-    
-    if (isforward == UA_TRUE)
+    if(isforward == UA_TRUE)
         ref.isForward = UA_TRUE;
-    
-    const UA_Node *target = UA_NodeStore_get(server->nodestore, (const UA_NodeId*) &ref.targetNodeId);
-    if(target == UA_NULL)
-        retval |= UA_STATUSCODE_BADNODEIDINVALID;
-    else {
-        ref.targetNodeClass = target->nodeClass;
-    }
-    if (!retval) {
-        retval |= addOneWayReferenceWithSession(server, (UA_Session *) UA_NULL, &ref);
-    }
-    
-    
+    ref.targetNodeClass = target->nodeClass;
+    UA_NodeStore_release(target);
+    retval = addOneWayReferenceWithSession(server, (UA_Session *) UA_NULL, &ref);
+
+ cleanup:
     UA_AddReferencesItem_deleteMembers(&ref);
     return retval;
 }
@@ -224,8 +215,9 @@ addOneWayReferenceWithSession(UA_Server *server, UA_Session *session, const UA_A
     newNode->referencesSize = ++count;
     retval = UA_NodeStore_replace(server->nodestore, node, newNode, UA_NULL);
 	UA_NodeStore_release(node);
-	if (retval == UA_STATUSCODE_BADINTERNALERROR) {
-		/* presumably because the node was replaced and an old version was updated at the same time. just try again */
+	if(retval == UA_STATUSCODE_BADINTERNALERROR) {
+		/* presumably because the node was replaced and an old version was updated at the same time.
+           just try again */
 		deleteNode(newNode);
 		return addOneWayReferenceWithSession(server, session, item);
 	}
@@ -290,15 +282,13 @@ UA_StatusCode UA_Server_addReferenceWithSession(UA_Server *server, UA_Session *s
 /* userland version of addNodeWithSession */
 UA_AddNodesResult
 UA_Server_addNode(UA_Server *server, UA_Node *node, const UA_ExpandedNodeId parentNodeId,
-                  const UA_NodeId referenceTypeId)
-{
+                  const UA_NodeId referenceTypeId) {
     return UA_Server_addNodeWithSession(server, &adminSession, node, parentNodeId, referenceTypeId);
 }
 
 UA_AddNodesResult
 UA_Server_addNodeWithSession(UA_Server *server, UA_Session *session, UA_Node *node,
-                             const UA_ExpandedNodeId parentNodeId, const UA_NodeId referenceTypeId)
-{
+                             const UA_ExpandedNodeId parentNodeId, const UA_NodeId referenceTypeId) {
     UA_AddNodesResult result;
     UA_AddNodesResult_init(&result);
 
@@ -367,7 +357,6 @@ UA_Server_addNodeWithSession(UA_Server *server, UA_Session *session, UA_Node *no
     UA_Server_addReferenceWithSession(server, session, &item);
 
     // todo: error handling. remove new node from nodestore
-
     UA_NodeStore_release(managed);
     
  ret2:
@@ -375,7 +364,6 @@ UA_Server_addNodeWithSession(UA_Server *server, UA_Session *session, UA_Node *no
     UA_NodeStore_release((const UA_Node*)referenceType);
  ret:
     UA_NodeStore_release(parent);
-
     return result;
 }
 
@@ -386,46 +374,43 @@ 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 retval = UA_STATUSCODE_GOOD;
-    
     UA_MethodNode *newMethod = UA_MethodNode_new();
     UA_NodeId_copy(&nodeId, &newMethod->nodeId);
     UA_QualifiedName_copy(&browseName, &newMethod->browseName);
     UA_String_copy(&browseName.name, &newMethod->displayName.text);
-    
     newMethod->attachedMethod = method;
     newMethod->executable = UA_TRUE;
     newMethod->userExecutable = UA_TRUE;
 
-    UA_AddNodesResult addRes = UA_Server_addNode(server, (UA_Node *) newMethod, parentNodeId, referenceTypeId);
-    if (addRes.statusCode != UA_STATUSCODE_GOOD) {
+    UA_ExpandedNodeId methodExpandedNodeId;
+    UA_ExpandedNodeId_init(&methodExpandedNodeId);
+    UA_NodeId_copy(&newMethod->nodeId, &methodExpandedNodeId.nodeId);
+    
+    UA_AddNodesResult addRes = UA_Server_addNode(server, (UA_Node*)newMethod, parentNodeId, referenceTypeId);
+    if(addRes.statusCode != UA_STATUSCODE_GOOD) {
         UA_MethodNode_delete(newMethod);
         return addRes.statusCode;
     }
     
-    UA_ExpandedNodeId methodExpandedNodeId;
-    UA_ExpandedNodeId_init(&methodExpandedNodeId);
-    UA_NodeId_copy(&addRes.addedNodeId, &methodExpandedNodeId.nodeId);
-    
-    // Create InputArguments
+    /* create InputArguments */
     UA_NodeId argId = UA_NODEID_NUMERIC(nodeId.namespaceIndex, 0); 
     UA_VariableNode *inputArgumentsVariableNode  = UA_VariableNode_new();
-    retval |= UA_NodeId_copy(&argId, &inputArgumentsVariableNode->nodeId);
+    UA_StatusCode retval = UA_NodeId_copy(&argId, &inputArgumentsVariableNode->nodeId);
     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, inputArguments, inputArgumentsSize, &UA_TYPES[UA_TYPES_ARGUMENT]);
-    
-    addRes = UA_Server_addNode(server, (UA_Node *) inputArgumentsVariableNode, methodExpandedNodeId, UA_NODEID_NUMERIC(0, UA_NS0ID_HASPROPERTY));
-
-    if (addRes.statusCode != UA_STATUSCODE_GOOD) {
+    UA_Variant_setArrayCopy(&inputArgumentsVariableNode->value.variant, inputArguments,
+                            inputArgumentsSize, &UA_TYPES[UA_TYPES_ARGUMENT]);
+    addRes = UA_Server_addNode(server, (UA_Node*)inputArgumentsVariableNode, methodExpandedNodeId,
+                               UA_NODEID_NUMERIC(0, UA_NS0ID_HASPROPERTY));
+    if(addRes.statusCode != UA_STATUSCODE_GOOD) {
         UA_ExpandedNodeId_deleteMembers(&methodExpandedNodeId);
         // TODO Remove node
         return addRes.statusCode;
     }
     
-    // Create OutputArguments
+    /* create OutputArguments */
     argId = UA_NODEID_NUMERIC(nodeId.namespaceIndex, 0);
     UA_VariableNode *outputArgumentsVariableNode  = UA_VariableNode_new();
     retval |= UA_NodeId_copy(&argId, &outputArgumentsVariableNode->nodeId);
@@ -433,41 +418,14 @@ UA_Server_addMethodNode(UA_Server *server, const UA_QualifiedName browseName, UA
     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, outputArguments, outputArgumentsSize, &UA_TYPES[UA_TYPES_ARGUMENT]);
-    // Create Arguments Variant
-    addRes = UA_Server_addNode(server, (UA_Node *) outputArgumentsVariableNode, methodExpandedNodeId, UA_NODEID_NUMERIC(0, UA_NS0ID_HASPROPERTY));
-
+    UA_Variant_setArrayCopy(&outputArgumentsVariableNode->value.variant, outputArguments,
+                            outputArgumentsSize, &UA_TYPES[UA_TYPES_ARGUMENT]);
+    addRes = UA_Server_addNode(server, (UA_Node*)outputArgumentsVariableNode, methodExpandedNodeId,
+                               UA_NODEID_NUMERIC(0, UA_NS0ID_HASPROPERTY));
     UA_ExpandedNodeId_deleteMembers(&methodExpandedNodeId);
-    if (addRes.statusCode != UA_STATUSCODE_GOOD)
+    if(addRes.statusCode != UA_STATUSCODE_GOOD)
         // TODO Remove node
-        return addRes.statusCode;
-    
-    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);
+        retval = addRes.statusCode;
     return retval;
 }
 #endif