static void presence_refresher_listener(belle_sip_refresher_t* refresher, void* user_pointer, unsigned int status_code, const char* reason_phrase){ SalOp* op = (SalOp*)user_pointer; switch(status_code){ case 481: { ms_message("The server or remote ua lost the SUBSCRIBE dialog context. Let's restart a new one."); belle_sip_refresher_stop(op->refresher); if (op->dialog) { /*delete previous dialog if any*/ belle_sip_dialog_set_application_data(op->dialog,NULL); belle_sip_object_unref(op->dialog); op->dialog=NULL; } if (sal_op_get_contact_address(op)) { /*contact is also probably not good*/ SalAddress* contact=sal_address_clone(sal_op_get_contact_address(op)); sal_address_set_port(contact,-1); sal_address_set_domain(contact,NULL); sal_op_set_contact_address(op,contact); sal_address_destroy(contact); } sal_subscribe_presence(op,NULL,NULL,-1); break; } } }
static void assign_address(SalAddress** address, const char *value){ if (*address){ sal_address_destroy(*address); *address=NULL; } if (value) *address=sal_address_new(value); }
int sal_listen_port(Sal *ctx, const char *addr, int port, SalTransport tr, int is_secure) { SalAddress* sal_addr = sal_address_new(NULL); int result; sal_address_set_domain(sal_addr,addr); sal_address_set_port_int(sal_addr,port); sal_address_set_transport(sal_addr,tr); result = sal_add_listen_port(ctx,sal_addr); sal_address_destroy(sal_addr); return result; }
static void presence_refresher_listener(belle_sip_refresher_t* refresher, void* user_pointer, unsigned int status_code, const char* reason_phrase){ SalOp* op = (SalOp*)user_pointer; if (status_code >= 300) { ms_message("The SUBSCRIBE dialog no longer works. Let's restart a new one."); belle_sip_refresher_stop(op->refresher); if (op->dialog) { /*delete previous dialog if any*/ set_or_update_dialog(op, NULL); } if (sal_op_get_contact_address(op)) { /*contact is also probably not good*/ SalAddress* contact=sal_address_clone(sal_op_get_contact_address(op)); sal_address_set_port(contact,-1); sal_address_set_domain(contact,NULL); sal_op_set_contact_address(op,contact); sal_address_destroy(contact); } /*send a new SUBSCRIBE, that will attempt to establish a new dialog*/ sal_subscribe_presence(op,NULL,NULL,-1); } }
/** * Sets a SIP route. * When a route is set, all outgoing calls will go to the route's destination if this proxy * is the default one (see linphone_core_set_default_proxy() ). **/ int linphone_proxy_config_set_route(LinphoneProxyConfig *obj, const char *route) { if (obj->reg_route!=NULL){ ms_free(obj->reg_route); obj->reg_route=NULL; } if (route!=NULL){ SalAddress *addr; char *tmp; /*try to prepend 'sip:' */ if (strstr(route,"sip:")==NULL){ tmp=ms_strdup_printf("sip:%s",route); }else tmp=ms_strdup(route); addr=sal_address_new(tmp); if (addr!=NULL){ sal_address_destroy(addr); }else{ ms_free(tmp); tmp=NULL; } obj->reg_route=tmp; } return 0; }
void sal_op_set_service_route(SalOp *op,const SalAddress* service_route) { if (((SalOpBase*)op)->service_route) sal_address_destroy(((SalOpBase*)op)->service_route); ((SalOpBase*)op)->service_route=service_route?sal_address_clone(service_route):NULL; }
void __sal_op_free(SalOp *op){ SalOpBase *b=(SalOpBase *)op; if (b->from_address){ sal_address_destroy(b->from_address); b->from_address=NULL; } if (b->to_address){ sal_address_destroy(b->to_address); b->to_address=NULL; } if (b->service_route){ sal_address_destroy(b->service_route); b->service_route=NULL; } if (b->origin_address){ sal_address_destroy(b->origin_address); b->origin_address=NULL; } if (b->from) { ms_free(b->from); b->from=NULL; } if (b->to) { ms_free(b->to); b->to=NULL; } if (b->route) { ms_free(b->route); b->route=NULL; } #ifndef USE_BELLESIP if (b->contact) { ms_free(b->contact); b->contact=NULL; } #else if (b->contact_address) { sal_address_destroy(b->contact_address); } #endif if (b->origin){ ms_free(b->origin); b->origin=NULL; } if (b->remote_ua){ ms_free(b->remote_ua); b->remote_ua=NULL; } if (b->remote_contact){ ms_free(b->remote_contact); b->remote_contact=NULL; } if (b->local_media) sal_media_description_unref(b->local_media); if (b->remote_media) sal_media_description_unref(b->remote_media); if (b->call_id) ms_free((void*)b->call_id); if (b->service_route) { sal_address_destroy(b->service_route); } if (b->route_addresses){ ms_list_for_each(b->route_addresses,(void (*)(void*)) sal_address_destroy); b->route_addresses=ms_list_free(b->route_addresses); } if (b->recv_custom_headers) sal_custom_header_free(b->recv_custom_headers); if (b->sent_custom_headers) sal_custom_header_free(b->sent_custom_headers); ms_free(op); }
void sal_op_set_contact_address(SalOp *op, const SalAddress *address){ if (((SalOpBase*)op)->contact_address) sal_address_destroy(((SalOpBase*)op)->contact_address); ((SalOpBase*)op)->contact_address=address?sal_address_clone(address):NULL; }
/** * Destroys a LinphoneAddress object. **/ void linphone_address_destroy(LinphoneAddress *u){ sal_address_destroy(u); }
void __sal_op_free(SalOp *op){ SalOpBase *b=(SalOpBase *)op; if (b->from_address){ sal_address_destroy(b->from_address); b->from_address=NULL; } if (b->to_address){ sal_address_destroy(b->to_address); b->to_address=NULL; } if (b->service_route){ sal_address_destroy(b->service_route); b->service_route=NULL; } if (b->origin_address){ sal_address_destroy(b->origin_address); b->origin_address=NULL; } if (b->from) { ms_free(b->from); b->from=NULL; } if (b->to) { ms_free(b->to); b->to=NULL; } if (b->route) { ms_free(b->route); b->route=NULL; } if (b->realm) { ms_free(b->realm); b->realm=NULL; } if (b->contact_address) { sal_address_destroy(b->contact_address); } if (b->origin){ ms_free(b->origin); b->origin=NULL; } if (b->remote_ua){ ms_free(b->remote_ua); b->remote_ua=NULL; } if (b->remote_contact){ ms_free(b->remote_contact); b->remote_contact=NULL; } if (b->remote_contact_address){ sal_address_destroy(b->remote_contact_address); } if (b->local_media) sal_media_description_unref(b->local_media); if (b->remote_media) sal_media_description_unref(b->remote_media); if (b->call_id) ms_free((void*)b->call_id); if (b->service_route) { sal_address_destroy(b->service_route); } if (b->route_addresses){ bctbx_list_for_each(b->route_addresses,(void (*)(void*)) sal_address_destroy); b->route_addresses=bctbx_list_free(b->route_addresses); } if (b->recv_custom_headers) sal_custom_header_free(b->recv_custom_headers); if (b->sent_custom_headers) sal_custom_header_free(b->sent_custom_headers); if (b->entity_tag != NULL){ ms_free(b->entity_tag); b->entity_tag = NULL; } ms_free(op); }
void sal_op_set_diversion_address(SalOp *op, const SalAddress *diversion){ if (((SalOpBase*)op)->diversion_address) sal_address_destroy(((SalOpBase*)op)->diversion_address); ((SalOpBase*)op)->diversion_address=diversion?sal_address_clone(diversion):NULL; }