ua_types_encoding_binary.h 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. #ifndef UA_TYPES_ENCODING_BINARY_H_
  2. #define UA_TYPES_ENCODING_BINARY_H_
  3. #include "util/ua_util.h"
  4. #include "ua_types.h"
  5. /**
  6. * @ingroup types
  7. * @defgroup encoding Datatype Encoding
  8. *
  9. * @brief Datatypes can have several encodings. The methods defined for
  10. * encodings and their signature are fixed.
  11. *
  12. * - CalcSize: Returns the size of the (encoded) variable in bytes. This
  13. * function is mainly used to allocate the bytestring into which the encoding
  14. * is done.
  15. *
  16. * - Encode: Encodes a variable into a bytestring.
  17. *
  18. * - Decode: Decodes a variable stored in a bytestring. It is assumed that the
  19. * input variable (dst) is allocated in memory, but not its dynamically sized
  20. * members.
  21. */
  22. /**
  23. * @ingroup encoding
  24. * @defgroup encoding_binary Binary Encoding
  25. *
  26. * @brief Functions for binary en- and decoding of built-in datatypes as defined
  27. * in the standard.
  28. *
  29. * @{
  30. */
  31. /* Stop decoding at the first failure. Free members that were already allocated.
  32. It is assumed that retval is already defined. */
  33. #define CHECKED_DECODE(DECODE, CLEAN_UP) do { \
  34. retval |= DECODE; \
  35. if(retval != UA_SUCCESS) { \
  36. CLEAN_UP; \
  37. return retval; \
  38. } } while(0)
  39. #define UA_TYPE_CALCSIZEBINARY_AS(TYPE, TYPE_AS) \
  40. UA_Int32 TYPE##_calcSizeBinary(TYPE const *p) { \
  41. return TYPE_AS##_calcSizeBinary((TYPE_AS *)p); \
  42. }
  43. #define UA_TYPE_ENCODEBINARY_AS(TYPE, TYPE_AS) \
  44. UA_Int32 TYPE##_encodeBinary(TYPE const *src, UA_ByteString *dst, UA_UInt32 *offset) { \
  45. return TYPE_AS##_encodeBinary((TYPE_AS *)src, dst, offset); \
  46. }
  47. #define UA_TYPE_DECODEBINARY_AS(TYPE, TYPE_AS) \
  48. UA_Int32 TYPE##_decodeBinary(UA_ByteString const *src, UA_UInt32 *offset, TYPE *dst) { \
  49. return TYPE_AS##_decodeBinary(src, offset, (TYPE_AS *)dst); \
  50. }
  51. #define UA_TYPE_BINARY_ENCODING_AS(TYPE, TYPE_AS) \
  52. UA_TYPE_CALCSIZEBINARY_AS(TYPE, TYPE_AS) \
  53. UA_TYPE_ENCODEBINARY_AS(TYPE, TYPE_AS) \
  54. UA_TYPE_DECODEBINARY_AS(TYPE, TYPE_AS)
  55. #define UA_TYPE_BINARY_ENCODING(TYPE) \
  56. UA_Int32 TYPE##_calcSizeBinary(TYPE const *p); \
  57. UA_Int32 TYPE##_encodeBinary(TYPE const *src, UA_ByteString *dst, UA_UInt32 *offset); \
  58. UA_Int32 TYPE##_decodeBinary(UA_ByteString const *src, UA_UInt32 *offset, TYPE *dst);
  59. UA_TYPE_BINARY_ENCODING(UA_Boolean)
  60. UA_TYPE_BINARY_ENCODING(UA_SByte)
  61. UA_TYPE_BINARY_ENCODING(UA_Byte)
  62. UA_TYPE_BINARY_ENCODING(UA_Int16)
  63. UA_TYPE_BINARY_ENCODING(UA_UInt16)
  64. UA_TYPE_BINARY_ENCODING(UA_Int32)
  65. UA_TYPE_BINARY_ENCODING(UA_UInt32)
  66. UA_TYPE_BINARY_ENCODING(UA_Int64)
  67. UA_TYPE_BINARY_ENCODING(UA_UInt64)
  68. UA_TYPE_BINARY_ENCODING(UA_Float)
  69. UA_TYPE_BINARY_ENCODING(UA_Double)
  70. UA_TYPE_BINARY_ENCODING(UA_String)
  71. UA_TYPE_BINARY_ENCODING(UA_DateTime)
  72. UA_TYPE_BINARY_ENCODING(UA_Guid)
  73. UA_TYPE_BINARY_ENCODING(UA_ByteString)
  74. UA_TYPE_BINARY_ENCODING(UA_XmlElement)
  75. UA_TYPE_BINARY_ENCODING(UA_NodeId)
  76. UA_TYPE_BINARY_ENCODING(UA_ExpandedNodeId)
  77. UA_TYPE_BINARY_ENCODING(UA_StatusCode)
  78. UA_TYPE_BINARY_ENCODING(UA_QualifiedName)
  79. UA_TYPE_BINARY_ENCODING(UA_LocalizedText)
  80. UA_TYPE_BINARY_ENCODING(UA_ExtensionObject)
  81. UA_TYPE_BINARY_ENCODING(UA_DataValue)
  82. UA_TYPE_BINARY_ENCODING(UA_Variant)
  83. UA_TYPE_BINARY_ENCODING(UA_DiagnosticInfo)
  84. /* Not built-in types */
  85. UA_TYPE_BINARY_ENCODING(UA_InvalidType)
  86. /*********/
  87. /* Array */
  88. /*********/
  89. /* Computes the size of an array (incl. length field) in a binary blob. */
  90. UA_Int32 UA_Array_calcSizeBinary(UA_Int32 nElements, UA_VTable_Entry *vt, const void *data);
  91. /* @brief Encodes an array into a binary blob. The array size is printed as well. */
  92. UA_Int32 UA_Array_encodeBinary(const void *src, UA_Int32 noElements, UA_VTable_Entry *vt, UA_ByteString *dst, UA_UInt32 *offset);
  93. /* @brief Decodes an array from a binary blob. The array is allocated automatically before decoding. */
  94. UA_Int32 UA_Array_decodeBinary(const UA_ByteString *src, UA_UInt32 * offset, UA_Int32 noElements, UA_VTable_Entry *vt, void **dst);
  95. /// @} /* end of group */
  96. #endif /* UA_TYPES_ENCODING_BINARY_H_ */