diff --git a/coreapi/bellesip_sal/sal_address_impl.c b/coreapi/bellesip_sal/sal_address_impl.c index e2bb58daf..86415ad0f 100644 --- a/coreapi/bellesip_sal/sal_address_impl.c +++ b/coreapi/bellesip_sal/sal_address_impl.c @@ -22,15 +22,16 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. SalAddress * sal_address_new(const char *uri){ belle_sip_header_address_t* result; if (uri) { - return (SalAddress *)belle_sip_header_address_parse (uri); + result=belle_sip_header_address_parse (uri); } else { result = belle_sip_header_address_new(); belle_sip_header_address_set_uri(result,belle_sip_uri_new()); - return (SalAddress *)result; } + belle_sip_object_ref(result); + return (SalAddress *)result; } SalAddress * sal_address_clone(const SalAddress *addr){ - return (SalAddress *) belle_sip_object_clone(BELLE_SIP_OBJECT(addr)); + return (SalAddress *) belle_sip_object_ref(belle_sip_object_clone(BELLE_SIP_OBJECT(addr))); } const char *sal_address_get_scheme(const SalAddress *addr){ belle_sip_header_address_t* header_addr = BELLE_SIP_HEADER_ADDRESS(addr); diff --git a/coreapi/bellesip_sal/sal_impl.c b/coreapi/bellesip_sal/sal_impl.c index fd063b64f..08b9d2450 100644 --- a/coreapi/bellesip_sal/sal_impl.c +++ b/coreapi/bellesip_sal/sal_impl.c @@ -425,7 +425,6 @@ int sal_listen_port(Sal *ctx, const char *addr, int port, SalTransport tr, int i belle_sip_listening_point_t* lp = belle_sip_stack_create_listening_point(ctx->stack,addr,port,sal_transport_to_string(tr)); if (lp) { result = belle_sip_provider_add_listening_point(ctx->prov,lp); - belle_sip_object_unref(lp); } else { return -1; } diff --git a/coreapi/bellesip_sal/sal_impl.h b/coreapi/bellesip_sal/sal_impl.h index 8619bf856..c71a84417 100644 --- a/coreapi/bellesip_sal/sal_impl.h +++ b/coreapi/bellesip_sal/sal_impl.h @@ -75,7 +75,7 @@ belle_sip_request_t* sal_op_build_request(SalOp *op,const char* method); void sal_op_call_fill_cbs(SalOp*op); -void set_or_update_dialog(SalOp* op, const belle_sip_response_event_t* event); +void set_or_update_dialog(SalOp* op, belle_sip_dialog_t* dialog); void sal_op_set_remote_ua(SalOp*op,belle_sip_message_t* message); int sal_op_send_request(SalOp* op, belle_sip_request_t* request); diff --git a/coreapi/bellesip_sal/sal_op_call.c b/coreapi/bellesip_sal/sal_op_call.c index f2456d997..857818d87 100644 --- a/coreapi/bellesip_sal/sal_op_call.c +++ b/coreapi/bellesip_sal/sal_op_call.c @@ -33,7 +33,7 @@ static void sdp_process(SalOp *h){ belle_sip_object_unref(h->sdp_answer); } offer_answer_initiate_incoming(h->base.local_media,h->base.remote_media,h->result,h->base.root->one_matching_codec); - h->sdp_answer=media_description_to_sdp(h->result); + h->sdp_answer=(belle_sdp_session_description_t *)belle_sip_object_ref(media_description_to_sdp(h->result)); /*once we have generated the SDP answer, we modify the result description for processing by the upper layer. It should contains media parameters constraint from the remote offer, not our response*/ strcpy(h->result->addr,h->base.remote_media->addr); @@ -171,7 +171,7 @@ static void call_response_event(void *op_base, const belle_sip_response_event_t } return; } - set_or_update_dialog(op,event); + set_or_update_dialog(op,belle_sip_response_event_get_dialog(event)); /*check if op is terminating*/ @@ -180,6 +180,7 @@ static void call_response_event(void *op_base, const belle_sip_response_event_t && (!op->dialog || belle_sip_dialog_get_state(op->dialog)==BELLE_SIP_DIALOG_NULL || belle_sip_dialog_get_state(op->dialog)==BELLE_SIP_DIALOG_EARLY)) { + /*FIXME if DIALOG_CONFIRM then ACK+BYE*/ cancelling_invite(op); return; @@ -278,7 +279,7 @@ static void process_sdp_for_invite(SalOp* op,belle_sip_request_t* invite) { static void process_request_event(void *op_base, const belle_sip_request_event_t *event) { SalOp* op = (SalOp*)op_base; belle_sip_server_transaction_t* server_transaction = belle_sip_provider_create_server_transaction(op->base.root->prov,belle_sip_request_event_get_request(event)); - belle_sip_object_ref(server_transaction); + if (server_transaction) belle_sip_object_ref(server_transaction); /*ACK does'nt create srv transaction*/ if (op->pending_server_trans) belle_sip_object_unref(op->pending_server_trans); op->pending_server_trans=server_transaction; belle_sdp_session_description_t* sdp; @@ -289,8 +290,7 @@ static void process_request_event(void *op_base, const belle_sip_request_event_t belle_sip_header_t* call_info; if (!op->dialog) { - op->dialog=belle_sip_provider_create_dialog(op->base.root->prov,BELLE_SIP_TRANSACTION(op->pending_server_trans)); - belle_sip_dialog_set_application_data(op->dialog,op); + set_or_update_dialog(op,belle_sip_provider_create_dialog(op->base.root->prov,BELLE_SIP_TRANSACTION(op->pending_server_trans))); ms_message("new incoming call from [%s] to [%s]",sal_op_get_from(op),sal_op_get_to(op)); } dialog_state=belle_sip_dialog_get_state(op->dialog); diff --git a/coreapi/bellesip_sal/sal_op_impl.c b/coreapi/bellesip_sal/sal_op_impl.c index 8ed860a05..4b12a653f 100644 --- a/coreapi/bellesip_sal/sal_op_impl.c +++ b/coreapi/bellesip_sal/sal_op_impl.c @@ -32,6 +32,7 @@ void sal_op_release(SalOp *op){ belle_sip_main_loop_cancel_source(belle_sip_stack_get_main_loop(op->base.root->stack),op->registration_refresh_timer); } if (op->auth_info) sal_auth_info_delete(op->auth_info); + if (op->sdp_answer) belle_sip_object_unref(op->sdp_answer); __sal_op_free(op); return ; } @@ -198,13 +199,13 @@ bool_t sal_compute_sal_errors(belle_sip_response_t* response,SalError* sal_err,S return FALSE; } } -void set_or_update_dialog(SalOp* op, const belle_sip_response_event_t* event) { +void set_or_update_dialog(SalOp* op, belle_sip_dialog_t* dialog) { /*check if dialog has changed*/ - if (belle_sip_response_event_get_dialog(event) != op->dialog) { - ms_message("Dialog set from [%p] to [%p] for op [%p]",op->dialog,belle_sip_response_event_get_dialog(event),op); + if (dialog != op->dialog) { + ms_message("Dialog set from [%p] to [%p] for op [%p]",op->dialog,dialog,op); /*fixme, shouldn't we cancel previous dialog*/ if (op->dialog)belle_sip_object_unref(op->dialog); - op->dialog=belle_sip_response_event_get_dialog(event); + op->dialog=dialog; belle_sip_dialog_set_application_data(op->dialog,op); belle_sip_object_ref(op->dialog); } diff --git a/coreapi/bellesip_sal/sal_op_presence.c b/coreapi/bellesip_sal/sal_op_presence.c index a4d8900fd..9da9e1080 100644 --- a/coreapi/bellesip_sal/sal_op_presence.c +++ b/coreapi/bellesip_sal/sal_op_presence.c @@ -424,7 +424,7 @@ static void presence_response_event(void *op_base, const belle_sip_response_even op->base.root->callbacks.notify_presence(op,SalSubscribeTerminated, SalPresenceOffline,NULL); return; } - set_or_update_dialog(op_base,event); + set_or_update_dialog(op_base,belle_sip_response_event_get_dialog(event)); if (!op->dialog) { ms_message("presence op [%p] receive out of dialog answer [%i]",op,code); return;