Description: post to libexosip4 API Author: Felix Lechner Only in linphone-3.6.1: aclocal.m4 Only in linphone-3.6.1/build/macos: Makefile.in Only in linphone-3.6.1/build: Makefile.in Only in linphone-3.6.1: compile Only in linphone-3.6.1: config.guess Only in linphone-3.6.1: config.h.in Only in linphone-3.6.1: config.sub Only in linphone-3.6.1: configure Only in linphone-3.6.1/console: Makefile.in --- a/coreapi/authentication.c +++ b/coreapi/authentication.c @@ -308,7 +308,7 @@ void linphone_core_add_auth_info(Linphon sai.userid=ai->userid; sai.realm=ai->realm; sai.password=ai->passwd; - sal_op_authenticate(op,&sai); + sal_op_authenticate(lc->sal,op,&sai); ai->usecount++; } } --- a/coreapi/callbacks.c +++ b/coreapi/callbacks.c @@ -224,19 +224,19 @@ static void call_received(SalOp *h){ lc->presence_mode==LinphoneStatusDoNotDisturb || lc->presence_mode==LinphoneStatusMoved){ if (lc->presence_mode==LinphoneStatusBusy ) - sal_call_decline(h,SalReasonBusy,NULL); + sal_call_decline(lc->sal,h,SalReasonBusy,NULL); else if (lc->presence_mode==LinphoneStatusOffline) - sal_call_decline(h,SalReasonTemporarilyUnavailable,NULL); + sal_call_decline(lc->sal,h,SalReasonTemporarilyUnavailable,NULL); else if (lc->presence_mode==LinphoneStatusDoNotDisturb) - sal_call_decline(h,SalReasonTemporarilyUnavailable,NULL); + sal_call_decline(lc->sal,h,SalReasonTemporarilyUnavailable,NULL); else if (lc->alt_contact!=NULL && lc->presence_mode==LinphoneStatusMoved) - sal_call_decline(h,SalReasonRedirect,lc->alt_contact); - sal_op_release(h); + sal_call_decline(lc->sal,h,SalReasonRedirect,lc->alt_contact); + sal_op_release(lc->sal,h); return; } if (!linphone_core_can_we_add_call(lc)){/*busy*/ - sal_call_decline(h,SalReasonBusy,NULL); - sal_op_release(h); + sal_call_decline(lc->sal,h,SalReasonBusy,NULL); + sal_op_release(lc->sal,h); return; } from=sal_op_get_from(h); @@ -246,8 +246,8 @@ static void call_received(SalOp *h){ if ((already_a_call_with_remote_address(lc,from_addr) && prevent_colliding_calls) || already_a_call_pending(lc)){ ms_warning("Receiving another call while one is ringing or initiated, refusing this one with busy message."); - sal_call_decline(h,SalReasonBusy,NULL); - sal_op_release(h); + sal_call_decline(lc->sal,h,SalReasonBusy,NULL); + sal_op_release(lc->sal,h); linphone_address_destroy(from_addr); linphone_address_destroy(to_addr); return; @@ -449,7 +449,7 @@ static void call_accept_update(LinphoneC } #endif //BUILD_UPNP linphone_call_update_remote_session_id_and_ver(call); - sal_call_accept(call->op); + sal_call_accept(lc->sal,call->op); md=sal_call_get_final_media_description(call->op); if (md && !sal_media_description_empty(md)) linphone_core_update_streams(lc,call,md); @@ -701,7 +701,7 @@ static void auth_requested(SalOp *h, con sai.realm=ai->realm; sai.password=ai->passwd; ms_message("auth_requested(): authenticating realm=%s, username=%s",realm,username); - sal_op_authenticate(h,&sai); + sal_op_authenticate(lc->sal,h,&sai); ai->usecount++; ai->last_use_time=ms_time(NULL); }else{ @@ -936,6 +936,7 @@ static int op_equals(LinphoneCall *a, Sa return a->op !=b; /*return 0 if equals*/ } static void text_delivery_update(SalOp *op, SalTextDeliveryStatus status){ + LinphoneCore *lc=(LinphoneCore *)sal_get_user_pointer(sal_op_get_sal(op)); LinphoneChatMessage *chat_msg=(LinphoneChatMessage* )sal_op_get_user_pointer(op); const MSList* calls = linphone_core_get_calls(chat_msg->chat_room->lc); @@ -950,7 +951,7 @@ static void text_delivery_update(SalOp * if (!ms_list_find_custom((MSList*)calls, (MSCompareFunc) op_equals, op)) { /*op was only create for messaging purpose, destroying*/ - sal_op_release(op); + sal_op_release(lc->sal, op); } } --- a/coreapi/chat.c +++ b/coreapi/chat.c @@ -98,10 +98,10 @@ static void _linphone_chat_room_send_mes } if (msg->external_body_url) { content_type=ms_strdup_printf("message/external-body; access-type=URL; URL=\"%s\"",msg->external_body_url); - sal_message_send(op,identity,cr->peer,content_type, NULL); + sal_message_send(cr->lc->sal,op,identity,cr->peer,content_type, NULL); ms_free(content_type); } else { - sal_text_send(op, identity, cr->peer,msg->message); + sal_text_send(cr->lc->sal, op, identity, cr->peer,msg->message); } msg->dir=LinphoneChatMessageOutgoing; msg->from=linphone_address_new(identity); --- a/coreapi/friend.c +++ b/coreapi/friend.c @@ -131,13 +131,13 @@ void __linphone_friend_do_subscribe(Linp fr->lc->vtable.notify_recv(fr->lc,(LinphoneFriend*)fr); */ }else{ - sal_op_release(fr->outsub); + sal_op_release(fr->lc->sal,fr->outsub); fr->outsub=NULL; } fr->outsub=sal_op_new(fr->lc->sal); sal_op_set_route(fr->outsub,route); sal_op_set_contact(fr->outsub,fixed_contact); - sal_subscribe_presence(fr->outsub,from,friend); + sal_subscribe_presence(fr->lc->sal,fr->outsub,from,friend); fr->subscribe_active=TRUE; ms_free(friend); } @@ -278,13 +278,13 @@ void linphone_friend_notify(LinphoneFrie ms_message("Want to notify %s, insub=%p",addr,lf->insub); ms_free(addr); if (lf->insub!=NULL){ - sal_notify_presence(lf->insub,linphone_online_status_to_sal(os),NULL); + sal_notify_presence(lf->lc->sal,lf->insub,linphone_online_status_to_sal(os),NULL); } } static void linphone_friend_unsubscribe(LinphoneFriend *lf){ if (lf->outsub!=NULL) { - sal_unsubscribe(lf->outsub); + sal_unsubscribe(lf->lc->sal,lf->outsub); lf->subscribe_active=FALSE; } } @@ -292,18 +292,18 @@ static void linphone_friend_unsubscribe( void linphone_friend_close_subscriptions(LinphoneFriend *lf){ linphone_friend_unsubscribe(lf); if (lf->insub){ - sal_notify_close(lf->insub); + sal_notify_close(lf->lc->sal,lf->insub); } } void linphone_friend_destroy(LinphoneFriend *lf){ if (lf->insub) { - sal_op_release(lf->insub); + sal_op_release(lf->lc->sal,lf->insub); lf->insub=NULL; } if (lf->outsub){ - sal_op_release(lf->outsub); + sal_op_release(lf->lc->sal,lf->outsub); lf->outsub=NULL; } if (lf->uri!=NULL) linphone_address_destroy(lf->uri); --- a/coreapi/linphonecall.c +++ b/coreapi/linphonecall.c @@ -526,7 +526,7 @@ LinphoneCall * linphone_call_new_incomin from_str=linphone_address_as_string_uri_only(from); sal_op_set_route(call->ping_op,sal_op_get_network_origin(op)); sal_op_set_user_pointer(call->ping_op,call); - sal_ping(call->ping_op,linphone_core_find_best_identity(lc,from,NULL),from_str); + sal_ping(lc->sal,call->ping_op,linphone_core_find_best_identity(lc,from,NULL),from_str); ms_free(from_str); } } @@ -714,7 +714,7 @@ void linphone_call_set_state(LinphoneCal if (call->op!=NULL) { /* so that we cannot have anymore upcalls for SAL concerning this call*/ - sal_op_release(call->op); + sal_op_release(lc->sal,call->op); call->op=NULL; } linphone_call_unref(call); @@ -729,7 +729,7 @@ static void linphone_call_destroy(Linpho #endif //BUILD_UPNP linphone_call_delete_ice_session(obj); if (obj->op!=NULL) { - sal_op_release(obj->op); + sal_op_release(obj->core->sal,obj->op); obj->op=NULL; } if (obj->resultdesc!=NULL) { @@ -741,7 +741,7 @@ static void linphone_call_destroy(Linpho obj->localdesc=NULL; } if (obj->ping_op) { - sal_op_release(obj->ping_op); + sal_op_release(obj->core->sal,obj->ping_op); } if (obj->refer_to){ ms_free(obj->refer_to); @@ -956,7 +956,7 @@ int linphone_call_get_duration(const Lin * This function allows the application to know whether a new incoming call is a one that replaces another one. **/ LinphoneCall *linphone_call_get_replaced_call(LinphoneCall *call){ - SalOp *op=sal_call_get_replaces(call->op); + SalOp *op=sal_call_get_replaces(call->core->sal,call->op); if (op){ return (LinphoneCall*)sal_op_get_user_pointer(op); } @@ -987,7 +987,7 @@ void linphone_call_enable_camera (Linpho void linphone_call_send_vfu_request(LinphoneCall *call) { if (LinphoneCallStreamsRunning == linphone_call_get_state(call)) - sal_call_send_vfu_request(call->op); + sal_call_send_vfu_request(call->core->sal,call->op); } #endif --- a/coreapi/linphonecore.c +++ b/coreapi/linphonecore.c @@ -27,6 +27,11 @@ Foundation, Inc., 59 Temple Place - Suit #include #include #include + +#ifdef HAVE_EXOSIP2_EXOSIP_H +#include +#endif + #include "mediastreamer2/mediastream.h" #include "mediastreamer2/mseventqueue.h" #include "mediastreamer2/msvolume.h" @@ -1773,10 +1778,6 @@ int linphone_core_get_sip_port(LinphoneC static char _ua_name[64]="Linphone"; static char _ua_version[64]=LINPHONE_VERSION; -#ifdef HAVE_EXOSIP_GET_VERSION -extern const char *eXosip_get_version(); -#endif - static void apply_user_agent(LinphoneCore *lc){ char ua_string[256]; snprintf(ua_string,sizeof(ua_string)-1,"%s/%s (eXosip2/%s)",_ua_name,_ua_version, @@ -2302,7 +2303,7 @@ void linphone_core_start_refered_call(Li void linphone_core_notify_refer_state(LinphoneCore *lc, LinphoneCall *referer, LinphoneCall *newcall){ if (referer->op!=NULL){ - sal_call_notify_refer_state(referer->op,newcall ? newcall->op : NULL); + sal_call_notify_refer_state(lc->sal,referer->op,newcall ? newcall->op : NULL); } } @@ -2445,7 +2446,7 @@ int linphone_core_start_invite(LinphoneC } real_url=linphone_address_as_string(call->log->to); from=linphone_address_as_string(call->log->from); - err=sal_call(call->op,from,real_url); + err=sal_call(lc->sal,call->op,from,real_url); call->log->call_id=ms_strdup(sal_op_get_call_id(call->op)); /*must be known at that time*/ if (lc->sip_conf.sdp_200_ack){ @@ -2642,7 +2643,7 @@ LinphoneCall * linphone_core_invite_addr /*defer the start of the call after the OPTIONS ping*/ call->ping_replied=FALSE; call->ping_op=sal_op_new(lc->sal); - sal_ping(call->ping_op,from,real_url); + sal_ping(lc->sal,call->ping_op,from,real_url); sal_op_set_user_pointer(call->ping_op,call); call->start_time=time(NULL); defer = TRUE; @@ -2677,7 +2678,7 @@ int linphone_core_transfer_call(Linphone } //lc->call=NULL; //Do not do that you will lose the call afterward . . . real_url=linphone_address_as_string (real_parsed_url); - sal_call_refer(call->op,real_url); + sal_call_refer(lc->sal,call->op,real_url); ms_free(real_url); linphone_address_destroy(real_parsed_url); linphone_call_set_transfer_state(call, LinphoneCallOutgoingInit); @@ -2699,7 +2700,7 @@ int linphone_core_transfer_call(Linphone * close the call with us (the 'dest' call). **/ int linphone_core_transfer_call_to_another(LinphoneCore *lc, LinphoneCall *call, LinphoneCall *dest){ - int result = sal_call_refer_with_replaces (call->op,dest->op); + int result = sal_call_refer_with_replaces (lc->sal,call->op,dest->op); linphone_call_set_transfer_state(call, LinphoneCallOutgoingInit); return result; } @@ -2741,7 +2742,7 @@ void linphone_core_notify_incoming_call( md=sal_call_get_final_media_description(call->op); if (md){ if (sal_media_description_empty(md) || linphone_core_incompatible_security(lc,md)){ - sal_call_decline(call->op,SalReasonMedia,NULL); + sal_call_decline(lc->sal,call->op,SalReasonMedia,NULL); linphone_call_unref(call); return; } @@ -2785,14 +2786,14 @@ void linphone_core_notify_incoming_call( linphone_call_set_state(call,LinphoneCallIncomingReceived,"Incoming call"); if (call->state==LinphoneCallIncomingReceived){ - sal_call_notify_ringing(call->op,propose_early_media || ringback_tone!=NULL); + sal_call_notify_ringing(lc->sal,call->op,propose_early_media || ringback_tone!=NULL); if (propose_early_media || ringback_tone!=NULL){ linphone_call_set_state(call,LinphoneCallIncomingEarlyMedia,"Incoming call early media"); md=sal_call_get_final_media_description(call->op); linphone_core_update_streams(lc,call,md); } - if (sal_call_get_replaces(call->op)!=NULL && lp_config_get_int(lc->config,"sip","auto_answer_replacing_calls",1)){ + if (sal_call_get_replaces(lc->sal,call->op)!=NULL && lp_config_get_int(lc->config,"sip","auto_answer_replacing_calls",1)){ linphone_core_accept_call(lc,call); } } @@ -2821,7 +2822,7 @@ int linphone_core_start_update_call(Linp if (lc->vtable.display_status) lc->vtable.display_status(lc,_("Modifying call parameters...")); sal_call_set_local_media_description (call->op,call->localdesc); - return sal_call_update(call->op,subject); + return sal_call_update(lc->sal,call->op,subject); } /** @@ -2950,7 +2951,7 @@ int linphone_core_start_accept_call_upda #endif //BUILD_UPNP linphone_call_update_remote_session_id_and_ver(call); sal_call_set_local_media_description(call->op,call->localdesc); - sal_call_accept(call->op); + sal_call_accept(lc->sal,call->op); md=sal_call_get_final_media_description(call->op); if (md && !sal_media_description_empty(md)) linphone_core_update_streams (lc,call,md); @@ -2993,7 +2994,7 @@ int linphone_core_accept_call_update(Lin if (keep_sdp_version &&(remote_desc->session_id == call->remote_session_id) && (remote_desc->session_ver == call->remote_session_ver)) { /* Remote has sent an INVITE with the same SDP as before, so send a 200 OK with the same SDP as before. */ ms_warning("SDP version has not changed, send same SDP as before."); - sal_call_accept(call->op); + sal_call_accept(lc->sal,call->op); linphone_call_set_state(call,LinphoneCallStreamsRunning,"Connected (streams running)"); return 0; } @@ -3101,7 +3102,7 @@ int linphone_core_accept_call_with_param } /* check if this call is supposed to replace an already running one*/ - replaced=sal_call_get_replaces(call->op); + replaced=sal_call_get_replaces(lc->sal,call->op); if (replaced){ LinphoneCall *rc=(LinphoneCall*)sal_op_get_user_pointer (replaced); if (rc){ @@ -3159,7 +3160,7 @@ int linphone_core_accept_call_with_param } linphone_call_update_remote_session_id_and_ver(call); - sal_call_accept(call->op); + sal_call_accept(lc->sal,call->op); if (lc->vtable.display_status!=NULL) lc->vtable.display_status(lc,_("Connected.")); lc->current_call=call; @@ -3175,7 +3176,7 @@ int linphone_core_accept_call_with_param } int linphone_core_abort_call(LinphoneCore *lc, LinphoneCall *call, const char *error){ - sal_call_terminate(call->op); + sal_call_terminate(lc->sal,call->op); /*stop ringing*/ if (lc->ringstream!=NULL) { @@ -3218,7 +3219,7 @@ static void terminate_call(LinphoneCore int linphone_core_redirect_call(LinphoneCore *lc, LinphoneCall *call, const char *redirect_uri){ if (call->state==LinphoneCallIncomingReceived){ - sal_call_decline(call->op,SalReasonRedirect,redirect_uri); + sal_call_decline(lc->sal,call->op,SalReasonRedirect,redirect_uri); call->reason=LinphoneReasonDeclined; terminate_call(lc,call); }else{ @@ -3252,7 +3253,7 @@ int linphone_core_terminate_call(Linphon { call = the_call; } - sal_call_terminate(call->op); + sal_call_terminate(lc->sal,call->op); terminate_call(lc,call); return 0; } @@ -3284,7 +3285,7 @@ int linphone_core_decline_call(LinphoneC return -1; break; } - sal_call_decline(call->op,sal_reason,NULL); + sal_call_decline(lc->sal,call->op,sal_reason,NULL); terminate_call(lc,call); return 0; } @@ -3378,7 +3379,7 @@ int _linphone_core_pause_call(LinphoneCo return -1; } sal_call_set_local_media_description(call->op,call->localdesc); - if (sal_call_update(call->op,subject) != 0){ + if (sal_call_update(lc->sal,call->op,subject) != 0){ if (lc->vtable.display_warning) lc->vtable.display_warning(lc,_("Could not pause the call")); } @@ -3461,7 +3462,7 @@ int linphone_core_resume_call(LinphoneCo sal_call_set_local_media_description(call->op,call->localdesc); sal_media_description_set_dir(call->localdesc,SalStreamSendRecv); if (call->params.in_conference && !call->current_params.in_conference) subject="Conference"; - if(sal_call_update(call->op,subject) != 0){ + if(sal_call_update(lc->sal,call->op,subject) != 0){ return -1; } linphone_call_set_state (call,LinphoneCallResuming,"Resuming"); @@ -4177,7 +4178,7 @@ void linphone_core_send_dtmf(LinphoneCor } if (linphone_core_get_use_info_for_dtmf(lc)!=0){ /* Out of Band DTMF (use INFO method) */ - sal_call_send_dtmf(call->op,dtmf); + sal_call_send_dtmf(lc->sal,call->op,dtmf); } } --- a/coreapi/presence.c +++ b/coreapi/presence.c @@ -79,21 +79,21 @@ void linphone_subscription_new(LinphoneC if (linphone_find_friend(lc->friends,uri,&lf)!=NULL){ lf->insub=op; lf->inc_subscribe_pending=TRUE; - sal_subscribe_accept(op); + sal_subscribe_accept(lc->sal,op); linphone_friend_done(lf); /*this will do all necessary actions */ }else{ /* check if this subscriber is in our black list */ if (linphone_find_friend(lc->subscribers,uri,&lf)){ if (lf->pol==LinphoneSPDeny){ ms_message("Rejecting %s because we already rejected it once.",from); - sal_subscribe_decline(op); + sal_subscribe_decline(lc->sal,op); } else { /* else it is in wait for approval state, because otherwise it is in the friend list.*/ ms_message("New subscriber found in friend list, in %s state.",__policy_enum_to_str(lf->pol)); } }else { - sal_subscribe_accept(op); + sal_subscribe_accept(lc->sal,op); linphone_core_add_subscriber(lc,tmp,op); } } @@ -150,7 +150,7 @@ void linphone_notify_recv(LinphoneCore * ms_message("But this person is not part of our friend list, so we don't care."); } if (ss==SalSubscribeTerminated){ - sal_op_release(op); + sal_op_release(lc->sal,op); if (lf){ lf->outsub=NULL; lf->subscribe_active=FALSE; @@ -161,7 +161,7 @@ void linphone_notify_recv(LinphoneCore * void linphone_subscription_closed(LinphoneCore *lc, SalOp *op){ LinphoneFriend *lf; lf=linphone_find_friend_by_inc_subscribe(lc->friends,op); - sal_op_release(op); + sal_op_release(lc->sal,op); if (lf!=NULL){ lf->insub=NULL; }else{ --- a/coreapi/proxy.c +++ b/coreapi/proxy.c @@ -84,8 +84,8 @@ void linphone_proxy_config_destroy(Linph if (obj->realm!=NULL) ms_free(obj->realm); if (obj->type!=NULL) ms_free(obj->type); if (obj->dial_prefix!=NULL) ms_free(obj->dial_prefix); - if (obj->op) sal_op_release(obj->op); - if (obj->publish_op) sal_op_release(obj->publish_op); + if (obj->op) sal_op_release(obj->lc->sal, obj->op); + if (obj->publish_op) sal_op_release(obj->lc->sal,obj->publish_op); } /** @@ -245,7 +245,7 @@ void linphone_proxy_config_edit(Linphone if (obj->reg_sendregister){ /* unregister */ if (obj->state != LinphoneRegistrationNone && obj->state != LinphoneRegistrationCleared) { - sal_unregister(obj->op); + sal_unregister(obj->lc->sal,obj->op); } } } @@ -312,13 +312,13 @@ static void linphone_proxy_config_regist if (obj->reg_sendregister){ char *contact; if (obj->op) - sal_op_release(obj->op); + sal_op_release(obj->lc->sal,obj->op); obj->op=sal_op_new(obj->lc->sal); contact=guess_contact_for_register(obj); sal_op_set_contact(obj->op,contact); ms_free(contact); sal_op_set_user_pointer(obj->op,obj); - if (sal_register(obj->op,obj->reg_proxy,obj->reg_identity,obj->expires)==0) { + if (sal_register(obj->lc->sal,obj->op,obj->reg_proxy,obj->reg_identity,obj->expires)==0) { linphone_proxy_config_set_state(obj,LinphoneRegistrationProgress,"Registration in progress"); } else { linphone_proxy_config_set_state(obj,LinphoneRegistrationFailed,"Registration failed"); @@ -332,7 +332,7 @@ static void linphone_proxy_config_regist **/ void linphone_proxy_config_refresh_register(LinphoneProxyConfig *obj){ if (obj->reg_sendregister && obj->op){ - if (sal_register_refresh(obj->op,obj->expires) == 0) { + if (sal_register_refresh(obj->lc->sal,obj->op,obj->expires) == 0) { linphone_proxy_config_set_state(obj,LinphoneRegistrationProgress, "Refresh registration"); } } @@ -793,10 +793,10 @@ int linphone_proxy_config_send_publish(L int err; SalOp *op=sal_op_new(proxy->lc->sal); sal_op_set_route(op,proxy->reg_proxy); - err=sal_publish(op,linphone_proxy_config_get_identity(proxy), + err=sal_publish(proxy->lc->sal,op,linphone_proxy_config_get_identity(proxy), linphone_proxy_config_get_identity(proxy),linphone_online_status_to_sal(presence_mode)); if (proxy->publish_op!=NULL) - sal_op_release(proxy->publish_op); + sal_op_release(proxy->lc->sal, proxy->publish_op); proxy->publish_op=op; return err; } --- a/coreapi/sal_eXosip2.c +++ b/coreapi/sal_eXosip2.c @@ -46,7 +46,11 @@ void _osip_list_set_empty(osip_list_t *l } void sal_get_default_local_ip(Sal *sal, int address_family,char *ip, size_t iplen){ +#ifdef HAVE_STRUCT_EXOSIP_T + if (eXosip_guess_localip(sal->excontext, address_family, ip, iplen) < 0){ +#else if (eXosip_guess_localip(address_family,ip,iplen)<0){ +#endif /*default to something */ strncpy(ip,address_family==AF_INET6 ? "::1" : "127.0.0.1",iplen); ms_error("Could not find default routable ip address !"); @@ -185,14 +189,14 @@ bool_t sal_call_autoanswer_asked(SalOp * return op->auto_answer_asked; } -void sal_op_release(SalOp *op){ +void sal_op_release(Sal *ctx, SalOp *op){ if (op->sdp_answer) sdp_message_free(op->sdp_answer); if (op->pending_auth) eXosip_event_free(op->pending_auth); if (op->rid!=-1){ sal_remove_register(op->base.root,op->rid); - eXosip_register_remove(op->rid); + eXosip_register_remove(ctx->excontext, op->rid); } if (op->cid!=-1){ ms_message("Cleaning cid %i",op->cid); @@ -273,8 +277,14 @@ Sal * sal_init(){ osip_trace_initialize_func (OSIP_INFO4,&_osip_trace_func); firsttime=FALSE; } - eXosip_init(); sal=ms_new0(Sal,1); +#ifdef HAVE_STRUCT_EXOSIP_T + sal->excontext = eXosip_malloc(); + eXosip_init(sal->excontext); + /* order with ms_new0 changed, maybe free(sal) on error? */ +#else + eXosip_init(); +#endif sal->keepalive_period=30; sal->double_reg=TRUE; sal->use_rports=TRUE; @@ -290,7 +300,12 @@ Sal * sal_init(){ } void sal_uninit(Sal* sal){ +#ifdef HAVE_STRUCT_EXOSIP_T + eXosip_quit(sal->excontext); + free(sal->excontext); +#else eXosip_quit(); +#endif if (sal->rootCa) ms_free(sal->rootCa); ms_free(sal); @@ -348,8 +363,16 @@ void sal_set_callbacks(Sal *ctx, const S int sal_unlisten_ports(Sal *ctx){ if (ctx->running){ +#ifdef HAVE_STRUCT_EXOSIP_T + eXosip_quit(ctx->excontext); +#else eXosip_quit(); +#endif +#ifdef HAVE_STRUCT_EXOSIP_T + eXosip_init(ctx->excontext); +#else eXosip_init(); +#endif ctx->running=FALSE; } return 0; @@ -359,13 +382,17 @@ int sal_reset_transports(Sal *ctx){ #ifdef HAVE_EXOSIP_RESET_TRANSPORTS if (ctx->running){ ms_message("Exosip transports reset."); +#ifdef HAVE_STRUCT_EXOSIP_T + eXosip_reset_transports(ctx->excontext); +#else eXosip_reset_transports(); +#endif } return 0; -#else +#else /* HAVE_EXOSIP_RESET_TRANSPORTS */ ms_warning("sal_reset_transports() not implemented in this version."); return -1; -#endif +#endif /* HAVE_EXOSIP_RESET_TRANSPORTS */ } @@ -374,9 +401,16 @@ static void set_tls_options(Sal *ctx){ eXosip_tls_ctx_t tlsCtx; memset(&tlsCtx, 0, sizeof(tlsCtx)); snprintf(tlsCtx.root_ca_cert, sizeof(tlsCtx.client.cert), "%s", ctx->rootCa); +#ifdef EXOSIP_OPT_SET_TLS_CERTIFICATES_INFO + eXosip_set_option(ctx->excontext, EXOSIP_OPT_SET_TLS_CERTIFICATES_INFO, &tlsCtx); +#else eXosip_set_tls_ctx(&tlsCtx); - } -#ifdef HAVE_EXOSIP_TLS_VERIFY_CERTIFICATE +#endif + } +#ifdef EXOSIP_OPT_SET_TLS_VERIFY_CERTIFICATE + eXosip_set_option(ctx->excontext, EXOSIP_OPT_SET_TLS_VERIFY_CERTIFICATE, + &ctx->verify_server_certs); +#elif defined HAVE_EXOSIP_TLS_VERIFY_CERTIFICATE eXosip_tls_verify_certificate(ctx->verify_server_certs); #endif #ifdef HAVE_EXOSIP_TLS_VERIFY_CN @@ -386,10 +420,15 @@ static void set_tls_options(Sal *ctx){ void sal_set_dscp(Sal *ctx, int dscp){ ctx->dscp=dscp; -#ifdef HAVE_EXOSIP_DSCP - if (dscp!=-1) + if (dscp!=-1) { +#ifdef EXOSIP_OPT_SET_DSCP +#ifdef HAVE_STRUCT_EXOSIP_T + eXosip_set_option(ctx->excontext, EXOSIP_OPT_SET_DSCP, &ctx->dscp); +#else eXosip_set_option(EXOSIP_OPT_SET_DSCP,&ctx->dscp); #endif +#endif /* EXOSIP_OPT_SET_DSCP */ + } } int sal_listen_port(Sal *ctx, const char *addr, int port, SalTransport tr, int is_secure){ @@ -402,13 +441,21 @@ int sal_listen_port(Sal *ctx, const char switch (tr) { case SalTransportUDP: proto=IPPROTO_UDP; +#ifdef HAVE_STRUCT_EXOSIP_T + eXosip_set_option (ctx->excontext, EXOSIP_OPT_UDP_KEEP_ALIVE, &keepalive); +#else eXosip_set_option (EXOSIP_OPT_UDP_KEEP_ALIVE, &keepalive); +#endif break; case SalTransportTCP: case SalTransportTLS: proto= IPPROTO_TCP; if (!ctx->tcp_tls_keepalive) keepalive=-1; +#ifdef HAVE_STRUCT_EXOSIP_T + eXosip_set_option (ctx->excontext, EXOSIP_OPT_UDP_KEEP_ALIVE, &keepalive); +#else eXosip_set_option (EXOSIP_OPT_UDP_KEEP_ALIVE,&keepalive); +#endif set_tls_options(ctx); break; default: @@ -416,9 +463,15 @@ int sal_listen_port(Sal *ctx, const char } /*see if it looks like an IPv6 address*/ int use_rports = ctx->use_rports; // Copy char to int to avoid bad alignment +#ifdef HAVE_STRUCT_EXOSIP_T + eXosip_set_option(ctx->excontext, EXOSIP_OPT_USE_RPORT, &use_rports); +#else eXosip_set_option(EXOSIP_OPT_USE_RPORT,&use_rports); +#endif +#ifdef EXOSIP_OPT_DONT_SEND_101 int dont_use_101 = !ctx->use_101; // Copy char to int to avoid bad alignment eXosip_set_option(EXOSIP_OPT_DONT_SEND_101,&dont_use_101); +#endif sal_set_dscp(ctx,ctx->dscp); sal_use_dates(ctx,ctx->add_dates); @@ -429,7 +482,11 @@ int sal_listen_port(Sal *ctx, const char ms_fatal("SIP over DTLS is not supported yet."); return -1; } +#ifdef HAVE_STRUCT_EXOSIP_T + err=eXosip_listen_addr(ctx->excontext, proto, addr, port, ipv6 ? PF_INET6 : PF_INET, is_secure); +#else err=eXosip_listen_addr(proto, addr, port, ipv6 ? PF_INET6 : PF_INET, is_secure); +#endif ctx->running=TRUE; return err; } @@ -444,7 +501,11 @@ ortp_socket_t sal_get_socket(Sal *ctx){ } void sal_set_user_agent(Sal *ctx, const char *user_agent){ +#ifdef HAVE_STRUCT_EXOSIP_T + eXosip_set_user_agent(ctx->excontext, user_agent); +#else eXosip_set_user_agent(user_agent); +#endif } void sal_use_session_timers(Sal *ctx, int expires){ @@ -472,11 +533,15 @@ void sal_use_dates(Sal *ctx, bool_t enab #ifdef EXOSIP_OPT_REGISTER_WITH_DATE { int tmp=enabled; +#ifdef HAVE_STRUCT_EXOSIP_T + eXosip_set_option(ctx->excontext, EXOSIP_OPT_REGISTER_WITH_DATE, &tmp); +#else eXosip_set_option(EXOSIP_OPT_REGISTER_WITH_DATE,&tmp); +#endif } -#else +#else /* EXOSIP_OPT_REGISTER_WITH_DATE */ if (enabled) ms_warning("Exosip does not support EXOSIP_OPT_REGISTER_WITH_DATE option."); -#endif +#endif /* EXOSIP_OPT_REGISTER_WITH_DATE */ } void sal_use_rport(Sal *ctx, bool_t use_rports){ @@ -499,7 +564,9 @@ const char *sal_get_root_ca(Sal* ctx) { void sal_verify_server_certificates(Sal *ctx, bool_t verify){ ctx->verify_server_certs=verify; -#ifdef HAVE_EXOSIP_TLS_VERIFY_CERTIFICATE +#ifdef EXOSIP_OPT_SET_TLS_VERIFY_CERTIFICATE + eXosip_set_option(ctx->excontext, EXOSIP_OPT_SET_TLS_VERIFY_CERTIFICATE, &verify); +#elif defined HAVE_EXOSIP_TLS_VERIFY_CERTIFICATE eXosip_tls_verify_certificate(verify); #endif } @@ -626,7 +693,7 @@ int sal_call_set_local_media_description return 0; } -int sal_call(SalOp *h, const char *from, const char *to){ +int sal_call(Sal *ctx, SalOp *h, const char *from, const char *to){ int err; const char *route; osip_message_t *invite=NULL; @@ -638,7 +705,11 @@ int sal_call(SalOp *h, const char *from, h->terminated = FALSE; route = sal_op_get_route(h); +#ifdef HAVE_STRUCT_EXOSIP_T + err=eXosip_call_build_initial_invite(ctx->excontext, &invite, to, from, route, "Phone call"); +#else err=eXosip_call_build_initial_invite(&invite,to,from,route,"Phone call"); +#endif if (err!=0){ ms_error("Could not create call. Error %d (from=%s to=%s route=%s)", err, from, to, route); @@ -664,9 +735,21 @@ int sal_call(SalOp *h, const char *from, osip_message_set_header(invite,"Referred-By",h->referred_by); } +#ifdef HAVE_STRUCT_EXOSIP_T + eXosip_lock(ctx->excontext); +#else eXosip_lock(); +#endif +#ifdef HAVE_STRUCT_EXOSIP_T + err=eXosip_call_send_initial_invite(ctx->excontext, invite); +#else err=eXosip_call_send_initial_invite(invite); +#endif +#ifdef HAVE_STRUCT_EXOSIP_T + eXosip_unlock(ctx->excontext); +#else eXosip_unlock(); +#endif h->cid=err; if (err<0){ ms_error("Fail to send invite ! Error code %d", err); @@ -682,14 +765,22 @@ int sal_call(SalOp *h, const char *from, return 0; } -int sal_call_notify_ringing(SalOp *h, bool_t early_media){ +int sal_call_notify_ringing(Sal *ctx, SalOp *h, bool_t early_media){ osip_message_t *msg; /*if early media send also 180 and 183 */ if (early_media){ msg=NULL; +#ifdef HAVE_STRUCT_EXOSIP_T + eXosip_lock(ctx->excontext); +#else eXosip_lock(); +#endif +#ifdef HAVE_STRUCT_EXOSIP_T + eXosip_call_build_answer(ctx->excontext, h->tid, 183, &msg); +#else eXosip_call_build_answer(h->tid,183,&msg); +#endif if (msg){ sdp_process(h); if (h->sdp_answer){ @@ -697,22 +788,46 @@ int sal_call_notify_ringing(SalOp *h, bo sdp_message_free(h->sdp_answer); h->sdp_answer=NULL; } +#ifdef HAVE_STRUCT_EXOSIP_T + eXosip_call_send_answer(ctx->excontext, h->tid, 183, msg); +#else eXosip_call_send_answer(h->tid,183,msg); +#endif } +#ifdef HAVE_STRUCT_EXOSIP_T + eXosip_unlock(ctx->excontext); +#else eXosip_unlock(); +#endif }else{ +#ifdef HAVE_STRUCT_EXOSIP_T + eXosip_lock(ctx->excontext); +#else eXosip_lock(); +#endif +#ifdef HAVE_STRUCT_EXOSIP_T + eXosip_call_send_answer(ctx->excontext, h->tid, 180, NULL); +#else eXosip_call_send_answer(h->tid,180,NULL); +#endif +#ifdef HAVE_STRUCT_EXOSIP_T + eXosip_unlock(ctx->excontext); +#else eXosip_unlock(); +#endif } return 0; } -int sal_call_accept(SalOp * h){ +int sal_call_accept(Sal *ctx, SalOp * h){ osip_message_t *msg; const char *contact=sal_op_get_contact(h); /* sends a 200 OK */ +#ifdef HAVE_STRUCT_EXOSIP_T + int err=eXosip_call_build_answer(ctx->excontext, h->tid, 200, &msg); +#else int err=eXosip_call_build_answer(h->tid,200,&msg); +#endif if (err<0 || msg==NULL){ ms_error("Fail to build answer for call: err=%i",err); return -1; @@ -741,39 +856,107 @@ int sal_call_accept(SalOp * h){ }else{ ms_error("You are accepting a call but not defined any media capabilities !"); } +#ifdef HAVE_STRUCT_EXOSIP_T + eXosip_call_send_answer(ctx->excontext, h->tid, 200, msg); +#else eXosip_call_send_answer(h->tid,200,msg); +#endif return 0; } -int sal_call_decline(SalOp *h, SalReason reason, const char *redirect){ +int sal_call_decline(Sal * ctx, SalOp *h, SalReason reason, const char *redirect){ if (reason==SalReasonBusy){ +#ifdef HAVE_STRUCT_EXOSIP_T + eXosip_lock(ctx->excontext); +#else eXosip_lock(); +#endif +#ifdef HAVE_STRUCT_EXOSIP_T + eXosip_call_send_answer(ctx->excontext, h->tid, 486, NULL); +#else eXosip_call_send_answer(h->tid,486,NULL); +#endif +#ifdef HAVE_STRUCT_EXOSIP_T + eXosip_unlock(ctx->excontext); +#else eXosip_unlock(); +#endif } else if (reason==SalReasonTemporarilyUnavailable){ +#ifdef HAVE_STRUCT_EXOSIP_T + eXosip_lock(ctx->excontext); +#else eXosip_lock(); +#endif +#ifdef HAVE_STRUCT_EXOSIP_T + eXosip_call_send_answer(ctx->excontext, h->tid, 480, NULL); +#else eXosip_call_send_answer(h->tid,480,NULL); +#endif +#ifdef HAVE_STRUCT_EXOSIP_T + eXosip_unlock(ctx->excontext); +#else eXosip_unlock(); +#endif }else if (reason==SalReasonDoNotDisturb){ +#ifdef HAVE_STRUCT_EXOSIP_T + eXosip_lock(ctx->excontext); +#else eXosip_lock(); +#endif +#ifdef HAVE_STRUCT_EXOSIP_T + eXosip_call_send_answer(ctx->excontext, h->tid, 600, NULL); +#else eXosip_call_send_answer(h->tid,600,NULL); +#endif +#ifdef HAVE_STRUCT_EXOSIP_T + eXosip_unlock(ctx->excontext); +#else eXosip_unlock(); +#endif }else if (reason==SalReasonMedia){ +#ifdef HAVE_STRUCT_EXOSIP_T + eXosip_lock(ctx->excontext); +#else eXosip_lock(); +#endif +#ifdef HAVE_STRUCT_EXOSIP_T + eXosip_call_send_answer(ctx->excontext, h->tid, 415, NULL); +#else eXosip_call_send_answer(h->tid,415,NULL); +#endif +#ifdef HAVE_STRUCT_EXOSIP_T + eXosip_unlock(ctx->excontext); +#else eXosip_unlock(); +#endif }else if (redirect!=NULL && reason==SalReasonRedirect){ osip_message_t *msg; int code; if (strstr(redirect,"sip:")!=0) code=302; else code=380; +#ifdef HAVE_STRUCT_EXOSIP_T + eXosip_lock(ctx->excontext); +#else eXosip_lock(); +#endif +#ifdef HAVE_STRUCT_EXOSIP_T + eXosip_call_build_answer(ctx->excontext, h->tid, code, &msg); +#else eXosip_call_build_answer(h->tid,code,&msg); +#endif osip_message_set_contact(msg,redirect); +#ifdef HAVE_STRUCT_EXOSIP_T + eXosip_call_send_answer(ctx->excontext, h->tid, code, msg); +#else eXosip_call_send_answer(h->tid,code,msg); +#endif +#ifdef HAVE_STRUCT_EXOSIP_T + eXosip_unlock(ctx->excontext); +#else eXosip_unlock(); - }else sal_call_terminate(h); +#endif + }else sal_call_terminate(ctx, h); return 0; } @@ -796,39 +979,59 @@ int sal_call_set_referer(SalOp *h, SalOp return 0; } -static int send_notify_for_refer(int did, const char *sipfrag){ +static int send_notify_for_refer(Sal *ctx, int did, const char *sipfrag){ osip_message_t *msg; +#ifdef HAVE_STRUCT_EXOSIP_T + eXosip_lock(ctx->excontext); +#else eXosip_lock(); +#endif +#ifdef HAVE_STRUCT_EXOSIP_T + eXosip_call_build_notify(ctx->excontext, did, EXOSIP_SUBCRSTATE_ACTIVE, &msg); +#else eXosip_call_build_notify(did,EXOSIP_SUBCRSTATE_ACTIVE,&msg); +#endif if (msg==NULL){ +#ifdef HAVE_STRUCT_EXOSIP_T + eXosip_unlock(ctx->excontext); +#else eXosip_unlock(); +#endif ms_warning("Could not build NOTIFY for refer."); return -1; } osip_message_set_content_type(msg,"message/sipfrag"); osip_message_set_header(msg,"Event","refer"); osip_message_set_body(msg,sipfrag,strlen(sipfrag)); +#ifdef HAVE_STRUCT_EXOSIP_T + eXosip_call_send_request(ctx->excontext, did, msg); +#else eXosip_call_send_request(did,msg); +#endif +#ifdef HAVE_STRUCT_EXOSIP_T + eXosip_unlock(ctx->excontext); +#else eXosip_unlock(); +#endif return 0; } /* currently only support to notify trying and 200Ok*/ -int sal_call_notify_refer_state(SalOp *h, SalOp *newcall){ +int sal_call_notify_refer_state(Sal *ctx, SalOp *h, SalOp *newcall){ if (newcall==NULL){ /* in progress*/ - send_notify_for_refer(h->did,"SIP/2.0 100 Trying\r\n"); + send_notify_for_refer(ctx, h->did,"SIP/2.0 100 Trying\r\n"); } else if (newcall->cid!=-1){ if (newcall->did==-1){ /* not yet established*/ if (!newcall->terminated){ /* in progress*/ - send_notify_for_refer(h->did,"SIP/2.0 100 Trying\r\n"); + send_notify_for_refer(ctx, h->did,"SIP/2.0 100 Trying\r\n"); } }else{ if (!newcall->terminated){ - if (send_notify_for_refer(h->did,"SIP/2.0 200 Ok\r\n")==-1){ + if (send_notify_for_refer(ctx, h->did,"SIP/2.0 200 Ok\r\n")==-1){ /* we need previous notify transaction to complete, so buffer the request for later*/ h->sipfrag_pending="SIP/2.0 200 Ok\r\n"; } @@ -838,61 +1041,126 @@ int sal_call_notify_refer_state(SalOp *h return 0; } -int sal_ping(SalOp *op, const char *from, const char *to){ +int sal_ping(Sal *ctx, SalOp *op, const char *from, const char *to){ osip_message_t *options=NULL; sal_op_set_from(op,from); sal_op_set_to(op,to); sal_exosip_fix_route(op); +#ifdef HAVE_STRUCT_EXOSIP_T + eXosip_options_build_request (ctx->excontext, &options, sal_op_get_to(op), + sal_op_get_from(op),sal_op_get_route(op)); +#else eXosip_options_build_request (&options, sal_op_get_to(op), sal_op_get_from(op),sal_op_get_route(op)); +#endif if (options){ if (op->base.root->session_expires!=0){ osip_message_set_header(options, "Session-expires", "200"); osip_message_set_supported(options, "timer"); } sal_add_other(sal_op_get_sal(op),op,options); +#ifdef HAVE_STRUCT_EXOSIP_T + return eXosip_options_send_request(ctx->excontext, options); +#else return eXosip_options_send_request(options); +#endif } return -1; } -int sal_call_refer(SalOp *h, const char *refer_to){ +int sal_call_refer(Sal *ctx, SalOp *h, const char *refer_to){ osip_message_t *msg=NULL; int err=0; +#ifdef HAVE_STRUCT_EXOSIP_T + eXosip_lock(ctx->excontext); +#else eXosip_lock(); +#endif +#ifdef HAVE_STRUCT_EXOSIP_T + eXosip_call_build_refer(ctx->excontext, h->did, refer_to, &msg); +#else eXosip_call_build_refer(h->did,refer_to, &msg); - if (msg) err=eXosip_call_send_request(h->did, msg); +#endif + if (msg) { +#ifdef HAVE_STRUCT_EXOSIP_T + err=eXosip_call_send_request(ctx->excontext, h->did, msg); +#else + err=eXosip_call_send_request(h->did, msg); +#endif + } else err=-1; +#ifdef HAVE_STRUCT_EXOSIP_T + eXosip_unlock(ctx->excontext); +#else eXosip_unlock(); +#endif return err; } -int sal_call_refer_with_replaces(SalOp *h, SalOp *other_call_h){ +int sal_call_refer_with_replaces(Sal *ctx, SalOp *h, SalOp *other_call_h){ osip_message_t *msg=NULL; char referto[256]={0}; int err=0; +#ifdef HAVE_STRUCT_EXOSIP_T + eXosip_lock(ctx->excontext); +#else eXosip_lock(); +#endif +#ifdef HAVE_STRUCT_EXOSIP_T + if (eXosip_call_get_referto(ctx->excontext, other_call_h->did,referto,sizeof(referto)-1)!=0){ +#else if (eXosip_call_get_referto(other_call_h->did,referto,sizeof(referto)-1)!=0){ +#endif ms_error("eXosip_call_get_referto() failed for did=%i",other_call_h->did); +#ifdef HAVE_STRUCT_EXOSIP_T + eXosip_unlock(ctx->excontext); +#else eXosip_unlock(); +#endif return -1; } +#ifdef HAVE_STRUCT_EXOSIP_T + eXosip_call_build_refer(ctx->excontext, h->did,referto, &msg); +#else eXosip_call_build_refer(h->did,referto, &msg); +#endif osip_message_set_header(msg,"Referred-By",h->base.from); - if (msg) err=eXosip_call_send_request(h->did, msg); + if (msg) { +#ifdef HAVE_STRUCT_EXOSIP_T + err=eXosip_call_send_request(ctx->excontext, h->did, msg); +#else + err=eXosip_call_send_request(h->did, msg); +#endif + } else err=-1; +#ifdef HAVE_STRUCT_EXOSIP_T + eXosip_unlock(ctx->excontext); +#else eXosip_unlock(); +#endif return err; } -SalOp *sal_call_get_replaces(SalOp *h){ +SalOp *sal_call_get_replaces(Sal *ctx, SalOp *h){ if (h!=NULL && h->replaces!=NULL){ int cid; +#ifdef HAVE_STRUCT_EXOSIP_T + eXosip_lock(ctx->excontext); +#else eXosip_lock(); +#endif +#ifdef HAVE_STRUCT_EXOSIP_T + cid=eXosip_call_find_by_replaces(ctx->excontext, h->replaces); +#else cid=eXosip_call_find_by_replaces(h->replaces); +#endif +#ifdef HAVE_STRUCT_EXOSIP_T + eXosip_unlock(ctx->excontext); +#else eXosip_unlock(); +#endif if (cid>0){ SalOp *ret=sal_find_call(h->base.root,cid); return ret; @@ -901,48 +1169,81 @@ SalOp *sal_call_get_replaces(SalOp *h){ return NULL; } -int sal_call_send_dtmf(SalOp *h, char dtmf){ +int sal_call_send_dtmf(Sal *ctx, SalOp *h, char dtmf){ osip_message_t *msg=NULL; char dtmf_body[128]; char clen[10]; +#ifdef HAVE_STRUCT_EXOSIP_T + eXosip_lock(ctx->excontext); +#else eXosip_lock(); +#endif +#ifdef HAVE_STRUCT_EXOSIP_T + eXosip_call_build_info(ctx->excontext, h->did, &msg); +#else eXosip_call_build_info(h->did,&msg); +#endif if (msg){ snprintf(dtmf_body, sizeof(dtmf_body), "Signal=%c\r\nDuration=250\r\n", dtmf); osip_message_set_body(msg,dtmf_body,strlen(dtmf_body)); osip_message_set_content_type(msg,"application/dtmf-relay"); snprintf(clen,sizeof(clen),"%lu",(unsigned long)strlen(dtmf_body)); osip_message_set_content_length(msg,clen); +#ifdef HAVE_STRUCT_EXOSIP_T + eXosip_call_send_request(ctx->excontext, h->did, msg); +#else eXosip_call_send_request(h->did,msg); +#endif } +#ifdef HAVE_STRUCT_EXOSIP_T + eXosip_unlock(ctx->excontext); +#else eXosip_unlock(); +#endif return 0; } -static void push_auth_to_exosip(const SalAuthInfo *info){ +static void push_auth_to_exosip(Sal *ctx, const SalAuthInfo *info){ const char *userid; if (info->userid==NULL || info->userid[0]=='\0') userid=info->username; else userid=info->userid; ms_message("Authentication info for username [%s], id[%s], realm [%s] added to eXosip", info->username,userid, info->realm); +#ifdef HAVE_STRUCT_EXOSIP_T + eXosip_add_authentication_info (ctx->excontext, info->username,userid, + info->password, NULL,info->realm); +#else eXosip_add_authentication_info (info->username,userid, info->password, NULL,info->realm); +#endif } /* * Just for symmetry ;-) */ -static void pop_auth_from_exosip() { - eXosip_clear_authentication_info(); +static void pop_auth_from_exosip(Sal *ctx) { + eXosip_clear_authentication_info(ctx->excontext); } -int sal_call_terminate(SalOp *h){ +int sal_call_terminate(Sal *ctx, SalOp *h){ int err; if (h == NULL) return -1; - if (h->auth_info) push_auth_to_exosip(h->auth_info); + if (h->auth_info) push_auth_to_exosip(ctx, h->auth_info); +#ifdef HAVE_STRUCT_EXOSIP_T + eXosip_lock(ctx->excontext); +#else eXosip_lock(); +#endif +#ifdef HAVE_STRUCT_EXOSIP_T + err=eXosip_call_terminate(ctx->excontext, h->cid, h->did); +#else err=eXosip_call_terminate(h->cid,h->did); +#endif +#ifdef HAVE_STRUCT_EXOSIP_T + eXosip_unlock(ctx->excontext); +#else eXosip_unlock(); - if (!h->base.root->reuse_authorization) pop_auth_from_exosip(); +#endif + if (!h->base.root->reuse_authorization) pop_auth_from_exosip(ctx); if (err!=0){ ms_warning("Exosip could not terminate the call: cid=%i did=%i", h->cid,h->did); } @@ -950,7 +1251,7 @@ int sal_call_terminate(SalOp *h){ return 0; } -void sal_op_authenticate(SalOp *h, const SalAuthInfo *info){ +void sal_op_authenticate(Sal *ctx, SalOp *h, const SalAuthInfo *info){ bool_t terminating=FALSE; if (h->pending_auth && strcmp(h->pending_auth->request->sip_method,"BYE")==0) { terminating=TRUE; @@ -958,7 +1259,7 @@ void sal_op_authenticate(SalOp *h, const if (h->terminated && !terminating) return; if (h->pending_auth){ - push_auth_to_exosip(info); + push_auth_to_exosip(ctx, info); /*FIXME exosip does not take into account this update register message*/ /* @@ -967,11 +1268,23 @@ void sal_op_authenticate(SalOp *h, const }; */ update_contact_from_response(h,h->pending_auth->response); +#ifdef HAVE_STRUCT_EXOSIP_T + eXosip_lock(ctx->excontext); +#else eXosip_lock(); +#endif +#ifdef HAVE_STRUCT_EXOSIP_T + eXosip_default_action(ctx->excontext, h->pending_auth); +#else eXosip_default_action(h->pending_auth); +#endif +#ifdef HAVE_STRUCT_EXOSIP_T + eXosip_unlock(ctx->excontext); +#else eXosip_unlock(); +#endif ms_message("eXosip_default_action() done"); - if (!h->base.root->reuse_authorization) pop_auth_from_exosip(); + if (!h->base.root->reuse_authorization) pop_auth_from_exosip(ctx); if (h->auth_info) sal_auth_info_delete(h->auth_info); /*if already exist*/ h->auth_info=sal_auth_info_clone(info); /*store auth info for subsequent request*/ @@ -1210,9 +1523,21 @@ static int call_proceeding(Sal *sal, eXo if (op==NULL || op->terminated==TRUE) { ms_warning("This call has been canceled."); +#ifdef HAVE_STRUCT_EXOSIP_T + eXosip_lock(sal->excontext); +#else eXosip_lock(); +#endif +#ifdef HAVE_STRUCT_EXOSIP_T + eXosip_call_terminate(sal->excontext, ev->cid, ev->did); +#else eXosip_call_terminate(ev->cid,ev->did); +#endif +#ifdef HAVE_STRUCT_EXOSIP_T + eXosip_unlock(sal->excontext); +#else eXosip_unlock(); +#endif return -1; } if (ev->did>0) @@ -1249,9 +1574,21 @@ static void call_accepted(Sal *sal, eXos if (op==NULL || op->terminated==TRUE) { ms_warning("This call has been already terminated."); +#ifdef HAVE_STRUCT_EXOSIP_T + eXosip_lock(sal->excontext); +#else eXosip_lock(); +#endif +#ifdef HAVE_STRUCT_EXOSIP_T + eXosip_call_terminate(sal->excontext, ev->cid, ev->did); +#else eXosip_call_terminate(ev->cid,ev->did); +#endif +#ifdef HAVE_STRUCT_EXOSIP_T + eXosip_unlock(sal->excontext); +#else eXosip_unlock(); +#endif return ; } @@ -1266,12 +1603,28 @@ static void call_accepted(Sal *sal, eXos sdp_message_free(sdp); if (op->base.local_media) sdp_process(op); } +#ifdef HAVE_STRUCT_EXOSIP_T + eXosip_call_build_ack(sal->excontext, ev->did, &msg); +#else eXosip_call_build_ack(ev->did,&msg); +#endif if (msg==NULL) { ms_warning("This call has been already terminated."); +#ifdef HAVE_STRUCT_EXOSIP_T + eXosip_lock(sal->excontext); +#else eXosip_lock(); +#endif +#ifdef HAVE_STRUCT_EXOSIP_T + eXosip_call_terminate(sal->excontext, ev->cid, ev->did); +#else eXosip_call_terminate(ev->cid,ev->did); +#endif +#ifdef HAVE_STRUCT_EXOSIP_T + eXosip_unlock(sal->excontext); +#else eXosip_unlock(); +#endif return ; } contact=sal_op_get_contact(op); @@ -1284,7 +1637,11 @@ static void call_accepted(Sal *sal, eXos sdp_message_free(op->sdp_answer); op->sdp_answer=NULL; } +#ifdef HAVE_STRUCT_EXOSIP_T + eXosip_call_send_ack(sal->excontext, ev->did, msg); +#else eXosip_call_send_ack(ev->did,msg); +#endif sal->callbacks.call_accepted(op); } @@ -1458,7 +1815,11 @@ static bool_t call_failure(Sal *sal, eXo sr=SalReasonMedia; break; case 422: +#ifdef HAVE_STRUCT_EXOSIP_T + eXosip_default_action(sal->excontext, ev); +#else eXosip_default_action(ev); +#endif return TRUE; break; case 480: @@ -1494,7 +1855,7 @@ static bool_t call_failure(Sal *sal, eXo } /* Request remote side to send us VFU */ -void sal_call_send_vfu_request(SalOp *h){ +void sal_call_send_vfu_request(Sal *ctx, SalOp *h){ osip_message_t *msg=NULL; char info_body[] = "" @@ -1508,17 +1869,33 @@ void sal_call_send_vfu_request(SalOp *h) char clen[10]; +#ifdef HAVE_STRUCT_EXOSIP_T + eXosip_lock(ctx->excontext); +#else eXosip_lock(); +#endif +#ifdef HAVE_STRUCT_EXOSIP_T + eXosip_call_build_info(ctx->excontext, h->did, &msg); +#else eXosip_call_build_info(h->did,&msg); +#endif if (msg){ osip_message_set_body(msg,info_body,strlen(info_body)); osip_message_set_content_type(msg,"application/media_control+xml"); snprintf(clen,sizeof(clen),"%lu",(unsigned long)strlen(info_body)); osip_message_set_content_length(msg,clen); +#ifdef HAVE_STRUCT_EXOSIP_T + eXosip_call_send_request(ctx->excontext, h->did, msg); +#else eXosip_call_send_request(h->did,msg); +#endif ms_message("Sending VFU request !"); } +#ifdef HAVE_STRUCT_EXOSIP_T + eXosip_unlock(ctx->excontext); +#else eXosip_unlock(); +#endif } static void process_media_control_xml(Sal *sal, eXosip_event_t *ev){ @@ -1537,20 +1914,45 @@ static void process_media_control_xml(Sa ms_message("Receiving VFU request !"); if (sal->callbacks.vfu_request){ sal->callbacks.vfu_request(op); +#ifdef HAVE_STRUCT_EXOSIP_T + eXosip_call_build_answer(sal->excontext, ev->tid, 200, &ans); +#else eXosip_call_build_answer(ev->tid,200,&ans); +#endif if (ans) +#ifdef HAVE_STRUCT_EXOSIP_T + eXosip_call_send_answer(sal->excontext, ev->tid, 200, ans); +#else eXosip_call_send_answer(ev->tid,200,ans); +#endif return; } } /*in all other cases we must say it is not implemented.*/ { osip_message_t *ans=NULL; +#ifdef HAVE_STRUCT_EXOSIP_T + eXosip_lock(sal->excontext); +#else eXosip_lock(); +#endif +#ifdef HAVE_STRUCT_EXOSIP_T + eXosip_call_build_answer(sal->excontext, ev->tid, 501, &ans); +#else eXosip_call_build_answer(ev->tid,501,&ans); - if (ans) +#endif + if (ans) { +#ifdef HAVE_STRUCT_EXOSIP_T + eXosip_call_send_answer(sal->excontext, ev->tid, 501, ans); +#else eXosip_call_send_answer(ev->tid,501,ans); +#endif + } +#ifdef HAVE_STRUCT_EXOSIP_T + eXosip_unlock(sal->excontext); +#else eXosip_unlock(); +#endif } } @@ -1579,11 +1981,28 @@ static void process_dtmf_relay(Sal *sal, sal->callbacks.dtmf_received(op, tmp[0]); } } +#ifdef HAVE_STRUCT_EXOSIP_T + eXosip_lock(sal->excontext); +#else eXosip_lock(); +#endif +#ifdef HAVE_STRUCT_EXOSIP_T + eXosip_call_build_answer(sal->excontext, ev->tid, 200, &ans); +#else eXosip_call_build_answer(ev->tid,200,&ans); - if (ans) +#endif + if (ans) { +#ifdef HAVE_STRUCT_EXOSIP_T + eXosip_call_send_answer(sal->excontext, ev->tid, 200, ans); +#else eXosip_call_send_answer(ev->tid,200,ans); +#endif + } +#ifdef HAVE_STRUCT_EXOSIP_T + eXosip_unlock(sal->excontext); +#else eXosip_unlock(); +#endif } } @@ -1628,11 +2047,28 @@ static void process_refer(Sal *sal, SalO osip_free(tmp); osip_from_free(from); } +#ifdef HAVE_STRUCT_EXOSIP_T + eXosip_lock(sal->excontext); +#else eXosip_lock(); +#endif +#ifdef HAVE_STRUCT_EXOSIP_T + eXosip_call_build_answer(sal->excontext, ev->tid, 202, &ans); +#else eXosip_call_build_answer(ev->tid,202,&ans); - if (ans) +#endif + if (ans) { +#ifdef HAVE_STRUCT_EXOSIP_T + eXosip_call_send_answer(sal->excontext, ev->tid, 202, ans); +#else eXosip_call_send_answer(ev->tid,202,ans); +#endif + } +#ifdef HAVE_STRUCT_EXOSIP_T + eXosip_unlock(sal->excontext); +#else eXosip_unlock(); +#endif } else { @@ -1677,11 +2113,28 @@ static void process_notify(Sal *sal, eXo } } /*answer that we received the notify*/ +#ifdef HAVE_STRUCT_EXOSIP_T + eXosip_lock(sal->excontext); +#else eXosip_lock(); +#endif +#ifdef HAVE_STRUCT_EXOSIP_T + eXosip_call_build_answer(sal->excontext, ev->tid, 200, &ans); +#else eXosip_call_build_answer(ev->tid,200,&ans); - if (ans) +#endif + if (ans) { +#ifdef HAVE_STRUCT_EXOSIP_T + eXosip_call_send_answer(sal->excontext, ev->tid, 200, ans); +#else eXosip_call_send_answer(ev->tid,200,ans); +#endif + } +#ifdef HAVE_STRUCT_EXOSIP_T + eXosip_unlock(sal->excontext); +#else eXosip_unlock(); +#endif osip_free(from); } @@ -1699,28 +2152,79 @@ static void call_message_new(Sal *sal, e else { ms_message("Unhandled SIP INFO."); /*send an "Not implemented" answer*/ +#ifdef HAVE_STRUCT_EXOSIP_T + eXosip_lock(sal->excontext); +#else eXosip_lock(); +#endif +#ifdef HAVE_STRUCT_EXOSIP_T + eXosip_call_build_answer(sal->excontext, ev->tid, 501, &ans); +#else eXosip_call_build_answer(ev->tid,501,&ans); - if (ans) +#endif + if (ans) { +#ifdef HAVE_STRUCT_EXOSIP_T + eXosip_call_send_answer(sal->excontext, ev->tid, 501, ans); +#else eXosip_call_send_answer(ev->tid,501,ans); +#endif + } +#ifdef HAVE_STRUCT_EXOSIP_T + eXosip_unlock(sal->excontext); +#else eXosip_unlock(); +#endif } }else{ /*empty SIP INFO, probably to test we are alive. Send an empty answer*/ +#ifdef HAVE_STRUCT_EXOSIP_T + eXosip_lock(sal->excontext); +#else eXosip_lock(); +#endif +#ifdef HAVE_STRUCT_EXOSIP_T + eXosip_call_build_answer(sal->excontext, ev->tid, 200, &ans); +#else eXosip_call_build_answer(ev->tid,200,&ans); - if (ans) +#endif + if (ans) { +#ifdef HAVE_STRUCT_EXOSIP_T + eXosip_call_send_answer(sal->excontext, ev->tid, 200, ans); +#else eXosip_call_send_answer(ev->tid,200,ans); +#endif + } +#ifdef HAVE_STRUCT_EXOSIP_T + eXosip_unlock(sal->excontext); +#else eXosip_unlock(); +#endif } }else if(MSG_IS_MESSAGE(ev->request)){ /* SIP messages could be received into call */ text_received(sal, ev); +#ifdef HAVE_STRUCT_EXOSIP_T + eXosip_lock(sal->excontext); +#else eXosip_lock(); +#endif +#ifdef HAVE_STRUCT_EXOSIP_T + eXosip_call_build_answer(sal->excontext, ev->tid, 200, &ans); +#else eXosip_call_build_answer(ev->tid,200,&ans); - if (ans) +#endif + if (ans) { +#ifdef HAVE_STRUCT_EXOSIP_T + eXosip_call_send_answer(sal->excontext, ev->tid, 200, ans); +#else eXosip_call_send_answer(ev->tid,200,ans); +#endif + } +#ifdef HAVE_STRUCT_EXOSIP_T + eXosip_unlock(sal->excontext); +#else eXosip_unlock(); +#endif }else if(MSG_IS_REFER(ev->request)){ SalOp *op=find_op(sal,ev); @@ -1729,13 +2233,29 @@ static void call_message_new(Sal *sal, e }else if(MSG_IS_NOTIFY(ev->request)){ process_notify(sal,ev); }else if (MSG_IS_OPTIONS(ev->request)){ +#ifdef HAVE_STRUCT_EXOSIP_T + eXosip_lock(sal->excontext); +#else eXosip_lock(); +#endif +#ifdef HAVE_STRUCT_EXOSIP_T + eXosip_call_build_answer(sal->excontext, ev->tid, 200, &ans); +#else eXosip_call_build_answer(ev->tid,200,&ans); +#endif if (ans){ fill_options_answer(ans); +#ifdef HAVE_STRUCT_EXOSIP_T + eXosip_call_send_answer(sal->excontext, ev->tid, 200, ans); +#else eXosip_call_send_answer(ev->tid,200,ans); +#endif } +#ifdef HAVE_STRUCT_EXOSIP_T + eXosip_unlock(sal->excontext); +#else eXosip_unlock(); +#endif } }else ms_warning("call_message_new: No request ?"); } @@ -1743,11 +2263,28 @@ static void call_message_new(Sal *sal, e static void inc_update(Sal *sal, eXosip_event_t *ev){ osip_message_t *msg=NULL; ms_message("Processing incoming UPDATE"); +#ifdef HAVE_STRUCT_EXOSIP_T + eXosip_lock(sal->excontext); +#else eXosip_lock(); +#endif +#ifdef HAVE_STRUCT_EXOSIP_T + eXosip_message_build_answer(sal->excontext, ev->tid, 200, &msg); +#else eXosip_message_build_answer(ev->tid,200,&msg); - if (msg!=NULL) +#endif + if (msg!=NULL) { +#ifdef HAVE_STRUCT_EXOSIP_T + eXosip_message_send_answer(sal->excontext, ev->tid, 200, msg); +#else eXosip_message_send_answer(ev->tid,200,msg); +#endif + } +#ifdef HAVE_STRUCT_EXOSIP_T + eXosip_unlock(sal->excontext); +#else eXosip_unlock(); +#endif } static bool_t comes_from_local_if(osip_message_t *msg){ @@ -1865,7 +2402,7 @@ static void text_received(Sal *sal, eXos salmsg.message_id=message_id; salmsg.time=date!=NULL ? mktime_utc(&ret) : time(NULL); sal->callbacks.text_received(op,&salmsg); - sal_op_release(op); + sal_op_release(sal, op); osip_free(from); } @@ -1874,12 +2411,24 @@ static void other_request(Sal *sal, eXos if (ev->request==NULL) return; if (strcmp(ev->request->sip_method,"MESSAGE")==0){ text_received(sal,ev); +#ifdef HAVE_STRUCT_EXOSIP_T + eXosip_message_send_answer(sal->excontext, ev->tid, 200, NULL); +#else eXosip_message_send_answer(ev->tid,200,NULL); +#endif }else if (strcmp(ev->request->sip_method,"OPTIONS")==0){ osip_message_t *options=NULL; +#ifdef HAVE_STRUCT_EXOSIP_T + eXosip_options_build_answer(sal->excontext, ev->tid, 200, &options); +#else eXosip_options_build_answer(ev->tid,200,&options); +#endif fill_options_answer(options); +#ifdef HAVE_STRUCT_EXOSIP_T + eXosip_options_send_answer(sal->excontext, ev->tid, 200, options); +#else eXosip_options_send_answer(ev->tid,200,options); +#endif }else if (strncmp(ev->request->sip_method, "REFER", 5) == 0){ ms_message("Receiving REFER request !"); if (comes_from_local_if(ev->request)) { @@ -1896,7 +2445,11 @@ static void other_request(Sal *sal, eXos osip_free(tmp); } /*answer with a 501 Not implemented*/ +#ifdef HAVE_STRUCT_EXOSIP_T + eXosip_message_send_answer(sal->excontext, ev->tid, 501, NULL); +#else eXosip_message_send_answer(ev->tid,501,NULL); +#endif } } @@ -1959,7 +2512,7 @@ static bool_t fix_message_contact(SalOp return TRUE; } -static bool_t register_again_with_updated_contact(SalOp *op, osip_message_t *orig_request, osip_message_t *last_answer){ +static bool_t register_again_with_updated_contact(Sal *ctx, SalOp *op, osip_message_t *orig_request, osip_message_t *last_answer){ osip_contact_t *ctt=NULL; SalAddress* ori_contact_address=NULL; const char *received; @@ -2007,25 +2560,53 @@ static bool_t register_again_with_update ms_message("Contact do not match, resending register."); else return FALSE; +#ifdef HAVE_STRUCT_EXOSIP_T + eXosip_lock(ctx->excontext); +#else eXosip_lock(); +#endif +#ifdef HAVE_STRUCT_EXOSIP_T + eXosip_register_build_register(ctx->excontext, op->rid, op->expires, &msg); +#else eXosip_register_build_register(op->rid,op->expires,&msg); +#endif if (msg==NULL){ +#ifdef HAVE_STRUCT_EXOSIP_T + eXosip_unlock(ctx->excontext); +#else eXosip_unlock(); +#endif ms_warning("Fail to create a contact updated register."); return FALSE; } if (fix_message_contact(op,msg,last_answer,op->base.root->expire_old_contact)) { +#ifdef HAVE_STRUCT_EXOSIP_T + eXosip_register_send_register(ctx->excontext, op->rid, msg); +#else eXosip_register_send_register(op->rid,msg); +#endif +#ifdef HAVE_STRUCT_EXOSIP_T + eXosip_unlock(ctx->excontext); +#else eXosip_unlock(); +#endif ms_message("Resending new register with updated contact"); update_contact_from_response(op,last_answer); return TRUE; } else { ms_warning("Fail to send updated register."); +#ifdef HAVE_STRUCT_EXOSIP_T + eXosip_unlock(ctx->excontext); +#else eXosip_unlock(); +#endif return FALSE; } +#ifdef HAVE_STRUCT_EXOSIP_T + eXosip_unlock(ctx->excontext); +#else eXosip_unlock(); +#endif return FALSE; } @@ -2040,7 +2621,7 @@ static void registration_success(Sal *sa osip_message_get_expires(ev->request,0,&h); if (h!=NULL && atoi(h->hvalue)!=0){ registered=TRUE; - if (!register_again_with_updated_contact(op,ev->request,ev->response)){ + if (!register_again_with_updated_contact(sal,op,ev->request,ev->response)){ sal->callbacks.register_success(op,registered); } }else { @@ -2078,10 +2659,26 @@ static bool_t registration_failure(Sal * if (val>op->expires) op->expires=val; }else op->expires*=2; +#ifdef HAVE_STRUCT_EXOSIP_T + eXosip_lock(sal->excontext); +#else eXosip_lock(); +#endif +#ifdef HAVE_STRUCT_EXOSIP_T + eXosip_register_build_register(sal->excontext, op->rid, op->expires, &msg); +#else eXosip_register_build_register(op->rid,op->expires,&msg); +#endif +#ifdef HAVE_STRUCT_EXOSIP_T + eXosip_register_send_register(sal->excontext, op->rid, msg); +#else eXosip_register_send_register(op->rid,msg); +#endif +#ifdef HAVE_STRUCT_EXOSIP_T + eXosip_unlock(sal->excontext); +#else eXosip_unlock(); +#endif } break; case 606: /*Not acceptable, workaround for proxies that don't like private addresses @@ -2092,7 +2689,7 @@ static bool_t registration_failure(Sal * default: /* if contact is up to date, process the failure, otherwise resend a new register with updated contact first, just in case the faillure is due to incorrect contact */ - if (ev->response && register_again_with_updated_contact(op,ev->request,ev->response)) + if (ev->response && register_again_with_updated_contact(sal,op,ev->request,ev->response)) return TRUE; /*we are retrying with an updated contact*/ if (status_code==403){ se=SalErrorFailure; @@ -2136,7 +2733,7 @@ static void process_in_call_reply(Sal *s if (ev->response){ if (ev->request && strcmp(osip_message_get_method(ev->request),"NOTIFY")==0){ if (op->sipfrag_pending){ - send_notify_for_refer(op->did,op->sipfrag_pending); + send_notify_for_refer(sal, op->did,op->sipfrag_pending); op->sipfrag_pending=NULL; } } @@ -2156,7 +2753,9 @@ static bool_t process_event(Sal *sal, eX ms_message("CALL_CLOSED or CANCELLED\n"); call_terminated(sal,ev); break; +#ifdef EXOSIP_CALL_TIMEOUT case EXOSIP_CALL_TIMEOUT: +#endif case EXOSIP_CALL_NOANSWER: ms_message("CALL_TIMEOUT or NOANSWER\n"); return call_failure(sal,ev); @@ -2184,7 +2783,11 @@ static bool_t process_event(Sal *sal, eX break; case EXOSIP_CALL_REDIRECTED: ms_message("CALL_REDIRECTED"); +#ifdef HAVE_STRUCT_EXOSIP_T + eXosip_default_action(sal->excontext, ev); +#else eXosip_default_action(ev); +#endif break; case EXOSIP_CALL_PROCEEDING: ms_message("CALL_PROCEEDING"); @@ -2213,13 +2816,17 @@ static bool_t process_event(Sal *sal, eX ms_message("CALL_IN_SUBSCRIPTION_NEW "); sal_exosip_subscription_recv(sal,ev); break; +#ifdef EXOSIP_IN_SUBSCRIPTION_RELEASED case EXOSIP_IN_SUBSCRIPTION_RELEASED: ms_message("CALL_SUBSCRIPTION_NEW "); sal_exosip_in_subscription_closed(sal,ev); break; +#endif +#ifdef EXOSIP_SUBSCRIPTION_UPDATE case EXOSIP_SUBSCRIPTION_UPDATE: ms_message("CALL_SUBSCRIPTION_UPDATE"); break; +#endif case EXOSIP_SUBSCRIPTION_NOTIFY: ms_message("CALL_SUBSCRIPTION_NOTIFY"); sal_exosip_notify_recv(sal,ev); @@ -2228,10 +2835,12 @@ static bool_t process_event(Sal *sal, eX ms_message("EXOSIP_SUBSCRIPTION_ANSWERED, ev->sid=%i, ev->did=%i\n",ev->sid,ev->did); sal_exosip_subscription_answered(sal,ev); break; +#ifdef EXOSIP_SUBSCRIPTION_CLOSED case EXOSIP_SUBSCRIPTION_CLOSED: ms_message("EXOSIP_SUBSCRIPTION_CLOSED\n"); sal_exosip_subscription_closed(sal,ev); break; +#endif case EXOSIP_SUBSCRIPTION_REQUESTFAILURE: /**< announce a request failure */ if (ev->response && (ev->response->status_code == 407 || ev->response->status_code == 401)){ return process_authentication(sal,ev); @@ -2266,7 +2875,11 @@ static bool_t process_event(Sal *sal, eX case 401: return process_authentication(sal,ev); case 412: { +#ifdef HAVE_STRUCT_EXOSIP_T + eXosip_automatic_action (sal->excontext); +#else eXosip_automatic_action (); +#endif return 1; } } @@ -2282,22 +2895,50 @@ static bool_t process_event(Sal *sal, eX int sal_iterate(Sal *sal){ eXosip_event_t *ev; +#ifdef HAVE_STRUCT_EXOSIP_T + while((ev=eXosip_event_wait(sal->excontext, 0, 0))!=NULL){ +#else while((ev=eXosip_event_wait(0,0))!=NULL){ +#endif if (process_event(sal,ev)) eXosip_event_free(ev); } #ifdef HAVE_EXOSIP_TRYLOCK + if (eXosip_trylock()==0){ +#ifdef HAVE_STRUCT_EXOSIP_T + eXosip_automatic_refresh(sal->excontext); +#else eXosip_automatic_refresh(); +#endif +#ifdef HAVE_STRUCT_EXOSIP_T + eXosip_unlock(sal->excontext); +#else eXosip_unlock(); +#endif }else{ ms_warning("eXosip_trylock busy."); } + +#else /* HAVE_EXOSIP_TRYLOCK */ + +#ifdef HAVE_STRUCT_EXOSIP_T + eXosip_lock(sal->excontext); #else eXosip_lock(); +#endif +#ifdef HAVE_STRUCT_EXOSIP_T + eXosip_automatic_refresh(sal->excontext); +#else eXosip_automatic_refresh(); +#endif +#ifdef HAVE_STRUCT_EXOSIP_T + eXosip_unlock(sal->excontext); +#else eXosip_unlock(); #endif + +#endif /* HAVE_EXOSIP_TRYLOCK */ return 0; } @@ -2337,7 +2978,7 @@ void sal_message_add_route(osip_message_ } -int sal_register(SalOp *h, const char *proxy, const char *from, int expires){ +int sal_register(Sal *ctx, SalOp *h, const char *proxy, const char *from, int expires){ osip_message_t *msg; const char *contact=sal_op_get_contact(h); @@ -2361,31 +3002,60 @@ int sal_register(SalOp *h, const char *p } if (uri) ms_free(uri); sal_address_destroy(from_parsed); +#ifdef HAVE_STRUCT_EXOSIP_T + eXosip_lock(ctx->excontext); +#else eXosip_lock(); +#endif +#ifdef HAVE_STRUCT_EXOSIP_T + h->rid=eXosip_register_build_initial_register(ctx->excontext, from, domain, + NULL, expires, &msg); +#else h->rid=eXosip_register_build_initial_register(from,domain,NULL,expires,&msg); +#endif if (msg){ if (contact) register_set_contact(msg,contact); sal_message_add_route(msg,proxy); sal_add_register(h->base.root,h); }else{ ms_error("Could not build initial register."); +#ifdef HAVE_STRUCT_EXOSIP_T + eXosip_unlock(ctx->excontext); +#else eXosip_unlock(); +#endif return -1; } }else{ +#ifdef HAVE_STRUCT_EXOSIP_T + eXosip_lock(ctx->excontext); +#else eXosip_lock(); +#endif +#ifdef HAVE_STRUCT_EXOSIP_T + eXosip_register_build_register(ctx->excontext, h->rid, expires, &msg); +#else eXosip_register_build_register(h->rid,expires,&msg); +#endif sal_message_add_route(msg,proxy); } if (msg){ +#ifdef HAVE_STRUCT_EXOSIP_T + eXosip_register_send_register(ctx->excontext, h->rid, msg); +#else eXosip_register_send_register(h->rid,msg); +#endif } +#ifdef HAVE_STRUCT_EXOSIP_T + eXosip_unlock(ctx->excontext); +#else eXosip_unlock(); +#endif h->expires=expires; return (msg != NULL) ? 0 : -1; } -int sal_register_refresh(SalOp *op, int expires){ +int sal_register_refresh(Sal *ctx, SalOp *op, int expires){ osip_message_t *msg=NULL; const char *contact=sal_op_get_contact(op); @@ -2408,27 +3078,58 @@ int sal_register_refresh(SalOp *op, int } } } +#else /* HAVE_EXOSIP_TRYLOCK */ +#ifdef HAVE_STRUCT_EXOSIP_T + eXosip_lock(ctx->excontext); #else eXosip_lock(); #endif +#endif /* HAVE_EXOSIP_TRYLOCK */ +#ifdef HAVE_STRUCT_EXOSIP_T + eXosip_register_build_register(ctx->excontext, op->rid, expires, &msg); +#else eXosip_register_build_register(op->rid,expires,&msg); +#endif if (msg!=NULL){ if (contact) register_set_contact(msg,contact); sal_message_add_route(msg,sal_op_get_route(op)); +#ifdef HAVE_STRUCT_EXOSIP_T + eXosip_register_send_register(ctx->excontext, op->rid, msg); +#else eXosip_register_send_register(op->rid,msg); +#endif }else ms_error("Could not build REGISTER refresh message."); +#ifdef HAVE_STRUCT_EXOSIP_T + eXosip_unlock(ctx->excontext); +#else eXosip_unlock(); +#endif return (msg != NULL) ? 0 : -1; } - -int sal_unregister(SalOp *h){ +int sal_unregister(Sal *ctx, SalOp *h){ osip_message_t *msg=NULL; +#ifdef HAVE_STRUCT_EXOSIP_T + eXosip_lock(ctx->excontext); +#else eXosip_lock(); - eXosip_register_build_register(h->rid,0,&msg); +#endif +#ifdef HAVE_STRUCT_EXOSIP_T + eXosip_register_build_register(ctx->excontext, h->rid, 0, &msg); +#else + eXosip_register_build_register(h->rid, 0, &msg); +#endif +#ifdef HAVE_STRUCT_EXOSIP_T + if (msg) eXosip_register_send_register(ctx->excontext, h->rid,msg); +#else if (msg) eXosip_register_send_register(h->rid,msg); +#endif else ms_warning("Could not build unREGISTER !"); +#ifdef HAVE_STRUCT_EXOSIP_T + eXosip_unlock(ctx->excontext); +#else eXosip_unlock(); +#endif return 0; } @@ -2598,8 +3299,13 @@ void sal_set_keepalive_period(Sal *ctx,u default: break; } +#ifdef HAVE_STRUCT_EXOSIP_T + eXosip_set_option (ctx->excontext, EXOSIP_OPT_UDP_KEEP_ALIVE, &ctx->keepalive_period); +#else eXosip_set_option (EXOSIP_OPT_UDP_KEEP_ALIVE, &ctx->keepalive_period); +#endif } + unsigned int sal_get_keepalive_period(Sal *ctx) { return ctx->keepalive_period; } @@ -2632,16 +3338,32 @@ void sal_address_set_transport(SalAddres } /* sends a reinvite. Local media description may have changed by application since call establishment*/ -int sal_call_update(SalOp *h, const char *subject){ +int sal_call_update(Sal *sal, SalOp *h, const char *subject){ int err=0; osip_message_t *reinvite=NULL; +#ifdef HAVE_STRUCT_EXOSIP_T + eXosip_lock(sal->excontext); +#else eXosip_lock(); +#endif +#ifdef HAVE_STRUCT_EXOSIP_T + if(eXosip_call_build_request(sal->excontext, h->did, "INVITE", &reinvite) != 0 || reinvite==NULL){ +#else if(eXosip_call_build_request(h->did,"INVITE",&reinvite) != 0 || reinvite==NULL){ +#endif +#ifdef HAVE_STRUCT_EXOSIP_T + eXosip_unlock(sal->excontext); +#else eXosip_unlock(); +#endif return -1; } +#ifdef HAVE_STRUCT_EXOSIP_T + eXosip_unlock(sal->excontext); +#else eXosip_unlock(); +#endif osip_message_set_subject(reinvite,subject); osip_message_set_allow(reinvite, "INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, NOTIFY, MESSAGE, SUBSCRIBE, INFO"); if (h->base.contact){ @@ -2656,9 +3378,21 @@ int sal_call_update(SalOp *h, const char h->sdp_offering=TRUE; set_sdp_from_desc(reinvite,h->base.local_media); }else h->sdp_offering=FALSE; +#ifdef HAVE_STRUCT_EXOSIP_T + eXosip_lock(sal->excontext); +#else eXosip_lock(); +#endif +#ifdef HAVE_STRUCT_EXOSIP_T + err = eXosip_call_send_request(sal->excontext, h->did, reinvite); +#else err = eXosip_call_send_request(h->did, reinvite); +#endif +#ifdef HAVE_STRUCT_EXOSIP_T + eXosip_unlock(sal->excontext); +#else eXosip_unlock(); +#endif return err; } --- a/coreapi/sal_eXosip2.h +++ b/coreapi/sal_eXosip2.h @@ -53,6 +53,9 @@ struct Sal{ bool_t expire_old_contact; bool_t add_dates; bool_t tcp_tls_keepalive; +#ifdef HAVE_STRUCT_EXOSIP_T + struct eXosip_t *excontext; +#endif }; struct SalOp{ --- a/coreapi/sal_eXosip2_presence.c +++ b/coreapi/sal_eXosip2_presence.c @@ -17,6 +17,9 @@ along with this program; if not, write t Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif #include "sal_eXosip2.h" @@ -101,7 +104,7 @@ static void msg_add_current_date(osip_me } -int sal_message_send(SalOp *op, const char *from, const char *to, const char* content_type, const char *msg){ +int sal_message_send(Sal *ctx, SalOp *op, const char *from, const char *to, const char* content_type, const char *msg){ osip_message_t *sip=NULL; if(op->cid == -1) @@ -113,68 +116,126 @@ int sal_message_send(SalOp *op, const ch sal_op_set_to(op,to); sal_exosip_fix_route(op); +#ifdef HAVE_STRUCT_EXOSIP_T + eXosip_lock(ctx->excontext); +#else eXosip_lock(); +#endif +#ifdef HAVE_STRUCT_EXOSIP_T + eXosip_message_build_request(ctx->excontext, &sip, "MESSAGE", sal_op_get_to(op), + sal_op_get_from(op),sal_op_get_route(op)); +#else eXosip_message_build_request(&sip,"MESSAGE",sal_op_get_to(op), sal_op_get_from(op),sal_op_get_route(op)); +#endif if (sip!=NULL){ sal_exosip_add_custom_headers(sip,op->base.custom_headers); msg_add_current_date(sip); osip_message_set_content_type(sip,content_type); if (msg) osip_message_set_body(sip,msg,strlen(msg)); sal_add_other(op->base.root,op,sip); +#ifdef HAVE_STRUCT_EXOSIP_T + eXosip_message_send_request(ctx->excontext, sip); +#else eXosip_message_send_request(sip); +#endif }else{ ms_error("Could not build MESSAGE request !"); } +#ifdef HAVE_STRUCT_EXOSIP_T + eXosip_unlock(ctx->excontext); +#else eXosip_unlock(); +#endif } else { /* we are currently in communication with the destination */ +#ifdef HAVE_STRUCT_EXOSIP_T + eXosip_lock(ctx->excontext); +#else eXosip_lock(); +#endif //First we generate an INFO message to get the current call_id and a good cseq +#ifdef HAVE_STRUCT_EXOSIP_T + eXosip_call_build_request(ctx->excontext, op->did, "MESSAGE", &sip); +#else eXosip_call_build_request(op->did,"MESSAGE",&sip); +#endif if(sip == NULL) { ms_warning("could not get a build info to send MESSAGE, maybe no previous call established ?"); +#ifdef HAVE_STRUCT_EXOSIP_T + eXosip_unlock(ctx->excontext); +#else eXosip_unlock(); +#endif return -1; } sal_exosip_add_custom_headers(sip,op->base.custom_headers); msg_add_current_date(sip); osip_message_set_content_type(sip,content_type); if (msg) osip_message_set_body(sip,msg,strlen(msg)); +#ifdef HAVE_STRUCT_EXOSIP_T + eXosip_call_send_request(ctx->excontext, op->did, sip); +#else eXosip_call_send_request(op->did,sip); +#endif +#ifdef HAVE_STRUCT_EXOSIP_T + eXosip_unlock(ctx->excontext); +#else eXosip_unlock(); +#endif } return 0; } -int sal_text_send(SalOp *op, const char *from, const char *to, const char *msg) { - return sal_message_send(op,from,to,"text/plain",msg); +int sal_text_send(Sal *ctx, SalOp *op, const char *from, const char *to, const char *msg) { + return sal_message_send(ctx,op,from,to,"text/plain",msg); } /*presence Subscribe/notify*/ -int sal_subscribe_presence(SalOp *op, const char *from, const char *to){ +int sal_subscribe_presence(Sal *ctx, SalOp *op, const char *from, const char *to){ osip_message_t *msg=NULL; if (from) sal_op_set_from(op,from); if (to) sal_op_set_to(op,to); sal_exosip_fix_route(op); +#ifdef HAVE_STRUCT_EXOSIP_T + eXosip_lock(ctx->excontext); +#else eXosip_lock(); +#endif +#ifdef HAVE_STRUCT_EXOSIP_T + eXosip_subscribe_build_initial_request(ctx->excontext, &msg, sal_op_get_to(op), + sal_op_get_from(op), sal_op_get_route(op), "presence", 600); +#else eXosip_subscribe_build_initial_request(&msg,sal_op_get_to(op),sal_op_get_from(op), sal_op_get_route(op),"presence",600); +#endif if (msg==NULL){ ms_error("Could not build subscribe request to %s",to); +#ifdef HAVE_STRUCT_EXOSIP_T + eXosip_unlock(ctx->excontext); +#else eXosip_unlock(); +#endif return -1; } if (op->base.contact){ _osip_list_set_empty(&msg->contacts,(void (*)(void*))osip_contact_free); osip_message_set_contact(msg,op->base.contact); } +#ifdef HAVE_STRUCT_EXOSIP_T + op->sid=eXosip_subscribe_send_initial_request(ctx->excontext, msg); +#else op->sid=eXosip_subscribe_send_initial_request(msg); +#endif +#ifdef HAVE_STRUCT_EXOSIP_T + eXosip_unlock(ctx->excontext); +#else eXosip_unlock(); +#endif if (op->sid==-1){ osip_message_free(msg); return -1; @@ -183,45 +244,93 @@ int sal_subscribe_presence(SalOp *op, co return 0; } -int sal_unsubscribe(SalOp *op){ +int sal_unsubscribe(Sal *ctx, SalOp *op){ osip_message_t *msg=NULL; if (op->did==-1){ ms_error("cannot unsubscribe, no dialog !"); return -1; } +#ifdef HAVE_STRUCT_EXOSIP_T + eXosip_lock(ctx->excontext); +#else eXosip_lock(); +#endif +#ifdef HAVE_STRUCT_EXOSIP_T + eXosip_subscribe_build_refresh_request(ctx->excontext, op->did, &msg); +#else eXosip_subscribe_build_refresh_request(op->did,&msg); +#endif if (msg){ osip_message_set_expires(msg,"0"); +#ifdef HAVE_STRUCT_EXOSIP_T + eXosip_subscribe_send_refresh_request(ctx->excontext, op->did, msg); +#else eXosip_subscribe_send_refresh_request(op->did,msg); +#endif }else ms_error("Could not build subscribe refresh request ! op->sid=%i, op->did=%i", op->sid,op->did); +#ifdef HAVE_STRUCT_EXOSIP_T + eXosip_unlock(ctx->excontext); +#else eXosip_unlock(); +#endif return 0; } -int sal_subscribe_accept(SalOp *op){ +int sal_subscribe_accept(Sal *ctx, SalOp *op){ osip_message_t *msg=NULL; +#ifdef HAVE_STRUCT_EXOSIP_T + eXosip_lock(ctx->excontext); +#else eXosip_lock(); +#endif +#ifdef HAVE_STRUCT_EXOSIP_T + eXosip_insubscription_build_answer(ctx->excontext, op->tid, 202, &msg); +#else eXosip_insubscription_build_answer(op->tid,202,&msg); +#endif if (msg==NULL){ ms_error("Fail to build answer to subscribe."); +#ifdef HAVE_STRUCT_EXOSIP_T + eXosip_unlock(ctx->excontext); +#else eXosip_unlock(); +#endif return -1; } if (op->base.contact){ _osip_list_set_empty(&msg->contacts,(void (*)(void*))osip_contact_free); osip_message_set_contact(msg,op->base.contact); } +#ifdef HAVE_STRUCT_EXOSIP_T + eXosip_insubscription_send_answer(ctx->excontext, op->tid, 202, msg); +#else eXosip_insubscription_send_answer(op->tid,202,msg); +#endif +#ifdef HAVE_STRUCT_EXOSIP_T + eXosip_unlock(ctx->excontext); +#else eXosip_unlock(); +#endif return 0; } -int sal_subscribe_decline(SalOp *op){ +int sal_subscribe_decline(Sal *ctx, SalOp *op){ +#ifdef HAVE_STRUCT_EXOSIP_T + eXosip_lock(ctx->excontext); +#else eXosip_lock(); +#endif +#ifdef HAVE_STRUCT_EXOSIP_T + eXosip_insubscription_send_answer(ctx->excontext, op->tid, 401, NULL); +#else eXosip_insubscription_send_answer(op->tid,401,NULL); +#endif +#ifdef HAVE_STRUCT_EXOSIP_T + eXosip_unlock(ctx->excontext); +#else eXosip_unlock(); +#endif return 0; } @@ -595,45 +704,82 @@ static void add_presence_body(osip_messa } -int sal_notify_presence(SalOp *op, SalPresenceStatus status, const char *status_message){ +int sal_notify_presence(Sal *ctx, SalOp *op, SalPresenceStatus status, const char *status_message){ osip_message_t *msg=NULL; +#if 1 + enum eXosip_ss ss=EXOSIP_SUBCRSTATE_ACTIVE; +#else eXosip_ss_t ss=EXOSIP_SUBCRSTATE_ACTIVE; +#endif if (op->nid==-1){ ms_warning("Cannot notify, subscription was closed."); return -1; } +#ifdef HAVE_STRUCT_EXOSIP_T + eXosip_lock(ctx->excontext); +#else eXosip_lock(); +#endif +#ifdef HAVE_STRUCT_EXOSIP_T + eXosip_insubscription_build_notify(ctx->excontext, op->did, ss, DEACTIVATED, &msg); +#else eXosip_insubscription_build_notify(op->did,ss,DEACTIVATED,&msg); +#endif if (msg!=NULL){ const char *identity=sal_op_get_contact(op); if (identity==NULL) identity=sal_op_get_to(op); _osip_list_set_empty(&msg->contacts,(void (*)(void*))osip_contact_free); osip_message_set_contact(msg,identity); add_presence_body(msg,status); +#ifdef HAVE_STRUCT_EXOSIP_T + eXosip_insubscription_send_request(ctx->excontext, op->did, msg); +#else eXosip_insubscription_send_request(op->did,msg); +#endif }else ms_error("could not create notify for incoming subscription."); +#ifdef HAVE_STRUCT_EXOSIP_T + eXosip_unlock(ctx->excontext); +#else eXosip_unlock(); +#endif return 0; } -int sal_notify_close(SalOp *op){ +int sal_notify_close(Sal *ctx, SalOp *op){ osip_message_t *msg=NULL; +#ifdef HAVE_STRUCT_EXOSIP_T + eXosip_lock(ctx->excontext); +#else eXosip_lock(); +#endif +#ifdef HAVE_STRUCT_EXOSIP_T + eXosip_insubscription_build_notify(ctx->excontext, op->did, EXOSIP_SUBCRSTATE_TERMINATED, + DEACTIVATED, &msg); +#else eXosip_insubscription_build_notify(op->did,EXOSIP_SUBCRSTATE_TERMINATED,DEACTIVATED,&msg); +#endif if (msg!=NULL){ const char *identity=sal_op_get_contact(op); if (identity==NULL) identity=sal_op_get_to(op); osip_message_set_contact(msg,identity); add_presence_body(msg,SalPresenceOffline); +#ifdef HAVE_STRUCT_EXOSIP_T + eXosip_insubscription_send_request(ctx->excontext, op->did, msg); +#else eXosip_insubscription_send_request(op->did,msg); +#endif }else ms_error("sal_notify_close(): could not create notify for incoming subscription" " did=%i, nid=%i",op->did,op->nid); +#ifdef HAVE_STRUCT_EXOSIP_T + eXosip_unlock(ctx->excontext); +#else eXosip_unlock(); +#endif return 0; } -int sal_publish(SalOp *op, const char *from, const char *to, SalPresenceStatus presence_mode){ +int sal_publish(Sal *ctx, SalOp *op, const char *from, const char *to, SalPresenceStatus presence_mode){ osip_message_t *pub; int i; char buf[1024]; @@ -641,8 +787,13 @@ int sal_publish(SalOp *op, const char *f mk_presence_body (presence_mode, from, buf, sizeof (buf), presence_style); +#ifdef HAVE_STRUCT_EXOSIP_T + i = eXosip_build_publish(ctx->excontext, &pub, to, from, NULL, "presence", "600", + presence_style ? "application/xpidf+xml" : "application/pidf+xml", buf); +#else i = eXosip_build_publish(&pub,to, from, NULL, "presence", "600", presence_style ? "application/xpidf+xml" : "application/pidf+xml", buf); +#endif if (i<0){ ms_warning("Failed to build publish request."); return -1; @@ -650,10 +801,23 @@ int sal_publish(SalOp *op, const char *f if (route) sal_message_add_route(pub,route); +#ifdef HAVE_STRUCT_EXOSIP_T + eXosip_lock(ctx->excontext); +#else eXosip_lock(); +#endif +#ifdef HAVE_STRUCT_EXOSIP_T + i = eXosip_publish(ctx->excontext, pub, to); /* should update the sip-if-match parameter + from sip-etag from last 200ok of PUBLISH */ +#else i = eXosip_publish(pub, to); /* should update the sip-if-match parameter from sip-etag from last 200ok of PUBLISH */ +#endif +#ifdef HAVE_STRUCT_EXOSIP_T + eXosip_unlock(ctx->excontext); +#else eXosip_unlock(); +#endif if (i<0){ ms_message("Failed to send publish request."); return -1; @@ -693,10 +857,26 @@ void sal_exosip_subscription_recv(Sal *s }else { osip_message_t *msg=NULL; ms_warning("Probably a refresh subscribe"); +#ifdef HAVE_STRUCT_EXOSIP_T + eXosip_lock(sal->excontext); +#else eXosip_lock(); +#endif +#ifdef HAVE_STRUCT_EXOSIP_T + eXosip_insubscription_build_answer(sal->excontext, ev->tid, 202, &msg); +#else eXosip_insubscription_build_answer(ev->tid,202,&msg); +#endif +#ifdef HAVE_STRUCT_EXOSIP_T + eXosip_insubscription_send_answer(sal->excontext, ev->tid, 202, msg); +#else eXosip_insubscription_send_answer(ev->tid,202,msg); +#endif +#ifdef HAVE_STRUCT_EXOSIP_T + eXosip_unlock(sal->excontext); +#else eXosip_unlock(); +#endif } }else _sal_exosip_subscription_recv(sal,ev); } --- a/coreapi/sal.h +++ b/coreapi/sal.h @@ -382,8 +382,8 @@ void sal_op_set_contact(SalOp *op, const void sal_op_set_route(SalOp *op, const char *route); void sal_op_set_from(SalOp *op, const char *from); void sal_op_set_to(SalOp *op, const char *to); -void sal_op_release(SalOp *h); -void sal_op_authenticate(SalOp *h, const SalAuthInfo *info); +void sal_op_release(Sal *ctx, SalOp *h); +void sal_op_authenticate(Sal *ctx, SalOp *h, const SalAuthInfo *info); void sal_op_cancel_authentication(SalOp *h); void sal_op_set_user_pointer(SalOp *h, void *up); int sal_op_get_auth_requested(SalOp *h, const char **realm, const char **username); @@ -402,51 +402,51 @@ const char* sal_op_get_call_id(const Sal /*Call API*/ int sal_call_set_local_media_description(SalOp *h, SalMediaDescription *desc); -int sal_call(SalOp *h, const char *from, const char *to); -int sal_call_notify_ringing(SalOp *h, bool_t early_media); +int sal_call(Sal *ctx, SalOp *h, const char *from, const char *to); +int sal_call_notify_ringing(Sal *ctx, SalOp *h, bool_t early_media); /*accept an incoming call or, during a call accept a reINVITE*/ -int sal_call_accept(SalOp*h); -int sal_call_decline(SalOp *h, SalReason reason, const char *redirection /*optional*/); -int sal_call_update(SalOp *h, const char *subject); +int sal_call_accept(Sal *ctx, SalOp *h); +int sal_call_decline(Sal *ctx, SalOp *h, SalReason reason, const char *redirection /*optional*/); +int sal_call_update(Sal *sal, SalOp *h, const char *subject); SalMediaDescription * sal_call_get_remote_media_description(SalOp *h); SalMediaDescription * sal_call_get_final_media_description(SalOp *h); -int sal_call_refer(SalOp *h, const char *refer_to); -int sal_call_refer_with_replaces(SalOp *h, SalOp *other_call_h); +int sal_call_refer(Sal *ctx, SalOp *h, const char *refer_to); +int sal_call_refer_with_replaces(Sal *ctx, SalOp *h, SalOp *other_call_h); int sal_call_accept_refer(SalOp *h); /*informs this call is consecutive to an incoming refer */ int sal_call_set_referer(SalOp *h, SalOp *refered_call); /* returns the SalOp of a call that should be replaced by h, if any */ -SalOp *sal_call_get_replaces(SalOp *h); -int sal_call_send_dtmf(SalOp *h, char dtmf); -int sal_call_terminate(SalOp *h); +SalOp *sal_call_get_replaces(Sal *ctx, SalOp *h); +int sal_call_send_dtmf(Sal *ctx, SalOp *h, char dtmf); +int sal_call_terminate(Sal *ctx, SalOp *h); bool_t sal_call_autoanswer_asked(SalOp *op); -void sal_call_send_vfu_request(SalOp *h); +void sal_call_send_vfu_request(Sal *ctx, SalOp *h); int sal_call_is_offerer(const SalOp *h); -int sal_call_notify_refer_state(SalOp *h, SalOp *newcall); +int sal_call_notify_refer_state(Sal *ctx, SalOp *h, SalOp *newcall); /*Registration*/ -int sal_register(SalOp *op, const char *proxy, const char *from, int expires); -int sal_register_refresh(SalOp *op, int expires); -int sal_unregister(SalOp *h); +int sal_register(Sal *ctx, SalOp *op, const char *proxy, const char *from, int expires); +int sal_register_refresh(Sal *ctx, SalOp *op, int expires); +int sal_unregister(Sal *ctx, SalOp *h); /*Messaging */ -int sal_text_send(SalOp *op, const char *from, const char *to, const char *text); -int sal_message_send(SalOp *op, const char *from, const char *to, const char* content_type, const char *msg); +int sal_text_send(Sal *ctx, SalOp *op, const char *from, const char *to, const char *text); +int sal_message_send(Sal *ctx, SalOp *op, const char *from, const char *to, const char* content_type, const char *msg); /*presence Subscribe/notify*/ -int sal_subscribe_presence(SalOp *op, const char *from, const char *to); -int sal_unsubscribe(SalOp *op); -int sal_subscribe_accept(SalOp *op); -int sal_subscribe_decline(SalOp *op); -int sal_notify_presence(SalOp *op, SalPresenceStatus status, const char *status_message); -int sal_notify_close(SalOp *op); +int sal_subscribe_presence(Sal *ctx, SalOp *op, const char *from, const char *to); +int sal_unsubscribe(Sal *ctx, SalOp *op); +int sal_subscribe_accept(Sal *ctx, SalOp *op); +int sal_subscribe_decline(Sal *ctx, SalOp *op); +int sal_notify_presence(Sal *ctx, SalOp *op, SalPresenceStatus status, const char *status_message); +int sal_notify_close(Sal *ctx, SalOp *op); /*presence publish */ -int sal_publish(SalOp *op, const char *from, const char *to, SalPresenceStatus status); +int sal_publish(Sal *ctx, SalOp *op, const char *from, const char *to, SalPresenceStatus status); /*ping: main purpose is to obtain its own contact address behind firewalls*/ -int sal_ping(SalOp *op, const char *from, const char *to); +int sal_ping(Sal *ctx, SalOp *op, const char *from, const char *to); --- a/m4/exosip.m4 +++ b/m4/exosip.m4 @@ -13,64 +13,30 @@ case $host_alias in ;; esac + dnl eXosip embeded stuff EXOSIP_CFLAGS="$OSIP_CFLAGS -DOSIP_MT " -EXOSIP_LIBS="$OSIP_LIBS -leXosip2 " +EXOSIP_LIBS="$OSIP_LIBS -leXosip2 " + -CPPFLAGS_save=$CPPFLAGS -CPPFLAGS="$OSIP_CFLAGS $CPPFLAGS" -AC_CHECK_HEADER([eXosip2/eXosip.h], ,AC_MSG_ERROR([Could not find eXosip2 headers !])) - -dnl check exosip support of DSCP in exosip -AC_MSG_CHECKING([for DSCP support in exosip]) -AC_TRY_COMPILE([#include ], - [int dscp=0;eXosip_set_option(EXOSIP_OPT_SET_DSCP,&dscp);], - has_exosip_dscp=yes, - has_exosip_dscp=no +dnl check for eXosip2 headers +AC_CHECK_HEADERS([eXosip2/eXosip.h], + [], [AC_MSG_ERROR([Could not find eXosip2 headers])] ) -AC_MSG_RESULT($has_exosip_dscp) -if test "$has_exosip_dscp" = "yes" ; then - AC_DEFINE( HAVE_EXOSIP_DSCP, 1, [Define if exosip dscp available] ) -fi -CPPFLAGS=$CPPFLAGS_save +dnl check for eXosip2 libs +AC_SEARCH_LIBS([eXosip_init], [eXosip2], + [], [AC_MSG_ERROR([Could not find eXosip2 library])] +) +AC_CHECK_FUNCS([ eXosip_malloc eXosip_set_tls_ctx eXosip_get_version eXosip_tls_verify_certificate eXosip_tls_verify_cn eXosip_trylock eXosip_reset_transports ]) +if test "x$ac_cv_func_eXosip_malloc" == xyes; then + AC_DEFINE([HAVE_STRUCT_EXOSIP_T], [1], [Define if struct eXosip_t exists.]) +elif test "x$ac_cv_func_eXosip_set_tls_ctx" != xyes; then + AC_MSG_ERROR([Could not find eXosip2 library with version >= 3.5.0 !]) +fi -dnl check for eXosip2 libs -LDFLAGS_save=$LDFLAGS -LDFLAGS="$OSIP_LIBS $LDFLAGS $OPENSSL_LIBS" -LIBS_save=$LIBS -AC_CHECK_LIB([eXosip2],[eXosip_set_tls_ctx], - [], - [AC_MSG_ERROR([Could not find eXosip2 library with version >= 3.5.0 !])], - [-losipparser2 -losip2 ]) -AC_CHECK_LIB([eXosip2],[eXosip_get_version], - [AC_DEFINE([HAVE_EXOSIP_GET_VERSION],[1],[Defined when eXosip_get_version is available])], - [], - [-losipparser2 -losip2 ]) -AC_CHECK_LIB([eXosip2],[eXosip_tls_verify_certificate], - [AC_DEFINE([HAVE_EXOSIP_TLS_VERIFY_CERTIFICATE],[1],[Defined when eXosip_tls_verify_certificate is available])], - [AC_MSG_WARN([Could not find eXosip_tls_verify_certificate in eXosip2 !])], - [-losipparser2 -losip2 ]) -AC_CHECK_LIB([eXosip2],[eXosip_tls_verify_cn], - [AC_DEFINE([HAVE_EXOSIP_TLS_VERIFY_CN],[1],[Defined when eXosip_tls_verify_certificate is available])], - [AC_MSG_WARN([Could not find eXosip_tls_verify_cn in eXosip2 !])], - [-losipparser2 -losip2 ]) -AC_CHECK_LIB([eXosip2],[eXosip_trylock], - [AC_DEFINE([HAVE_EXOSIP_TRYLOCK],[1],[Defined when eXosip_get_socket is available])], - [], - [-losipparser2 -losip2 ]) -AC_CHECK_LIB([eXosip2],[eXosip_reset_transports], - [AC_DEFINE([HAVE_EXOSIP_RESET_TRANSPORTS],[1],[Defined when eXosip_reset_transports is available])], - [], - [-losipparser2 -losip2 ]) -dnl AC_CHECK_LIB([eXosip2],[eXosip_get_naptr], -dnl [AC_DEFINE([HAVE_EXOSIP_NAPTR_SUPPORT],[1],[Defined when eXosip_get_naptr is available])], -dnl [], -dnl [-losipparser2 -losip2 ]) -LIBS=$LIBS_save -LDFLAGS=$LDFLAGS_save AC_SUBST(EXOSIP_CFLAGS) AC_SUBST(EXOSIP_LIBS)