blob: eec9909a7b8ab7479d00b3137d53dae36dc321de [file] [log] [blame]
/*******************************************************************************
* Copyright (C) 2004-2006 Intel Corp. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* - Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* - Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
*
* - Neither the name of Intel Corp. nor the names of its
* contributors may be used to endorse or promote products derived from this
* software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS''
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL Intel Corp. OR THE CONTRIBUTORS
* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*******************************************************************************/
/**
* @author Anas Nashif
* @author Eugene Yarmosh
*/
/**
* @defgroup XMLSerializer XML Serializer
* @brief Serializer and Deserializer Functions and Macros
*
* @{
*/
#ifndef WS_XML_SERIALIZER_H
#define WS_XML_SERIALIZER_H
#include "wsman-types.h"
#include "wsman-names.h"
#include "u/libu.h"
// Errors
#define WS_ERR_INSUFFICIENT_RESOURCES (-1)
#define WS_ERR_INVALID_PARAMETER (-2)
#define WS_ERR_XML_PARSING (-3)
#define WS_ERR_XML_NODE_NOT_FOUND (-4)
#define WS_ERR_NOT_IMPLEMENTED (-5)
typedef void* XML_TYPE_PTR;
typedef struct __XmlSerialiseDynamicSizeData
{
unsigned int count;
XML_TYPE_PTR data;
} XmlSerialiseDynamicSizeData;
#ifdef WIN32
typedef char XML_TYPE_INT8;
typedef unsigned char XML_TYPE_UINT8;
typedef short XML_TYPE_INT16;
typedef unsigned short XML_TYPE_UINT16;
typedef long XML_TYPE_INT32;
typedef unsigned long XML_TYPE_UINT32;
typedef long long XML_TYPE_INT64;
typedef unsigned long long XML_TYPE_UINT64;
typedef int XML_TYPE_BOOL;
typedef char XML_TYPE_CHAR;
typedef float XML_TYPE_REAL32;
typedef double XML_TYPE_REAL64;
#define PTRTOINT unsigned long long
#else
#include <sys/types.h>
#if defined (__SVR4) && defined (__sun)
typedef uchar_t XML_TYPE_UINT8;
typedef ushort_t XML_TYPE_UINT16;
typedef uint_t XML_TYPE_UINT32;
typedef u_longlong_t XML_TYPE_UINT64;
typedef char XML_TYPE_INT8;
typedef short XML_TYPE_INT16;
typedef int XML_TYPE_INT32;
typedef long long XML_TYPE_INT64;
typedef float XML_TYPE_REAL32;
typedef double XML_TYPE_REAL64;
typedef int XML_TYPE_BOOL;
typedef char XML_TYPE_CHAR;
#define PTRTOINT int
#else
typedef u_int8_t XML_TYPE_UINT8;
typedef u_int16_t XML_TYPE_UINT16;
typedef u_int32_t XML_TYPE_UINT32;
typedef u_int64_t XML_TYPE_UINT64;
typedef int8_t XML_TYPE_INT8;
typedef int16_t XML_TYPE_INT16;
typedef int32_t XML_TYPE_INT32;
typedef int64_t XML_TYPE_INT64;
typedef float XML_TYPE_REAL32;
typedef double XML_TYPE_REAL64;
typedef int XML_TYPE_BOOL;
typedef char XML_TYPE_CHAR;
#define PTRTOINT intptr_t
#endif
#endif
typedef struct {
struct tm tm;
int tz_min; // timezone GMT shift in minutes
} XML_DATETIME;
typedef char* XML_TYPE_STR;
typedef XmlSerialiseDynamicSizeData XML_TYPE_DYN_ARRAY;
struct _XML_NODE_ATTR;
struct _XML_NODE_ATTR {
struct _XML_NODE_ATTR *next;
char *ns;
char *name;
char *value;
};
typedef struct _XML_NODE_ATTR XML_NODE_ATTR;
#define SER_ENUMERATOR_PREFIX "_XmlSerializeEnum"
/**
* Count can be 1 for single elementd; > 1 for fixed size array;
* 0 for dynamic array.
*/
struct __XmlSerializationData;
typedef int (*XmlSerializationProc)(struct __XmlSerializationData* data);
struct __XmlSerializerInfo
{
const char *ns;
const char* name;
unsigned int mincount; /**< Minimal Count */
unsigned int count; /**< Maximal Count */
unsigned int size; /**< size of serialized/deserialized element */
unsigned int flags; /**< flags */
XmlSerializationProc proc; /**< Serialization Processor */
XML_TYPE_PTR extData; /**< External Data */
};
typedef struct __XmlSerializerInfo XmlSerializerInfo;
struct __WsSerializerContext
{
pthread_mutex_t lock;
list_t *WsSerializerAllocList;
};
typedef struct __WsSerializerContext *WsSerializerContextH;
#define SER_IN 0x8000
#define SER_OUT 0x4000
#define SER_SKIP 0x2000
#define SER_HEAD 0x1000
#define SER_ATTRS 0x0800
#define XML_NUM_OCCURS(x) (x)->count
#define XML_MAX_OCCURS(x) (x)->count
#define XML_MIN_OCCURS(x) (x)->mincount
#define XML_IS_SKIP(x) ((x)->flags & SER_SKIP)
#define XML_IS_IN(x) ((x)->flags & SER_IN)
#define XML_IS_OUT(x) ((x)->flags & SER_OUT)
#define XML_IS_HEAD(x) ((x)->flags & SER_HEAD)
#define XML_IS_ATTRS(x) ((x)->flags & SER_ATTRS)
#define SER_NULL {NULL, NULL, 0, 0, 0, 0, NULL, NULL}
/* Serializer Info base defines with min/max */
#define SER_NS_CNT_UINT8_FLAGS(ns, n, min, max, flags) \
{(ns), (n), (min), (max), sizeof (XML_TYPE_UINT8), \
flags, do_serialize_uint8, NULL \
}
#define SER_NS_CNT_UINT16_FLAGS(ns, n, min, max, flags) \
{(ns), (n), (min), (max), sizeof (XML_TYPE_UINT16), \
flags, do_serialize_uint16, NULL \
}
#define SER_NS_CNT_UINT32_FLAGS(ns, n, min, max, flags) \
{(ns), (n), (min), (max), sizeof (XML_TYPE_UINT32), \
flags, do_serialize_uint32, NULL \
}
#define SER_NS_CNT_UINT64_FLAGS(ns, n, min, max, flags) \
{(ns), (n), (min), (max), sizeof (XML_TYPE_UINT64), \
flags, do_serialize_uint64, NULL \
}
#define SER_NS_CNT_BOOL_FLAGS(ns, n, min, max, flags) \
{(ns), (n), (min), (max), sizeof (XML_TYPE_BOOL), \
flags, do_serialize_bool, NULL \
}
#define SER_NS_CNT_STR_FLAGS(ns, n, min, max, flags) \
{(ns), (n), (min), (max), sizeof (XML_TYPE_STR), \
flags, do_serialize_string, NULL \
}
#define SER_NS_CNT_STRUCT_FLAGS(ns, n, min, max, flags, t) \
{(ns), (n), (min), (max), sizeof (t), flags, \
do_serialize_struct, t##_TypeItems \
}
// Serializer Info base defines
#define SER_NS_INT8_FLAGS(ns, n, x, flags) \
{(ns), (n), (x), (x), sizeof (XML_TYPE_INT8), \
flags, do_serialize_int8, NULL \
}
#define SER_NS_UINT8_FLAGS(ns, n, x, flags) \
{(ns), (n), (x), (x), sizeof (XML_TYPE_UINT8), \
flags, do_serialize_uint8, NULL \
}
#define SER_NS_INT16_FLAGS(ns, n, x, flags) \
{(ns), (n), (x), (x), sizeof (XML_TYPE_INT16), \
flags, do_serialize_int16, NULL \
}
#define SER_NS_UINT16_FLAGS(ns, n, x, flags) \
{(ns), (n), (x), (x), sizeof (XML_TYPE_UINT16), \
flags, do_serialize_uint16, NULL \
}
#define SER_NS_INT32_FLAGS(ns, n, x, flags) \
{(ns), (n), (x), (x), sizeof (XML_TYPE_INT32), \
flags, do_serialize_int32, NULL \
}
#define SER_NS_UINT32_FLAGS(ns, n, x, flags) \
{(ns), (n), (x), (x), sizeof (XML_TYPE_UINT32), \
flags, do_serialize_uint32, NULL \
}
#define SER_NS_INT64_FLAGS(ns, n, x, flags) \
{(ns), (n), (x), (x), sizeof (XML_TYPE_INT64), \
flags, do_serialize_int64, NULL \
}
#define SER_NS_UINT64_FLAGS(ns, n, x, flags) \
{(ns), (n), (x), (x), sizeof (XML_TYPE_UINT64), \
flags, do_serialize_uint64, NULL \
}
#define SER_NS_REAL32_FLAGS(ns, n, x, flags)\
{(ns), (n), (x), (x), sizeof (XML_TYPE_REAL32), \
flags, do_serialize_real, NULL \
}
#define SER_NS_REAL64_FLAGS(ns, n, x, flags)\
{(ns), (n), (x), (x), sizeof (XML_TYPE_REAL64), \
flags, do_serialize_real, NULL \
}
#define SER_NS_BOOL_FLAGS(ns, n, x, flags) \
{(ns), (n), (x), (x), sizeof (XML_TYPE_BOOL), \
flags, do_serialize_bool, NULL \
}
#define SER_NS_STR_FLAGS(ns, n, x, flags) \
{(ns), (n), (x), (x), sizeof (XML_TYPE_STR), \
flags, do_serialize_string, NULL \
}
#define SER_NS_STRUCT_FLAGS(ns, n, x, flags, t) \
{(ns), (n), (x), (x), sizeof (t), flags, \
do_serialize_struct, t##_TypeItems \
}
#define SER_NS_DYN_ARRAY_FLAGS(ns, n, min, max, flags, t)\
{(ns), (n), (min), (max), sizeof (XmlSerialiseDynamicSizeData), flags, \
do_serialize_dyn_size_array, t##_TypeInfo \
}
// nodes with attributes
#define SER_ATTR_NS_INT8_FLAGS(ns, n, x, flags) \
{(ns), (n), (x), (x), sizeof (struct {XML_TYPE_INT8 s; XML_NODE_ATTR *a;}), \
flags | SER_ATTRS, do_serialize_int8, NULL \
}
#define SER_ATTR_NS_UINT8_FLAGS(ns, n, x, flags) \
{(ns), (n), (x), (x), sizeof (struct {XML_TYPE_UINT8 s; XML_NODE_ATTR *a;}), \
flags | SER_ATTRS, do_serialize_uint8, NULL \
}
#define SER_ATTR_NS_INT16_FLAGS(ns, n, x, flags) \
{(ns), (n), (x), (x), sizeof (struct {XML_TYPE_INT16 s; XML_NODE_ATTR *a;}), \
flags | SER_ATTRS, do_serialize_int16, NULL \
}
#define SER_ATTR_NS_UINT16_FLAGS(ns, n, x, flags) \
{(ns), (n), (x), (x), sizeof (struct {XML_TYPE_UINT16 s; XML_NODE_ATTR *a;}), \
flags | SER_ATTRS, do_serialize_uint16, NULL \
}
#define SER_ATTR_NS_INT32_FLAGS(ns, n, x, flags) \
{(ns), (n), (x), (x), sizeof (struct {XML_TYPE_INT32 s; XML_NODE_ATTR *a;}), \
flags | SER_ATTRS, do_serialize_int32, NULL \
}
#define SER_ATTR_NS_UINT32_FLAGS(ns, n, x, flags) \
{(ns), (n), (x), (x), sizeof (struct {XML_TYPE_UINT32 s; XML_NODE_ATTR *a;}), \
flags | SER_ATTRS, do_serialize_uint32, NULL \
}
#define SER_ATTR_NS_INT64_FLAGS(ns, n, x, flags) \
{(ns), (n), (x), (x), sizeof (struct {XML_TYPE_INT64 s; XML_NODE_ATTR *a;}), \
flags | SER_ATTRS, do_serialize_int64, NULL \
}
#define SER_ATTR_NS_UINT64_FLAGS(ns, n, x, flags) \
{(ns), (n), (x), (x), sizeof (struct {XML_TYPE_UINT64 s; XML_NODE_ATTR *a;}), \
flags | SER_ATTRS, do_serialize_uint64, NULL \
}
#define SER_ATTR_NS_REAL32_FLAGS(ns, n, x, flags) \
{(ns), (n), (x), (x), sizeof (struct {XML_TYPE_UINT32 s; XML_NODE_ATTR *a;}), \
flags | SER_ATTRS, do_serialize_real32, NULL \
}
#define SER_ATTR_NS_REAL64_FLAGS(ns, n, x, flags) \
{(ns), (n), (x), (x), sizeof (struct {XML_TYPE_REAL64 s; XML_NODE_ATTR *a;}), \
flags | SER_ATTRS, do_serialize_real64, NULL \
}
#define SER_ATTR_NS_BOOL_FLAGS(ns, n, x, flags) \
{(ns), (n), (x), (x), sizeof (struct {XML_TYPE_BOOL s; XML_NODE_ATTR *a;}), \
flags | SER_ATTRS, do_serialize_bool, NULL \
}
#define SER_ATTR_NS_STR_FLAGS(ns, n, x, flags) \
{(ns), (n), (x), (x), sizeof (struct {XML_TYPE_STR s; XML_NODE_ATTR *a;}), \
flags | SER_ATTRS, do_serialize_string, NULL \
}
#define SER_ATTR_NS_STRUCT_FLAGS(ns, n, x, flags, t) \
{(ns), (n), (x), (x), sizeof (struct {t s; XML_NODE_ATTR *a;}), \
flags | SER_ATTRS, do_serialize_struct, t##_TypeItems \
}
// No namespace defines
#define SER_INT8_FLAGS(n, x, flags) SER_NS_INT8_FLAGS(NULL, n, x, flags)
#define SER_UINT8_FLAGS(n, x, flags) SER_NS_UINT8_FLAGS(NULL, n, x, flags)
#define SER_INT16_FLAGS(n, x, flags) SER_NS_INT16_FLAGS(NULL, n, x, flags)
#define SER_UINT16_FLAGS(n, x, flags) SER_NS_UINT16_FLAGS(NULL, n, x, flags)
#define SER_INT32_FLAGS(n, x, flags) SER_NS_INT32_FLAGS(NULL, n, x, flags)
#define SER_UINT32_FLAGS(n, x, flags) SER_NS_UINT32_FLAGS(NULL, n, x, flags)
#define SER_INT64_FLAGS(n, x, flags) SER_NS_INT64_FLAGS(NULL, n, x, flags)
#define SER_UINT64_FLAGS(n, x, flags) SER_NS_UINT64_FLAGS(NULL, n, x, flags)
#define SER_REAL32_FLAGS(n, x, flags) SER_NS_REAL32_FLAGS(NULL, n, x, flags)
#define SER_REAL64_FLAGS(n, x, flags) SER_NS_REAL64_FLAGS(NULL, n, x, flags)
#define SER_BOOL_FLAGS(n, x, flags) SER_NS_BOOL_FLAGS(NULL, n, x, flags)
#define SER_STR_FLAGS(n, x, flags) SER_NS_STR_FLAGS(NULL, n, x, flags)
#define SER_STRUCT_FLAGS(n, x, flags, t) \
SER_NS_STRUCT_FLAGS(NULL, n, x, flags, t)
#define SER_DYN_ARRAY_FLAGS(n, min, max, flags, t) \
SER_NS_DYN_ARRAY_FLAGS(NULL, n, min, max, flags, t)
// Serialization Info for different types
#define SER_INT8(n, x) SER_INT8_FLAGS(n, x, 0)
#define SER_UINT8(n, x) SER_UINT8_FLAGS(n, x, 0)
#define SER_INT16(n, x) SER_INT16_FLAGS(n, x, 0)
#define SER_UINT16(n, x) SER_UINT16_FLAGS(n, x, 0)
#define SER_INT32(n, x) SER_INT32_FLAGS(n, x, 0)
#define SER_UINT32(n, x) SER_UINT32_FLAGS(n, x, 0)
#define SER_INT64(n, x) SER_INT64_FLAGS(n, x, 0)
#define SER_UINT64(n, x) SER_UINT64_FLAGS(n, x, 0)
#define SER_REAL32(n, x) SER_REAL32_FLAGS(n, x, 0)
#define SER_REAL64(n, x) SER_REAL64_FLAGS(n, x, 0)
#define SER_BOOL(n, x) SER_BOOL_FLAGS(n, x, 0)
#define SER_STR(n, x) SER_STR_FLAGS(n, x, 0)
#define SER_STRUCT(n, x, t) SER_STRUCT_FLAGS(n, x, 0, t)
#define SER_DYN_ARRAY(n, mn, mx, t) SER_DYN_ARRAY_FLAGS(n, mn, mx, 0, t)
#define SER_NS_UINT8(ns, n, x) SER_NS_UINT8_FLAGS(ns, n, x, 0)
#define SER_NS_UINT16(ns, n, x) SER_NS_UINT16_FLAGS(ns, n, x, 0)
#define SER_NS_UINT32(ns, n, x) SER_NS_UINT32_FLAGS(ns, n, x, 0)
#define SER_NS_UINT64(ns, n, x) SER_NS_UINT64_FLAGS(ns, n, x, 0)
#define SER_NS_REAL32(ns, n, x) SER_NS_REAL32_FLAGS(ns, n, x, 0)
#define SER_NS_REAL64(ns, n, x) SER_NS_REAL64_FLAGS(ns, n, x, 0)
#define SER_NS_BOOL(ns, n, x) SER_NS_BOOL_FLAGS(ns, n, x, 0)
#define SER_NS_STR(ns, n, x) SER_NS_STR_FLAGS(ns, n, x, 0)
#define SER_NS_STRUCT(ns, n, x, t) SER_NS_STRUCT_FLAGS(ns, n, x, 0, t)
#define SER_NS_DYN_ARRAY(ns, n, mn, mx, t) \
SER_NS_DYN_ARRAY_FLAGS(ns, n, mn, mx, 0, t)
// Serialization Info to skip in
#define SER_IN_INT8(n, x) SER_INT8_FLAGS(n, x, SER_IN)
#define SER_IN_UINT8(n, x) SER_UINT8_FLAGS(n, x, SER_IN)
#define SER_IN_INT16(n, x) SER_INT16_FLAGS(n, x, SER_IN)
#define SER_IN_UINT16(n, x) SER_UINT16_FLAGS(n, x, SER_IN)
#define SER_IN_UINT32(n, x) SER_UINT32_FLAGS(n, x, SER_IN)
#define SER_IN_UINT32(n, x) SER_UINT32_FLAGS(n, x, SER_IN)
#define SER_IN_INT64(n, x) SER_INT64_FLAGS(n, x, SER_IN)
#define SER_IN_UINT64(n, x) SER_UINT64_FLAGS(n, x, SER_IN)
#define SER_IN_REAL32(n, x) SER_REAL32_FLAGS(n, x, SER_IN)
#define SER_IN_REAL64(n, x) SER_REAL64_FLAGS(n, x, SER_IN)
#define SER_IN_BOOL(n, x) SER_BOOL_FLAGS(n, x, SER_IN)
#define SER_IN_STR(n, x) SER_STR_FLAGS(n, x, SER_IN)
#define SER_IN_STRUCT(n, x, t) SER_STRUCT_FLAGS(n, x, SER_IN, t)
#define SER_IN_DYN_ARRAY(n, mn, mx, t) \
SER_DYN_ARRAY_FLAGS(n, mn, mx, SER_IN, t)
#define SER_NS_IN_INT8(ns, n, x) SER_NS_INT8_FLAGS(ns, n, x, SER_IN)
#define SER_NS_IN_UINT8(ns, n, x) SER_NS_UINT8_FLAGS(ns, n, x, SER_IN)
#define SER_NS_IN_INT16(ns, n, x) SER_NS_INT16_FLAGS(ns, n, x, SER_IN)
#define SER_NS_IN_UINT16(ns, n, x) SER_NS_UINT16_FLAGS(ns, n, x, SER_IN)
#define SER_NS_IN_INT32(ns, n, x) SER_NS_INT32_FLAGS(ns, n, x, SER_IN)
#define SER_NS_IN_UINT32(ns, n, x) SER_NS_UINT32_FLAGS(ns, n, x, SER_IN)
#define SER_NS_IN_INT64(ns, n, x) SER_NS_INT64_FLAGS(ns, n, x, SER_IN)
#define SER_NS_IN_UINT64(ns, n, x) SER_NS_UINT64_FLAGS(ns, n, x, SER_IN)
#define SER_NS_IN_REAL32(ns, n, x) SER_NS_REAL32_FLAGS(ns, n, x, SER_IN)
#define SER_NS_IN_REAL64(ns, n, x) SER_NS_REAL64_FLAGS(ns, n, x, SER_IN)
#define SER_NS_IN_BOOL(ns, n, x) SER_NS_BOOL_FLAGS(ns, n, x, SER_IN)
#define SER_NS_IN_STR(ns, n, x) SER_NS_STR_FLAGS(ns, n, x, SER_IN)
#define SER_NS_IN_STRUCT(ns, n, x, t) SER_NS_STRUCT_FLAGS(ns, n, x, SER_IN, t)
#define SER_NS_IN_DYN_ARRAY(ns, n, mn, mx, t) \
SER_NS_DYN_ARRAY_FLAGS(ns, n, mn, mx, SER_IN, t)
// Serialization Info to skip out
#define SER_OUT_INT8(n, x) SER_INT8_FLAGS(n, x, SER_OUT)
#define SER_OUT_UINT8(n, x) SER_UINT8_FLAGS(n, x, SER_OUT)
#define SER_OUT_INT16(n, x) SER_INT16_FLAGS(n, x, SER_OUT)
#define SER_OUT_UINT16(n, x) SER_UINT16_FLAGS(n, x, SER_OUT)
#define SER_OUT_INT32(n, x) SER_INT32_FLAGS(n, x, SER_OUT)
#define SER_OUT_UINT32(n, x) SER_UINT32_FLAGS(n, x, SER_OUT)
#define SER_OUT_INT64(n, x) SER_INT64_FLAGS(n, x, SER_OUT)
#define SER_OUT_UINT64(n, x) SER_UINT64_FLAGS(n, x, SER_OUT)
#define SER_OUT_REAL32(n, x) SER_REAL32_FLAGS(n, x, SER_OUT)
#define SER_OUT_REAL64(n, x) SER_REAL64_FLAGS(n, x, SER_OUT)
#define SER_OUT_BOOL(n, x) SER_BOOL_FLAGS(n, x, SER_OUT)
#define SER_OUT_STR(n, x) SER_STR_FLAGS(n, x, SER_OUT)
#define SER_OUT_STRUCT(n, x, t) SER_STRUCT_FLAGS(n, x, SER_OUT, t)
#define SER_OUT_DYN_ARRAY(n, mn, mx, t) \
SER_DYN_ARRAY_FLAGS(n, mn, mx, SER_OUT, t)
#define SER_NS_OUT_INT8(ns, n, x) SER_NS_INT8_FLAGS(ns, n, x, SER_OUT)
#define SER_NS_OUT_UINT8(ns, n, x) SER_NS_UINT8_FLAGS(ns, n, x, SER_OUT)
#define SER_NS_OUT_INT16(ns, n, x) SER_NS_INT16_FLAGS(ns, n, x, SER_OUT)
#define SER_NS_OUT_UINT16(ns, n, x) SER_NS_UINT16_FLAGS(ns, n, x, SER_OUT)
#define SER_NS_OUT_INT32(ns, n, x) SER_NS_INT32_FLAGS(ns, n, x, SER_OUT)
#define SER_NS_OUT_UINT32(ns, n, x) SER_NS_UINT32_FLAGS(ns, n, x, SER_OUT)
#define SER_NS_OUT_INT64(ns, n, x) SER_NS_INT64_FLAGS(ns, n, x, SER_OUT)
#define SER_NS_OUT_UINT64(ns, n, x) SER_NS_UINT64_FLAGS(ns, n, x, SER_OUT)
#define SER_NS_OUT_REAL32(ns, n, x) SER_NS_REAL32_FLAGS(ns, n, x, SER_OUT)
#define SER_NS_OUT_REAL64(ns, n, x) SER_NS_REAL64_FLAGS(ns, n, x, SER_OUT)
#define SER_NS_OUT_BOOL(ns, n, x) SER_NS_BOOL_FLAGS(ns, n, x, SER_OUT)
#define SER_NS_OUT_STR(ns, n, x) SER_NS_STR_FLAGS(ns, n, x, SER_OUT)
#define SER_NS_OUT_STRUCT(ns, n, x, t) SER_NS_STRUCT_FLAGS(ns, n, x, SER_OUT, t)
#define SER_NS_OUT_DYN_ARRAY(ns, n, mn, mx, t) \
SER_NS_DYN_ARRAY_FLAGS(ns, n, mn, mx, SER_OUT, t)
// Serialization Info to skip inout
#define SER_INOUT_INT8(n, x) SER_INT8_FLAGS(n, x, SER_IN | SER_OUT)
#define SER_INOUT_UINT8(n, x) SER_UINT8_FLAGS(n, x, SER_IN | SER_OUT)
#define SER_INOUT_INT16(n, x) SER_INT16_FLAGS(n, x, SER_IN | SER_OUT)
#define SER_INOUT_UINT16(n, x) SER_UINT16_FLAGS(n, x, SER_IN | SER_OUT)
#define SER_INOUT_INT32(n, x) SER_INT32_FLAGS(n, x, SER_IN | SER_OUT)
#define SER_INOUT_UINT32(n, x) SER_UINT32_FLAGS(n, x, SER_IN | SER_OUT)
#define SER_INOUT_INT64(n, x) SER_INT64_FLAGS(n, x, SER_IN | SER_OUT)
#define SER_INOUT_UINT64(n, x) SER_UINT64_FLAGS(n, x, SER_IN | SER_OUT)
#define SER_INOUT_REAL32(n, x) SER_REAL32_FLAGS(n, x, SER_IN | SER_OUT)
#define SER_INOUT_REAL64(n, x) SER_REAL64_FLAGS(n, x, SER_IN | SER_OUT)
#define SER_INOUT_BOOL(n, x) SER_BOOL_FLAGS(n, x, SER_IN | SER_OUT)
#define SER_INOUT_STR(n, x) SER_STR_FLAGS(n, x, SER_IN | SER_OUT)
#define SER_INOUT_STRUCT(n, x, t) \
SER_STRUCT_FLAGS(n, x, SER_IN | SER_OUT, t)
#define SER_INOUT_DYN_ARRAY(n, mn, mx, t) \
SER_DYN_ARRAY_FLAGS(n, mn, mx, SER_IN | SER_OUT, t)
#define SER_NS_INOUT_INT8(ns, n, x) \
SER_NS_INT8_FLAGS(ns, n, x, SER_IN | SER_OUT)
#define SER_NS_INOUT_UINT8(ns, n, x) \
SER_NS_UINT8_FLAGS(ns, n, x, SER_IN | SER_OUT)
#define SER_NS_INOUT_INT16(ns, n, x) \
SER_NS_INT16_FLAGS(ns, n, x, SER_IN | SER_OUT)
#define SER_NS_INOUT_UINT16(ns, n, x) \
SER_NS_UINT16_FLAGS(ns, n, x, SER_IN | SER_OUT)
#define SER_NS_INOUT_INT32(ns, n, x) \
SER_NS_INT32_FLAGS(ns, n, x, SER_IN | SER_OUT)
#define SER_NS_INOUT_UINT32(ns, n, x) \
SER_NS_UINT32_FLAGS(ns, n, x, SER_IN | SER_OUT)
#define SER_NS_INOUT_INT64(ns, n, x) \
SER_NS_INT64_FLAGS(ns, n, x, SER_IN | SER_OUT)
#define SER_NS_INOUT_UINT64(ns, n, x) \
SER_NS_UINT64_FLAGS(ns, n, x, SER_IN | SER_OUT)
#define SER_NS_INOUT_REAL32(ns, n, x) \
SER_NS_REAL32_FLAGS(ns, n, x, SER_IN | SER_OUT)
#define SER_NS_INOUT_REAL64(ns, n, x) \
SER_NS_REAL64_FLAGS(ns, n, x, SER_IN | SER_OUT)
#define SER_NS_INOUT_BOOL(ns, n, x) \
SER_NS_BOOL_FLAGS(ns, n, x, SER_IN | SER_OUT)
#define SER_NS_INOUT_STR(ns, n, x) \
SER_NS_STR_FLAGS(ns, n, x, SER_IN | SER_OUT)
#define SER_NS_INOUT_STRUCT(ns, n, x, t) \
SER_NS_STRUCT_FLAGS(ns, n, x, SER_IN | SER_OUT, t)
#define SER_NS_INOUT_DYN_ARRAY(ns, n, mn, mx, t) \
SER_NS_DYN_ARRAY_FLAGS(ns, n, mn, mx, SER_IN | SER_OUT, t)
// TypeInfo structures for base types
// to use in dynamic arrays
#define SER_TYPEINFO_UINT8 \
XmlSerializerInfo uint8_TypeInfo[] = {\
SER_UINT8("uint8", 1), \
SER_NULL \
}
#define SER_TYPEINFO_INT8 \
XmlSerializerInfo int8_TypeInfo[] = {\
SER_INT8("int8", 1), \
SER_NULL \
}
#define SER_TYPEINFO_UINT8_ATTR \
XmlSerializerInfo uint8_TypeInfo[] = {\
SER_ATTR_NS_UINT8_FLAGS(NULL, "uint8", 1, SER_ATTRS), \
SER_NULL \
}
#define SER_TYPEINFO_INT8_ATTR \
XmlSerializerInfo int8_TypeInfo[] = {\
SER_ATTR_NS_INT8_FLAGS(NULL, "int8", 1, SER_ATTRS), \
SER_NULL \
}
#define SER_TYPEINFO_UINT16 \
XmlSerializerInfo uint16_TypeInfo[] = { \
SER_UINT16("uint16", 1), \
SER_NULL \
}
#define SER_TYPEINFO_INT16 \
XmlSerializerInfo int16_TypeInfo[] = { \
SER_INT16("int16", 1), \
SER_NULL \
}
#define SER_TYPEINFO_UINT16_ATTR \
XmlSerializerInfo uint16_TypeInfo[] = { \
SER_ATTR_NS_UINT16_FLAGS(NULL, "uint16", 1, SER_ATTRS), \
SER_NULL \
}
#define SER_TYPEINFO_INT16_ATTR \
XmlSerializerInfo int16_TypeInfo[] = { \
SER_ATTR_NS_INT16_FLAGS(NULL, "int16", 1, SER_ATTRS), \
SER_NULL \
}
#define SER_TYPEINFO_UINT32 \
XmlSerializerInfo uint32_TypeInfo[] = { \
SER_UINT32("uint32", 1), \
SER_NULL \
}
#define SER_TYPEINFO_INT32 \
XmlSerializerInfo int32_TypeInfo[] = { \
SER_INT32("int32", 1), \
SER_NULL \
}
#define SER_TYPEINFO_UINT32_ATTR \
XmlSerializerInfo uint32_TypeInfo[] = { \
SER_ATTR_NS_UINT32_FLAGS(NULL, "uint32", 1, SER_ATTRS), \
SER_NULL \
}
#define SER_TYPEINFO_INT32_ATTR \
XmlSerializerInfo int32_TypeInfo[] = { \
SER_ATTR_NS_INT32_FLAGS(NULL, "int32", 1, SER_ATTRS), \
SER_NULL \
}
#define SER_TYPEINFO_UINT64 \
XmlSerializerInfo uint64_TypeInfo[] = { \
SER_UINT64("uint64", 1), \
SER_NULL \
}
#define SER_TYPEINFO_INT64 \
XmlSerializerInfo int64_TypeInfo[] = { \
SER_INT64("int64", 1), \
SER_NULL \
}
#define SER_TYPEINFO_UINT64_ATTR \
XmlSerializerInfo uint64_TypeInfo[] = { \
SER_ATTR_NS_UINT64_FLAGS(NULL, "uint64", 1, SER_ATTRS), \
SER_NULL \
}
#define SER_TYPEINFO_INT64_ATTR \
XmlSerializerInfo int64_TypeInfo[] = { \
SER_ATTR_NS_INT64_FLAGS(NULL, "int64", 1, SER_ATTRS), \
SER_NULL \
}
#define SER_TYPEINFO_REAL32 \
XmlSerializerInfo real32_TypeInfo[] = { \
SER_REAL32("real32", 1), \
SER_NULL \
}
#define SER_TYPEINFO_REAL32_ATTR \
XmlSerializerInfo real32_TypeInfo[] = { \
SER_ATTR_NS_REAL32_FLAGS(NULL, "real32", 1, SER_ATTRS), \
SER_NULL \
}
#define SER_TYPEINFO_REAL64 \
XmlSerializerInfo real64_TypeInfo[] = { \
SER_REAL32("real64", 1), \
SER_NULL \
}
#define SER_TYPEINFO_REAL64_ATTR \
XmlSerializerInfo real64_TypeInfo[] = { \
SER_ATTR_NS_REAL64_FLAGS(NULL, "real64", 1, SER_ATTRS), \
SER_NULL \
}
#define SER_TYPEINFO_BOOL \
XmlSerializerInfo bool_TypeInfo[] = {\
SER_BOOL("bool", 1), \
SER_NULL \
}
#define SER_TYPEINFO_BOOL_ATTR \
XmlSerializerInfo bool_TypeInfo[] = { \
SER_ATTR_NS_BOOL_FLAGS(NULL, "bool", 1, SER_ATTRS), \
SER_NULL \
}
#define SER_TYPEINFO_STRING \
XmlSerializerInfo string_TypeInfo[] = { \
SER_STR("string", 1), \
SER_NULL \
}
#define SER_TYPEINFO_STRING_ATTR \
XmlSerializerInfo string_attr_TypeInfo[] = { \
SER_ATTR_NS_STR_FLAGS(NULL, "string", 1, SER_ATTRS), \
SER_NULL \
}
// Define to declare TypeInfo for structures
#define SER_DECLARE_TYPE(t)\
extern XmlSerializerInfo t##_TypeInfo[];\
extern XmlSerializerInfo t##_TypeItems[]
// Defines to define TypeInfo for structures
#define SER_START_ITEMS(t) \
XmlSerializerInfo t##_TypeItems[] = \
{
#define SER_END_ITEMS(t) \
SER_NULL \
}; \
\
XmlSerializerInfo t##_TypeInfo[] = {\
SER_STRUCT_FLAGS(NULL, 1, 0, t), \
SER_NULL \
}
// TypeInfo structures for well known types
// XmlSerializationProc functions for different types
int do_serialize_uint8(struct __XmlSerializationData* data);
int do_serialize_uint16(struct __XmlSerializationData* data);
int do_serialize_uint32(struct __XmlSerializationData* data);
int do_serialize_uint64(struct __XmlSerializationData* data);
int do_serialize_int8(struct __XmlSerializationData* data);
int do_serialize_int16(struct __XmlSerializationData* data);
int do_serialize_int32(struct __XmlSerializationData* data);
int do_serialize_int64(struct __XmlSerializationData* data);
int do_serialize_real32(struct __XmlSerializationData* data);
int do_serialize_real64(struct __XmlSerializationData* data);
int do_serialize_string(struct __XmlSerializationData* data);
int do_serialize_bool(struct __XmlSerializationData* data);
int do_serialize_dyn_size_array(struct __XmlSerializationData* data);
int do_serialize_struct(struct __XmlSerializationData* data);
int do_serialize_attrs(struct __XmlSerializationData* data);
int ws_havenilvalue(XML_NODE_ATTR *attrs);
// Serializer user interface
int ws_serialize(WsSerializerContextH serctx,
WsXmlNodeH xmlNode,
XML_TYPE_PTR dataPtr,
XmlSerializerInfo *info,
const char *name,
const char *ns,
XML_NODE_ATTR *attrs,
int output);
void *ws_deserialize(WsSerializerContextH serctx,
WsXmlNodeH xmlParent,
XmlSerializerInfo *info,
const char *name,
const char *ns,
XML_NODE_ATTR **attrs,
int index,
int output);
int ws_serialize_str(WsSerializerContextH serctx,
WsXmlNodeH parent,
const char *str,
const char *nameNs,
const char *name,
int mustunderstand);
int ws_serialize_uint32(
WsSerializerContextH serctx,
WsXmlNodeH parent,
unsigned long val,
const char *nameNs,
const char *name,
int mustunderstand);
char *ws_deserialize_str(WsSerializerContextH serctx,
WsXmlNodeH parent,
int index,
const char *nameNs,
const char *name);
unsigned long ws_deserialize_uint32(
WsSerializerContextH serctx,
WsXmlNodeH parent,
int index,
const char *nameNs,
const char *name);
int ws_deserialize_duration(
const char* text,
time_t *value);
int ws_deserialize_datetime(
const char *text,
XML_DATETIME *tmx);
int ws_serializer_free_mem(WsSerializerContextH serctx,
XML_TYPE_PTR buf,
XmlSerializerInfo *info);
/** @} */
#endif //WS_XML_SERIALIZER_H