ua_nodes.c 14 KB

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