|
|
|
@ -8,66 +8,70 @@ |
|
|
|
|
|
|
|
|
|
#include "msget.h" |
|
|
|
|
|
|
|
|
|
static int cmp_cw_elemhandler_by_id(const void * elem1, const void *elem2){ |
|
|
|
|
const struct cw_ElemHandler * e1 = elem1; |
|
|
|
|
const struct cw_ElemHandler * e2 = elem2; |
|
|
|
|
static int cmp_cw_elemhandler_by_id(const void *elem1, const void *elem2) |
|
|
|
|
{ |
|
|
|
|
const struct cw_ElemHandler *e1 = elem1; |
|
|
|
|
const struct cw_ElemHandler *e2 = elem2; |
|
|
|
|
int r; |
|
|
|
|
r = e1->id - e2->id; |
|
|
|
|
if (r!=0) |
|
|
|
|
if (r != 0) |
|
|
|
|
return r; |
|
|
|
|
r = e1->vendor - e2->vendor; |
|
|
|
|
if (r!=0) |
|
|
|
|
if (r != 0) |
|
|
|
|
return r; |
|
|
|
|
r = e1->proto - e2->proto; |
|
|
|
|
if (r != 0) |
|
|
|
|
return r; |
|
|
|
|
r = e1->proto - e2->proto; |
|
|
|
|
if (r != 0) |
|
|
|
|
return r; |
|
|
|
|
return 0; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static int cmp_cw_elemhandler_by_key(const void *elem1, const void *elem2){ |
|
|
|
|
const struct cw_ElemHandler * e1 = elem1; |
|
|
|
|
const struct cw_ElemHandler * e2 = elem2; |
|
|
|
|
return strcmp(e1->key,e2->key); |
|
|
|
|
static int cmp_cw_elemhandler_by_key(const void *elem1, const void *elem2) |
|
|
|
|
{ |
|
|
|
|
const struct cw_ElemHandler *e1 = elem1; |
|
|
|
|
const struct cw_ElemHandler *e2 = elem2; |
|
|
|
|
return strcmp(e1->key, e2->key); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static int cmp_msgdata(const void * elem1, const void *elem2) |
|
|
|
|
{
|
|
|
|
|
const struct cw_MsgData * e1 = elem1; |
|
|
|
|
const struct cw_MsgData * e2 = elem2; |
|
|
|
|
static int cmp_msgdata(const void *elem1, const void *elem2) |
|
|
|
|
{ |
|
|
|
|
const struct cw_MsgData *e1 = elem1; |
|
|
|
|
const struct cw_MsgData *e2 = elem2; |
|
|
|
|
return e1->type - e2->type; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static int cmp_elemdata(const void * elem1, const void *elem2) |
|
|
|
|
static int cmp_elemdata(const void *elem1, const void *elem2) |
|
|
|
|
{ |
|
|
|
|
const struct cw_ElemData * e1 = elem1; |
|
|
|
|
const struct cw_ElemData * e2 = elem2; |
|
|
|
|
const struct cw_ElemData *e1 = elem1; |
|
|
|
|
const struct cw_ElemData *e2 = elem2; |
|
|
|
|
int r; |
|
|
|
|
r = e1->id - e2->id; |
|
|
|
|
if (r!=0) |
|
|
|
|
if (r != 0) |
|
|
|
|
return r; |
|
|
|
|
r = e1->vendor - e2->vendor; |
|
|
|
|
if (r!=0) |
|
|
|
|
if (r != 0) |
|
|
|
|
return r; |
|
|
|
|
r = e1->proto - e2->proto; |
|
|
|
|
if (r != 0) |
|
|
|
|
return r; |
|
|
|
|
r = e1->proto - e2->proto; |
|
|
|
|
if (r != 0) |
|
|
|
|
return r; |
|
|
|
|
return 0; |
|
|
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static void msgdata_destroy(struct cw_MsgData *data){ |
|
|
|
|
static void msgdata_destroy(struct cw_MsgData *data) |
|
|
|
|
{ |
|
|
|
|
if (!data) |
|
|
|
|
return; |
|
|
|
|
/* if (data->elements_list)
|
|
|
|
|
mlist_destroy(data->elements_list); |
|
|
|
|
*/ |
|
|
|
|
if (data->elements_tree) |
|
|
|
|
mavl_destroy( data->elements_tree ); |
|
|
|
|
mavl_destroy(data->elements_tree); |
|
|
|
|
free(data); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
static void del_mavl_msdgdata( void * d ){ |
|
|
|
|
static void del_mavl_msdgdata(void *d) |
|
|
|
|
{ |
|
|
|
|
msgdata_destroy(d); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -76,7 +80,8 @@ static void del_mavl_msdgdata( void * d ){ |
|
|
|
|
* @brief Destroy a message set |
|
|
|
|
* @param set Message set to destroy |
|
|
|
|
*/ |
|
|
|
|
void cw_msgset_destroy(struct cw_MsgSet * set){ |
|
|
|
|
void cw_msgset_destroy(struct cw_MsgSet *set) |
|
|
|
|
{ |
|
|
|
|
if (set->msgdata) |
|
|
|
|
mavl_destroy(set->msgdata); |
|
|
|
|
if (set->handlers_by_id) |
|
|
|
@ -91,35 +96,36 @@ void cw_msgset_destroy(struct cw_MsgSet * set){ |
|
|
|
|
* @brief Create a message set |
|
|
|
|
* @return Message set create, NULL if an error has occured |
|
|
|
|
*/ |
|
|
|
|
struct cw_MsgSet * cw_msgset_create(){ |
|
|
|
|
struct cw_MsgSet *cw_msgset_create() |
|
|
|
|
{ |
|
|
|
|
|
|
|
|
|
/* allocate memory for a message_set */ |
|
|
|
|
struct cw_MsgSet * set = malloc(sizeof(struct cw_MsgSet )); |
|
|
|
|
if (set==NULL) |
|
|
|
|
struct cw_MsgSet *set = malloc(sizeof(struct cw_MsgSet)); |
|
|
|
|
if (set == NULL) |
|
|
|
|
return NULL; |
|
|
|
|
|
|
|
|
|
memset(set,0,sizeof(struct cw_MsgSet)); |
|
|
|
|
memset(set, 0, sizeof(struct cw_MsgSet)); |
|
|
|
|
|
|
|
|
|
/* create mavl for all_elems by id */ |
|
|
|
|
set->handlers_by_id = mavl_create(cmp_cw_elemhandler_by_id,NULL, |
|
|
|
|
sizeof(struct cw_ElemHandler)); |
|
|
|
|
if (set->handlers_by_id==NULL){ |
|
|
|
|
set->handlers_by_id = mavl_create(cmp_cw_elemhandler_by_id, NULL, |
|
|
|
|
sizeof(struct cw_ElemHandler)); |
|
|
|
|
if (set->handlers_by_id == NULL) { |
|
|
|
|
cw_msgset_destroy(set); |
|
|
|
|
return NULL; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/* create mavl for all_elems by key */ |
|
|
|
|
set->handlers_by_key = mavl_create(cmp_cw_elemhandler_by_key,NULL, |
|
|
|
|
sizeof(struct cw_ElemHandler)); |
|
|
|
|
if (set->handlers_by_key==NULL){ |
|
|
|
|
set->handlers_by_key = mavl_create(cmp_cw_elemhandler_by_key, NULL, |
|
|
|
|
sizeof(struct cw_ElemHandler)); |
|
|
|
|
if (set->handlers_by_key == NULL) { |
|
|
|
|
cw_msgset_destroy(set); |
|
|
|
|
return NULL; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/* create mavl for messages */ |
|
|
|
|
set->msgdata = mavl_create(cmp_msgdata,del_mavl_msdgdata, |
|
|
|
|
sizeof(struct cw_MsgData)); |
|
|
|
|
if (set->msgdata==NULL){ |
|
|
|
|
set->msgdata = mavl_create(cmp_msgdata, del_mavl_msdgdata, |
|
|
|
|
sizeof(struct cw_MsgData)); |
|
|
|
|
if (set->msgdata == NULL) { |
|
|
|
|
cw_msgset_destroy(set); |
|
|
|
|
return NULL; |
|
|
|
|
} |
|
|
|
@ -127,120 +133,107 @@ struct cw_MsgSet * cw_msgset_create(){ |
|
|
|
|
return set; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
struct cw_ElemHandler * cw_msgset_get_elemhandler(struct cw_MsgSet * set, |
|
|
|
|
int proto, int vendor, int id) |
|
|
|
|
struct cw_ElemHandler *cw_msgset_get_elemhandler(struct cw_MsgSet *set, |
|
|
|
|
int proto, int vendor, int id) |
|
|
|
|
{ |
|
|
|
|
struct cw_ElemHandler search; |
|
|
|
|
search.proto=proto; |
|
|
|
|
search.vendor=vendor; |
|
|
|
|
search.id=id; |
|
|
|
|
return mavl_find(set->handlers_by_id,&search); |
|
|
|
|
search.proto = proto; |
|
|
|
|
search.vendor = vendor; |
|
|
|
|
search.id = id; |
|
|
|
|
return mavl_find(set->handlers_by_id, &search); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
static int update_msgdata(struct cw_MsgSet * set, struct cw_MsgData * msgdata, |
|
|
|
|
struct cw_MsgDef * msgdef) |
|
|
|
|
static int update_msgdata(struct cw_MsgSet *set, struct cw_MsgData *msgdata, |
|
|
|
|
struct cw_MsgDef *msgdef) |
|
|
|
|
{ |
|
|
|
|
struct cw_ElemDef * elemdef; |
|
|
|
|
struct cw_ElemDef *elemdef; |
|
|
|
|
struct cw_ElemData ed, *result; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* iterate through all defined elements */ |
|
|
|
|
for(elemdef = msgdef->elements; elemdef->id; elemdef++){ |
|
|
|
|
struct cw_ElemHandler * handler; |
|
|
|
|
for (elemdef = msgdef->elements; elemdef->id; elemdef++) { |
|
|
|
|
struct cw_ElemHandler *handler; |
|
|
|
|
int replaced; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
handler = cw_msgset_get_elemhandler(set, |
|
|
|
|
elemdef->proto, |
|
|
|
|
elemdef->vendor, |
|
|
|
|
elemdef->id); |
|
|
|
|
elemdef->proto, |
|
|
|
|
elemdef->vendor, elemdef->id); |
|
|
|
|
/* check if a handler for our element already exists */ |
|
|
|
|
if (!handler){ |
|
|
|
|
if (!handler) { |
|
|
|
|
cw_log(LOG_ERR, "No handler for message element: %d %d %d", |
|
|
|
|
elemdef->proto, |
|
|
|
|
elemdef->vendor, |
|
|
|
|
elemdef->id); |
|
|
|
|
elemdef->proto, elemdef->vendor, elemdef->id); |
|
|
|
|
continue; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
ed.id=elemdef->id; |
|
|
|
|
ed.proto=elemdef->proto; |
|
|
|
|
ed.vendor=elemdef->vendor; |
|
|
|
|
ed.mand=elemdef->mand; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ed.id = elemdef->id; |
|
|
|
|
ed.proto = elemdef->proto; |
|
|
|
|
ed.vendor = elemdef->vendor; |
|
|
|
|
ed.mand = elemdef->mand; |
|
|
|
|
|
|
|
|
|
result = mavl_replace(msgdata->elements_tree, &ed, &replaced); |
|
|
|
|
|
|
|
|
|
if (!replaced){ |
|
|
|
|
cw_dbg(DBG_MOD, " adding message element %d %d %d - %s",
|
|
|
|
|
elemdef->proto, |
|
|
|
|
elemdef->vendor, |
|
|
|
|
elemdef->id,
|
|
|
|
|
handler->name); |
|
|
|
|
} |
|
|
|
|
else{ |
|
|
|
|
cw_dbg(DBG_MOD, " replacing message element %d %d %d - %s",
|
|
|
|
|
elemdef->proto, |
|
|
|
|
elemdef->vendor, |
|
|
|
|
elemdef->id,
|
|
|
|
|
handler->name); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (!replaced) { |
|
|
|
|
cw_dbg(DBG_MOD, " adding message element %d %d %d - %s", |
|
|
|
|
elemdef->proto, |
|
|
|
|
elemdef->vendor, elemdef->id, handler->name); |
|
|
|
|
} else { |
|
|
|
|
cw_dbg(DBG_MOD, " replacing message element %d %d %d - %s", |
|
|
|
|
elemdef->proto, |
|
|
|
|
elemdef->vendor, elemdef->id, handler->name); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return 0; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
int cw_msgset_add(struct cw_MsgSet * set, |
|
|
|
|
struct cw_MsgDef messages[],
|
|
|
|
|
struct cw_ElemHandler handlers[] |
|
|
|
|
){ |
|
|
|
|
int cw_msgset_add(struct cw_MsgSet *set, |
|
|
|
|
struct cw_MsgDef messages[], struct cw_ElemHandler handlers[] |
|
|
|
|
) |
|
|
|
|
{ |
|
|
|
|
|
|
|
|
|
struct cw_ElemHandler * handler; |
|
|
|
|
struct cw_MsgDef * msgdef; |
|
|
|
|
struct cw_ElemHandler *handler; |
|
|
|
|
struct cw_MsgDef *msgdef; |
|
|
|
|
|
|
|
|
|
/* Create mavl for all handlers */ |
|
|
|
|
for(handler = handlers; handler->id; handler++){ |
|
|
|
|
cw_dbg(DBG_MOD,"Adding handler for element %d - %s - with key: %s",
|
|
|
|
|
handler->id, |
|
|
|
|
handler->name, |
|
|
|
|
handler->key); |
|
|
|
|
mavl_replace(set->handlers_by_id,handler,NULL); |
|
|
|
|
mavl_replace(set->handlers_by_key,handler,NULL); |
|
|
|
|
for (handler = handlers; handler->id; handler++) { |
|
|
|
|
cw_dbg(DBG_MOD, "Adding handler for element %d - %s - with key: %s", |
|
|
|
|
handler->id, handler->name, handler->key); |
|
|
|
|
mavl_replace(set->handlers_by_id, handler, NULL); |
|
|
|
|
mavl_replace(set->handlers_by_key, handler, NULL); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
for (msgdef=messages; msgdef->type !=0; msgdef++){ |
|
|
|
|
for (msgdef = messages; msgdef->type != 0; msgdef++) { |
|
|
|
|
struct cw_MsgData search; |
|
|
|
|
struct cw_MsgData *msg; |
|
|
|
|
int exists; |
|
|
|
|
|
|
|
|
|
/* Look if message already exists */
|
|
|
|
|
search.type=msgdef->type; |
|
|
|
|
msg = mavl_add(set->msgdata,&search,&exists); |
|
|
|
|
|
|
|
|
|
if (msg == NULL){ |
|
|
|
|
cw_log(LOG_ERR,"Can't create messae"); |
|
|
|
|
return 0; |
|
|
|
|
|
|
|
|
|
/* Look if message already exists */ |
|
|
|
|
search.type = msgdef->type; |
|
|
|
|
msg = mavl_add(set->msgdata, &search, &exists); |
|
|
|
|
|
|
|
|
|
if (msg == NULL) { |
|
|
|
|
cw_log(LOG_ERR, "Can't create messae"); |
|
|
|
|
return 0; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (!exists){ |
|
|
|
|
msg->elements_tree = mavl_create(cmp_elemdata,NULL, |
|
|
|
|
sizeof(struct cw_ElemData)); |
|
|
|
|
|
|
|
|
|
if (!exists) { |
|
|
|
|
msg->elements_tree = mavl_create(cmp_elemdata, NULL, |
|
|
|
|
sizeof(struct cw_ElemData)); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/* Overwrite the found message */ |
|
|
|
|
if (msgdef->name) |
|
|
|
|
msg->name=msgdef->name; |
|
|
|
|
msg->name = msgdef->name; |
|
|
|
|
if (msgdef->states) |
|
|
|
|
msg->states=msgdef->states; |
|
|
|
|
msg->receiver=msgdef->receiver; |
|
|
|
|
msg->states = msgdef->states; |
|
|
|
|
msg->receiver = msgdef->receiver; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
cw_dbg(DBG_MOD, "Add message Type:%d - %s ", msgdef->type, msgdef->name); |
|
|
|
|
|
|
|
|
|
cw_dbg(DBG_MOD, "Add message Type:%d - %s ",msgdef->type,msgdef->name); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
update_msgdata(set,msg,msgdef); |
|
|
|
|
update_msgdata(set, msg, msgdef); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
return 0; |
|
|
|
@ -252,8 +245,9 @@ int cw_msgset_add(struct cw_MsgSet * set, |
|
|
|
|
* @param type message type to search for |
|
|
|
|
* @return message data or NULL if not found |
|
|
|
|
*/ |
|
|
|
|
struct cw_MsgData * cw_msgset_get_msgdata(struct cw_MsgSet *set,int type){ |
|
|
|
|
struct cw_MsgData *cw_msgset_get_msgdata(struct cw_MsgSet *set, int type) |
|
|
|
|
{ |
|
|
|
|
struct cw_MsgData search; |
|
|
|
|
search.type=type; |
|
|
|
|
return mavl_find_ptr(set->msgdata,&search); |
|
|
|
|
search.type = type; |
|
|
|
|
return mavl_find_ptr(set->msgdata, &search); |
|
|
|
|
} |
|
|
|
|