ua_nodes.c 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413
  1. #include "ua_nodes.h"
  2. #include "ua_util.h"
  3. /* UA_Node */
  4. static void UA_Node_deleteMembers(UA_Node *p) {
  5. UA_NodeId_deleteMembers(&p->nodeId);
  6. UA_QualifiedName_deleteMembers(&p->browseName);
  7. UA_LocalizedText_deleteMembers(&p->displayName);
  8. UA_LocalizedText_deleteMembers(&p->description);
  9. UA_Array_delete(p->references, p->referencesSize, &UA_TYPES[UA_TYPES_REFERENCENODE]);
  10. }
  11. static UA_StatusCode UA_Node_copy(const UA_Node *src, UA_Node *dst) {
  12. UA_StatusCode retval = UA_STATUSCODE_GOOD;
  13. retval |= UA_NodeId_copy(&src->nodeId, &dst->nodeId);
  14. dst->nodeClass = src->nodeClass;
  15. retval |= UA_QualifiedName_copy(&src->browseName, &dst->browseName);
  16. retval |= UA_LocalizedText_copy(&src->displayName, &dst->displayName);
  17. retval |= UA_LocalizedText_copy(&src->description, &dst->description);
  18. dst->writeMask = src->writeMask;
  19. dst->userWriteMask = src->userWriteMask;
  20. if(retval != UA_STATUSCODE_GOOD) {
  21. UA_Node_deleteMembers(dst);
  22. return retval;
  23. }
  24. retval |= UA_Array_copy(src->references, src->referencesSize, (void**)&dst->references,
  25. &UA_TYPES[UA_TYPES_REFERENCENODE]);
  26. if(retval == UA_STATUSCODE_GOOD)
  27. dst->referencesSize = src->referencesSize;
  28. return retval;
  29. }
  30. void UA_Node_deleteMembersAnyNodeClass(UA_Node *node) {
  31. switch(node->nodeClass) {
  32. case UA_NODECLASS_OBJECT:
  33. UA_ObjectNode_deleteMembers((UA_ObjectNode*)node);
  34. break;
  35. case UA_NODECLASS_VARIABLE:
  36. UA_VariableNode_deleteMembers((UA_VariableNode*)node);
  37. break;
  38. case UA_NODECLASS_METHOD:
  39. UA_MethodNode_deleteMembers((UA_MethodNode*)node);
  40. break;
  41. case UA_NODECLASS_OBJECTTYPE:
  42. UA_ObjectTypeNode_deleteMembers((UA_ObjectTypeNode*)node);
  43. break;
  44. case UA_NODECLASS_VARIABLETYPE:
  45. UA_VariableTypeNode_deleteMembers((UA_VariableTypeNode*)node);
  46. break;
  47. case UA_NODECLASS_REFERENCETYPE:
  48. UA_ReferenceTypeNode_deleteMembers((UA_ReferenceTypeNode*)node);
  49. break;
  50. case UA_NODECLASS_DATATYPE:
  51. UA_DataTypeNode_deleteMembers((UA_DataTypeNode*)node);
  52. break;
  53. case UA_NODECLASS_VIEW:
  54. UA_ViewNode_deleteMembers((UA_ViewNode*)node);
  55. break;
  56. default:
  57. break;
  58. }
  59. }
  60. void UA_Node_deleteAnyNodeClass(UA_Node *node) {
  61. UA_Node_deleteMembersAnyNodeClass(node);
  62. UA_free(node);
  63. }
  64. typedef UA_Node *(*UA_NewNodeFunction)(void);
  65. typedef UA_StatusCode (*UA_CopyNodeFunction)(const UA_Node *src, UA_Node *dst);
  66. typedef void (*UA_DeleteNodeFunction)(UA_Node *p);
  67. UA_Node * UA_Node_copyAnyNodeClass(const UA_Node *node) {
  68. UA_NewNodeFunction newNode;
  69. UA_CopyNodeFunction copyNode;
  70. UA_DeleteNodeFunction deleteNode;
  71. switch(node->nodeClass) {
  72. case UA_NODECLASS_OBJECT:
  73. newNode = (UA_NewNodeFunction)UA_ObjectNode_new;
  74. copyNode = (UA_CopyNodeFunction)UA_ObjectNode_copy;
  75. deleteNode = (UA_DeleteNodeFunction)UA_ObjectNode_delete;
  76. break;
  77. case UA_NODECLASS_VARIABLE:
  78. newNode = (UA_NewNodeFunction)UA_VariableNode_new;
  79. copyNode = (UA_CopyNodeFunction)UA_VariableNode_copy;
  80. deleteNode = (UA_DeleteNodeFunction)UA_VariableNode_delete;
  81. break;
  82. case UA_NODECLASS_METHOD:
  83. newNode = (UA_NewNodeFunction)UA_MethodNode_new;
  84. copyNode = (UA_CopyNodeFunction)UA_MethodNode_copy;
  85. deleteNode = (UA_DeleteNodeFunction)UA_MethodNode_delete;
  86. break;
  87. case UA_NODECLASS_OBJECTTYPE:
  88. newNode = (UA_NewNodeFunction)UA_ObjectTypeNode_new;
  89. copyNode = (UA_CopyNodeFunction)UA_ObjectTypeNode_copy;
  90. deleteNode = (UA_DeleteNodeFunction)UA_ObjectTypeNode_delete;
  91. break;
  92. case UA_NODECLASS_VARIABLETYPE:
  93. newNode = (UA_NewNodeFunction)UA_VariableTypeNode_new;
  94. copyNode = (UA_CopyNodeFunction)UA_VariableTypeNode_copy;
  95. deleteNode = (UA_DeleteNodeFunction)UA_VariableTypeNode_delete;
  96. break;
  97. case UA_NODECLASS_REFERENCETYPE:
  98. newNode = (UA_NewNodeFunction)UA_ReferenceTypeNode_new;
  99. copyNode = (UA_CopyNodeFunction)UA_ReferenceTypeNode_copy;
  100. deleteNode = (UA_DeleteNodeFunction)UA_ReferenceTypeNode_delete;
  101. break;
  102. case UA_NODECLASS_DATATYPE:
  103. newNode = (UA_NewNodeFunction)UA_DataTypeNode_new;
  104. copyNode = (UA_CopyNodeFunction)UA_DataTypeNode_copy;
  105. deleteNode = (UA_DeleteNodeFunction)UA_DataTypeNode_delete;
  106. break;
  107. case UA_NODECLASS_VIEW:
  108. newNode = (UA_NewNodeFunction)UA_ViewNode_new;
  109. copyNode = (UA_CopyNodeFunction)UA_ViewNode_copy;
  110. deleteNode = (UA_DeleteNodeFunction)UA_ViewNode_delete;
  111. break;
  112. default:
  113. return NULL;
  114. break;
  115. }
  116. UA_Node *copy = newNode();
  117. if(!copy)
  118. return NULL;
  119. if(copyNode(node, copy) != UA_STATUSCODE_GOOD) {
  120. deleteNode(copy);
  121. return NULL;
  122. }
  123. return copy;
  124. }
  125. /* UA_ObjectNode */
  126. void UA_ObjectNode_init(UA_ObjectNode *p) {
  127. memset(p, 0, sizeof(UA_ObjectNode));
  128. p->nodeClass = UA_NODECLASS_OBJECT;
  129. }
  130. UA_ObjectNode * UA_ObjectNode_new(void) {
  131. UA_ObjectNode *p = (UA_ObjectNode*)UA_malloc(sizeof(UA_ObjectNode));
  132. if(p)
  133. UA_ObjectNode_init(p);
  134. return p;
  135. }
  136. void UA_ObjectNode_deleteMembers(UA_ObjectNode *p) {
  137. UA_Node_deleteMembers((UA_Node*)p);
  138. }
  139. void UA_ObjectNode_delete(UA_ObjectNode *p) {
  140. UA_ObjectNode_deleteMembers(p);
  141. UA_free(p);
  142. }
  143. UA_StatusCode UA_ObjectNode_copy(const UA_ObjectNode *src, UA_ObjectNode *dst) {
  144. dst->eventNotifier = src->eventNotifier;
  145. dst->instanceHandle = src->instanceHandle;
  146. return UA_Node_copy((const UA_Node*)src, (UA_Node*)dst);
  147. }
  148. /* UA_ObjectTypeNode */
  149. void UA_ObjectTypeNode_init(UA_ObjectTypeNode *p) {
  150. memset(p, 0, sizeof(UA_ObjectTypeNode));
  151. p->nodeClass = UA_NODECLASS_OBJECTTYPE;
  152. }
  153. UA_ObjectTypeNode * UA_ObjectTypeNode_new(void) {
  154. UA_ObjectTypeNode *p = (UA_ObjectTypeNode*)UA_malloc(sizeof(UA_ObjectTypeNode));
  155. if(p)
  156. UA_ObjectTypeNode_init(p);
  157. return p;
  158. }
  159. void UA_ObjectTypeNode_deleteMembers(UA_ObjectTypeNode *p) {
  160. UA_Node_deleteMembers((UA_Node*)p);
  161. }
  162. void UA_ObjectTypeNode_delete(UA_ObjectTypeNode *p) {
  163. UA_ObjectTypeNode_deleteMembers(p);
  164. UA_free(p);
  165. }
  166. UA_StatusCode UA_ObjectTypeNode_copy(const UA_ObjectTypeNode *src, UA_ObjectTypeNode *dst) {
  167. dst->isAbstract = src->isAbstract;
  168. dst->lifecycleManagement = src->lifecycleManagement;
  169. return UA_Node_copy((const UA_Node*)src, (UA_Node*)dst);
  170. }
  171. /* UA_VariableNode */
  172. void UA_VariableNode_init(UA_VariableNode *p) {
  173. memset(p, 0, sizeof(UA_VariableNode));
  174. p->nodeClass = UA_NODECLASS_VARIABLE;
  175. p->valueRank = -2; // scalar or array of any dimension
  176. p->accessLevel = UA_ACCESSLEVELMASK_READ | UA_ACCESSLEVELMASK_WRITE;
  177. p->userAccessLevel = UA_ACCESSLEVELMASK_READ | UA_ACCESSLEVELMASK_WRITE;
  178. }
  179. UA_VariableNode * UA_VariableNode_new(void) {
  180. UA_VariableNode *p = (UA_VariableNode*)UA_malloc(sizeof(UA_VariableNode));
  181. if(p)
  182. UA_VariableNode_init(p);
  183. return p;
  184. }
  185. void UA_VariableNode_deleteMembers(UA_VariableNode *p) {
  186. UA_Node_deleteMembers((UA_Node*)p);
  187. if(p->valueSource == UA_VALUESOURCE_VARIANT)
  188. UA_Variant_deleteMembers(&p->value.variant.value);
  189. }
  190. void UA_VariableNode_delete(UA_VariableNode *p) {
  191. UA_VariableNode_deleteMembers(p);
  192. UA_free(p);
  193. }
  194. UA_StatusCode UA_VariableNode_copy(const UA_VariableNode *src, UA_VariableNode *dst) {
  195. UA_StatusCode retval = UA_Node_copy((const UA_Node*)src, (UA_Node*)dst);
  196. dst->valueRank = src->valueRank;
  197. dst->valueSource = src->valueSource;
  198. if(src->valueSource == UA_VALUESOURCE_VARIANT) {
  199. retval = UA_Variant_copy(&src->value.variant.value, &dst->value.variant.value);
  200. dst->value.variant.callback = src->value.variant.callback;
  201. } else
  202. dst->value.dataSource = src->value.dataSource;
  203. if(retval != UA_STATUSCODE_GOOD) {
  204. UA_VariableNode_deleteMembers(dst);
  205. return retval;
  206. }
  207. dst->accessLevel = src->accessLevel;
  208. dst->userAccessLevel = src->accessLevel;
  209. dst->minimumSamplingInterval = src->minimumSamplingInterval;
  210. dst->historizing = src->historizing;
  211. return UA_STATUSCODE_GOOD;
  212. }
  213. /* UA_VariableTypeNode */
  214. void UA_VariableTypeNode_init(UA_VariableTypeNode *p) {
  215. memset(p, 0, sizeof(UA_VariableTypeNode));
  216. p->nodeClass = UA_NODECLASS_VARIABLETYPE;
  217. p->valueRank = -2; // scalar or array of any dimension
  218. }
  219. UA_VariableTypeNode * UA_VariableTypeNode_new(void) {
  220. UA_VariableTypeNode *p = (UA_VariableTypeNode*)UA_malloc(sizeof(UA_VariableTypeNode));
  221. if(p)
  222. UA_VariableTypeNode_init(p);
  223. return p;
  224. }
  225. void UA_VariableTypeNode_deleteMembers(UA_VariableTypeNode *p) {
  226. UA_Node_deleteMembers((UA_Node*)p);
  227. if(p->valueSource == UA_VALUESOURCE_VARIANT)
  228. UA_Variant_deleteMembers(&p->value.variant.value);
  229. }
  230. void UA_VariableTypeNode_delete(UA_VariableTypeNode *p) {
  231. UA_VariableTypeNode_deleteMembers(p);
  232. UA_free(p);
  233. }
  234. UA_StatusCode UA_VariableTypeNode_copy(const UA_VariableTypeNode *src, UA_VariableTypeNode *dst) {
  235. UA_StatusCode retval = UA_Node_copy((const UA_Node*)src, (UA_Node*)dst);
  236. dst->valueRank = src->valueRank;
  237. dst->valueSource = src->valueSource;
  238. if(src->valueSource == UA_VALUESOURCE_VARIANT){
  239. UA_Variant_copy(&src->value.variant.value, &dst->value.variant.value);
  240. dst->value.variant.callback = src->value.variant.callback;
  241. } else
  242. dst->value.dataSource = src->value.dataSource;
  243. if(retval != UA_STATUSCODE_GOOD) {
  244. UA_VariableTypeNode_deleteMembers(dst);
  245. return retval;
  246. }
  247. dst->isAbstract = src->isAbstract;
  248. return UA_STATUSCODE_GOOD;
  249. }
  250. /* UA_ReferenceTypeNode */
  251. void UA_ReferenceTypeNode_init(UA_ReferenceTypeNode *p) {
  252. memset(p, 0, sizeof(UA_ReferenceTypeNode));
  253. p->nodeClass = UA_NODECLASS_REFERENCETYPE;
  254. }
  255. UA_ReferenceTypeNode * UA_ReferenceTypeNode_new(void) {
  256. UA_ReferenceTypeNode *p = (UA_ReferenceTypeNode*)UA_malloc(sizeof(UA_ReferenceTypeNode));
  257. if(p)
  258. UA_ReferenceTypeNode_init(p);
  259. return p;
  260. }
  261. void UA_ReferenceTypeNode_deleteMembers(UA_ReferenceTypeNode *p) {
  262. UA_Node_deleteMembers((UA_Node*)p);
  263. UA_LocalizedText_deleteMembers(&p->inverseName);
  264. }
  265. void UA_ReferenceTypeNode_delete(UA_ReferenceTypeNode *p) {
  266. UA_ReferenceTypeNode_deleteMembers(p);
  267. UA_free(p);
  268. }
  269. UA_StatusCode UA_ReferenceTypeNode_copy(const UA_ReferenceTypeNode *src, UA_ReferenceTypeNode *dst) {
  270. UA_StatusCode retval = UA_Node_copy((const UA_Node*)src, (UA_Node*)dst);
  271. if(retval != UA_STATUSCODE_GOOD)
  272. return retval;
  273. retval = UA_LocalizedText_copy(&src->inverseName, &dst->inverseName);
  274. if(retval != UA_STATUSCODE_GOOD) {
  275. UA_ReferenceTypeNode_deleteMembers(dst);
  276. return retval;
  277. }
  278. dst->isAbstract = src->isAbstract;
  279. dst->symmetric = src->symmetric;
  280. return UA_STATUSCODE_GOOD;
  281. }
  282. /* UA_MethodNode */
  283. void UA_MethodNode_init(UA_MethodNode *p) {
  284. memset(p, 0, sizeof(UA_MethodNode));
  285. p->nodeClass = UA_NODECLASS_METHOD;
  286. }
  287. UA_MethodNode * UA_MethodNode_new(void) {
  288. UA_MethodNode *p = (UA_MethodNode*)UA_malloc(sizeof(UA_MethodNode));
  289. if(p)
  290. UA_MethodNode_init(p);
  291. return p;
  292. }
  293. void UA_MethodNode_deleteMembers(UA_MethodNode *p) {
  294. #ifdef ENABLE_METHODCALLS
  295. p->attachedMethod = NULL;
  296. #endif
  297. UA_Node_deleteMembers((UA_Node*)p);
  298. }
  299. void UA_MethodNode_delete(UA_MethodNode *p) {
  300. UA_MethodNode_deleteMembers(p);
  301. #ifdef ENABLE_METHODCALLS
  302. p->methodHandle = NULL;
  303. p->attachedMethod = NULL;
  304. #endif
  305. UA_free(p);
  306. }
  307. UA_StatusCode UA_MethodNode_copy(const UA_MethodNode *src, UA_MethodNode *dst) {
  308. UA_StatusCode retval = UA_Node_copy((const UA_Node*)src, (UA_Node*)dst);
  309. if(retval != UA_STATUSCODE_GOOD)
  310. return retval;
  311. dst->executable = src->executable;
  312. dst->userExecutable = src->userExecutable;
  313. #ifdef ENABLE_METHODCALLS
  314. dst->methodHandle = src->methodHandle;
  315. dst->attachedMethod = src->attachedMethod;
  316. #endif
  317. return retval;
  318. }
  319. /* UA_ViewNode */
  320. void UA_ViewNode_init(UA_ViewNode *p) {
  321. memset(p, 0, sizeof(UA_ViewNode));
  322. p->nodeClass = UA_NODECLASS_VIEW;
  323. }
  324. UA_ViewNode * UA_ViewNode_new(void) {
  325. UA_ViewNode *p = UA_malloc(sizeof(UA_ViewNode));
  326. if(p)
  327. UA_ViewNode_init(p);
  328. return p;
  329. }
  330. void UA_ViewNode_deleteMembers(UA_ViewNode *p) {
  331. UA_Node_deleteMembers((UA_Node*)p);
  332. }
  333. void UA_ViewNode_delete(UA_ViewNode *p) {
  334. UA_ViewNode_deleteMembers(p);
  335. UA_free(p);
  336. }
  337. UA_StatusCode UA_ViewNode_copy(const UA_ViewNode *src, UA_ViewNode *dst) {
  338. dst->containsNoLoops = src->containsNoLoops;
  339. dst->eventNotifier = src->eventNotifier;
  340. return UA_Node_copy((const UA_Node*)src, (UA_Node*)dst);
  341. }
  342. /* UA_DataTypeNode */
  343. void UA_DataTypeNode_init(UA_DataTypeNode *p) {
  344. memset(p, 0, sizeof(UA_DataTypeNode));
  345. p->nodeClass = UA_NODECLASS_DATATYPE;
  346. }
  347. UA_DataTypeNode * UA_DataTypeNode_new(void) {
  348. UA_DataTypeNode *p = UA_malloc(sizeof(UA_DataTypeNode));
  349. if(p)
  350. UA_DataTypeNode_init(p);
  351. return p;
  352. }
  353. void UA_DataTypeNode_deleteMembers(UA_DataTypeNode *p) {
  354. UA_Node_deleteMembers((UA_Node*)p);
  355. }
  356. void UA_DataTypeNode_delete(UA_DataTypeNode *p) {
  357. UA_DataTypeNode_deleteMembers(p);
  358. UA_free(p);
  359. }
  360. UA_StatusCode UA_DataTypeNode_copy(const UA_DataTypeNode *src, UA_DataTypeNode *dst) {
  361. dst->isAbstract = src->isAbstract;
  362. return UA_Node_copy((const UA_Node*)src, (UA_Node*)dst);
  363. }