#include "mbag.h" #include "capwap.h" #include "format.h" /** * @file * @MBAG functions * @addtogroup MbagFunctions * @{ */ /* static int mbag_bstr16str(void *item,char *dst) { mbag_item_t *i= item; char *d = dst; int utf8 = cw_is_utf8(bstr16_data(i->data), bstr16_len(i->data)); if (utf8) { d += sprintf(d, "%.*s", bstr16_len(i->data), bstr16_data(i->data)); } else { d += sprintf(d, "\".x"); d += cw_format_hex(d, bstr16_data(i->data), bstr16_len(i->data)); d += sprintf(d, "\""); } return d-dst; } */ /* const struct mbag_typedef mbag_type_byte = { "byte",NULL }; */ /* const struct mbag_typedef mbag_type_word = { "word",NULL }; */ /* const struct mbag_typedef mbag_type_dword = { "dword",NULL }; */ const struct mbag_typedef mbag_type_const_data = { "data",NULL }; const struct mbag_typedef mbag_type_bstr = { "bstr",free }; /* const struct mbag_typedef mbag_type_bstr16 = { "bstr16",free,mbag_bstr16str }; */ /* const struct mbag_typedef mbag_type_vendorstr = { "vendorstr",free }; */ void free_avltree(void*t){ mavl_t i = (mavl_t) t; mavl_destroy(i); } const struct mbag_typedef mbag_type_avltree = { "mavl",free_avltree }; static void mbag_type_mbag_del(void *i) { mbag_t x = (mbag_t)i; mavl_destroy(x); } /*const struct mbag_typedef mbag_type_mbag = { # "mbag",mbag_type_mbag_del }; */ /*const struct mbag_typedef mbag_type_mbag_dyn = { "mbag",mbag_type_mbag_del }; */ static void mbag_del_data(struct mbag_item *i) { if (i->type->del) { i->type->del(i->data); } } static void mbag_del_fun(void *e) { mbag_item_t * i = (mbag_item_t*)e; if (i->dynid){ free((void*)i->id); } mbag_del_data(e); free(e); } static void mbag_i_del_fun(void *e) { mbag_del_data(e); free(e); } static int mbag_cmp_fun(const void *x1, const void *x2) { return strcmp(( (struct mbag_item *) x1)->id , ((struct mbag_item *) x2)->id ); } static int mbag_i_cmp_fun(const void *x1, const void *x2) { return ((struct mbag_item *) x1)->iid - ((struct mbag_item *) x2)->iid; } mbag_t mbag_i_create() { return mavl_create(mbag_i_cmp_fun, mbag_i_del_fun); } mbag_t mbag_create() { return mavl_create(mbag_cmp_fun, mbag_del_fun); } mbag_item_t *mbag_item_new(mbagtype_t type) { struct mbag_item *i= malloc(sizeof(mbag_item_t)); if (!i) return NULL; i->type = type; i->dynid=0; return i; } struct mbag_item *mbag_item_create(mbag_t s, const char *id) { struct mbag_item is; is.id = id; struct mbag_item *i = mavl_get(s, &is); if (i) { mbag_del_data(i); return i; } i = malloc(sizeof(struct mbag_item)); if (!i) return NULL; i->id = id; i->dynid=0; return mavl_add(s, i); } struct mbag_item *mbag_i_item_create(mbag_t s, uint32_t id) { struct mbag_item is; is.iid = id; struct mbag_item *i = mavl_get(s, &is); if (i) { mbag_del_data(i); return i; } i = malloc(sizeof(struct mbag_item)); if (!i) return NULL; i->iid = id; i->dynid=0; return mavl_add(s, i); } /* struct mbag_item *strmbag_item_create(mbag_t s, char *name) { struct mbag_item is; is.name = name; struct mbag_item *i = mavl_get(s, &is); if (i) { mbag_del_data(i); return i; } i = malloc(sizeof(struct mbag_item)); if (!i) return NULL; i->name = name; return mavl_add(s, i); } */ /**@}*/ int mbag_set(mbag_t t,mbag_item_t *is) { mavl_del(t,is); mavl_add(t,is); return 1; /* struct mbag_item *i = mavl_get(s, is); if (i) { mbag_del_data(i); return i; } mavl_add(t,is); */ } int mbag_set_byte(mbag_t s, const char *id, uint8_t byte) { struct mbag_item *i = mbag_item_create(s, id); if (!i) return 0; i->byte = byte; i->type = &mbag_type_byte; return 1; } struct mbag_item * mbag_set_word(mbag_t s, const char *id, uint16_t word) { struct mbag_item *i = mbag_item_create(s, id); if (!i) return 0; i->word = word; i->type = &mbag_type_word; return i; } struct mbag_item * mbag_set_dword(mbag_t s, const char *id, uint32_t dword) { struct mbag_item *i = mbag_item_create(s, id); if (!i) return NULL; i->dword = dword; i->type = &mtype_dword; return i; } int mbag_i_set_mbag(mbag_t s, uint32_t id, mbag_t mbag) { struct mbag_item *i = mbag_i_item_create(s, id); if (!i) return 0; i->data = mbag; i->type = &mbag_type_mbag; return 1; } int mbag_set_mbag(mbag_t s, const char *id, mbag_t mbag) { struct mbag_item *i = mbag_item_create(s, id); if (!i) return 0; i->data = mbag; i->type = &mbag_type_mbag; return 1; } int mbag_set_data(mbag_t s, const char *id, const struct mbag_typedef *type, void *data) { struct mbag_item *i = mbag_item_create(s, id); if (!i) return 0; i->data = data; i->type = type; return 1; } bstrv_t mbag_set_bstrv(mbag_t s, const char *id, uint32_t vendor_id, uint8_t * version, int len) { mbag_item_t *i = mbag_item_create(s, id); if (!i) return NULL; i->type = MBAG_VENDORSTR; i->data = bstrv_create(vendor_id,version,len); return i->data; } mbag_item_t *mbag_get(mbag_t s, const char *id) { mbag_item_t i; i.id = id; i.type=0; return mavl_get(s, &i); } mbag_item_t *mbag_i_get(mbag_t s, uint32_t id) { mbag_item_t i; i.iid = id; i.type=0; return mavl_get(s, &i); } void mbag_del(mbag_t s,const char *id) { mbag_item_t i; i.id = id; i.type=0; mavl_del(s, &i); } void * mbag_get_data(mbag_t s, const char *id, const struct mbag_typedef * type, void * def) { struct mbag_item *i = mbag_get(s, id); if (!i) return def; if (i->type != type) return def; return i->data; }