ua_nodes.c 8.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240
  1. /* This Source Code Form is subject to the terms of the Mozilla Public
  2. * License, v. 2.0. If a copy of the MPL was not distributed with this
  3. * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
  4. #include "ua_server_internal.h"
  5. #include "ua_nodes.h"
  6. void UA_Node_deleteReferences(UA_Node *node) {
  7. for(size_t i = 0; i < node->referencesSize; ++i) {
  8. UA_NodeReferenceKind *refs = &node->references[i];
  9. for(size_t j = 0; j < refs->targetIdsSize; ++j)
  10. UA_ExpandedNodeId_deleteMembers(&refs->targetIds[j]);
  11. UA_free(refs->targetIds);
  12. UA_NodeId_deleteMembers(&refs->referenceTypeId);
  13. }
  14. if(node->references)
  15. UA_free(node->references);
  16. node->references = NULL;
  17. node->referencesSize = 0;
  18. }
  19. void UA_Node_deleteMembersAnyNodeClass(UA_Node *node) {
  20. /* Delete standard content */
  21. UA_NodeId_deleteMembers(&node->nodeId);
  22. UA_QualifiedName_deleteMembers(&node->browseName);
  23. UA_LocalizedText_deleteMembers(&node->displayName);
  24. UA_LocalizedText_deleteMembers(&node->description);
  25. /* Delete references */
  26. UA_Node_deleteReferences(node);
  27. /* Delete unique content of the nodeclass */
  28. switch(node->nodeClass) {
  29. case UA_NODECLASS_OBJECT:
  30. break;
  31. case UA_NODECLASS_METHOD:
  32. break;
  33. case UA_NODECLASS_OBJECTTYPE:
  34. break;
  35. case UA_NODECLASS_VARIABLE:
  36. case UA_NODECLASS_VARIABLETYPE: {
  37. UA_VariableNode *p = (UA_VariableNode*)node;
  38. UA_NodeId_deleteMembers(&p->dataType);
  39. UA_Array_delete(p->arrayDimensions, p->arrayDimensionsSize,
  40. &UA_TYPES[UA_TYPES_INT32]);
  41. p->arrayDimensions = NULL;
  42. p->arrayDimensionsSize = 0;
  43. if(p->valueSource == UA_VALUESOURCE_DATA)
  44. UA_DataValue_deleteMembers(&p->value.data.value);
  45. break;
  46. }
  47. case UA_NODECLASS_REFERENCETYPE: {
  48. UA_ReferenceTypeNode *p = (UA_ReferenceTypeNode*)node;
  49. UA_LocalizedText_deleteMembers(&p->inverseName);
  50. break;
  51. }
  52. case UA_NODECLASS_DATATYPE:
  53. break;
  54. case UA_NODECLASS_VIEW:
  55. break;
  56. default:
  57. break;
  58. }
  59. }
  60. static UA_StatusCode
  61. UA_ObjectNode_copy(const UA_ObjectNode *src, UA_ObjectNode *dst) {
  62. dst->eventNotifier = src->eventNotifier;
  63. dst->instanceHandle = src->instanceHandle;
  64. return UA_STATUSCODE_GOOD;
  65. }
  66. static UA_StatusCode
  67. UA_CommonVariableNode_copy(const UA_VariableNode *src, UA_VariableNode *dst) {
  68. UA_StatusCode retval = UA_Array_copy(src->arrayDimensions,
  69. src->arrayDimensionsSize,
  70. (void**)&dst->arrayDimensions,
  71. &UA_TYPES[UA_TYPES_INT32]);
  72. if(retval != UA_STATUSCODE_GOOD)
  73. return retval;
  74. dst->arrayDimensionsSize = src->arrayDimensionsSize;
  75. retval = UA_NodeId_copy(&src->dataType, &dst->dataType);
  76. dst->valueRank = src->valueRank;
  77. dst->valueSource = src->valueSource;
  78. if(src->valueSource == UA_VALUESOURCE_DATA) {
  79. retval |= UA_DataValue_copy(&src->value.data.value,
  80. &dst->value.data.value);
  81. dst->value.data.callback = src->value.data.callback;
  82. } else
  83. dst->value.dataSource = src->value.dataSource;
  84. return retval;
  85. }
  86. static UA_StatusCode
  87. UA_VariableNode_copy(const UA_VariableNode *src, UA_VariableNode *dst) {
  88. UA_StatusCode retval = UA_CommonVariableNode_copy(src, dst);
  89. dst->accessLevel = src->accessLevel;
  90. dst->minimumSamplingInterval = src->minimumSamplingInterval;
  91. dst->historizing = src->historizing;
  92. return retval;
  93. }
  94. static UA_StatusCode
  95. UA_VariableTypeNode_copy(const UA_VariableTypeNode *src,
  96. UA_VariableTypeNode *dst) {
  97. UA_StatusCode retval = UA_CommonVariableNode_copy((const UA_VariableNode*)src,
  98. (UA_VariableNode*)dst);
  99. dst->isAbstract = src->isAbstract;
  100. return retval;
  101. }
  102. static UA_StatusCode
  103. UA_MethodNode_copy(const UA_MethodNode *src, UA_MethodNode *dst) {
  104. dst->executable = src->executable;
  105. dst->methodHandle = src->methodHandle;
  106. dst->attachedMethod = src->attachedMethod;
  107. return UA_STATUSCODE_GOOD;
  108. }
  109. static UA_StatusCode
  110. UA_ObjectTypeNode_copy(const UA_ObjectTypeNode *src, UA_ObjectTypeNode *dst) {
  111. dst->isAbstract = src->isAbstract;
  112. dst->lifecycleManagement = src->lifecycleManagement;
  113. return UA_STATUSCODE_GOOD;
  114. }
  115. static UA_StatusCode
  116. UA_ReferenceTypeNode_copy(const UA_ReferenceTypeNode *src,
  117. UA_ReferenceTypeNode *dst) {
  118. UA_StatusCode retval = UA_LocalizedText_copy(&src->inverseName,
  119. &dst->inverseName);
  120. dst->isAbstract = src->isAbstract;
  121. dst->symmetric = src->symmetric;
  122. return retval;
  123. }
  124. static UA_StatusCode
  125. UA_DataTypeNode_copy(const UA_DataTypeNode *src, UA_DataTypeNode *dst) {
  126. dst->isAbstract = src->isAbstract;
  127. return UA_STATUSCODE_GOOD;
  128. }
  129. static UA_StatusCode
  130. UA_ViewNode_copy(const UA_ViewNode *src, UA_ViewNode *dst) {
  131. dst->containsNoLoops = src->containsNoLoops;
  132. dst->eventNotifier = src->eventNotifier;
  133. return UA_STATUSCODE_GOOD;
  134. }
  135. UA_StatusCode UA_Node_copyAnyNodeClass(const UA_Node *src, UA_Node *dst) {
  136. if(src->nodeClass != dst->nodeClass)
  137. return UA_STATUSCODE_BADINTERNALERROR;
  138. /* Copy standard content */
  139. UA_StatusCode retval = UA_NodeId_copy(&src->nodeId, &dst->nodeId);
  140. dst->nodeClass = src->nodeClass;
  141. retval |= UA_QualifiedName_copy(&src->browseName, &dst->browseName);
  142. retval |= UA_LocalizedText_copy(&src->displayName, &dst->displayName);
  143. retval |= UA_LocalizedText_copy(&src->description, &dst->description);
  144. dst->writeMask = src->writeMask;
  145. if(retval != UA_STATUSCODE_GOOD) {
  146. UA_Node_deleteMembersAnyNodeClass(dst);
  147. return retval;
  148. }
  149. /* Copy the references */
  150. dst->references = NULL;
  151. if(src->referencesSize > 0) {
  152. dst->references =
  153. (UA_NodeReferenceKind*)UA_calloc(src->referencesSize,
  154. sizeof(UA_NodeReferenceKind));
  155. if(!dst->references) {
  156. UA_Node_deleteMembersAnyNodeClass(dst);
  157. return UA_STATUSCODE_BADOUTOFMEMORY;
  158. }
  159. dst->referencesSize = src->referencesSize;
  160. for(size_t i = 0; i < src->referencesSize; ++i) {
  161. UA_NodeReferenceKind *srefs = &src->references[i];
  162. UA_NodeReferenceKind *drefs = &dst->references[i];
  163. drefs->isInverse = srefs->isInverse;
  164. retval = UA_NodeId_copy(&srefs->referenceTypeId, &drefs->referenceTypeId);
  165. if(retval != UA_STATUSCODE_GOOD)
  166. break;
  167. retval = UA_Array_copy(srefs->targetIds, srefs->targetIdsSize,
  168. (void**)&drefs->targetIds,
  169. &UA_TYPES[UA_TYPES_EXPANDEDNODEID]);
  170. if(retval != UA_STATUSCODE_GOOD)
  171. break;
  172. drefs->targetIdsSize = srefs->targetIdsSize;
  173. }
  174. if(retval != UA_STATUSCODE_GOOD) {
  175. UA_Node_deleteMembersAnyNodeClass(dst);
  176. return retval;
  177. }
  178. }
  179. /* Copy unique content of the nodeclass */
  180. switch(src->nodeClass) {
  181. case UA_NODECLASS_OBJECT:
  182. retval = UA_ObjectNode_copy((const UA_ObjectNode*)src,
  183. (UA_ObjectNode*)dst);
  184. break;
  185. case UA_NODECLASS_VARIABLE:
  186. retval = UA_VariableNode_copy((const UA_VariableNode*)src,
  187. (UA_VariableNode*)dst);
  188. break;
  189. case UA_NODECLASS_METHOD:
  190. retval = UA_MethodNode_copy((const UA_MethodNode*)src,
  191. (UA_MethodNode*)dst);
  192. break;
  193. case UA_NODECLASS_OBJECTTYPE:
  194. retval = UA_ObjectTypeNode_copy((const UA_ObjectTypeNode*)src,
  195. (UA_ObjectTypeNode*)dst);
  196. break;
  197. case UA_NODECLASS_VARIABLETYPE:
  198. retval = UA_VariableTypeNode_copy((const UA_VariableTypeNode*)src,
  199. (UA_VariableTypeNode*)dst);
  200. break;
  201. case UA_NODECLASS_REFERENCETYPE:
  202. retval = UA_ReferenceTypeNode_copy((const UA_ReferenceTypeNode*)src,
  203. (UA_ReferenceTypeNode*)dst);
  204. break;
  205. case UA_NODECLASS_DATATYPE:
  206. retval = UA_DataTypeNode_copy((const UA_DataTypeNode*)src,
  207. (UA_DataTypeNode*)dst);
  208. break;
  209. case UA_NODECLASS_VIEW:
  210. retval = UA_ViewNode_copy((const UA_ViewNode*)src, (UA_ViewNode*)dst);
  211. break;
  212. default:
  213. break;
  214. }
  215. if(retval != UA_STATUSCODE_GOOD)
  216. UA_Node_deleteMembersAnyNodeClass(dst);
  217. return retval;
  218. }