ua_nodes.c 9.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314
  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. /* UA_ObjectNode */
  40. void UA_ObjectNode_init(UA_ObjectNode *p) {
  41. UA_Node_init((UA_Node*)p);
  42. p->nodeClass = UA_NODECLASS_OBJECT;
  43. p->eventNotifier = 0;
  44. }
  45. UA_ObjectNode * UA_ObjectNode_new(void) {
  46. UA_ObjectNode *p = (UA_ObjectNode*)UA_malloc(sizeof(UA_ObjectNode));
  47. if(p)
  48. UA_ObjectNode_init(p);
  49. return p;
  50. }
  51. void UA_ObjectNode_deleteMembers(UA_ObjectNode *p) {
  52. UA_Node_deleteMembers((UA_Node*)p);
  53. }
  54. void UA_ObjectNode_delete(UA_ObjectNode *p) {
  55. UA_ObjectNode_deleteMembers(p);
  56. UA_free(p);
  57. }
  58. UA_StatusCode UA_ObjectNode_copy(const UA_ObjectNode *src, UA_ObjectNode *dst) {
  59. dst->eventNotifier = src->eventNotifier;
  60. return UA_Node_copy((const UA_Node*)src, (UA_Node*)dst);
  61. }
  62. /* UA_ObjectTypeNode */
  63. void UA_ObjectTypeNode_init(UA_ObjectTypeNode *p) {
  64. UA_Node_init((UA_Node*)p);
  65. p->nodeClass = UA_NODECLASS_OBJECTTYPE;
  66. p->isAbstract = UA_FALSE;
  67. }
  68. UA_ObjectTypeNode * UA_ObjectTypeNode_new(void) {
  69. UA_ObjectTypeNode *p = (UA_ObjectTypeNode*)UA_malloc(sizeof(UA_ObjectTypeNode));
  70. if(p)
  71. UA_ObjectTypeNode_init(p);
  72. return p;
  73. }
  74. void UA_ObjectTypeNode_deleteMembers(UA_ObjectTypeNode *p) {
  75. UA_Node_deleteMembers((UA_Node*)p);
  76. }
  77. void UA_ObjectTypeNode_delete(UA_ObjectTypeNode *p) {
  78. UA_ObjectTypeNode_deleteMembers(p);
  79. UA_free(p);
  80. }
  81. UA_StatusCode UA_ObjectTypeNode_copy(const UA_ObjectTypeNode *src, UA_ObjectTypeNode *dst) {
  82. dst->isAbstract = src->isAbstract;
  83. return UA_Node_copy((const UA_Node*)src, (UA_Node*)dst);
  84. }
  85. /* UA_VariableNode */
  86. void UA_VariableNode_init(UA_VariableNode *p) {
  87. UA_Node_init((UA_Node*)p);
  88. p->nodeClass = UA_NODECLASS_VARIABLE;
  89. p->variableType = UA_VARIABLENODETYPE_VARIANT;
  90. UA_Variant_init(&p->variable.variant);
  91. p->valueRank = -2; // scalar or array of any dimension
  92. p->accessLevel = 0;
  93. p->userAccessLevel = 0;
  94. p->minimumSamplingInterval = 0.0;
  95. p->historizing = UA_FALSE;
  96. }
  97. UA_VariableNode * UA_VariableNode_new(void) {
  98. UA_VariableNode *p = (UA_VariableNode*)UA_malloc(sizeof(UA_VariableNode));
  99. if(p)
  100. UA_VariableNode_init(p);
  101. return p;
  102. }
  103. void UA_VariableNode_deleteMembers(UA_VariableNode *p) {
  104. UA_Node_deleteMembers((UA_Node*)p);
  105. if(p->variableType == UA_VARIABLENODETYPE_VARIANT)
  106. UA_Variant_deleteMembers(&p->variable.variant);
  107. }
  108. void UA_VariableNode_delete(UA_VariableNode *p) {
  109. UA_VariableNode_deleteMembers(p);
  110. UA_free(p);
  111. }
  112. UA_StatusCode UA_VariableNode_copy(const UA_VariableNode *src, UA_VariableNode *dst) {
  113. UA_VariableNode_init(dst);
  114. UA_StatusCode retval = UA_Node_copy((const UA_Node*)src, (UA_Node*)dst);
  115. dst->variableType = src->variableType;
  116. if(src->variableType == UA_VARIABLENODETYPE_VARIANT)
  117. retval = UA_Variant_copy(&src->variable.variant, &dst->variable.variant);
  118. else
  119. dst->variable.dataSource = src->variable.dataSource;
  120. if(retval) {
  121. UA_VariableNode_deleteMembers(dst);
  122. return retval;
  123. }
  124. dst->accessLevel = src->accessLevel;
  125. dst->userAccessLevel = src->accessLevel;
  126. dst->minimumSamplingInterval = src->minimumSamplingInterval;
  127. dst->historizing = src->historizing;
  128. return UA_STATUSCODE_GOOD;
  129. }
  130. /* UA_VariableTypeNode */
  131. void UA_VariableTypeNode_init(UA_VariableTypeNode *p) {
  132. UA_Node_init((UA_Node*)p);
  133. p->nodeClass = UA_NODECLASS_VARIABLETYPE;
  134. UA_Variant_init(&p->value);
  135. p->valueRank = 0;
  136. p->isAbstract = UA_FALSE;
  137. }
  138. UA_VariableTypeNode * UA_VariableTypeNode_new(void) {
  139. UA_VariableTypeNode *p = (UA_VariableTypeNode*)UA_malloc(sizeof(UA_VariableTypeNode));
  140. if(p)
  141. UA_VariableTypeNode_init(p);
  142. return p;
  143. }
  144. void UA_VariableTypeNode_deleteMembers(UA_VariableTypeNode *p) {
  145. UA_Node_deleteMembers((UA_Node*)p);
  146. UA_Variant_deleteMembers(&p->value);
  147. }
  148. void UA_VariableTypeNode_delete(UA_VariableTypeNode *p) {
  149. UA_VariableTypeNode_deleteMembers(p);
  150. UA_free(p);
  151. }
  152. UA_StatusCode UA_VariableTypeNode_copy(const UA_VariableTypeNode *src, UA_VariableTypeNode *dst) {
  153. UA_VariableTypeNode_init(dst);
  154. UA_StatusCode retval = UA_Node_copy((const UA_Node*)src, (UA_Node*)dst);
  155. retval |= UA_Variant_copy(&src->value, &dst->value);
  156. if(retval) {
  157. UA_VariableTypeNode_deleteMembers(dst);
  158. return retval;
  159. }
  160. dst->isAbstract = src->isAbstract;
  161. return UA_STATUSCODE_GOOD;
  162. }
  163. /* UA_ReferenceTypeNode */
  164. void UA_ReferenceTypeNode_init(UA_ReferenceTypeNode *p) {
  165. UA_Node_init((UA_Node*)p);
  166. p->nodeClass = UA_NODECLASS_REFERENCETYPE;
  167. p->isAbstract = UA_FALSE;
  168. p->symmetric = UA_FALSE;
  169. UA_LocalizedText_init(&p->inverseName);
  170. }
  171. UA_ReferenceTypeNode * UA_ReferenceTypeNode_new(void) {
  172. UA_ReferenceTypeNode *p = (UA_ReferenceTypeNode*)UA_malloc(sizeof(UA_ReferenceTypeNode));
  173. if(p)
  174. UA_ReferenceTypeNode_init(p);
  175. return p;
  176. }
  177. void UA_ReferenceTypeNode_deleteMembers(UA_ReferenceTypeNode *p) {
  178. UA_Node_deleteMembers((UA_Node*)p);
  179. UA_LocalizedText_deleteMembers(&p->inverseName);
  180. }
  181. void UA_ReferenceTypeNode_delete(UA_ReferenceTypeNode *p) {
  182. UA_ReferenceTypeNode_deleteMembers(p);
  183. UA_free(p);
  184. }
  185. UA_StatusCode UA_ReferenceTypeNode_copy(const UA_ReferenceTypeNode *src, UA_ReferenceTypeNode *dst) {
  186. UA_StatusCode retval = UA_Node_copy((const UA_Node*)src, (UA_Node*)dst);
  187. if(retval)
  188. return retval;
  189. retval = UA_LocalizedText_copy(&src->inverseName, &dst->inverseName);
  190. if(retval) {
  191. UA_ReferenceTypeNode_deleteMembers(dst);
  192. return retval;
  193. }
  194. dst->isAbstract = src->isAbstract;
  195. dst->symmetric = src->symmetric;
  196. return UA_STATUSCODE_GOOD;
  197. }
  198. /* UA_MethodNode */
  199. void UA_MethodNode_init(UA_MethodNode *p) {
  200. UA_Node_init((UA_Node*)p);
  201. p->nodeClass = UA_NODECLASS_METHOD;
  202. p->executable = UA_FALSE;
  203. p->userExecutable = UA_FALSE;
  204. }
  205. UA_MethodNode * UA_MethodNode_new(void) {
  206. UA_MethodNode *p = (UA_MethodNode*)UA_malloc(sizeof(UA_MethodNode));
  207. if(p)
  208. UA_MethodNode_init(p);
  209. return p;
  210. }
  211. void UA_MethodNode_deleteMembers(UA_MethodNode *p) {
  212. UA_Node_deleteMembers((UA_Node*)p);
  213. }
  214. void UA_MethodNode_delete(UA_MethodNode *p) {
  215. UA_MethodNode_deleteMembers(p);
  216. UA_free(p);
  217. }
  218. UA_StatusCode UA_MethodNode_copy(const UA_MethodNode *src, UA_MethodNode *dst) {
  219. dst->executable = src->executable;
  220. dst->userExecutable = src->userExecutable;
  221. return UA_Node_copy((const UA_Node*)src, (UA_Node*)dst);
  222. }
  223. /* UA_ViewNode */
  224. void UA_ViewNode_init(UA_ViewNode *p) {
  225. UA_Node_init((UA_Node*)p);
  226. p->nodeClass = UA_NODECLASS_VIEW;
  227. p->containsNoLoops = UA_FALSE;
  228. p->eventNotifier = 0;
  229. }
  230. UA_ViewNode * UA_ViewNode_new(void) {
  231. UA_ViewNode *p = UA_malloc(sizeof(UA_ViewNode));
  232. if(p)
  233. UA_ViewNode_init(p);
  234. return p;
  235. }
  236. void UA_ViewNode_deleteMembers(UA_ViewNode *p) {
  237. UA_Node_deleteMembers((UA_Node*)p);
  238. }
  239. void UA_ViewNode_delete(UA_ViewNode *p) {
  240. UA_ViewNode_deleteMembers(p);
  241. UA_free(p);
  242. }
  243. UA_StatusCode UA_ViewNode_copy(const UA_ViewNode *src, UA_ViewNode *dst) {
  244. dst->containsNoLoops = src->containsNoLoops;
  245. dst->eventNotifier = src->eventNotifier;
  246. return UA_Node_copy((const UA_Node*)src, (UA_Node*)dst);
  247. }
  248. /* UA_DataTypeNode */
  249. void UA_DataTypeNode_init(UA_DataTypeNode *p) {
  250. UA_Node_init((UA_Node*)p);
  251. p->nodeClass = UA_NODECLASS_DATATYPE;
  252. p->isAbstract = UA_FALSE;
  253. }
  254. UA_DataTypeNode * UA_DataTypeNode_new(void) {
  255. UA_DataTypeNode *p = UA_malloc(sizeof(UA_DataTypeNode));
  256. if(p)
  257. UA_DataTypeNode_init(p);
  258. return p;
  259. }
  260. void UA_DataTypeNode_deleteMembers(UA_DataTypeNode *p) {
  261. UA_Node_deleteMembers((UA_Node*)p);
  262. }
  263. void UA_DataTypeNode_delete(UA_DataTypeNode *p) {
  264. UA_DataTypeNode_deleteMembers(p);
  265. UA_free(p);
  266. }
  267. UA_StatusCode UA_DataTypeNode_copy(const UA_DataTypeNode *src, UA_DataTypeNode *dst) {
  268. dst->isAbstract = src->isAbstract;
  269. return UA_Node_copy((const UA_Node*)src, (UA_Node*)dst);
  270. }