24 #ifndef KSI_TLV_TEMPLATE_H_
25 #define KSI_TLV_TEMPLATE_H_
31 #define KSI_TLV_toTlv KSI_TLV_clone
32 #define KSI_TLV_fromTlv KSI_TLV_clone
48 typedef int (*
getter_t)(
const void *,
void **);
65 typedef int (*
parse_t)(KSI_CTX *,
unsigned char *, size_t, int,
void *);
149 int (*
toTlv)(KSI_CTX *,
void *, unsigned, int, int, KSI_TLV **tlv);
170 #define KSI_TLV_TEMPLATE(name) name##_template
175 #define KSI_IMPORT_TLV_TEMPLATE(name) KSI_DEFINE_EXTERN(const KSI_TlvTemplate KSI_TLV_TEMPLATE(name)[])
180 #define KSI_TLV_TEMPLATE_OBJECT 1
185 #define KSI_TLV_TEMPLATE_COMPOSITE 2
190 #define KSI_TLV_TEMPLATE_LIST 3
195 #define KSI_TLV_TMPL_FLG_NONE 0x00
200 #define KSI_TLV_TMPL_FLG_FORWARD 0x01
205 #define KSI_TLV_TMPL_FLG_NONCRITICAL 0x02
210 #define KSI_TLV_TMPL_FLG_MANDATORY 0x04
215 #define KSI_TLV_TMPL_FLG_LEAST_ONE_G0 0x08
220 #define KSI_TLV_TMPL_FLG_LEAST_ONE_G1 0x10
226 #define KSI_TLV_TMPL_FLG_MORE_DEFS 0x20
231 #define KSI_TLV_TMPL_FLG_NO_SERIALIZE 0x40
236 #define KSI_TLV_TMPL_FLG_MOST_ONE_G0 0x80
241 #define KSI_TLV_TMPL_FLG_MOST_ONE_G1 0x100
247 #define KSI_TLV_TMPL_FLG_FIXED_ORDER 0x200
252 #define KSI_TLV_TMPL_FLG_FIRST 0x400
257 #define KSI_TLV_TMPL_FLG_LAST 0x800
262 #define KSI_TLV_TMPL_FLG_NO_VALUE 0x1000
267 #define KSI_TLV_TMPL_FLG_MANTATORY_MOST_ONE_G0 (KSI_TLV_TMPL_FLG_LEAST_ONE_G0 | KSI_TLV_TMPL_FLG_MOST_ONE_G0)
272 #define KSI_TLV_TMPL_FLG_MANTATORY_MOST_ONE_G1 (KSI_TLV_TMPL_FLG_LEAST_ONE_G1 | KSI_TLV_TMPL_FLG_MOST_ONE_G1)
297 #define KSI_TLV_FULL_TEMPLATE_DEF(typ, tg, flg, gttr, sttr, constr, destr, subTmpl, list_append, mul, list_new, list_free, list_len, list_elAt, fromTlv, toTlv, descr, parser, p_opt, setRaw) \
298 { typ, tg, flg , (getter_t)gttr, (setter_t)sttr, (int (*)(KSI_CTX *, void **)) constr, (void (*)(void *)) destr, subTmpl, \
299 (int (*)(void *, void *))list_append, mul, (int (*)(void **)) list_new, (void (*)(void *)) list_free, (int (*)(const void *)) list_len, (int (*)(const void *, int, void **))list_elAt, \
300 (int (*)(KSI_TLV *, void **)) fromTlv, (int (*)(KSI_CTX *, void *, unsigned, int, int, KSI_TLV **))toTlv, (descr), (parse_t)(parser), (p_opt), (int (*)(void *, KSI_OctetString *))(setRaw)}, \
311 #define KSI_TLV_PRIMITIVE_TEMPLATE_DEF(typ, tg, flg, gttr, sttr, descr) KSI_TLV_FULL_TEMPLATE_DEF(typ, tg, flg, gttr, sttr, NULL, NULL, NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL, NULL, descr, NULL, 0, NULL)
317 #define KSI_DEFINE_TLV_TEMPLATE(name) const KSI_TlvTemplate name##_template[] = {
330 #define KSI_TLV_OBJECT(tg, flg, gttr, sttr, fromTlv, toTlv, destr, descr) KSI_TLV_FULL_TEMPLATE_DEF(KSI_TLV_TEMPLATE_OBJECT, tg, flg, gttr, sttr, NULL, destr, NULL, NULL, 0, NULL, NULL, NULL, NULL, fromTlv, toTlv, descr, NULL, 0, NULL)
331 #define KSI_TLV_WRAP_OBJECT(tg, flg, gttr, sttr, parser, toTlv, destr, descr) KSI_TLV_FULL_TEMPLATE_DEF(KSI_TLV_TEMPLATE_OBJECT, tg, flg, gttr, sttr, NULL, destr, NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL, toTlv, descr, (parser), 0, NULL)
332 #define KSI_TLV_COMPOSITE_OBJECT(tg, flg, gttr, sttr, fromTlv, toTlv, destr, tmpl, descr) KSI_TLV_FULL_TEMPLATE_DEF(KSI_TLV_TEMPLATE_OBJECT, tg, flg, gttr, sttr, NULL, destr, (tmpl), NULL, 0, NULL, NULL, NULL, NULL, fromTlv, toTlv, descr, NULL, 0, NULL)
343 #define KSI_TLV_UTF8_STRING(tg, flg, gttr, sttr, descr) KSI_TLV_OBJECT(tg, flg, gttr, sttr, KSI_Utf8String_fromTlv, KSI_Utf8String_toTlv, KSI_Utf8String_free, descr)
353 #define KSI_TLV_INTEGER(tg, flg, gttr, sttr, descr) KSI_TLV_OBJECT(tg, flg, gttr, sttr, KSI_Integer_fromTlv, KSI_Integer_toTlv, KSI_Integer_free, descr)
363 #define KSI_TLV_OCTET_STRING(tg, flg, gttr, sttr, descr) KSI_TLV_OBJECT(tg, flg, gttr, sttr, KSI_OctetString_fromTlv, KSI_OctetString_toTlv, KSI_OctetString_free, descr)
373 #define KSI_TLV_IMPRINT(tg, flg, gttr, sttr, descr) KSI_TLV_OBJECT(tg, flg, gttr, sttr, KSI_DataHash_fromTlv, KSI_DataHash_toTlv, KSI_DataHash_free, descr)
374 #define KSI_TLV_WRAP_IMPRINT(tg, flg, gttr, sttr, descr) KSI_TLV_WRAP_OBJECT(tg, flg, gttr, sttr, KSI_DataHash_parse, KSI_DataHash_toTlv, KSI_DataHash_free, descr)
379 #define KSI_TLV_TIME_S KSI_TLV_INTEGER
380 #define KSI_TLV_TIME_US KSI_TLV_INTEGER
392 #define KSI_TLV_OBJECT_LIST(tg, flg, gttr, sttr, obj, descr) KSI_TLV_FULL_TEMPLATE_DEF(KSI_TLV_TEMPLATE_OBJECT, tg, flg, gttr, sttr, NULL, obj##_free, NULL, KSI_List_append, 1, obj##List_new, obj##List_free, KSI_List_length, KSI_List_elementAt, obj##_fromTlv, obj##_toTlv, descr, NULL, 0, NULL)
402 #define KSI_TLV_OCTET_STRING_LIST(tg, flg, gttr, sttr, descr) KSI_TLV_OBJECT_LIST(tg, flg, gttr, sttr, KSI_OctetString, descr)
412 #define KSI_TLV_UTF8_STRING_LIST(tg, flg, gttr, sttr, descr) KSI_TLV_OBJECT_LIST(tg, flg, gttr, sttr, KSI_Utf8String, descr)
422 #define KSI_TLV_INTEGER_LIST(tg, flg, gttr, sttr, descr) KSI_TLV_OBJECT_LIST(tg, flg, gttr, sttr, KSI_Integer, descr)
433 #define KSI_TLV_COMPOSITE(tg, flg, gttr, sttr, sub, descr) KSI_TLV_FULL_TEMPLATE_DEF(KSI_TLV_TEMPLATE_COMPOSITE, tg, flg, gttr, sttr, sub##_new, sub##_free, sub##_template, NULL, 0, NULL, NULL, NULL, NULL, NULL, NULL, descr, NULL, 0, NULL)
444 #define KSI_TLV_COMPOSITE_LIST(tg, flg, gttr, sttr, sub, descr) KSI_TLV_FULL_TEMPLATE_DEF(KSI_TLV_TEMPLATE_COMPOSITE, tg, flg, gttr, sttr, sub##_new, sub##_free, sub##_template, KSI_List_append, 1, sub##List_new, sub##List_free, KSI_List_length, KSI_List_elementAt, NULL, NULL, descr, NULL, 0, NULL)
449 #define KSI_END_TLV_TEMPLATE { -1, 0, 0, NULL, NULL, NULL, NULL, NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, NULL}};
537 #define KSI_IMPLEMENT_OBJECT_PARSE(type, tag) \
538 int type##_parse(KSI_CTX *ctx, const unsigned char *raw, size_t len, type **t) { \
539 int res = KSI_UNKNOWN_ERROR; \
540 KSI_TLV *tlv = NULL; \
542 if (ctx == NULL || t == NULL) { \
543 res = KSI_INVALID_ARGUMENT; \
546 res = KSI_TLV_parseBlob2(ctx, (unsigned char *)raw, len, 0, &tlv); \
547 if (res != KSI_OK) goto cleanup; \
548 if (KSI_TLV_getTag(tlv) != (tag)) { \
549 res = KSI_INVALID_FORMAT; \
552 res = type##_new(ctx, &tmp); \
553 if (res != KSI_OK) goto cleanup; \
554 res = KSI_TlvTemplate_parse(ctx, raw, len, KSI_TLV_TEMPLATE(type), tmp); \
555 if (res != KSI_OK) goto cleanup; \
572 #define KSI_IMPLEMENT_OBJECT_SERIALIZE(type, tag, nc, fwd) \
573 int type##_serialize(const type *t, unsigned char **raw, size_t *len) { \
574 int res = KSI_UNKNOWN_ERROR; \
575 if (t == NULL || raw == NULL || len == NULL) { \
576 res = KSI_INVALID_ARGUMENT; \
579 res = KSI_TlvTemplate_serializeObject(t->ctx, t, (tag), (nc), (fwd), KSI_TLV_TEMPLATE(type), raw, len); \
580 if (res != KSI_OK) goto cleanup; \
586 #define KSI_IMPLEMENT_WRITE_BYTES(typ, tag, nc, fwd) \
587 KSI_DEFINE_WRITE_BYTES(typ) { \
588 if (o == NULL) return KSI_INVALID_ARGUMENT; \
589 return KSI_TlvTemplate_writeBytes(o->ctx, (void *)o, tag, nc, fwd, KSI_TLV_TEMPLATE(typ), buf, buf_size, buf_len, opt); \
int KSI_TlvTemplate_parse(KSI_CTX *ctx, const unsigned char *raw, size_t raw_len, const KSI_TlvTemplate *tmpl, void *payload)
int(* cb_encode_t)(KSI_CTX *, KSI_TLV *, const void *, const KSI_TlvTemplate *)
Definition: tlv_template.h:63
int(* fromTlv)(KSI_TLV *tlv, void **)
Definition: tlv_template.h:144
int(* cb_decode_t)(KSI_CTX *ctx, const KSI_TLV *, void *, const KSI_TlvTemplate *)
Definition: tlv_template.h:58
int KSI_TlvTemplate_writeBytes(KSI_CTX *ctx, const void *obj, unsigned tag, int isNc, int isFwd, const KSI_TlvTemplate *tmpl, unsigned char *raw, size_t raw_size, size_t *raw_len, int opt)
unsigned flags
Definition: tlv_template.h:81
int KSI_TlvTemplate_extract(KSI_CTX *ctx, void *payload, KSI_TLV *tlv, const KSI_TlvTemplate *tmpl)
int parser_opt
Definition: tlv_template.h:158
int(* listLength)(const void *)
Definition: tlv_template.h:134
int(* construct)(KSI_CTX *, void **)
Definition: tlv_template.h:96
int(* listElementAt)(const void *, int, void **)
Definition: tlv_template.h:139
int(* parse_t)(KSI_CTX *, unsigned char *, size_t, int, void *)
Definition: tlv_template.h:65
getter_t getValue
Definition: tlv_template.h:86
int KSI_TlvTemplate_construct(KSI_CTX *ctx, KSI_TLV *tlv, const void *payload, const KSI_TlvTemplate *tmpl)
unsigned tag
Definition: tlv_template.h:79
int(* setRaw)(void *, KSI_OctetString *)
Definition: tlv_template.h:160
const KSI_TlvTemplate * subTemplate
Definition: tlv_template.h:107
struct KSI_OctetString_st KSI_OctetString
Definition: types_base.h:145
int(* getter_t)(const void *, void **)
Definition: tlv_template.h:48
parse_t parser
Definition: tlv_template.h:157
int KSI_TlvTemplate_extractGenerator(KSI_CTX *ctx, void *payload, void *generatorCtx, const KSI_TlvTemplate *tmpl, int(*generator)(void *, KSI_TLV **))
void(* listFree)(void *)
Definition: tlv_template.h:129
void(* destruct)(void *)
Definition: tlv_template.h:101
int(* listNew)(void **)
Definition: tlv_template.h:123
const char * descr
Definition: tlv_template.h:154
struct KSI_CTX_st KSI_CTX
Definition: types_base.h:124
int KSI_TlvTemplate_serializeObject(KSI_CTX *ctx, const void *obj, unsigned tag, int isNc, int isFwd, const KSI_TlvTemplate *tmpl, unsigned char **raw, size_t *raw_len)
struct KSI_TLV_st KSI_TLV
Definition: types_base.h:129
int(* toTlv)(KSI_CTX *, void *, unsigned, int, int, KSI_TLV **tlv)
Definition: tlv_template.h:149
Definition: tlv_template.h:70
int type
Definition: tlv_template.h:74
int multiple
Definition: tlv_template.h:118
setter_t setValue
Definition: tlv_template.h:91
int(* listAppend)(void *, void *)
Definition: tlv_template.h:112
int(* setter_t)(void *, void *)
Definition: tlv_template.h:53