ua_types_encoding_xml.c 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459
  1. #include "ua_types_encoding_xml.h"
  2. #include "ua_util.h"
  3. #include "ua_namespace_0.h"
  4. #include "ua_xml.h"
  5. /* Boolean */
  6. UA_Int32 UA_Boolean_copycstring(cstring src, UA_Boolean *dst) {
  7. *dst = UA_FALSE;
  8. if(0 == strncmp(src, "true", 4) || 0 == strncmp(src, "TRUE", 4))
  9. *dst = UA_TRUE;
  10. return UA_SUCCESS;
  11. }
  12. UA_TYPE_METHOD_CALCSIZEXML_NOTIMPL(UA_Boolean)
  13. UA_TYPE_METHOD_ENCODEXML_NOTIMPL(UA_Boolean)
  14. UA_Int32 UA_Boolean_decodeXML(XML_Stack *s, XML_Attr *attr, UA_Boolean *dst, _Bool isStart) {
  15. DBG_VERBOSE(printf("UA_Boolean entered with dst=%p,isStart=%d\n", (void * )dst, isStart));
  16. if(isStart) {
  17. if(dst == UA_NULL) {
  18. UA_Boolean_new(&dst);
  19. s->parent[s->depth - 1].children[s->parent[s->depth - 1].activeChild].obj = (void *)dst;
  20. }
  21. UA_Boolean_copycstring((cstring)attr[1], dst);
  22. }
  23. return UA_SUCCESS;
  24. }
  25. UA_TYPE_DECODEXML_FROM_BYTESTRING(UA_Boolean)
  26. /* SByte */
  27. UA_TYPE_METHOD_CALCSIZEXML_NOTIMPL(UA_SByte)
  28. UA_TYPE_METHOD_ENCODEXML_NOTIMPL(UA_SByte)
  29. UA_TYPE_METHOD_DECODEXML_NOTIMPL(UA_SByte)
  30. /* Byte */
  31. UA_TYPE_METHOD_CALCSIZEXML_NOTIMPL(UA_Byte)
  32. UA_TYPE_METHOD_ENCODEXML_NOTIMPL(UA_Byte)
  33. UA_TYPE_METHOD_DECODEXML_NOTIMPL(UA_Byte)
  34. /* Int16 */
  35. UA_TYPE_METHOD_CALCSIZEXML_NOTIMPL(UA_Int16)
  36. UA_TYPE_METHOD_ENCODEXML_NOTIMPL(UA_Int16)
  37. UA_Int32 UA_Int16_copycstring(cstring src, UA_Int16 *dst) {
  38. *dst = atoi(src);
  39. return UA_SUCCESS;
  40. }
  41. UA_Int32 UA_UInt16_copycstring(cstring src, UA_UInt16 *dst) {
  42. *dst = atoi(src);
  43. return UA_SUCCESS;
  44. }
  45. UA_Int32 UA_Int16_decodeXmlFromStack(XML_Stack *s, XML_Attr *attr, UA_Int16 *dst, _Bool isStart) {
  46. DBG_VERBOSE(printf("UA_Int32 entered with dst=%p,isStart=%d\n", (void * )dst, isStart));
  47. if(isStart) {
  48. if(dst == UA_NULL) {
  49. UA_Int16_new(&dst);
  50. s->parent[s->depth - 1].children[s->parent[s->depth - 1].activeChild].obj = (void *)dst;
  51. }
  52. UA_Int16_copycstring((cstring)attr[1], dst);
  53. }
  54. return UA_SUCCESS;
  55. }
  56. UA_TYPE_DECODEXML_FROM_BYTESTRING(UA_Int16)
  57. /* UInt16 */
  58. UA_TYPE_METHOD_CALCSIZEXML_NOTIMPL(UA_UInt16)
  59. UA_TYPE_METHOD_ENCODEXML_NOTIMPL(UA_UInt16)
  60. UA_TYPE_METHOD_DECODEXML_NOTIMPL(UA_UInt16)
  61. /* Int32 */
  62. UA_TYPE_METHOD_CALCSIZEXML_NOTIMPL(UA_Int32)
  63. UA_TYPE_METHOD_ENCODEXML_NOTIMPL(UA_Int32)
  64. UA_Int32 UA_Int32_decodeXmlFromStack(XML_Stack *s, XML_Attr *attr, UA_Int32 *dst, _Bool isStart) {
  65. DBG_VERBOSE(printf("UA_Int32 entered with dst=%p,isStart=%d\n", (void * )dst, isStart));
  66. if(isStart) {
  67. if(dst == UA_NULL) {
  68. UA_Int32_new(&dst);
  69. s->parent[s->depth - 1].children[s->parent[s->depth - 1].activeChild].obj = (void *)dst;
  70. }
  71. *dst = atoi(attr[1]);
  72. }
  73. return UA_SUCCESS;
  74. }
  75. UA_TYPE_DECODEXML_FROM_BYTESTRING(UA_Int32)
  76. /* UInt32 */
  77. UA_TYPE_METHOD_CALCSIZEXML_NOTIMPL(UA_UInt32)
  78. UA_TYPE_METHOD_ENCODEXML_NOTIMPL(UA_UInt32)
  79. UA_TYPE_METHOD_DECODEXML_NOTIMPL(UA_UInt32)
  80. /* Int64 */
  81. UA_TYPE_METHOD_CALCSIZEXML_NOTIMPL(UA_Int64)
  82. UA_TYPE_METHOD_ENCODEXML_NOTIMPL(UA_Int64)
  83. UA_TYPE_METHOD_DECODEXML_NOTIMPL(UA_Int64)
  84. /* UInt64 */
  85. UA_TYPE_METHOD_CALCSIZEXML_NOTIMPL(UA_UInt64)
  86. UA_TYPE_METHOD_ENCODEXML_NOTIMPL(UA_UInt64)
  87. UA_TYPE_METHOD_DECODEXML_NOTIMPL(UA_UInt64)
  88. /* Float */
  89. UA_TYPE_METHOD_CALCSIZEXML_NOTIMPL(UA_Float)
  90. UA_TYPE_METHOD_ENCODEXML_NOTIMPL(UA_Float)
  91. UA_TYPE_METHOD_DECODEXML_NOTIMPL(UA_Float)
  92. /* Double */
  93. UA_TYPE_METHOD_CALCSIZEXML_NOTIMPL(UA_Double)
  94. UA_TYPE_METHOD_ENCODEXML_NOTIMPL(UA_Double)
  95. UA_TYPE_METHOD_DECODEXML_NOTIMPL(UA_Double)
  96. /* String */
  97. UA_TYPE_METHOD_CALCSIZEXML_NOTIMPL(UA_String)
  98. UA_TYPE_METHOD_ENCODEXML_NOTIMPL(UA_String)
  99. UA_Int32 UA_String_decodeXmlFromStack(XML_Stack *s, XML_Attr *attr, UA_String *dst, _Bool isStart) {
  100. DBG_VERBOSE(printf("UA_String entered with dst=%p,isStart=%d\n", (void * )dst, isStart));
  101. UA_UInt32 i;
  102. if(isStart) {
  103. if(dst == UA_NULL) {
  104. UA_String_new(&dst);
  105. s->parent[s->depth - 1].children[s->parent[s->depth - 1].activeChild].obj = (void *)dst;
  106. }
  107. s->parent[s->depth].len = 0;
  108. XML_Stack_addChildHandler(s, "Data", strlen("Data"), (XML_decoder)UA_Text_decodeXmlFromStack, UA_BYTE,
  109. &(dst->data));
  110. XML_Stack_addChildHandler(s, "Length", strlen("Length"), (XML_decoder)UA_Int32_decodeXmlFromStack, UA_INT32,
  111. &(dst->length));
  112. XML_Stack_handleTextAsElementOf(s, "Data", 0);
  113. // set attributes
  114. for(i = 0;attr[i];i += 2) {
  115. if(0 == strncmp("Data", attr[i], strlen("Data")))
  116. UA_String_copycstring(attr[i + 1], dst);
  117. else
  118. printf("UA_String_decodeXml - Unknown attribute - name=%s, value=%s\n", attr[i], attr[i+1]);
  119. }
  120. } else {
  121. switch(s->parent[s->depth - 1].activeChild) {
  122. case 0:
  123. if(dst != UA_NULL && dst->data != UA_NULL && dst->length == -1)
  124. dst->length = strlen((char const *)dst->data);
  125. break;
  126. }
  127. }
  128. return UA_SUCCESS;
  129. }
  130. UA_TYPE_DECODEXML_FROM_BYTESTRING(UA_String)
  131. /* DateTime */
  132. UA_TYPE_METHOD_CALCSIZEXML_NOTIMPL(UA_DateTime)
  133. UA_TYPE_METHOD_ENCODEXML_NOTIMPL(UA_DateTime)
  134. UA_TYPE_METHOD_DECODEXML_NOTIMPL(UA_DateTime)
  135. /* Guid */
  136. UA_TYPE_METHOD_CALCSIZEXML_NOTIMPL(UA_Guid)
  137. UA_TYPE_METHOD_ENCODEXML_NOTIMPL(UA_Guid)
  138. UA_TYPE_METHOD_DECODEXML_NOTIMPL(UA_Guid)
  139. /* ByteString */
  140. UA_TYPE_METHOD_CALCSIZEXML_NOTIMPL(UA_ByteString)
  141. UA_TYPE_METHOD_ENCODEXML_NOTIMPL(UA_ByteString)
  142. UA_TYPE_METHOD_DECODEXML_NOTIMPL(UA_ByteString)
  143. /* XmlElement */
  144. UA_TYPE_METHOD_CALCSIZEXML_NOTIMPL(UA_XmlElement)
  145. UA_TYPE_METHOD_ENCODEXML_NOTIMPL(UA_XmlElement)
  146. UA_TYPE_METHOD_DECODEXML_NOTIMPL(UA_XmlElement)
  147. /* NodeId */
  148. UA_TYPE_METHOD_CALCSIZEXML_NOTIMPL(UA_NodeId)
  149. UA_TYPE_METHOD_ENCODEXML_NOTIMPL(UA_NodeId)
  150. UA_Int32 UA_NodeId_decodeXmlFromStack(XML_Stack *s, XML_Attr *attr, UA_NodeId *dst, _Bool isStart) {
  151. DBG_VERBOSE(printf("UA_NodeId entered with dst=%p,isStart=%d\n", (void * )dst, isStart));
  152. UA_UInt32 i;
  153. if(isStart) {
  154. if(dst == UA_NULL) {
  155. UA_NodeId_new(&dst);
  156. s->parent[s->depth - 1].children[s->parent[s->depth - 1].activeChild].obj = (void *)dst;
  157. }
  158. s->parent[s->depth].len = 0;
  159. XML_Stack_addChildHandler(s, "Namespace", strlen(
  160. "Namespace"), (XML_decoder)UA_Int16_decodeXmlFromStack, UA_INT16,
  161. &(dst->namespace));
  162. XML_Stack_addChildHandler(s, "Numeric", strlen(
  163. "Numeric"), (XML_decoder)UA_Int32_decodeXmlFromStack, UA_INT32,
  164. &(dst->identifier.numeric));
  165. XML_Stack_addChildHandler(s, "Identifier", strlen(
  166. "Identifier"), (XML_decoder)UA_String_decodeXmlFromStack, UA_STRING, UA_NULL);
  167. XML_Stack_handleTextAsElementOf(s, "Data", 2);
  168. // set attributes
  169. for(i = 0; attr[i]; i += 2) {
  170. if(0 == strncmp("Namespace", attr[i], strlen("Namespace")))
  171. dst->namespace = atoi(attr[i + 1]);
  172. else if(0 == strncmp("Numeric", attr[i], strlen("Numeric"))) {
  173. dst->identifier.numeric = atoi(attr[i + 1]);
  174. dst->encodingByte = UA_NODEIDTYPE_FOURBYTE;
  175. } else
  176. printf("UA_NodeId_decodeXml - Unknown attribute name=%s, value=%s\n", attr[i], attr[i+1]);
  177. }
  178. } else {
  179. if(s->parent[s->depth - 1].activeChild == 2)
  180. UA_NodeId_copycstring((cstring)((UA_String *)attr)->data, dst, s->aliases);
  181. }
  182. return UA_SUCCESS;
  183. }
  184. UA_TYPE_DECODEXML_FROM_BYTESTRING(UA_NodeId)
  185. /* ExpandedNodeId */
  186. UA_TYPE_METHOD_CALCSIZEXML_NOTIMPL(UA_ExpandedNodeId)
  187. UA_TYPE_METHOD_ENCODEXML_NOTIMPL(UA_ExpandedNodeId)
  188. UA_Int32 UA_ExpandedNodeId_decodeXmlFromStack(XML_Stack *s, XML_Attr *attr, UA_ExpandedNodeId *dst, _Bool isStart) {
  189. DBG_VERBOSE(printf("UA_ExpandedNodeId entered with dst=%p,isStart=%d\n", (void * )dst, isStart));
  190. UA_UInt32 i;
  191. if(isStart) {
  192. if(dst == UA_NULL) {
  193. UA_ExpandedNodeId_new(&dst);
  194. s->parent[s->depth - 1].children[s->parent[s->depth - 1].activeChild].obj = (void *)dst;
  195. }
  196. s->parent[s->depth].len = 0;
  197. XML_Stack_addChildHandler(s, "NodeId", strlen(
  198. "NodeId"), (XML_decoder)UA_NodeId_decodeXmlFromStack, UA_NODEID, &(dst->nodeId));
  199. XML_Stack_addChildHandler(s, "Namespace", strlen(
  200. "Namespace"), (XML_decoder)UA_Int16_decodeXmlFromStack, UA_INT16,
  201. &(dst->nodeId.namespace));
  202. XML_Stack_addChildHandler(s, "Numeric", strlen("Numeric"), (XML_decoder)UA_Int32_decodeXmlFromStack, UA_INT32,
  203. &(dst->nodeId.identifier.numeric));
  204. XML_Stack_addChildHandler(s, "Id", strlen("Id"), (XML_decoder)UA_String_decodeXmlFromStack, UA_STRING, UA_NULL);
  205. XML_Stack_handleTextAsElementOf(s, "Data", 3);
  206. // set attributes
  207. for(i = 0; attr[i]; i += 2) {
  208. if(0 == strncmp("Namespace", attr[i], strlen("Namespace")))
  209. UA_UInt16_copycstring((cstring)attr[i + 1], &(dst->nodeId.namespace));
  210. else if(0 == strncmp("Numeric", attr[i], strlen("Numeric"))) {
  211. UA_NodeId_copycstring((cstring)attr[i + 1], &(dst->nodeId), s->aliases);
  212. } else if(0 == strncmp("NodeId", attr[i], strlen("NodeId")))
  213. UA_NodeId_copycstring((cstring)attr[i + 1], &(dst->nodeId), s->aliases);
  214. else
  215. printf("UA_ExpandedNodeId_decodeXml - unknown attribute name=%s, value=%s\n", attr[i], attr[i+1]);
  216. }
  217. }
  218. return UA_SUCCESS;
  219. }
  220. UA_TYPE_DECODEXML_FROM_BYTESTRING(UA_ExpandedNodeId)
  221. /* StatusCode */
  222. UA_TYPE_METHOD_CALCSIZEXML_NOTIMPL(UA_StatusCode)
  223. UA_TYPE_METHOD_ENCODEXML_NOTIMPL(UA_StatusCode)
  224. UA_Int32 UA_StatusCode_decodeXML(XML_Stack *s, XML_Attr *attr, UA_StatusCode *dst, _Bool isStart) {
  225. DBG_VERBOSE(printf("UA_StatusCode_decodeXML entered with dst=%p,isStart=%d\n", (void * )dst, isStart));
  226. return UA_ERR_NOT_IMPLEMENTED;
  227. }
  228. UA_TYPE_DECODEXML_FROM_BYTESTRING(UA_StatusCode)
  229. /* QualifiedName */
  230. UA_TYPE_METHOD_CALCSIZEXML_NOTIMPL(UA_QualifiedName)
  231. UA_TYPE_METHOD_ENCODEXML_NOTIMPL(UA_QualifiedName)
  232. UA_Int32 UA_QualifiedName_decodeXmlFromStack(XML_Stack *s, XML_Attr *attr, UA_QualifiedName *dst, _Bool isStart) {
  233. DBG_VERBOSE(printf("UA_QualifiedName entered with dst=%p,isStart=%d\n", (void * )dst, isStart));
  234. UA_UInt32 i;
  235. if(isStart) {
  236. if(dst == UA_NULL) {
  237. UA_QualifiedName_new(&dst);
  238. s->parent[s->depth - 1].children[s->parent[s->depth - 1].activeChild].obj = (void *)dst;
  239. }
  240. s->parent[s->depth].len = 0;
  241. XML_Stack_addChildHandler(s, "Name", strlen("Name"), (XML_decoder)UA_String_decodeXmlFromStack, UA_STRING,
  242. &(dst->name));
  243. XML_Stack_addChildHandler(s, "NamespaceIndex", strlen(
  244. "NamespaceIndex"), (XML_decoder)UA_Int16_decodeXmlFromStack, UA_STRING,
  245. &(dst->namespaceIndex));
  246. XML_Stack_handleTextAsElementOf(s, "Data", 0);
  247. // set attributes
  248. for(i = 0;attr[i];i += 2) {
  249. if(0 == strncmp("NamespaceIndex", attr[i], strlen("NamespaceIndex")))
  250. dst->namespaceIndex = atoi(attr[i + 1]);
  251. else if(0 == strncmp("Name", attr[i], strlen("Name")))
  252. UA_String_copycstring(attr[i + 1], &(dst->name));
  253. else
  254. perror("Unknown attribute");
  255. }
  256. }
  257. return UA_SUCCESS;
  258. }
  259. UA_TYPE_DECODEXML_FROM_BYTESTRING(UA_QualifiedName)
  260. /* LocalizedText */
  261. UA_TYPE_METHOD_CALCSIZEXML_NOTIMPL(UA_LocalizedText)
  262. UA_TYPE_METHOD_ENCODEXML_NOTIMPL(UA_LocalizedText)
  263. UA_Int32 UA_LocalizedText_decodeXmlFromStack(XML_Stack *s, XML_Attr *attr, UA_LocalizedText *dst, _Bool isStart) {
  264. DBG_VERBOSE(printf("UA_LocalizedText entered with dst=%p,isStart=%d\n", (void * )dst, isStart));
  265. UA_UInt32 i;
  266. if(isStart) {
  267. if(dst == UA_NULL) {
  268. UA_LocalizedText_new(&dst);
  269. s->parent[s->depth - 1].children[s->parent[s->depth - 1].activeChild].obj = (void *)dst;
  270. }
  271. // s->parent[s->depth].len = 0;
  272. XML_Stack_addChildHandler(s, "Text", strlen("Text"), (XML_decoder)UA_String_decodeXmlFromStack, UA_STRING,
  273. &(dst->text));
  274. XML_Stack_addChildHandler(s, "Locale", strlen(
  275. "Locale"), (XML_decoder)UA_String_decodeXmlFromStack, UA_STRING, &(dst->locale));
  276. XML_Stack_handleTextAsElementOf(s, "Data", 0);
  277. // set attributes
  278. for(i = 0;attr[i];i += 2) {
  279. if(0 == strncmp("Text", attr[i], strlen("Text"))) {
  280. UA_String_copycstring(attr[i + 1], &dst->text);
  281. } else if(0 == strncmp("Locale", attr[i], strlen("Locale"))) {
  282. UA_String_copycstring(attr[i + 1], &dst->locale);
  283. } else
  284. perror("Unknown attribute");
  285. }
  286. } else {
  287. switch(s->parent[s->depth - 1].activeChild) {
  288. case 0:
  289. //dst->encodingMask |= UA_LOCALIZEDTEXT_ENCODINGMASKTYPE_TEXT;
  290. break;
  291. case 1:
  292. //dst->encodingMask |= UA_LOCALIZEDTEXT_ENCODINGMASKTYPE_LOCALE;
  293. break;
  294. default:
  295. break;
  296. }
  297. }
  298. return UA_SUCCESS;
  299. }
  300. UA_TYPE_DECODEXML_FROM_BYTESTRING(UA_LocalizedText)
  301. /* ExtensionObject */
  302. UA_TYPE_METHOD_CALCSIZEXML_NOTIMPL(UA_ExtensionObject)
  303. UA_TYPE_METHOD_ENCODEXML_NOTIMPL(UA_ExtensionObject)
  304. UA_Int32 UA_ExtensionObject_decodeXmlFromStack(XML_Stack *s, XML_Attr *attr, UA_ExtensionObject *dst, _Bool isStart) {
  305. DBG_VERBOSE(printf("UA_ExtensionObject entered with dst=%p,isStart=%d\n", (void * )dst, isStart));
  306. UA_UInt32 i;
  307. if(isStart) {
  308. // create a new object if called with UA_NULL
  309. if(dst == UA_NULL) {
  310. UA_ExtensionObject_new(&dst);
  311. s->parent[s->depth - 1].children[s->parent[s->depth - 1].activeChild].obj = (void *)dst;
  312. }
  313. s->parent[s->depth].len = 0;
  314. XML_Stack_addChildHandler(s, "TypeId", strlen(
  315. "TypeId"), (XML_decoder)UA_NodeId_decodeXmlFromStack, UA_NODEID, &(dst->typeId));
  316. // XML_Stack_addChildHandler(s, "Body", strlen("Body"), (XML_decoder) UA_Body_decodeXml, UA_LOCALIZEDTEXT, UA_NULL);
  317. // set attributes
  318. for(i = 0;attr[i];i += 2) {
  319. {
  320. DBG_ERR(XML_Stack_print(s));
  321. DBG_ERR(printf("%s - unknown attribute\n", attr[i]));
  322. }
  323. }
  324. }
  325. return UA_SUCCESS;
  326. }
  327. UA_TYPE_DECODEXML_FROM_BYTESTRING(UA_ExtensionObject)
  328. /* DataValue */
  329. UA_TYPE_METHOD_CALCSIZEXML_NOTIMPL(UA_DataValue)
  330. UA_TYPE_METHOD_ENCODEXML_NOTIMPL(UA_DataValue)
  331. UA_TYPE_METHOD_DECODEXML_NOTIMPL(UA_DataValue)
  332. /* Variant */
  333. UA_TYPE_METHOD_CALCSIZEXML_NOTIMPL(UA_Variant)
  334. UA_TYPE_METHOD_ENCODEXML_NOTIMPL(UA_Variant)
  335. UA_Int32 UA_Variant_decodeXmlFromStack(XML_Stack *s, XML_Attr *attr, UA_Variant *dst, _Bool isStart) {
  336. DBG_VERBOSE(printf("UA_Variant entered with dst=%p,isStart=%d\n", (void * )dst, isStart));
  337. UA_UInt32 i;
  338. if(isStart) {
  339. // create a new object if called with UA_NULL
  340. if(dst == UA_NULL) {
  341. UA_Variant_new(&dst);
  342. s->parent[s->depth - 1].children[s->parent[s->depth - 1].activeChild].obj = (void *)dst;
  343. }
  344. s->parent[s->depth].len = 0;
  345. XML_Stack_addChildHandler(s, "ListOfExtensionObject", strlen(
  346. "ListOfExtensionObject"), (XML_decoder)UA_TypedArray_decodeXmlFromStack,
  347. UA_EXTENSIONOBJECT, UA_NULL);
  348. XML_Stack_addChildHandler(s, "ListOfLocalizedText", strlen(
  349. "ListOfLocalizedText"), (XML_decoder)UA_TypedArray_decodeXmlFromStack,
  350. UA_LOCALIZEDTEXT, UA_NULL);
  351. // set attributes
  352. for(i = 0;attr[i];i += 2) {
  353. {
  354. DBG_ERR(XML_Stack_print(s));
  355. DBG_ERR(printf("%s - unknown attribute\n", attr[i]));
  356. }
  357. }
  358. } else {
  359. if(s->parent[s->depth - 1].activeChild == 0 && attr != UA_NULL ) { // ExtensionObject
  360. UA_TypedArray *array = (UA_TypedArray *)attr;
  361. DBG_VERBOSE(printf("UA_Variant_decodeXml - finished array: references=%p, size=%d\n", (void *)array,
  362. (array == UA_NULL) ? -1 : array->size));
  363. dst->arrayLength = array->size;
  364. dst->data = array->elements;
  365. dst->vt = &UA_.types[UA_EXTENSIONOBJECT];
  366. s->parent[s->depth - 1].children[s->parent[s->depth - 1].activeChild].obj = UA_NULL;
  367. } else if(s->parent[s->depth - 1].activeChild == 1 && attr != UA_NULL ) { // LocalizedText
  368. UA_TypedArray *array = (UA_TypedArray *)attr;
  369. DBG_VERBOSE(printf("UA_Variant_decodeXml - finished array: references=%p, size=%d\n", (void *)array,
  370. (array == UA_NULL) ? -1 : array->size));
  371. dst->arrayLength = array->size;
  372. dst->data = array->elements;
  373. dst->vt = &UA_.types[UA_LOCALIZEDTEXT];
  374. s->parent[s->depth - 1].children[s->parent[s->depth - 1].activeChild].obj = UA_NULL;
  375. }
  376. }
  377. return UA_SUCCESS;
  378. }
  379. UA_TYPE_DECODEXML_FROM_BYTESTRING(UA_Variant)
  380. /* DiagnosticInfo */
  381. UA_TYPE_METHOD_CALCSIZEXML_NOTIMPL(UA_DiagnosticInfo)
  382. UA_TYPE_METHOD_ENCODEXML_NOTIMPL(UA_DiagnosticInfo)
  383. UA_TYPE_METHOD_DECODEXML_NOTIMPL(UA_DiagnosticInfo)
  384. /* InvalidType */
  385. UA_TYPE_METHOD_CALCSIZEXML_NOTIMPL(UA_InvalidType)
  386. UA_TYPE_METHOD_ENCODEXML_NOTIMPL(UA_InvalidType)
  387. UA_TYPE_METHOD_DECODEXML_NOTIMPL(UA_InvalidType)
  388. /* NodeClass */
  389. UA_TYPE_METHOD_CALCSIZEXML_NOTIMPL(UA_NodeClass)
  390. UA_TYPE_METHOD_ENCODEXML_NOTIMPL(UA_NodeClass)
  391. UA_TYPE_METHOD_DECODEXML_NOTIMPL(UA_NodeClass)
  392. /* ReferenceDescription */
  393. UA_TYPE_METHOD_CALCSIZEXML_NOTIMPL(UA_ReferenceDescription)
  394. UA_TYPE_METHOD_ENCODEXML_NOTIMPL(UA_ReferenceDescription)
  395. UA_TYPE_METHOD_DECODEXML_NOTIMPL(UA_ReferenceDescription)