ua_nodes.c 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340
  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->valueSource = UA_VALUESOURCE_VARIANT;
  90. UA_Variant_init(&p->value.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->valueSource == UA_VALUESOURCE_VARIANT)
  106. UA_Variant_deleteMembers(&p->value.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->valueRank = src->valueRank;
  116. dst->valueSource = src->valueSource;
  117. if(src->valueSource == UA_VALUESOURCE_VARIANT)
  118. retval = UA_Variant_copy(&src->value.variant, &dst->value.variant);
  119. else
  120. dst->value.dataSource = src->value.dataSource;
  121. if(retval) {
  122. UA_VariableNode_deleteMembers(dst);
  123. return retval;
  124. }
  125. dst->accessLevel = src->accessLevel;
  126. dst->userAccessLevel = src->accessLevel;
  127. dst->minimumSamplingInterval = src->minimumSamplingInterval;
  128. dst->historizing = src->historizing;
  129. return UA_STATUSCODE_GOOD;
  130. }
  131. /* UA_VariableTypeNode */
  132. void UA_VariableTypeNode_init(UA_VariableTypeNode *p) {
  133. UA_Node_init((UA_Node*)p);
  134. p->nodeClass = UA_NODECLASS_VARIABLETYPE;
  135. p->valueSource = UA_VALUESOURCE_VARIANT;
  136. UA_Variant_init(&p->value.variant);
  137. p->valueRank = -2; // scalar or array of any dimension
  138. p->isAbstract = UA_FALSE;
  139. }
  140. UA_VariableTypeNode * UA_VariableTypeNode_new(void) {
  141. UA_VariableTypeNode *p = (UA_VariableTypeNode*)UA_malloc(sizeof(UA_VariableTypeNode));
  142. if(p)
  143. UA_VariableTypeNode_init(p);
  144. return p;
  145. }
  146. void UA_VariableTypeNode_deleteMembers(UA_VariableTypeNode *p) {
  147. UA_Node_deleteMembers((UA_Node*)p);
  148. if(p->valueSource == UA_VALUESOURCE_VARIANT)
  149. UA_Variant_deleteMembers(&p->value.variant);
  150. }
  151. void UA_VariableTypeNode_delete(UA_VariableTypeNode *p) {
  152. UA_VariableTypeNode_deleteMembers(p);
  153. UA_free(p);
  154. }
  155. UA_StatusCode UA_VariableTypeNode_copy(const UA_VariableTypeNode *src, UA_VariableTypeNode *dst) {
  156. UA_VariableTypeNode_init(dst);
  157. UA_StatusCode retval = UA_Node_copy((const UA_Node*)src, (UA_Node*)dst);
  158. dst->valueRank = src->valueRank;
  159. dst->valueSource = src->valueSource;
  160. if(src->valueSource == UA_VALUESOURCE_VARIANT)
  161. UA_Variant_copy(&src->value.variant, &dst->value.variant);
  162. else
  163. dst->value.dataSource = src->value.dataSource;
  164. if(retval) {
  165. UA_VariableTypeNode_deleteMembers(dst);
  166. return retval;
  167. }
  168. dst->isAbstract = src->isAbstract;
  169. return UA_STATUSCODE_GOOD;
  170. }
  171. /* UA_ReferenceTypeNode */
  172. void UA_ReferenceTypeNode_init(UA_ReferenceTypeNode *p) {
  173. UA_Node_init((UA_Node*)p);
  174. p->nodeClass = UA_NODECLASS_REFERENCETYPE;
  175. p->isAbstract = UA_FALSE;
  176. p->symmetric = UA_FALSE;
  177. UA_LocalizedText_init(&p->inverseName);
  178. }
  179. UA_ReferenceTypeNode * UA_ReferenceTypeNode_new(void) {
  180. UA_ReferenceTypeNode *p = (UA_ReferenceTypeNode*)UA_malloc(sizeof(UA_ReferenceTypeNode));
  181. if(p)
  182. UA_ReferenceTypeNode_init(p);
  183. return p;
  184. }
  185. void UA_ReferenceTypeNode_deleteMembers(UA_ReferenceTypeNode *p) {
  186. UA_Node_deleteMembers((UA_Node*)p);
  187. UA_LocalizedText_deleteMembers(&p->inverseName);
  188. }
  189. void UA_ReferenceTypeNode_delete(UA_ReferenceTypeNode *p) {
  190. UA_ReferenceTypeNode_deleteMembers(p);
  191. UA_free(p);
  192. }
  193. UA_StatusCode UA_ReferenceTypeNode_copy(const UA_ReferenceTypeNode *src, UA_ReferenceTypeNode *dst) {
  194. UA_StatusCode retval = UA_Node_copy((const UA_Node*)src, (UA_Node*)dst);
  195. if(retval)
  196. return retval;
  197. retval = UA_LocalizedText_copy(&src->inverseName, &dst->inverseName);
  198. if(retval) {
  199. UA_ReferenceTypeNode_deleteMembers(dst);
  200. return retval;
  201. }
  202. dst->isAbstract = src->isAbstract;
  203. dst->symmetric = src->symmetric;
  204. return UA_STATUSCODE_GOOD;
  205. }
  206. /* UA_MethodNode */
  207. void UA_MethodNode_init(UA_MethodNode *p) {
  208. UA_Node_init((UA_Node*)p);
  209. p->nodeClass = UA_NODECLASS_METHOD;
  210. p->executable = UA_FALSE;
  211. p->userExecutable = UA_FALSE;
  212. #ifdef ENABLE_METHODCALLS
  213. p->methodHandle = UA_NULL;
  214. p->attachedMethod = UA_NULL;
  215. #endif
  216. }
  217. UA_MethodNode * UA_MethodNode_new(void) {
  218. UA_MethodNode *p = (UA_MethodNode*)UA_malloc(sizeof(UA_MethodNode));
  219. if(p)
  220. UA_MethodNode_init(p);
  221. return p;
  222. }
  223. void UA_MethodNode_deleteMembers(UA_MethodNode *p) {
  224. #ifdef ENABLE_METHODCALLS
  225. p->attachedMethod = UA_NULL;
  226. #endif
  227. UA_Node_deleteMembers((UA_Node*)p);
  228. }
  229. void UA_MethodNode_delete(UA_MethodNode *p) {
  230. UA_MethodNode_deleteMembers(p);
  231. #ifdef ENABLE_METHODCALLS
  232. p->methodHandle = UA_NULL;
  233. p->attachedMethod = UA_NULL;
  234. #endif
  235. UA_free(p);
  236. }
  237. UA_StatusCode UA_MethodNode_copy(const UA_MethodNode *src, UA_MethodNode *dst) {
  238. UA_StatusCode retval = UA_Node_copy((const UA_Node*)src, (UA_Node*)dst);
  239. if(retval != UA_STATUSCODE_GOOD)
  240. return retval;
  241. dst->executable = src->executable;
  242. dst->userExecutable = src->userExecutable;
  243. #ifdef ENABLE_METHODCALLS
  244. dst->methodHandle = src->methodHandle;
  245. dst->attachedMethod = src->attachedMethod;
  246. #endif
  247. return retval;
  248. }
  249. /* UA_ViewNode */
  250. void UA_ViewNode_init(UA_ViewNode *p) {
  251. UA_Node_init((UA_Node*)p);
  252. p->nodeClass = UA_NODECLASS_VIEW;
  253. p->containsNoLoops = UA_FALSE;
  254. p->eventNotifier = 0;
  255. }
  256. UA_ViewNode * UA_ViewNode_new(void) {
  257. UA_ViewNode *p = UA_malloc(sizeof(UA_ViewNode));
  258. if(p)
  259. UA_ViewNode_init(p);
  260. return p;
  261. }
  262. void UA_ViewNode_deleteMembers(UA_ViewNode *p) {
  263. UA_Node_deleteMembers((UA_Node*)p);
  264. }
  265. void UA_ViewNode_delete(UA_ViewNode *p) {
  266. UA_ViewNode_deleteMembers(p);
  267. UA_free(p);
  268. }
  269. UA_StatusCode UA_ViewNode_copy(const UA_ViewNode *src, UA_ViewNode *dst) {
  270. dst->containsNoLoops = src->containsNoLoops;
  271. dst->eventNotifier = src->eventNotifier;
  272. return UA_Node_copy((const UA_Node*)src, (UA_Node*)dst);
  273. }
  274. /* UA_DataTypeNode */
  275. void UA_DataTypeNode_init(UA_DataTypeNode *p) {
  276. UA_Node_init((UA_Node*)p);
  277. p->nodeClass = UA_NODECLASS_DATATYPE;
  278. p->isAbstract = UA_FALSE;
  279. }
  280. UA_DataTypeNode * UA_DataTypeNode_new(void) {
  281. UA_DataTypeNode *p = UA_malloc(sizeof(UA_DataTypeNode));
  282. if(p)
  283. UA_DataTypeNode_init(p);
  284. return p;
  285. }
  286. void UA_DataTypeNode_deleteMembers(UA_DataTypeNode *p) {
  287. UA_Node_deleteMembers((UA_Node*)p);
  288. }
  289. void UA_DataTypeNode_delete(UA_DataTypeNode *p) {
  290. UA_DataTypeNode_deleteMembers(p);
  291. UA_free(p);
  292. }
  293. UA_StatusCode UA_DataTypeNode_copy(const UA_DataTypeNode *src, UA_DataTypeNode *dst) {
  294. dst->isAbstract = src->isAbstract;
  295. return UA_Node_copy((const UA_Node*)src, (UA_Node*)dst);
  296. }