backend_open62541_datatypes.py 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. from datatypes import *
  2. import datetime
  3. import re
  4. import logging
  5. logger = logging.getLogger(__name__)
  6. def generateBooleanCode(value):
  7. if value:
  8. return "true"
  9. return "false"
  10. def splitStringLiterals(value, splitLength=500, max_string_length=0):
  11. """
  12. Split a string literal longer than splitLength into smaller literals.
  13. E.g. "Some very long text" will be split into "Some ver" "y long te" "xt"
  14. On VS2008 there is a maximum allowed length of a single string literal.
  15. If maxLength is set and the string is longer than maxLength, then an
  16. empty string will be returned.
  17. """
  18. value = value.strip()
  19. if max_string_length > 0 and len(value) > max_string_length:
  20. logger.info("String is longer than {}. Returning empty string.".format(max_string_length))
  21. return "\"\""
  22. if len(value) < splitLength or splitLength == 0:
  23. return "\"" + value.replace('"', r'\"') + "\""
  24. ret = ""
  25. tmp = value
  26. while len(tmp) > splitLength:
  27. ret += "\"" + tmp[:splitLength].replace('"', r'\"') + "\" "
  28. tmp = tmp[splitLength:]
  29. ret += "\"" + tmp.replace('"', r'\"') + "\" "
  30. return ret
  31. def generateStringCode(value, alloc=False, max_string_length=0):
  32. return "UA_STRING{}({})".format("_ALLOC" if alloc else "", splitStringLiterals(value, max_string_length=max_string_length))
  33. def generateXmlElementCode(value, alloc=False, max_string_length=0):
  34. return "UA_XMLELEMENT{}({})".format("_ALLOC" if alloc else "", splitStringLiterals(value, max_string_length=max_string_length))
  35. def generateByteStringCode(value, alloc=False, max_string_length=0):
  36. return "UA_BYTESTRING{}({})".format("_ALLOC" if alloc else "", splitStringLiterals(value, max_string_length=max_string_length))
  37. def generateLocalizedTextCode(value, alloc=False, max_string_length=0):
  38. return "UA_LOCALIZEDTEXT{}(\"{}\", {})".format("_ALLOC" if alloc else "",
  39. value.locale, splitStringLiterals(value.text, max_string_length=max_string_length))
  40. def generateQualifiedNameCode(value, alloc=False, max_string_length=0):
  41. return "UA_QUALIFIEDNAME{}(ns{}, {})".format("_ALLOC" if alloc else "",
  42. str(value.ns), splitStringLiterals(value.name, max_string_length=max_string_length))
  43. def generateNodeIdCode(value):
  44. if not value:
  45. return "UA_NODEID_NUMERIC(0,0)"
  46. if value.i != None:
  47. return "UA_NODEID_NUMERIC(ns%s,%s)" % (value.ns, value.i)
  48. elif value.s != None:
  49. return "UA_NODEID_STRING(ns%s,%s)" % (value.ns, value.s.replace('"', r'\"'))
  50. raise Exception(str(value) + " no NodeID generation for bytestring and guid..")
  51. def generateExpandedNodeIdCode(value):
  52. if value.i != None:
  53. return "UA_EXPANDEDNODEID_NUMERIC(ns%s, %s)" % (str(value.ns), str(value.i))
  54. elif value.s != None:
  55. return "UA_EXPANDEDNODEID_STRING(ns%s, %s)" % (str(value.ns), value.s.replace('"', r'\"'))
  56. raise Exception(str(value) + " no NodeID generation for bytestring and guid..")
  57. def generateDateTimeCode(value):
  58. epoch = datetime.datetime.utcfromtimestamp(0)
  59. mSecsSinceEpoch = (value - epoch).total_seconds() * 1000.0
  60. return "( (" + str(mSecsSinceEpoch) + "f * UA_MSEC_TO_DATETIME) + UA_DATETIME_UNIX_EPOCH)"
  61. def generateNodeValueCode(node, instanceName, asIndirect=False, max_string_length=0):
  62. if type(node) in [Boolean, Byte, SByte, Int16, UInt16, Int32, UInt32, Int64, UInt64, Float, Double]:
  63. return "(UA_" + node.__class__.__name__ + ") " + str(node.value)
  64. elif type(node) == String:
  65. return generateStringCode(node.value, asIndirect, max_string_length)
  66. elif type(node) == XmlElement:
  67. return generateXmlElementCode(node.value, asIndirect, max_string_length)
  68. elif type(node) == ByteString:
  69. return generateByteStringCode(re.sub(r"[\r\n]+", "", node.value), asIndirect, max_string_length)
  70. elif type(node) == LocalizedText:
  71. return generateLocalizedTextCode(node, asIndirect, max_string_length)
  72. elif type(node) == NodeId:
  73. return generateNodeIdCode(node)
  74. elif type(node) == ExpandedNodeId:
  75. return generateExpandedNodeIdCode(node)
  76. elif type(node) == DateTime:
  77. return generateDateTimeCode(node.value)
  78. elif type(node) == QualifiedName:
  79. return generateQualifiedNameCode(node.value, asIndirect, max_string_length)
  80. elif type(node) == StatusCode:
  81. raise Exception("generateNodeValueCode for type " + node.__class__.name + " not implemented")
  82. elif type(node) == DiagnosticInfo:
  83. raise Exception("generateNodeValueCode for type " + node.__class__.name + " not implemented")
  84. elif type(node) == Guid:
  85. raise Exception("generateNodeValueCode for type " + node.__class__.name + " not implemented")
  86. elif type(node) == ExtensionObject:
  87. if asIndirect == False:
  88. return "*" + str(instanceName)
  89. return str(instanceName)