Преглед на файлове

refactor server-functions out of the service layer

Julius Pfrommer преди 8 години
родител
ревизия
6702b53ec1
променени са 4 файла, в които са добавени 55 реда и са изтрити 57 реда
  1. 31 1
      src/server/ua_server.c
  2. 0 5
      src/server/ua_server_internal.h
  3. 6 0
      src/server/ua_services.h
  4. 18 51
      src/server/ua_services_nodemanagement.c

+ 31 - 1
src/server/ua_server.c

@@ -222,7 +222,7 @@ addNodeInternal(UA_Server *server, UA_Node *node, const UA_NodeId parentNodeId,
     UA_AddNodesResult res;
     UA_AddNodesResult_init(&res);
     UA_RCU_LOCK();
-    UA_Server_addExistingNode(server, &adminSession, node, &parentNodeId,
+    Service_AddNodes_existing(server, &adminSession, node, &parentNodeId,
                               &referenceTypeId, &res);
     UA_RCU_UNLOCK();
     return res;
@@ -1192,6 +1192,36 @@ UA_Server_setObjectTypeNode_lifecycleManagement(UA_Server *server, UA_NodeId nod
     return retval;
 }
 
+#ifdef UA_ENABLE_METHODCALLS
+
+struct addMethodCallback {
+    UA_MethodCallback callback;
+    void *handle;
+};
+
+static UA_StatusCode
+editMethodCallback(UA_Server *server, UA_Session* session, UA_Node* node, const void* handle) {
+    if(node->nodeClass != UA_NODECLASS_METHOD)
+        return UA_STATUSCODE_BADNODECLASSINVALID;
+    const struct addMethodCallback *newCallback = handle;
+    UA_MethodNode *mnode = (UA_MethodNode*) node;
+    mnode->attachedMethod = newCallback->callback;
+    mnode->methodHandle   = newCallback->handle;
+    return UA_STATUSCODE_GOOD;
+}
+
+UA_StatusCode UA_EXPORT
+UA_Server_setMethodNode_callback(UA_Server *server, const UA_NodeId methodNodeId,
+                                 UA_MethodCallback method, void *handle) {
+    struct addMethodCallback cb = { method, handle };
+    UA_RCU_LOCK();
+    UA_StatusCode retval = UA_Server_editNode(server, &adminSession, &methodNodeId, editMethodCallback, &cb);
+    UA_RCU_UNLOCK();
+    return retval;
+}
+
+#endif
+
 UA_StatusCode
 __UA_Server_read(UA_Server *server, const UA_NodeId *nodeId, const UA_AttributeId attributeId, void *v) {
     UA_ReadValueId item;

+ 0 - 5
src/server/ua_server_internal.h

@@ -77,11 +77,6 @@ struct UA_Server {
     UA_ServerConfig config;
 };
 
-/* The node is assumed to be "finished", i.e. no instantiation from inheritance is necessary */
-void UA_Server_addExistingNode(UA_Server *server, UA_Session *session, UA_Node *node,
-                               const UA_NodeId *parentNodeId, const UA_NodeId *referenceTypeId,
-                               UA_AddNodesResult *result);
-
 typedef UA_StatusCode (*UA_EditNodeCallback)(UA_Server*, UA_Session*, UA_Node*, const void*);
 
 /* Calls callback on the node. In the multithreaded case, the node is copied before and replaced in

+ 6 - 0
src/server/ua_services.h

@@ -118,6 +118,12 @@ void Service_AddNodes(UA_Server *server, UA_Session *session,
 void Service_AddNodes_single(UA_Server *server, UA_Session *session, const UA_AddNodesItem *item,
                              UA_AddNodesResult *result, UA_InstantiationCallback *instantiationCallback);
 
+/* Add an existing node. The node is assumed to be "finished", i.e. no
+   instantiation from inheritance is necessary */
+void Service_AddNodes_existing(UA_Server *server, UA_Session *session, UA_Node *node,
+                               const UA_NodeId *parentNodeId, const UA_NodeId *referenceTypeId,
+                               UA_AddNodesResult *result);
+
 /** Used to add one or more References to one or more Nodes. */
 void Service_AddReferences(UA_Server *server, UA_Session *session,
                            const UA_AddReferencesRequest *request,

+ 18 - 51
src/server/ua_services_nodemanagement.c

@@ -6,7 +6,7 @@
 /************/
 
 void
-UA_Server_addExistingNode(UA_Server *server, UA_Session *session, UA_Node *node,
+Service_AddNodes_existing(UA_Server *server, UA_Session *session, UA_Node *node,
                           const UA_NodeId *parentNodeId, const UA_NodeId *referenceTypeId,
                           UA_AddNodesResult *result) {
     if(node->nodeId.namespaceIndex >= server->namespacesSize) {
@@ -238,9 +238,11 @@ instantiateObjectNode(UA_Server *server, UA_Session *session,
             item.targetNodeClass = UA_NODECLASS_METHOD;
             Service_AddReferences_single(server, session, &item);
         } else if(rd->nodeClass == UA_NODECLASS_VARIABLE)
-          copyExistingVariable(server, session, &rd->nodeId.nodeId, &rd->referenceTypeId, nodeId, instantiationCallback);
+          copyExistingVariable(server, session, &rd->nodeId.nodeId,
+                               &rd->referenceTypeId, nodeId, instantiationCallback);
         else if(rd->nodeClass == UA_NODECLASS_OBJECT)
-          copyExistingObject(server, session, &rd->nodeId.nodeId, &rd->referenceTypeId, nodeId, instantiationCallback);
+          copyExistingObject(server, session, &rd->nodeId.nodeId,
+                             &rd->referenceTypeId, nodeId, instantiationCallback);
     }
 
     /* add a hastypedefinition reference */
@@ -288,7 +290,8 @@ instantiateVariableNode(UA_Server *server, UA_Session *session, const UA_NodeId
     /* add the child properties */
     for(size_t i = 0; i < browseResult.referencesSize; i++) {
         UA_ReferenceDescription *rd = &browseResult.references[i];
-        copyExistingVariable(server, session, &rd->nodeId.nodeId, &rd->referenceTypeId, nodeId, instantiationCallback);
+        copyExistingVariable(server, session, &rd->nodeId.nodeId,
+                             &rd->referenceTypeId, nodeId, instantiationCallback);
     }
 
     /* add a hastypedefinition reference */
@@ -300,7 +303,6 @@ instantiateVariableNode(UA_Server *server, UA_Session *session, const UA_NodeId
     addref.targetNodeId.nodeId = *typeId;
     addref.targetNodeClass = UA_NODECLASS_OBJECTTYPE;
     Service_AddReferences_single(server, session, &addref);
-
     return UA_STATUSCODE_GOOD;
 }
 
@@ -500,7 +502,7 @@ void Service_AddNodes_single(UA_Server *server, UA_Session *session, const UA_Ad
     }
 
     /* add it to the server */
-    UA_Server_addExistingNode(server, session, node, &item->parentNodeId.nodeId,
+    Service_AddNodes_existing(server, session, node, &item->parentNodeId.nodeId,
                               &item->referenceTypeId, result);
     if(result->statusCode != UA_STATUSCODE_GOOD)
         return;
@@ -578,7 +580,7 @@ void Service_AddNodes(UA_Server *server, UA_Session *session, const UA_AddNodesR
 /* Add Special Nodes (not possible over the wire) */
 /**************************************************/
 
-UA_StatusCode UA_EXPORT
+UA_StatusCode
 UA_Server_addDataSourceVariableNode(UA_Server *server, const UA_NodeId requestedNewNodeId,
                                     const UA_NodeId parentNodeId, const UA_NodeId referenceTypeId,
                                     const UA_QualifiedName browseName, const UA_NodeId typeDefinition,
@@ -620,7 +622,7 @@ UA_Server_addDataSourceVariableNode(UA_Server *server, const UA_NodeId requested
     node->minimumSamplingInterval = attr.minimumSamplingInterval;
     node->valueRank = attr.valueRank;
     UA_RCU_LOCK();
-    UA_Server_addExistingNode(server, &adminSession, (UA_Node*)node, &item.parentNodeId.nodeId,
+    Service_AddNodes_existing(server, &adminSession, (UA_Node*)node, &item.parentNodeId.nodeId,
                               &item.referenceTypeId, &result);
     UA_RCU_UNLOCK();
     UA_AddNodesItem_deleteMembers(&item);
@@ -634,7 +636,8 @@ UA_Server_addDataSourceVariableNode(UA_Server *server, const UA_NodeId requested
 }
 
 #ifdef UA_ENABLE_METHODCALLS
-UA_StatusCode UA_EXPORT
+
+UA_StatusCode
 UA_Server_addMethodNode(UA_Server *server, const UA_NodeId requestedNewNodeId,
                         const UA_NodeId parentNodeId, const UA_NodeId referenceTypeId,
                         const UA_QualifiedName browseName, const UA_MethodAttributes attr,
@@ -678,7 +681,7 @@ UA_Server_addMethodNode(UA_Server *server, const UA_NodeId requestedNewNodeId,
     UA_MethodAttributes_deleteMembers(&attrCopy);
 
     UA_RCU_LOCK();
-    UA_Server_addExistingNode(server, &adminSession, (UA_Node*)node, &item.parentNodeId.nodeId,
+    Service_AddNodes_existing(server, &adminSession, (UA_Node*)node, &item.parentNodeId.nodeId,
                               &item.referenceTypeId, &result);
     UA_RCU_UNLOCK();
     if(result.statusCode != UA_STATUSCODE_GOOD)
@@ -691,7 +694,7 @@ UA_Server_addMethodNode(UA_Server *server, const UA_NodeId requestedNewNodeId,
     const UA_NodeId hasproperty = UA_NODEID_NUMERIC(0, UA_NS0ID_HASPROPERTY);
     UA_VariableNode *inputArgumentsVariableNode = UA_NodeStore_newVariableNode();
     inputArgumentsVariableNode->nodeId.namespaceIndex = result.addedNodeId.namespaceIndex;
-    inputArgumentsVariableNode->browseName = UA_QUALIFIEDNAME_ALLOC(0,"InputArguments");
+    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;
@@ -699,17 +702,16 @@ UA_Server_addMethodNode(UA_Server *server, const UA_NodeId requestedNewNodeId,
                             inputArgumentsSize, &UA_TYPES[UA_TYPES_ARGUMENT]);
     UA_AddNodesResult inputAddRes;
     UA_RCU_LOCK();
-    UA_Server_addExistingNode(server, &adminSession, (UA_Node*)inputArgumentsVariableNode,
-                              &parent.nodeId, &hasproperty, &inputAddRes);
+    Service_AddNodes_existing(server, &adminSession, (UA_Node*)inputArgumentsVariableNode,
+                             &parent.nodeId, &hasproperty, &inputAddRes);
     UA_RCU_UNLOCK();
     // todo: check if adding succeeded
     UA_AddNodesResult_deleteMembers(&inputAddRes);
     
     /* create OutputArguments */
-    /* FIXME:   See comment in inputArguments */
     UA_VariableNode *outputArgumentsVariableNode  = UA_NodeStore_newVariableNode();
     outputArgumentsVariableNode->nodeId.namespaceIndex = result.addedNodeId.namespaceIndex;
-    outputArgumentsVariableNode->browseName  = UA_QUALIFIEDNAME_ALLOC(0,"OutputArguments");
+    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;
@@ -717,7 +719,7 @@ UA_Server_addMethodNode(UA_Server *server, const UA_NodeId requestedNewNodeId,
                             outputArgumentsSize, &UA_TYPES[UA_TYPES_ARGUMENT]);
     UA_AddNodesResult outputAddRes;
     UA_RCU_LOCK();
-    UA_Server_addExistingNode(server, &adminSession, (UA_Node*)outputArgumentsVariableNode,
+    Service_AddNodes_existing(server, &adminSession, (UA_Node*)outputArgumentsVariableNode,
                               &parent.nodeId, &hasproperty, &outputAddRes);
     UA_RCU_UNLOCK();
     // todo: check if adding succeeded
@@ -730,41 +732,6 @@ UA_Server_addMethodNode(UA_Server *server, const UA_NodeId requestedNewNodeId,
     return result.statusCode;
 }
 
-static UA_StatusCode __UA_Server_editMethodCallback(UA_Server *server, UA_Session* session, UA_Node* node, const void* handle) {
-  const struct {
-    UA_MethodCallback callback;
-    void *handle;
-  } *newCallback = handle;
-  
-  if (node == NULL)
-    return UA_STATUSCODE_BADNODEIDINVALID;
-  if (node->nodeClass != UA_NODECLASS_METHOD)
-    return UA_STATUSCODE_BADNODECLASSINVALID;
-  if (newCallback == NULL)
-    return UA_STATUSCODE_BADNODEATTRIBUTESINVALID;
-  
-  UA_MethodNode *mnode = (UA_MethodNode *) node;
-  mnode->attachedMethod = newCallback->callback;
-  mnode->methodHandle   = newCallback->handle;
-  return 0;
-}
-
-UA_StatusCode UA_EXPORT
-UA_Server_setMethodNode_callback( UA_Server *server, const UA_NodeId methodNodeId,
-                                  UA_MethodCallback method, void *handle) {
-  struct {
-    UA_MethodCallback callback;
-    void *handle;
-  } newCallback;  
-  newCallback.callback = method;
-  newCallback.handle   = handle;
-  UA_RCU_LOCK();
-  UA_StatusCode retval = UA_Server_editNode(server, &adminSession, &methodNodeId,
-                            __UA_Server_editMethodCallback, &newCallback);
-  UA_RCU_UNLOCK();
-  return retval;
-}
-
 #endif
 
 /******************/