183 lines
5.6 KiB
C
183 lines
5.6 KiB
C
/*
|
|
* Copyright(c) 2006 to 2022 ZettaScale Technology and others
|
|
*
|
|
* This program and the accompanying materials are made available under the
|
|
* terms of the Eclipse Public License v. 2.0 which is available at
|
|
* http://www.eclipse.org/legal/epl-2.0, or the Eclipse Distribution License
|
|
* v. 1.0 which is available at
|
|
* http://www.eclipse.org/org/documents/edl-v10.php.
|
|
*
|
|
* SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
|
|
*/
|
|
#ifndef DDSI_SERDATA_DEFAULT_H
|
|
#define DDSI_SERDATA_DEFAULT_H
|
|
|
|
#include "dds/ddsrt/endian.h"
|
|
#include "dds/ddsi/q_protocol.h" /* for nn_parameterid_t */
|
|
#include "dds/ddsi/q_freelist.h"
|
|
#include "dds/ddsrt/avl.h"
|
|
#include "dds/ddsi/ddsi_serdata.h"
|
|
#include "dds/ddsi/ddsi_plist_generic.h"
|
|
#include "dds/ddsi/ddsi_typelib.h"
|
|
#include "dds/ddsi/ddsi_typelookup.h"
|
|
|
|
#include "dds/dds.h"
|
|
|
|
#if defined (__cplusplus)
|
|
extern "C" {
|
|
#endif
|
|
|
|
struct CDRHeader {
|
|
unsigned short identifier;
|
|
unsigned short options;
|
|
};
|
|
|
|
struct serdatapool {
|
|
struct nn_freelist freelist;
|
|
};
|
|
|
|
#define KEYBUFTYPE_UNSET 0u
|
|
#define KEYBUFTYPE_STATIC 1u // uses u.stbuf
|
|
#define KEYBUFTYPE_DYNALIAS 2u // points into payload
|
|
#define KEYBUFTYPE_DYNALLOC 3u // dynamically allocated
|
|
|
|
#define SERDATA_DEFAULT_KEYSIZE_MASK 0x3FFFFFFFu
|
|
|
|
struct ddsi_serdata_default_key {
|
|
unsigned buftype : 2;
|
|
unsigned keysize : 30;
|
|
union {
|
|
unsigned char stbuf[DDS_FIXED_KEY_MAX_SIZE];
|
|
unsigned char *dynbuf;
|
|
} u;
|
|
};
|
|
|
|
/* Debug builds may want to keep some additional state */
|
|
#ifndef NDEBUG
|
|
#define DDSI_SERDATA_DEFAULT_DEBUG_FIELDS \
|
|
bool fixed;
|
|
#else
|
|
#define DDSI_SERDATA_DEFAULT_DEBUG_FIELDS
|
|
#endif
|
|
|
|
/* There is an alignment requirement on the raw data (it must be at
|
|
offset mod 8 for the conversion to/from a dds_stream to work).
|
|
So we define two types: one without any additional padding, and
|
|
one where the appropriate amount of padding is inserted */
|
|
#define DDSI_SERDATA_DEFAULT_PREPAD \
|
|
struct ddsi_serdata c; \
|
|
uint32_t pos; \
|
|
uint32_t size; \
|
|
DDSI_SERDATA_DEFAULT_DEBUG_FIELDS \
|
|
struct ddsi_serdata_default_key key;\
|
|
struct serdatapool *serpool; \
|
|
struct ddsi_serdata_default *next /* in pool->freelist */
|
|
/* We suppress the zero-array warning (MSVC C4200) here ONLY for MSVC
|
|
and ONLY if it is being compiled as C++ code, as it only causes
|
|
issues there */
|
|
#if defined _MSC_VER && defined __cplusplus
|
|
#define DDSI_SERDATA_DEFAULT_POSTPAD \
|
|
struct CDRHeader hdr; \
|
|
DDSRT_WARNING_MSVC_OFF(4200) \
|
|
char data[]; \
|
|
DDSRT_WARNING_MSVC_ON(4200)
|
|
#else
|
|
#define DDSI_SERDATA_DEFAULT_POSTPAD \
|
|
struct CDRHeader hdr; \
|
|
char data[]
|
|
#endif
|
|
|
|
struct ddsi_serdata_default_unpadded {
|
|
DDSI_SERDATA_DEFAULT_PREPAD;
|
|
DDSI_SERDATA_DEFAULT_POSTPAD;
|
|
};
|
|
|
|
#ifdef __GNUC__
|
|
#define DDSI_SERDATA_DEFAULT_PAD(n) ((n) % 8)
|
|
#else
|
|
#define DDSI_SERDATA_DEFAULT_PAD(n) (n)
|
|
#endif
|
|
|
|
struct ddsi_serdata_default {
|
|
DDSI_SERDATA_DEFAULT_PREPAD;
|
|
char pad[DDSI_SERDATA_DEFAULT_PAD (8 - (offsetof (struct ddsi_serdata_default_unpadded, data) % 8))];
|
|
DDSI_SERDATA_DEFAULT_POSTPAD;
|
|
};
|
|
|
|
#undef DDSI_SERDATA_DEFAULT_PAD
|
|
#undef DDSI_SERDATA_DEFAULT_POSTPAD
|
|
#undef DDSI_SERDATA_DEFAULT_PREPAD
|
|
#undef DDSI_SERDATA_DEFAULT_FIXED_FIELD
|
|
|
|
#ifndef DDS_TOPIC_INTERN_FILTER_FN_DEFINED
|
|
#define DDS_TOPIC_INTERN_FILTER_FN_DEFINED
|
|
typedef bool (*dds_topic_intern_filter_fn) (const void * sample, void *ctx);
|
|
#endif
|
|
|
|
typedef struct ddsi_sertype_default_desc_key {
|
|
uint32_t ops_offs; /* Offset for key ops */
|
|
uint32_t idx; /* Key index (used for key order) */
|
|
} ddsi_sertype_default_desc_key_t;
|
|
|
|
typedef struct ddsi_sertype_default_desc_key_seq {
|
|
uint32_t nkeys;
|
|
ddsi_sertype_default_desc_key_t *keys;
|
|
} ddsi_sertype_default_desc_key_seq_t;
|
|
|
|
typedef struct ddsi_sertype_default_desc_op_seq {
|
|
uint32_t nops; /* Number of words in ops (which >= number of ops stored in preproc output) */
|
|
uint32_t *ops; /* Marshalling meta data */
|
|
} ddsi_sertype_default_desc_op_seq_t;
|
|
|
|
/* Reduced version of dds_topic_descriptor_t */
|
|
struct ddsi_sertype_default_desc {
|
|
uint32_t size; /* Size of topic type */
|
|
uint32_t align; /* Alignment of topic type */
|
|
uint32_t flagset; /* Flags */
|
|
ddsi_sertype_default_desc_key_seq_t keys;
|
|
ddsi_sertype_default_desc_op_seq_t ops;
|
|
ddsi_sertype_cdr_data_t typeinfo_ser;
|
|
ddsi_sertype_cdr_data_t typemap_ser;
|
|
};
|
|
|
|
struct ddsi_sertype_default {
|
|
struct ddsi_sertype c;
|
|
uint16_t encoding_format; /* CDR_ENC_FORMAT_(PLAIN|DELIMITED|PL) - CDR encoding format for the top-level type in this sertype */
|
|
uint16_t write_encoding_version; /* CDR_ENC_VERSION_(1|2) - CDR encoding version used for writing data using this sertype */
|
|
struct serdatapool *serpool;
|
|
struct ddsi_sertype_default_desc type;
|
|
size_t opt_size_xcdr1;
|
|
size_t opt_size_xcdr2;
|
|
};
|
|
|
|
struct ddsi_plist_sample {
|
|
void *blob;
|
|
size_t size;
|
|
nn_parameterid_t keyparam;
|
|
};
|
|
|
|
struct ddsi_rawcdr_sample {
|
|
void *blob;
|
|
size_t size;
|
|
void *key;
|
|
size_t keysize;
|
|
};
|
|
|
|
extern DDS_EXPORT const struct ddsi_sertype_ops ddsi_sertype_ops_default;
|
|
|
|
extern DDS_EXPORT const struct ddsi_serdata_ops ddsi_serdata_ops_cdr;
|
|
extern DDS_EXPORT const struct ddsi_serdata_ops ddsi_serdata_ops_cdr_nokey;
|
|
|
|
extern DDS_EXPORT const struct ddsi_serdata_ops ddsi_serdata_ops_xcdr2;
|
|
extern DDS_EXPORT const struct ddsi_serdata_ops ddsi_serdata_ops_xcdr2_nokey;
|
|
|
|
struct serdatapool * ddsi_serdatapool_new (void);
|
|
void ddsi_serdatapool_free (struct serdatapool * pool);
|
|
dds_return_t ddsi_sertype_default_init (const struct ddsi_domaingv *gv, struct ddsi_sertype_default *st, const dds_topic_descriptor_t *desc, uint16_t min_xcdrv, dds_data_representation_id_t data_representation);
|
|
|
|
#if defined (__cplusplus)
|
|
}
|
|
#endif
|
|
|
|
#endif
|