static void call_process_transaction_terminated(void *user_ctx, const belle_sip_transaction_terminated_event_t *event) { SalOp* op = (SalOp*)user_ctx; belle_sip_client_transaction_t *client_transaction=belle_sip_transaction_terminated_event_get_client_transaction(event); belle_sip_server_transaction_t *server_transaction=belle_sip_transaction_terminated_event_get_server_transaction(event); belle_sip_request_t* req; belle_sip_response_t* resp; bool_t release_call=FALSE; if (client_transaction) { req=belle_sip_transaction_get_request(BELLE_SIP_TRANSACTION(client_transaction)); resp=belle_sip_transaction_get_response(BELLE_SIP_TRANSACTION(client_transaction)); } else { req=belle_sip_transaction_get_request(BELLE_SIP_TRANSACTION(server_transaction)); resp=belle_sip_transaction_get_response(BELLE_SIP_TRANSACTION(server_transaction)); } if (op->state ==SalOpStateTerminating && strcmp("BYE",belle_sip_request_get_method(req))==0 && (!resp || (belle_sip_response_get_status_code(resp) !=401 && belle_sip_response_get_status_code(resp) !=407)) && op->dialog==NULL) { release_call=TRUE; } if (server_transaction){ if (op->pending_server_trans==server_transaction){ belle_sip_object_unref(op->pending_server_trans); op->pending_server_trans=NULL; } if (op->pending_update_server_trans==server_transaction){ belle_sip_object_unref(op->pending_update_server_trans); op->pending_update_server_trans=NULL; } } if (release_call) call_set_released(op); }
static void process_transaction_terminated(belle_sip_listener_t *user_ctx, const belle_sip_transaction_terminated_event_t *event) { belle_sip_refresher_t* refresher=(belle_sip_refresher_t*)user_ctx; belle_sip_client_transaction_t*client_transaction = belle_sip_transaction_terminated_event_get_client_transaction(event); if (refresher && (client_transaction !=refresher->transaction)) return; /*not for me*/ if (refresher->publish_pending && refresher->state==started) { refresher->publish_pending = FALSE; belle_sip_message("Publish pending on refresher [%p], doing it",refresher); belle_sip_refresher_refresh(refresher,refresher->target_expires); } else { refresher->publish_pending = FALSE; } }
static void process_transaction_terminated(void *user_ctx, const belle_sip_transaction_terminated_event_t *event) { belle_sip_client_transaction_t* client_transaction = belle_sip_transaction_terminated_event_get_client_transaction(event); belle_sip_server_transaction_t* server_transaction = belle_sip_transaction_terminated_event_get_server_transaction(event); belle_sip_transaction_t* trans; SalOp* op; if(client_transaction) trans=BELLE_SIP_TRANSACTION(client_transaction); else trans=BELLE_SIP_TRANSACTION(server_transaction); op = (SalOp*)belle_sip_transaction_get_application_data(trans); if (op && op->callbacks && op->callbacks->process_transaction_terminated) { op->callbacks->process_transaction_terminated(op,event); } else { ms_message("Unhandled transaction terminated [%p]",trans); } if (op) sal_op_unref(op); /*because every transaction ref op*/ }