Commit 3f4235f9 authored by Simon Morlat's avatar Simon Morlat

fix many bugs

parent 5d8b4391
......@@ -30,6 +30,9 @@
#define BELLE_SIP_TYPE_ID(_type) _type##_id
/**
* This enum declares all object types used in belle-sip (see belle_sip_object_t)
**/
typedef enum belle_sip_type_id{
belle_sip_type_id_first=1,
BELLE_SIP_TYPE_ID(belle_sip_stack_t),
......@@ -41,6 +44,7 @@ typedef enum belle_sip_type_id{
BELLE_SIP_TYPE_ID(belle_sip_provider_t),
BELLE_SIP_TYPE_ID(belle_sip_main_loop_t),
BELLE_SIP_TYPE_ID(belle_sip_source_t),
BELLE_SIP_TYPE_ID(belle_sip_resolver_context_t),
BELLE_SIP_TYPE_ID(belle_sip_transaction_t),
BELLE_SIP_TYPE_ID(belle_sip_server_transaction_t),
BELLE_SIP_TYPE_ID(belle_sip_client_transaction_t),
......
......@@ -29,6 +29,7 @@ int belle_sip_list_size(const belle_sip_list_t * first);
void belle_sip_list_for_each(const belle_sip_list_t * list, void (*func)(void *));
void belle_sip_list_for_each2(const belle_sip_list_t * list, void (*func)(void *, void *), void *user_data);
belle_sip_list_t * belle_sip_list_remove_link(belle_sip_list_t * list, belle_sip_list_t * elem);
belle_sip_list_t * belle_sip_list_delete_link(belle_sip_list_t * list, belle_sip_list_t * elem);
belle_sip_list_t * belle_sip_list_find(belle_sip_list_t * list, void *data);
typedef int (*belle_sip_compare_func)(const void *, const void*);
......
......@@ -104,6 +104,7 @@ BELLE_SIP_DECLARE_VPTR(belle_sip_uri_t);
BELLE_SIP_DECLARE_VPTR(belle_sip_header_t);
BELLE_SIP_DECLARE_VPTR(belle_sip_parameters_t);
BELLE_SIP_DECLARE_VPTR(belle_sip_header_contact_t);
BELLE_SIP_DECLARE_VPTR(belle_sip_source_t);
struct _belle_sip_list {
struct _belle_sip_list *next;
......@@ -125,8 +126,8 @@ struct belle_sip_source{
int index; /* index in pollfd table */
belle_sip_source_func_t notify;
belle_sip_source_remove_callback_t on_remove;
int cancelled:1;
int expired:1;
unsigned char cancelled;
unsigned char expired;
};
void belle_sip_fd_source_init(belle_sip_source_t *s, belle_sip_source_func_t func, void *data, int fd, unsigned int events, unsigned int timeout_value_ms);
......@@ -149,6 +150,7 @@ belle_sip_list_t *belle_sip_list_new(void *data);
belle_sip_list_t* belle_sip_list_append_link(belle_sip_list_t* elem,belle_sip_list_t *new_elem);
belle_sip_list_t *belle_sip_list_find_custom(belle_sip_list_t *list, belle_sip_compare_func compare_func, const void *user_data);
belle_sip_list_t *belle_sip_list_remove_custom(belle_sip_list_t *list, belle_sip_compare_func compare_func, const void *user_data);
belle_sip_list_t *belle_sip_list_delete_custom(belle_sip_list_t *list, belle_sip_compare_func compare_func, const void *user_data);
belle_sip_list_t * belle_sip_list_free(belle_sip_list_t *list);
#define belle_sip_list_next(elem) ((elem)->next)
/***************/
......
......@@ -65,13 +65,13 @@ void belle_sip_parameters_set_parameter(belle_sip_parameters_t* params,const cha
belle_sip_list_t * lResult = belle_sip_list_find_custom(params->paramnames_list, (belle_sip_compare_func)strcmp, name);
/* first remove from header names list*/
if (lResult) {
belle_sip_list_remove_link(params->paramnames_list,lResult);
params->paramnames_list=belle_sip_list_delete_link(params->paramnames_list,lResult);
}
/* next from header list*/
lResult = belle_sip_list_find_custom(params->param_list, (belle_sip_compare_func)belle_sip_param_pair_comp_func, name);
if (lResult) {
belle_sip_param_pair_destroy(lResult->data);
belle_sip_list_remove_link(params->param_list,lResult);
params->param_list=belle_sip_list_delete_link(params->param_list,lResult);
}
/* 2 insert*/
belle_sip_param_pair_t* lNewpair = belle_sip_param_pair_new(name,value);
......@@ -87,7 +87,7 @@ void belle_sip_parameters_remove_parameter(belle_sip_parameters_t* params,const
belle_sip_list_t * lResult = belle_sip_list_find_custom(params->paramnames_list, (belle_sip_compare_func)strcmp, name);
/* first remove from header names list*/
if (lResult) {
belle_sip_list_remove_link(params->paramnames_list,lResult);
params->paramnames_list=belle_sip_list_delete_link(params->paramnames_list,lResult);
} else {
belle_sip_warning("cannot remove param \%s because not present",name);
}
......
......@@ -31,9 +31,10 @@ void belle_sip_resolver_context_destroy(belle_sip_resolver_context_t *ctx){
if (ctx->ai){
freeaddrinfo(ctx->ai);
}
belle_sip_free(ctx);
}
BELLE_SIP_INSTANCIATE_VPTR(belle_sip_resolver_context_t, belle_sip_source_t, belle_sip_resolver_context_destroy, NULL, NULL);
static int resolver_callback(belle_sip_resolver_context_t *ctx){
ctx->cb(ctx->cb_data, ctx->name, ctx->ai);
ctx->ai=NULL;
......@@ -41,7 +42,7 @@ static int resolver_callback(belle_sip_resolver_context_t *ctx){
}
belle_sip_resolver_context_t *belle_sip_resolver_context_new(){
belle_sip_resolver_context_t *ctx=belle_sip_new0(belle_sip_resolver_context_t);
belle_sip_resolver_context_t *ctx=belle_sip_object_new(belle_sip_resolver_context_t);
if (pipe(ctx->ctlpipe)==-1){
belle_sip_fatal("pipe() failed: %s",strerror(errno));
}
......
......@@ -211,7 +211,7 @@ belle_sip_list_t* belle_sip_list_free(belle_sip_list_t* list){
belle_sip_list_t* belle_sip_list_remove(belle_sip_list_t* first, void *data){
belle_sip_list_t* it;
it=belle_sip_list_find(first,data);
if (it) return belle_sip_list_remove_link(first,it);
if (it) return belle_sip_list_delete_link(first,it);
else {
belle_sip_warning("belle_sip_list_remove: no element with %p data was in the list", data);
return first;
......@@ -253,10 +253,15 @@ belle_sip_list_t* belle_sip_list_remove_link(belle_sip_list_t* list, belle_sip_l
if (elem->next!=NULL) elem->next->prev=elem->prev;
elem->next=NULL;
elem->prev=NULL;
free(elem);
return list;
}
belle_sip_list_t * belle_sip_list_delete_link(belle_sip_list_t* list, belle_sip_list_t* elem){
belle_sip_list_t *ret=belle_sip_list_remove_link(list,elem);
belle_sip_list_free(elem);
return ret;
}
belle_sip_list_t* belle_sip_list_find(belle_sip_list_t* list, void *data){
for(;list!=NULL;list=list->next){
if (list->data==data) return list;
......@@ -279,6 +284,14 @@ belle_sip_list_t *belle_sip_list_remove_custom(belle_sip_list_t *list, belle_sip
return list;
}
belle_sip_list_t *belle_sip_list_delete_custom(belle_sip_list_t *list, belle_sip_compare_func compare_func, const void *user_data){
belle_sip_list_t *elem=belle_sip_list_find_custom(list,compare_func,user_data);
if (elem!=NULL){
list=belle_sip_list_delete_link(list,elem);
}
return list;
}
void * belle_sip_list_nth_data(const belle_sip_list_t* list, int index){
int i;
for(i=0;list!=NULL;list=list->next,++i){
......
......@@ -70,7 +70,7 @@ void belle_sip_provider_add_sip_listener(belle_sip_provider_t *p, belle_sip_list
void belle_sip_provider_remove_sip_listener(belle_sip_provider_t *p, belle_sip_listener_t *l, void *user_ctx){
listener_ctx_t ctx={l,user_ctx};
p->listeners=belle_sip_list_remove_custom(p->listeners,listener_ctx_compare,&ctx);
p->listeners=belle_sip_list_delete_custom(p->listeners,listener_ctx_compare,&ctx);
}
belle_sip_header_call_id_t * belle_sip_provider_create_call_id(belle_sip_provider_t *prov){
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment