ua_nodes.c 11 KB

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