ua_nodes.c 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177
  1. #include "ua_nodes.h"
  2. #include "ua_util.h"
  3. void UA_Node_deleteMembersAnyNodeClass(UA_Node *node) {
  4. /* delete standard content */
  5. UA_NodeId_deleteMembers(&node->nodeId);
  6. UA_QualifiedName_deleteMembers(&node->browseName);
  7. UA_LocalizedText_deleteMembers(&node->displayName);
  8. UA_LocalizedText_deleteMembers(&node->description);
  9. UA_Array_delete(node->references, node->referencesSize, &UA_TYPES[UA_TYPES_REFERENCENODE]);
  10. node->references = NULL;
  11. node->referencesSize = 0;
  12. /* delete unique content of the nodeclass */
  13. switch(node->nodeClass) {
  14. case UA_NODECLASS_OBJECT:
  15. break;
  16. case UA_NODECLASS_METHOD:
  17. break;
  18. case UA_NODECLASS_OBJECTTYPE:
  19. break;
  20. case UA_NODECLASS_VARIABLE:
  21. case UA_NODECLASS_VARIABLETYPE: {
  22. UA_VariableNode *p = (UA_VariableNode*)node;
  23. if(p->valueSource == UA_VALUESOURCE_VARIANT)
  24. UA_Variant_deleteMembers(&p->value.variant.value);
  25. break;
  26. }
  27. case UA_NODECLASS_REFERENCETYPE: {
  28. UA_ReferenceTypeNode *p = (UA_ReferenceTypeNode*)node;
  29. UA_LocalizedText_deleteMembers(&p->inverseName);
  30. break;
  31. }
  32. case UA_NODECLASS_DATATYPE:
  33. break;
  34. case UA_NODECLASS_VIEW:
  35. break;
  36. default:
  37. break;
  38. }
  39. }
  40. static UA_StatusCode
  41. UA_ObjectNode_copy(const UA_ObjectNode *src, UA_ObjectNode *dst) {
  42. dst->eventNotifier = src->eventNotifier;
  43. dst->instanceHandle = src->instanceHandle;
  44. return UA_STATUSCODE_GOOD;
  45. }
  46. static UA_StatusCode
  47. UA_VariableNode_copy(const UA_VariableNode *src, UA_VariableNode *dst) {
  48. dst->valueRank = src->valueRank;
  49. dst->valueSource = src->valueSource;
  50. if(src->valueSource == UA_VALUESOURCE_VARIANT) {
  51. UA_StatusCode retval = UA_Variant_copy(&src->value.variant.value, &dst->value.variant.value);
  52. if(retval != UA_STATUSCODE_GOOD)
  53. return retval;
  54. dst->value.variant.callback = src->value.variant.callback;
  55. } else
  56. dst->value.dataSource = src->value.dataSource;
  57. dst->accessLevel = src->accessLevel;
  58. dst->userAccessLevel = src->accessLevel;
  59. dst->minimumSamplingInterval = src->minimumSamplingInterval;
  60. dst->historizing = src->historizing;
  61. return UA_STATUSCODE_GOOD;
  62. }
  63. static UA_StatusCode
  64. UA_MethodNode_copy(const UA_MethodNode *src, UA_MethodNode *dst) {
  65. dst->executable = src->executable;
  66. dst->userExecutable = src->userExecutable;
  67. dst->methodHandle = src->methodHandle;
  68. dst->attachedMethod = src->attachedMethod;
  69. return UA_STATUSCODE_GOOD;
  70. }
  71. static UA_StatusCode
  72. UA_ObjectTypeNode_copy(const UA_ObjectTypeNode *src, UA_ObjectTypeNode *dst) {
  73. dst->isAbstract = src->isAbstract;
  74. dst->lifecycleManagement = src->lifecycleManagement;
  75. return UA_STATUSCODE_GOOD;
  76. }
  77. static UA_StatusCode
  78. UA_VariableTypeNode_copy(const UA_VariableTypeNode *src, UA_VariableTypeNode *dst) {
  79. dst->valueRank = src->valueRank;
  80. dst->valueSource = src->valueSource;
  81. if(src->valueSource == UA_VALUESOURCE_VARIANT){
  82. UA_StatusCode retval = UA_Variant_copy(&src->value.variant.value, &dst->value.variant.value);
  83. if(retval != UA_STATUSCODE_GOOD)
  84. return retval;
  85. dst->value.variant.callback = src->value.variant.callback;
  86. } else
  87. dst->value.dataSource = src->value.dataSource;
  88. dst->isAbstract = src->isAbstract;
  89. return UA_STATUSCODE_GOOD;
  90. }
  91. static UA_StatusCode
  92. UA_ReferenceTypeNode_copy(const UA_ReferenceTypeNode *src, UA_ReferenceTypeNode *dst) {
  93. UA_StatusCode retval = UA_LocalizedText_copy(&src->inverseName, &dst->inverseName);
  94. dst->isAbstract = src->isAbstract;
  95. dst->symmetric = src->symmetric;
  96. return retval;
  97. }
  98. static UA_StatusCode
  99. UA_DataTypeNode_copy(const UA_DataTypeNode *src, UA_DataTypeNode *dst) {
  100. dst->isAbstract = src->isAbstract;
  101. return UA_STATUSCODE_GOOD;
  102. }
  103. static UA_StatusCode
  104. UA_ViewNode_copy(const UA_ViewNode *src, UA_ViewNode *dst) {
  105. dst->containsNoLoops = src->containsNoLoops;
  106. dst->eventNotifier = src->eventNotifier;
  107. return UA_STATUSCODE_GOOD;
  108. }
  109. UA_StatusCode UA_Node_copyAnyNodeClass(const UA_Node *src, UA_Node *dst) {
  110. if(src->nodeClass != dst->nodeClass)
  111. return UA_STATUSCODE_BADINTERNALERROR;
  112. /* copy standard content */
  113. UA_StatusCode retval = UA_NodeId_copy(&src->nodeId, &dst->nodeId);
  114. dst->nodeClass = src->nodeClass;
  115. retval |= UA_QualifiedName_copy(&src->browseName, &dst->browseName);
  116. retval |= UA_LocalizedText_copy(&src->displayName, &dst->displayName);
  117. retval |= UA_LocalizedText_copy(&src->description, &dst->description);
  118. dst->writeMask = src->writeMask;
  119. dst->userWriteMask = src->userWriteMask;
  120. if(retval != UA_STATUSCODE_GOOD) {
  121. UA_Node_deleteMembersAnyNodeClass(dst);
  122. return retval;
  123. }
  124. retval |= UA_Array_copy(src->references, src->referencesSize, (void**)&dst->references,
  125. &UA_TYPES[UA_TYPES_REFERENCENODE]);
  126. if(retval != UA_STATUSCODE_GOOD) {
  127. UA_Node_deleteMembersAnyNodeClass(dst);
  128. return retval;
  129. }
  130. dst->referencesSize = src->referencesSize;
  131. /* copy unique content of the nodeclass */
  132. switch(src->nodeClass) {
  133. case UA_NODECLASS_OBJECT:
  134. retval = UA_ObjectNode_copy((const UA_ObjectNode*)src, (UA_ObjectNode*)dst);
  135. break;
  136. case UA_NODECLASS_VARIABLE:
  137. retval = UA_VariableNode_copy((const UA_VariableNode*)src, (UA_VariableNode*)dst);
  138. break;
  139. case UA_NODECLASS_METHOD:
  140. retval = UA_MethodNode_copy((const UA_MethodNode*)src, (UA_MethodNode*)dst);
  141. break;
  142. case UA_NODECLASS_OBJECTTYPE:
  143. retval = UA_ObjectTypeNode_copy((const UA_ObjectTypeNode*)src, (UA_ObjectTypeNode*)dst);
  144. break;
  145. case UA_NODECLASS_VARIABLETYPE:
  146. retval = UA_VariableTypeNode_copy((const UA_VariableTypeNode*)src, (UA_VariableTypeNode*)dst);
  147. break;
  148. case UA_NODECLASS_REFERENCETYPE:
  149. retval = UA_ReferenceTypeNode_copy((const UA_ReferenceTypeNode*)src, (UA_ReferenceTypeNode*)dst);
  150. break;
  151. case UA_NODECLASS_DATATYPE:
  152. retval = UA_DataTypeNode_copy((const UA_DataTypeNode*)src, (UA_DataTypeNode*)dst);
  153. break;
  154. case UA_NODECLASS_VIEW:
  155. retval = UA_ViewNode_copy((const UA_ViewNode*)src, (UA_ViewNode*)dst);
  156. break;
  157. default:
  158. break;
  159. }
  160. if(retval != UA_STATUSCODE_GOOD)
  161. UA_Node_deleteMembersAnyNodeClass(dst);
  162. return retval;
  163. }