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

Both Server and Client can create Object- & VariableNodes. Server can now easily delete them (Client: not yet).

ichrispa преди 9 години
родител
ревизия
71d7a10ccc
променени са 3 файла, в които са добавени 73 реда и са изтрити 3 реда
  1. 0 3
      examples/server.c
  2. 13 0
      include/ua_server.h
  3. 60 0
      src/server/ua_server_addressspace.c

+ 0 - 3
examples/server.c

@@ -308,9 +308,6 @@ int main(int argc, char** argv) {
                                   UA_NODEID_NUMERIC(1, MATRIXID), UA_NODEID_NUMERIC(0, UA_NS0ID_ORGANIZES), NULL);
    }
 
-
-
-
 #ifdef ENABLE_METHODCALLS
    UA_Argument inputArguments;
    UA_Argument_init(&inputArguments);

+ 13 - 0
include/ua_server.h

@@ -124,6 +124,19 @@ UA_UInt16 UA_EXPORT UA_Server_addNamespace(UA_Server *server, const char* name);
 UA_StatusCode UA_EXPORT UA_Server_addReference(UA_Server *server, const UA_NodeId sourceId,
                                                const UA_NodeId refTypeId, const UA_ExpandedNodeId targetId);
 
+UA_StatusCode UA_EXPORT
+UA_Server_deleteNode(UA_Server *server, UA_NodeId nodeId);
+
+#define UA_SERVER_DELETENODEALIAS_DECL(TYPE) \
+UA_StatusCode UA_EXPORT UA_Server_delete##TYPE##Node(UA_Server *server, UA_NodeId nodeId);
+
+UA_SERVER_DELETENODEALIAS_DECL(Object)
+UA_SERVER_DELETENODEALIAS_DECL(Variable)
+
+#ifdef ENABLE_METHODCALLS
+UA_SERVER_DELETENODEALIAS_DECL(Method)
+#endif
+
 UA_StatusCode UA_EXPORT
 UA_Server_addVariableNode(UA_Server *server, UA_Variant *value, const UA_QualifiedName browseName, 
                           UA_NodeId nodeId, const UA_NodeId parentNodeId, const UA_NodeId referenceTypeId,

+ 60 - 0
src/server/ua_server_addressspace.c

@@ -1,6 +1,66 @@
 #include "ua_server.h"
 #include "ua_server_internal.h"
 
+#define UA_SERVER_DELETENODEALIAS(TYPE) \
+UA_StatusCode UA_Server_delete##TYPE##Node(UA_Server *server, UA_NodeId nodeId) { \
+  return UA_Server_deleteNode(server, nodeId); \
+}
+
+UA_StatusCode 
+UA_Server_deleteNode(UA_Server *server, UA_NodeId nodeId) {
+  union nodeUnion {
+    const UA_Node *delNodeConst;
+    UA_Node *delNode;
+  } ptrs;
+  ptrs.delNodeConst = UA_NodeStore_get(server->nodestore, &nodeId);
+  
+  if (!ptrs.delNodeConst)
+    return UA_STATUSCODE_BADNODEIDINVALID;
+  UA_NodeStore_release(ptrs.delNodeConst);
+  
+  // Remove the node from the hashmap/slot
+  UA_NodeStore_remove(server->nodestore, &nodeId);
+  
+  /* Note: this is done by deleteEntry() in _remove()!
+   * FIXME: Delete unreachable child nodes???
+  switch(ptrs.delNode->nodeClass) {
+    case UA_NODECLASS_DATATYPE:
+      UA_DataTypeNode_delete((UA_DataTypeNode *) ptrs.delNode);
+      break;
+    case UA_NODECLASS_METHOD:
+      UA_MethodNode_delete((UA_MethodNode *) ptrs.delNode);
+      break;      
+    case UA_NODECLASS_OBJECT:
+      UA_ObjectNode_delete((UA_ObjectNode *) ptrs.delNode);
+      break;      
+    case UA_NODECLASS_OBJECTTYPE:
+      UA_ObjectTypeNode_delete((UA_ObjectTypeNode *) ptrs.delNode);
+      break;      
+    case UA_NODECLASS_REFERENCETYPE:
+      UA_ReferenceTypeNode_delete((UA_ReferenceTypeNode *) ptrs.delNode);
+      break;      
+    case UA_NODECLASS_VARIABLE:
+      UA_VariableNode_delete((UA_VariableNode *) ptrs.delNode);
+      break;      
+    case UA_NODECLASS_VARIABLETYPE:
+      UA_VariableTypeNode_delete((UA_VariableTypeNode *) ptrs.delNode);
+      break;      
+    case UA_NODECLASS_VIEW:
+      UA_ViewNode_delete((UA_ViewNode *) ptrs.delNode);
+      break;      
+    default:
+      break;
+  } */
+  
+  return UA_STATUSCODE_GOOD;
+}
+
+UA_SERVER_DELETENODEALIAS(Object)
+UA_SERVER_DELETENODEALIAS(Variable)
+#ifdef ENABLE_METHODCALLS
+UA_SERVER_DELETENODEALIAS(Method)
+#endif
+
 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,