ua_namespace_xml.c 2.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. #include "ua_namespace_xml.h"
  2. #include <fcntl.h> // open, O_RDONLY
  3. typedef UA_Int32 (*XML_Stack_Loader) (char* buf, int len);
  4. #define XML_BUFFER_LEN 1024
  5. UA_Int32 Namespace_loadXml(Namespace **ns,UA_UInt32 nsid,const char* rootName, XML_Stack_Loader getNextBufferFull) {
  6. UA_Int32 retval = UA_SUCCESS;
  7. char buf[XML_BUFFER_LEN];
  8. int len; /* len is the number of bytes in the current bufferful of data */
  9. XML_Stack s;
  10. XML_Stack_init(&s, 0, rootName);
  11. UA_NodeSet n;
  12. UA_NodeSet_init(&n, 0);
  13. *ns = n.ns;
  14. XML_Stack_addChildHandler(&s, "UANodeSet", strlen("UANodeSet"), (XML_decoder) UA_NodeSet_decodeXmlFromStack, UA_INVALIDTYPE, &n);
  15. XML_Parser parser = XML_ParserCreate(NULL);
  16. XML_SetUserData(parser, &s);
  17. XML_SetElementHandler(parser, XML_Stack_startElement, XML_Stack_endElement);
  18. XML_SetCharacterDataHandler(parser, XML_Stack_handleText);
  19. while ((len = getNextBufferFull(buf, XML_BUFFER_LEN)) > 0) {
  20. if (XML_Parse(parser, buf, len, (len < XML_BUFFER_LEN)) == XML_STATUS_ERROR) {
  21. retval = UA_ERR_INVALID_VALUE;
  22. break;
  23. }
  24. }
  25. XML_ParserFree(parser);
  26. DBG_VERBOSE(printf("Namespace_loadXml - aliases addr=%p, size=%d\n", (void*) &(n.aliases), n.aliases.size));
  27. DBG_VERBOSE(UA_NodeSetAliases_println("Namespace_loadXml - elements=", &n.aliases));
  28. return retval;
  29. }
  30. static int theFile = 0;
  31. UA_Int32 readFromTheFile(char*buf,int len) {
  32. return read(theFile,buf,len);
  33. }
  34. /** @brief load a namespace from an XML-File
  35. *
  36. * @param[in/out] ns the address of the namespace ptr
  37. * @param[in] namespaceIndex the numeric id of the namespace
  38. * @param[in] rootName the name of the root element of the hierarchy (not used?)
  39. * @param[in] fileName the name of an existing file, e.g. Opc.Ua.NodeSet2.xml
  40. */
  41. UA_Int32 Namespace_loadFromFile(Namespace **ns,UA_UInt32 nsid,const char* rootName,const char* fileName) {
  42. if (fileName == UA_NULL)
  43. theFile = 0; // stdin
  44. else if ((theFile = open(fileName, O_RDONLY)) == -1)
  45. return UA_ERR_INVALID_VALUE;
  46. UA_Int32 retval = Namespace_loadXml(ns,nsid,rootName,readFromTheFile);
  47. close(theFile);
  48. return retval;
  49. }
  50. static const char* theBuffer = UA_NULL;
  51. static const char* theBufferEnd = UA_NULL;
  52. UA_Int32 readFromTheBuffer(char*buf,int len) {
  53. if (len == 0) return 0;
  54. if (theBuffer + XML_BUFFER_LEN > theBufferEnd)
  55. len = theBufferEnd - theBuffer + 1;
  56. else
  57. len = XML_BUFFER_LEN;
  58. memcpy(buf,theBuffer,len);
  59. theBuffer = theBuffer + len;
  60. return len;
  61. }
  62. /** @brief load a namespace from a string
  63. *
  64. * @param[in/out] ns the address of the namespace ptr
  65. * @param[in] namespaceIndex the numeric id of the namespace
  66. * @param[in] rootName the name of the root element of the hierarchy (not used?)
  67. * @param[in] buffer the xml string
  68. */
  69. UA_Int32 Namespace_loadFromString(Namespace **ns,UA_UInt32 nsid,const char* rootName,const char* buffer) {
  70. theBuffer = buffer;
  71. theBufferEnd = buffer + strlen(buffer) - 1;
  72. return Namespace_loadXml(ns,nsid,rootName,readFromTheBuffer);
  73. }