ua_types_encoding_binary.h 4.3 KB

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