|
@@ -21,45 +21,108 @@ UA_Server_deleteNode(UA_Server *server, UA_NodeId nodeId) {
|
|
|
// 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) {
|
|
|
+ */
|
|
|
+
|
|
|
+ return UA_STATUSCODE_GOOD;
|
|
|
+}
|
|
|
+
|
|
|
+UA_SERVER_DELETENODEALIAS(Object)
|
|
|
+UA_SERVER_DELETENODEALIAS(Variable)
|
|
|
+#ifdef ENABLE_METHODCALLS
|
|
|
+UA_SERVER_DELETENODEALIAS(Method)
|
|
|
+#endif
|
|
|
+
|
|
|
+UA_StatusCode UA_Server_getNodeCopy(UA_Server *server, UA_NodeId nodeId, void **copyInto) {
|
|
|
+ const UA_Node *node = UA_NodeStore_get(server->nodestore, &nodeId);
|
|
|
+ UA_Node **copy = (UA_Node **) copyInto;
|
|
|
+
|
|
|
+ UA_StatusCode retval = UA_STATUSCODE_GOOD;
|
|
|
+
|
|
|
+ if (!node)
|
|
|
+ return UA_STATUSCODE_BADNODEIDINVALID;
|
|
|
+
|
|
|
+ switch(node->nodeClass) {
|
|
|
case UA_NODECLASS_DATATYPE:
|
|
|
- UA_DataTypeNode_delete((UA_DataTypeNode *) ptrs.delNode);
|
|
|
+ *copy = (UA_Node *) UA_VariableNode_new();
|
|
|
+ retval |= UA_DataTypeNode_copy((const UA_DataTypeNode *) node, (UA_DataTypeNode *) *copy);
|
|
|
break;
|
|
|
case UA_NODECLASS_METHOD:
|
|
|
- UA_MethodNode_delete((UA_MethodNode *) ptrs.delNode);
|
|
|
+ *copy = (UA_Node *) UA_MethodNode_new();
|
|
|
+ retval |= UA_MethodNode_copy((const UA_MethodNode *) node, (UA_MethodNode *) *copy);
|
|
|
break;
|
|
|
case UA_NODECLASS_OBJECT:
|
|
|
- UA_ObjectNode_delete((UA_ObjectNode *) ptrs.delNode);
|
|
|
+ *copy = (UA_Node *) UA_ObjectNode_new();
|
|
|
+ retval |= UA_ObjectNode_copy((const UA_ObjectNode *) node, (UA_ObjectNode *) *copy);
|
|
|
break;
|
|
|
case UA_NODECLASS_OBJECTTYPE:
|
|
|
- UA_ObjectTypeNode_delete((UA_ObjectTypeNode *) ptrs.delNode);
|
|
|
+ *copy = (UA_Node *) UA_ObjectTypeNode_new();
|
|
|
+ retval |= UA_ObjectTypeNode_copy((const UA_ObjectTypeNode *) node, (UA_ObjectTypeNode *) *copy);
|
|
|
break;
|
|
|
case UA_NODECLASS_REFERENCETYPE:
|
|
|
- UA_ReferenceTypeNode_delete((UA_ReferenceTypeNode *) ptrs.delNode);
|
|
|
+ *copy = (UA_Node *) UA_ReferenceTypeNode_new();
|
|
|
+ retval |= UA_ReferenceTypeNode_copy((const UA_ReferenceTypeNode *) node, (UA_ReferenceTypeNode *) *copy);
|
|
|
break;
|
|
|
case UA_NODECLASS_VARIABLE:
|
|
|
- UA_VariableNode_delete((UA_VariableNode *) ptrs.delNode);
|
|
|
+ *copy = (UA_Node *) UA_VariableNode_new();
|
|
|
+ retval |= UA_VariableNode_copy((const UA_VariableNode *) node, (UA_VariableNode *) *copy);
|
|
|
break;
|
|
|
case UA_NODECLASS_VARIABLETYPE:
|
|
|
- UA_VariableTypeNode_delete((UA_VariableTypeNode *) ptrs.delNode);
|
|
|
+ *copy = (UA_Node *) UA_VariableTypeNode_new();
|
|
|
+ retval |= UA_VariableTypeNode_copy((const UA_VariableTypeNode *) node, (UA_VariableTypeNode *) *copy);
|
|
|
break;
|
|
|
case UA_NODECLASS_VIEW:
|
|
|
- UA_ViewNode_delete((UA_ViewNode *) ptrs.delNode);
|
|
|
+ *copy = (UA_Node *) UA_ViewNode_new();
|
|
|
+ retval |= UA_ViewNode_copy((const UA_ViewNode *) node, (UA_ViewNode *) *copy);
|
|
|
break;
|
|
|
default:
|
|
|
break;
|
|
|
- } */
|
|
|
+ }
|
|
|
|
|
|
- return UA_STATUSCODE_GOOD;
|
|
|
-}
|
|
|
+ UA_NodeStore_release(node);
|
|
|
+
|
|
|
+ return retval;
|
|
|
+}
|
|
|
|
|
|
-UA_SERVER_DELETENODEALIAS(Object)
|
|
|
-UA_SERVER_DELETENODEALIAS(Variable)
|
|
|
-#ifdef ENABLE_METHODCALLS
|
|
|
-UA_SERVER_DELETENODEALIAS(Method)
|
|
|
-#endif
|
|
|
+UA_StatusCode UA_Server_deleteNodeCopy(UA_Server *server, void **nodeptr) {
|
|
|
+ UA_StatusCode retval = UA_STATUSCODE_GOOD;
|
|
|
+ UA_Node **node = (UA_Node **) nodeptr;
|
|
|
+
|
|
|
+ if (!(*node))
|
|
|
+ return UA_STATUSCODE_BADNODEIDINVALID;
|
|
|
+
|
|
|
+ switch((*node)->nodeClass) {
|
|
|
+ case UA_NODECLASS_DATATYPE:
|
|
|
+ UA_DataTypeNode_delete((UA_DataTypeNode *) *node);
|
|
|
+ break;
|
|
|
+ case UA_NODECLASS_METHOD:
|
|
|
+ UA_MethodNode_delete((UA_MethodNode *) *node);
|
|
|
+ break;
|
|
|
+ case UA_NODECLASS_OBJECT:
|
|
|
+ UA_ObjectNode_delete((UA_ObjectNode *) *node);
|
|
|
+ break;
|
|
|
+ case UA_NODECLASS_OBJECTTYPE:
|
|
|
+ UA_ObjectTypeNode_delete((UA_ObjectTypeNode *) *node);
|
|
|
+ break;
|
|
|
+ case UA_NODECLASS_REFERENCETYPE:
|
|
|
+ UA_ReferenceTypeNode_delete((UA_ReferenceTypeNode *) *node);
|
|
|
+ break;
|
|
|
+ case UA_NODECLASS_VARIABLE:
|
|
|
+ UA_VariableNode_delete((UA_VariableNode *) *node);
|
|
|
+ break;
|
|
|
+ case UA_NODECLASS_VARIABLETYPE:
|
|
|
+ UA_VariableTypeNode_delete((UA_VariableTypeNode *) *node);
|
|
|
+ break;
|
|
|
+ case UA_NODECLASS_VIEW:
|
|
|
+ UA_ViewNode_delete((UA_ViewNode *) *node);
|
|
|
+ break;
|
|
|
+ default:
|
|
|
+ break;
|
|
|
+ }
|
|
|
+
|
|
|
+ return retval;
|
|
|
+}
|
|
|
|
|
|
UA_StatusCode
|
|
|
UA_Server_forEachChildNodeCall(UA_Server *server, UA_NodeId parentNodeId, UA_NodeIteratorCallback callback) {
|