3 Copyright (C) 2010 Simon MORLAT (simon.morlat@free.fr)
5 This program is free software; you can redistribute it and/or
6 modify it under the terms of the GNU General Public License
7 as published by the Free Software Foundation; either version 2
8 of the License, or (at your option) any later version.
10 This program is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 GNU General Public License for more details.
15 You should have received a copy of the GNU General Public License
16 along with this program; if not, write to the Free Software
17 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
23 #include "sal_eXosip2.h"
25 #include "offeranswer.h"
28 // Necessary to make it linked
29 static void for_linker() { eXosip_transport_hook_register(NULL); }
31 static bool_t call_failure(Sal *sal, eXosip_event_t *ev);
33 static void text_received(Sal *sal, eXosip_event_t *ev);
35 static void masquerade_via(osip_message_t *msg, const char *ip, const char *port);
36 static bool_t fix_message_contact(SalOp *op, osip_message_t *request,osip_message_t *last_answer, bool_t expire_last_contact);
37 static void update_contact_from_response(SalOp *op, osip_message_t *response);
39 void _osip_list_set_empty(osip_list_t *l, void (*freefunc)(void*)){
41 while(!osip_list_eol(l,0)) {
42 data=osip_list_get(l,0);
43 osip_list_remove(l,0);
44 if (data) freefunc(data);
48 void sal_get_default_local_ip(Sal *sal, int address_family,char *ip, size_t iplen){
49 if (eXosip_guess_localip(address_family,ip,iplen)<0){
50 /*default to something */
51 strncpy(ip,address_family==AF_INET6 ? "::1" : "127.0.0.1",iplen);
52 ms_error("Could not find default routable ip address !");
57 static SalOp * sal_find_call(Sal *sal, int cid){
60 for(elem=sal->calls;elem!=NULL;elem=elem->next){
61 op=(SalOp*)elem->data;
62 if (op->cid==cid) return op;
67 static void sal_add_call(Sal *sal, SalOp *op){
68 sal->calls=ms_list_append(sal->calls,op);
71 static void sal_remove_call(Sal *sal, SalOp *op){
72 sal->calls=ms_list_remove(sal->calls, op);
75 static SalOp * sal_find_register(Sal *sal, int rid){
78 for(elem=sal->registers;elem!=NULL;elem=elem->next){
79 op=(SalOp*)elem->data;
80 if (op->rid==rid) return op;
85 static void sal_add_register(Sal *sal, SalOp *op){
86 sal->registers=ms_list_append(sal->registers,op);
89 static void sal_remove_register(Sal *sal, int rid){
92 for(elem=sal->registers;elem!=NULL;elem=elem->next){
93 op=(SalOp*)elem->data;
95 sal->registers=ms_list_remove_link(sal->registers,elem);
101 static SalOp * sal_find_other(Sal *sal, osip_message_t *response){
104 osip_call_id_t *callid=osip_message_get_call_id(response);
106 ms_error("There is no call-id in this response !");
109 for(elem=sal->other_transactions;elem!=NULL;elem=elem->next){
110 op=(SalOp*)elem->data;
111 if (osip_call_id_match(callid,op->call_id)==0) return op;
116 void sal_add_other(Sal *sal, SalOp *op, osip_message_t *request){
117 osip_call_id_t *callid=osip_message_get_call_id(request);
119 ms_error("There is no call id in the request !");
122 osip_call_id_clone(callid,&op->call_id);
123 sal->other_transactions=ms_list_append(sal->other_transactions,op);
126 static void sal_remove_other(Sal *sal, SalOp *op){
127 sal->other_transactions=ms_list_remove(sal->other_transactions,op);
131 static void sal_add_pending_auth(Sal *sal, SalOp *op){
132 sal->pending_auths=ms_list_append(sal->pending_auths,op);
136 static void sal_remove_pending_auth(Sal *sal, SalOp *op){
137 sal->pending_auths=ms_list_remove(sal->pending_auths,op);
140 void sal_exosip_fix_route(SalOp *op){
141 if (sal_op_get_route(op)!=NULL){
142 osip_route_t *rt=NULL;
143 osip_uri_param_t *lr_param=NULL;
145 osip_route_init(&rt);
146 if (osip_route_parse(rt,sal_op_get_route(op))<0){
147 ms_warning("Bad route %s!",sal_op_get_route(op));
148 sal_op_set_route(op,NULL);
150 /* check if the lr parameter is set , if not add it */
151 osip_uri_uparam_get_byname(rt->url, "lr", &lr_param);
154 osip_uri_uparam_add(rt->url,osip_strdup("lr"),NULL);
155 osip_route_to_str(rt,&tmproute);
156 sal_op_set_route(op,tmproute);
164 SalOp * sal_op_new(Sal *sal){
165 SalOp *op=ms_new0(SalOp,1);
166 __sal_op_init(op,sal);
167 op->cid=op->did=op->tid=op->rid=op->nid=op->sid=-1;
169 op->supports_session_timers=FALSE;
170 op->sdp_offering=TRUE;
171 op->pending_auth=NULL;
176 op->referred_by=NULL;
177 op->masquerade_via=FALSE;
178 op->auto_answer_asked=FALSE;
180 op->terminated=FALSE;
184 bool_t sal_call_autoanswer_asked(SalOp *op)
186 return op->auto_answer_asked;
189 void sal_op_release(SalOp *op){
191 sdp_message_free(op->sdp_answer);
192 if (op->pending_auth)
193 eXosip_event_free(op->pending_auth);
195 sal_remove_register(op->base.root,op->rid);
196 eXosip_register_remove(op->rid);
199 ms_message("Cleaning cid %i",op->cid);
200 sal_remove_call(op->base.root,op);
203 sal_remove_out_subscribe(op->base.root,op);
206 sal_remove_in_subscribe(op->base.root,op);
208 osip_call_id_free(op->call_id);
211 if (op->pending_auth){
212 sal_remove_pending_auth(op->base.root,op);
215 sal_media_description_unref(op->result);
217 sal_remove_other(op->base.root,op);
218 osip_call_id_free(op->call_id);
221 ms_free(op->replaces);
223 if (op->referred_by){
224 ms_free(op->referred_by);
227 sal_auth_info_delete(op->auth_info);
232 static void _osip_trace_func(char *fi, int li, osip_trace_level_t level, char *chfr, va_list ap){
233 int ortp_level=ORTP_DEBUG;
239 ortp_level=ORTP_MESSAGE;
242 ortp_level=ORTP_WARNING;
246 ortp_level=ORTP_ERROR;
249 ortp_level=ORTP_FATAL;
251 case END_TRACE_LEVEL:
254 if (ortp_log_level_enabled(level)){
255 int len=strlen(chfr);
256 char *chfrdup=ortp_strdup(chfr);
257 /*need to remove endline*/
259 if (chfrdup[len-1]=='\n')
261 if (chfrdup[len-2]=='\r')
264 ortp_logv(ortp_level,chfrdup,ap);
271 static bool_t firsttime=TRUE;
274 osip_trace_initialize_func (OSIP_INFO4,&_osip_trace_func);
279 sal->keepalive_period=30;
280 sal->double_reg=TRUE;
281 sal->use_rports=TRUE;
283 sal->reuse_authorization=FALSE;
285 sal->verify_server_certs=TRUE;
286 sal->expire_old_contact=FALSE;
290 void sal_uninit(Sal* sal){
293 ms_free(sal->rootCa);
297 void sal_set_user_pointer(Sal *sal, void *user_data){
301 void *sal_get_user_pointer(const Sal *sal){
305 static void unimplemented_stub(){
306 ms_warning("Unimplemented SAL callback");
309 void sal_set_callbacks(Sal *ctx, const SalCallbacks *cbs){
310 memcpy(&ctx->callbacks,cbs,sizeof(*cbs));
311 if (ctx->callbacks.call_received==NULL)
312 ctx->callbacks.call_received=(SalOnCallReceived)unimplemented_stub;
313 if (ctx->callbacks.call_ringing==NULL)
314 ctx->callbacks.call_ringing=(SalOnCallRinging)unimplemented_stub;
315 if (ctx->callbacks.call_accepted==NULL)
316 ctx->callbacks.call_accepted=(SalOnCallAccepted)unimplemented_stub;
317 if (ctx->callbacks.call_failure==NULL)
318 ctx->callbacks.call_failure=(SalOnCallFailure)unimplemented_stub;
319 if (ctx->callbacks.call_terminated==NULL)
320 ctx->callbacks.call_terminated=(SalOnCallTerminated)unimplemented_stub;
321 if (ctx->callbacks.call_released==NULL)
322 ctx->callbacks.call_released=(SalOnCallReleased)unimplemented_stub;
323 if (ctx->callbacks.call_updating==NULL)
324 ctx->callbacks.call_updating=(SalOnCallUpdating)unimplemented_stub;
325 if (ctx->callbacks.auth_requested==NULL)
326 ctx->callbacks.auth_requested=(SalOnAuthRequested)unimplemented_stub;
327 if (ctx->callbacks.auth_success==NULL)
328 ctx->callbacks.auth_success=(SalOnAuthSuccess)unimplemented_stub;
329 if (ctx->callbacks.register_success==NULL)
330 ctx->callbacks.register_success=(SalOnRegisterSuccess)unimplemented_stub;
331 if (ctx->callbacks.register_failure==NULL)
332 ctx->callbacks.register_failure=(SalOnRegisterFailure)unimplemented_stub;
333 if (ctx->callbacks.dtmf_received==NULL)
334 ctx->callbacks.dtmf_received=(SalOnDtmfReceived)unimplemented_stub;
335 if (ctx->callbacks.notify==NULL)
336 ctx->callbacks.notify=(SalOnNotify)unimplemented_stub;
337 if (ctx->callbacks.notify_presence==NULL)
338 ctx->callbacks.notify_presence=(SalOnNotifyPresence)unimplemented_stub;
339 if (ctx->callbacks.subscribe_received==NULL)
340 ctx->callbacks.subscribe_received=(SalOnSubscribeReceived)unimplemented_stub;
341 if (ctx->callbacks.text_received==NULL)
342 ctx->callbacks.text_received=(SalOnTextReceived)unimplemented_stub;
343 if (ctx->callbacks.ping_reply==NULL)
344 ctx->callbacks.ping_reply=(SalOnPingReply)unimplemented_stub;
347 int sal_unlisten_ports(Sal *ctx){
356 int sal_listen_port(Sal *ctx, const char *addr, int port, SalTransport tr, int is_secure){
359 int proto=IPPROTO_UDP;
360 int keepalive = ctx->keepalive_period;
363 case SalTransportUDP:
365 eXosip_set_option (EXOSIP_OPT_UDP_KEEP_ALIVE, &keepalive);
367 case SalTransportTCP:
368 case SalTransportTLS:
371 eXosip_set_option (EXOSIP_OPT_UDP_KEEP_ALIVE,&keepalive);
374 eXosip_tls_ctx_t tlsCtx;
375 memset(&tlsCtx, 0, sizeof(tlsCtx));
376 snprintf(tlsCtx.root_ca_cert, sizeof(tlsCtx.client.cert), "%s", ctx->rootCa);
377 eXosip_set_tls_ctx(&tlsCtx);
379 #ifdef HAVE_EXOSIP_TLS_VERIFY_CERTIFICATE
380 eXosip_tls_verify_certificate(ctx->verify_server_certs);
384 ms_warning("unexpected proto, using datagram");
386 /*see if it looks like an IPv6 address*/
387 int use_rports = ctx->use_rports; // Copy char to int to avoid bad alignment
388 eXosip_set_option(EXOSIP_OPT_USE_RPORT,&use_rports);
389 int dont_use_101 = !ctx->use_101; // Copy char to int to avoid bad alignment
390 eXosip_set_option(EXOSIP_OPT_DONT_SEND_101,&dont_use_101);
392 ipv6=strchr(addr,':')!=NULL;
393 eXosip_enable_ipv6(ipv6);
395 if (is_secure && tr == SalTransportUDP){
396 ms_fatal("SIP over DTLS is not supported yet.");
399 err=eXosip_listen_addr(proto, addr, port, ipv6 ? PF_INET6 : PF_INET, is_secure);
404 ortp_socket_t sal_get_socket(Sal *ctx){
405 #ifdef HAVE_EXOSIP_GET_SOCKET
406 return eXosip_get_socket(IPPROTO_UDP);
408 ms_warning("Sorry, eXosip does not have eXosip_get_socket() method");
413 void sal_set_user_agent(Sal *ctx, const char *user_agent){
414 eXosip_set_user_agent(user_agent);
417 void sal_use_session_timers(Sal *ctx, int expires){
418 ctx->session_expires=expires;
421 void sal_use_one_matching_codec_policy(Sal *ctx, bool_t one_matching_codec){
422 ctx->one_matching_codec=one_matching_codec;
425 MSList *sal_get_pending_auths(Sal *sal){
426 return ms_list_copy(sal->pending_auths);
429 void sal_use_double_registrations(Sal *ctx, bool_t enabled){
430 ctx->double_reg=enabled;
433 void sal_expire_old_registration_contacts(Sal *ctx, bool_t enabled){
434 ctx->expire_old_contact=enabled;
437 void sal_use_rport(Sal *ctx, bool_t use_rports){
438 ctx->use_rports=use_rports;
440 void sal_use_101(Sal *ctx, bool_t use_101){
441 ctx->use_101=use_101;
444 void sal_set_root_ca(Sal* ctx, const char* rootCa) {
446 ms_free(ctx->rootCa);
447 ctx->rootCa = ms_strdup(rootCa);
450 void sal_verify_server_certificates(Sal *ctx, bool_t verify){
451 ctx->verify_server_certs=verify;
452 #ifdef HAVE_EXOSIP_TLS_VERIFY_CERTIFICATE
453 eXosip_tls_verify_certificate(verify);
457 static int extract_received_rport(osip_message_t *msg, const char **received, int *rportval,SalTransport* transport){
458 osip_via_t *via=NULL;
459 osip_generic_param_t *param=NULL;
460 const char *rport=NULL;
464 osip_message_get_via(msg,0,&via);
466 ms_warning("extract_received_rport(): no via.");
470 *transport = sal_transport_parse(via->protocol);
472 if (via->port && via->port[0]!='\0')
473 *rportval=atoi(via->port);
475 osip_via_param_get_byname(via,"rport",¶m);
478 if (rport && rport[0]!='\0') *rportval=atoi(rport);
482 osip_via_param_get_byname(via,"received",¶m);
483 if (param) *received=param->gvalue;
485 if (rport==NULL && *received==NULL){
486 ms_warning("extract_received_rport(): no rport and no received parameters.");
492 static void set_sdp(osip_message_t *sip,sdp_message_t *msg){
496 sdp_message_to_str(msg,&sdp);
498 snprintf(clen,sizeof(clen),"%i",sdplen);
499 osip_message_set_body(sip,sdp,sdplen);
500 osip_message_set_content_type(sip,"application/sdp");
501 osip_message_set_content_length(sip,clen);
505 static void set_sdp_from_desc(osip_message_t *sip, const SalMediaDescription *desc, const IceSession *ice_session){
506 sdp_message_t *msg=media_description_to_sdp(desc, ice_session);
508 ms_error("Fail to print sdp message !");
512 sdp_message_free(msg);
515 static void sdp_process(SalOp *h){
516 ms_message("Doing SDP offer/answer process of type %s",h->sdp_offering ? "outgoing" : "incoming");
518 sal_media_description_unref(h->result);
520 h->result=sal_media_description_new();
521 if (h->sdp_offering){
522 offer_answer_initiate_outgoing(h->base.local_media,h->base.remote_media,h->result);
526 sdp_message_free(h->sdp_answer);
528 offer_answer_initiate_incoming(h->base.local_media,h->base.remote_media,h->result,h->base.root->one_matching_codec);
529 h->sdp_answer=media_description_to_sdp(h->result, sal_op_get_ice_session(h));
530 /*once we have generated the SDP answer, we modify the result description for processing by the upper layer.
531 It should contains media parameters constraint from the remote offer, not our response*/
532 strcpy(h->result->addr,h->base.remote_media->addr);
533 h->result->bandwidth=h->base.remote_media->bandwidth;
535 for(i=0;i<h->result->nstreams;++i){
536 if (h->result->streams[i].rtp_port>0){
537 strcpy(h->result->streams[i].rtp_addr,h->base.remote_media->streams[i].rtp_addr);
538 strcpy(h->result->streams[i].rtcp_addr,h->base.remote_media->streams[i].rtcp_addr);
539 h->result->streams[i].ptime=h->base.remote_media->streams[i].ptime;
540 h->result->streams[i].bandwidth=h->base.remote_media->streams[i].bandwidth;
541 h->result->streams[i].rtp_port=h->base.remote_media->streams[i].rtp_port;
542 h->result->streams[i].rtcp_port=h->base.remote_media->streams[i].rtcp_port;
544 if (h->result->streams[i].proto == SalProtoRtpSavp) {
545 h->result->streams[i].crypto[0] = h->base.remote_media->streams[i].crypto[0];
553 int sal_call_is_offerer(const SalOp *h){
554 return h->sdp_offering;
557 int sal_call_set_local_media_description(SalOp *h, SalMediaDescription *desc){
559 sal_media_description_ref(desc);
560 if (h->base.local_media)
561 sal_media_description_unref(h->base.local_media);
562 h->base.local_media=desc;
563 if (h->base.remote_media){
564 /*case of an incoming call where we modify the local capabilities between the time
565 * the call is ringing and it is accepted (for example if you want to accept without video*/
566 /*reset the sdp answer so that it is computed again*/
568 sdp_message_free(h->sdp_answer);
575 int sal_call(SalOp *h, const char *from, const char *to){
578 osip_message_t *invite=NULL;
579 sal_op_set_from(h,from);
581 sal_exosip_fix_route(h);
583 h->terminated = FALSE;
585 route = sal_op_get_route(h);
586 err=eXosip_call_build_initial_invite(&invite,to,from,route,"Phone call");
588 ms_error("Could not create call. Error %d (from=%s to=%s route=%s)",
589 err, from, to, route);
592 osip_message_set_allow(invite, "INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, NOTIFY, MESSAGE, SUBSCRIBE, INFO");
593 if (h->base.contact){
594 _osip_list_set_empty(&invite->contacts,(void (*)(void*))osip_contact_free);
595 osip_message_set_contact(invite,h->base.contact);
597 if (h->base.root->session_expires!=0){
598 osip_message_set_header(invite, "Session-expires", "200");
599 osip_message_set_supported(invite, "timer");
601 if (h->base.local_media){
602 h->sdp_offering=TRUE;
603 set_sdp_from_desc(invite,h->base.local_media,sal_op_get_ice_session(h));
604 }else h->sdp_offering=FALSE;
606 osip_message_set_header(invite,"Replaces",h->replaces);
608 osip_message_set_header(invite,"Referred-By",h->referred_by);
612 err=eXosip_call_send_initial_invite(invite);
616 ms_error("Fail to send invite ! Error code %d", err);
619 sal_add_call(h->base.root,h);
624 int sal_call_notify_ringing(SalOp *h, bool_t early_media){
627 /*if early media send also 180 and 183 */
631 eXosip_call_build_answer(h->tid,183,&msg);
635 set_sdp(msg,h->sdp_answer);
636 sdp_message_free(h->sdp_answer);
639 eXosip_call_send_answer(h->tid,183,msg);
644 eXosip_call_send_answer(h->tid,180,NULL);
650 int sal_call_accept(SalOp * h){
652 const char *contact=sal_op_get_contact(h);
654 int err=eXosip_call_build_answer(h->tid,200,&msg);
655 if (err<0 || msg==NULL){
656 ms_error("Fail to build answer for call: err=%i",err);
659 if (h->base.root->session_expires!=0){
660 if (h->supports_session_timers) osip_message_set_supported(msg, "timer");
664 _osip_list_set_empty(&msg->contacts,(void (*)(void*))osip_contact_free);
665 osip_message_set_contact(msg,contact);
668 if (h->base.local_media){
669 /*this is the case where we received an invite without SDP*/
670 if (h->sdp_offering) {
671 set_sdp_from_desc(msg,h->base.local_media,sal_op_get_ice_session(h));
673 if (h->sdp_answer==NULL) sdp_process(h);
675 set_sdp(msg,h->sdp_answer);
676 sdp_message_free(h->sdp_answer);
681 ms_error("You are accepting a call but not defined any media capabilities !");
683 eXosip_call_send_answer(h->tid,200,msg);
687 int sal_call_decline(SalOp *h, SalReason reason, const char *redirect){
688 if (reason==SalReasonBusy){
690 eXosip_call_send_answer(h->tid,486,NULL);
693 else if (reason==SalReasonTemporarilyUnavailable){
695 eXosip_call_send_answer(h->tid,480,NULL);
697 }else if (reason==SalReasonDoNotDisturb){
699 eXosip_call_send_answer(h->tid,600,NULL);
701 }else if (reason==SalReasonMedia){
703 eXosip_call_send_answer(h->tid,415,NULL);
705 }else if (redirect!=NULL && reason==SalReasonRedirect){
708 if (strstr(redirect,"sip:")!=0) code=302;
711 eXosip_call_build_answer(h->tid,code,&msg);
712 osip_message_set_contact(msg,redirect);
713 eXosip_call_send_answer(h->tid,code,msg);
715 }else sal_call_terminate(h);
719 SalMediaDescription * sal_call_get_remote_media_description(SalOp *h){
720 return h->base.remote_media;
723 SalMediaDescription * sal_call_get_final_media_description(SalOp *h){
724 if (h->base.local_media && h->base.remote_media && !h->result){
730 int sal_call_set_referer(SalOp *h, SalOp *refered_call){
731 if (refered_call->replaces)
732 h->replaces=ms_strdup(refered_call->replaces);
733 if (refered_call->referred_by)
734 h->referred_by=ms_strdup(refered_call->referred_by);
738 static int send_notify_for_refer(int did, const char *sipfrag){
741 eXosip_call_build_notify(did,EXOSIP_SUBCRSTATE_ACTIVE,&msg);
744 ms_warning("Could not build NOTIFY for refer.");
747 osip_message_set_content_type(msg,"message/sipfrag");
748 osip_message_set_header(msg,"Event","refer");
749 osip_message_set_body(msg,sipfrag,strlen(sipfrag));
750 eXosip_call_send_request(did,msg);
755 /* currently only support to notify trying and 200Ok*/
756 int sal_call_notify_refer_state(SalOp *h, SalOp *newcall){
759 send_notify_for_refer(h->did,"SIP/2.0 100 Trying\r\n");
761 else if (newcall->cid!=-1){
762 if (newcall->did==-1){
763 /* not yet established*/
764 if (!newcall->terminated){
766 send_notify_for_refer(h->did,"SIP/2.0 100 Trying\r\n");
769 if (!newcall->terminated){
770 if (send_notify_for_refer(h->did,"SIP/2.0 200 Ok\r\n")==-1){
771 /* we need previous notify transaction to complete, so buffer the request for later*/
772 h->sipfrag_pending="SIP/2.0 200 Ok\r\n";
780 int sal_ping(SalOp *op, const char *from, const char *to){
781 osip_message_t *options=NULL;
783 sal_op_set_from(op,from);
784 sal_op_set_to(op,to);
785 sal_exosip_fix_route(op);
787 eXosip_options_build_request (&options, sal_op_get_to(op),
788 sal_op_get_from(op),sal_op_get_route(op));
790 if (op->base.root->session_expires!=0){
791 osip_message_set_header(options, "Session-expires", "200");
792 osip_message_set_supported(options, "timer");
794 sal_add_other(sal_op_get_sal(op),op,options);
795 return eXosip_options_send_request(options);
800 int sal_call_refer(SalOp *h, const char *refer_to){
801 osip_message_t *msg=NULL;
804 eXosip_call_build_refer(h->did,refer_to, &msg);
805 if (msg) err=eXosip_call_send_request(h->did, msg);
811 int sal_call_refer_with_replaces(SalOp *h, SalOp *other_call_h){
812 osip_message_t *msg=NULL;
813 char referto[256]={0};
816 if (eXosip_call_get_referto(other_call_h->did,referto,sizeof(referto)-1)!=0){
817 ms_error("eXosip_call_get_referto() failed for did=%i",other_call_h->did);
821 eXosip_call_build_refer(h->did,referto, &msg);
822 osip_message_set_header(msg,"Referred-By",h->base.from);
823 if (msg) err=eXosip_call_send_request(h->did, msg);
829 SalOp *sal_call_get_replaces(SalOp *h){
830 if (h!=NULL && h->replaces!=NULL){
833 cid=eXosip_call_find_by_replaces(h->replaces);
836 SalOp *ret=sal_find_call(h->base.root,cid);
843 int sal_call_send_dtmf(SalOp *h, char dtmf){
844 osip_message_t *msg=NULL;
849 eXosip_call_build_info(h->did,&msg);
851 snprintf(dtmf_body, sizeof(dtmf_body), "Signal=%c\r\nDuration=250\r\n", dtmf);
852 osip_message_set_body(msg,dtmf_body,strlen(dtmf_body));
853 osip_message_set_content_type(msg,"application/dtmf-relay");
854 snprintf(clen,sizeof(clen),"%lu",(unsigned long)strlen(dtmf_body));
855 osip_message_set_content_length(msg,clen);
856 eXosip_call_send_request(h->did,msg);
862 static void push_auth_to_exosip(const SalAuthInfo *info){
864 if (info->userid==NULL || info->userid[0]=='\0') userid=info->username;
865 else userid=info->userid;
866 ms_message("Authentication info for username [%s], id[%s], realm [%s] added to eXosip", info->username,userid, info->realm);
867 eXosip_add_authentication_info (info->username,userid,
868 info->password, NULL,info->realm);
871 * Just for symmetry ;-)
873 static void pop_auth_from_exosip() {
874 eXosip_clear_authentication_info();
877 int sal_call_terminate(SalOp *h){
879 if (h == NULL) return -1;
880 if (h->auth_info) push_auth_to_exosip(h->auth_info);
882 err=eXosip_call_terminate(h->cid,h->did);
884 if (!h->base.root->reuse_authorization) pop_auth_from_exosip();
886 ms_warning("Exosip could not terminate the call: cid=%i did=%i", h->cid,h->did);
892 void sal_op_authenticate(SalOp *h, const SalAuthInfo *info){
893 if (h->terminated) return;
894 if (h->pending_auth){
895 push_auth_to_exosip(info);
897 /*FIXME exosip does not take into account this update register message*/
899 if (fix_message_contact(h, h->pending_auth->request,h->pending_auth->response)) {
903 update_contact_from_response(h,h->pending_auth->response);
905 eXosip_default_action(h->pending_auth);
907 ms_message("eXosip_default_action() done");
908 if (!h->base.root->reuse_authorization) pop_auth_from_exosip();
910 if (h->auth_info) sal_auth_info_delete(h->auth_info); /*if already exist*/
911 h->auth_info=sal_auth_info_clone(info); /*store auth info for subsequent request*/
914 void sal_op_cancel_authentication(SalOp *h) {
916 sal_op_get_sal(h)->callbacks.register_failure(h,SalErrorFailure, SalReasonForbidden,_("Authentication failure"));
917 } else if (h->cid >0) {
918 sal_op_get_sal(h)->callbacks.call_failure(h,SalErrorFailure, SalReasonForbidden,_("Authentication failure"),0);
920 ms_warning("Auth failure not handled");
924 static void set_network_origin(SalOp *op, osip_message_t *req){
925 const char *received=NULL;
928 SalTransport transport;
929 if (extract_received_rport(req,&received,&rport,&transport)!=0){
930 osip_via_t *via=NULL;
932 osip_message_get_via(req,0,&via);
933 received=osip_via_get_host(via);
934 tmp=osip_via_get_port(via);
935 if (tmp) rport=atoi(tmp);
937 if (transport != SalTransportUDP) {
938 snprintf(origin,sizeof(origin)-1,"sip:%s:%i",received,rport);
940 snprintf(origin,sizeof(origin)-1,"sip:%s:%i;transport=%s",received,rport,sal_transport_to_string(transport));
942 __sal_op_set_network_origin(op,origin);
945 static void set_remote_ua(SalOp* op, osip_message_t *req){
946 if (op->base.remote_ua==NULL){
947 osip_header_t *h=NULL;
948 osip_message_get_user_agent(req,0,&h);
950 op->base.remote_ua=ms_strdup(h->hvalue);
955 static void set_replaces(SalOp *op, osip_message_t *req){
956 osip_header_t *h=NULL;
959 ms_free(op->replaces);
962 osip_message_header_get_byname(req,"replaces",0,&h);
964 if (h->hvalue && h->hvalue[0]!='\0'){
965 op->replaces=ms_strdup(h->hvalue);
970 static SalOp *find_op(Sal *sal, eXosip_event_t *ev){
972 return sal_find_call(sal,ev->cid);
975 return sal_find_register(sal,ev->rid);
978 return sal_find_out_subscribe(sal,ev->sid);
981 return sal_find_in_subscribe(sal,ev->nid);
983 if (ev->response) return sal_find_other(sal,ev->response);
987 static void inc_new_call(Sal *sal, eXosip_event_t *ev){
988 SalOp *op=sal_op_new(sal);
989 osip_from_t *from,*to;
990 osip_call_info_t *call_info;
992 sdp_message_t *sdp=eXosip_get_sdp_info(ev->request);
993 IceSession *ice_session;
995 set_network_origin(op,ev->request);
996 set_remote_ua(op,ev->request);
997 set_replaces(op,ev->request);
1000 op->sdp_offering=FALSE;
1001 op->base.remote_media=sal_media_description_new();
1002 ice_session=sal_op_get_ice_session(op);
1003 sdp_to_media_description(sdp,op->base.remote_media,&ice_session);
1004 sal_op_set_ice_session(op,ice_session);
1005 sdp_message_free(sdp);
1006 }else op->sdp_offering=TRUE;
1008 from=osip_message_get_from(ev->request);
1009 to=osip_message_get_to(ev->request);
1010 osip_from_to_str(from,&tmp);
1011 sal_op_set_from(op,tmp);
1013 osip_from_to_str(to,&tmp);
1014 sal_op_set_to(op,tmp);
1017 osip_message_get_call_info(ev->request,0,&call_info);
1020 osip_call_info_to_str(call_info,&tmp);
1021 if( strstr(tmp,"answer-after=") != NULL)
1023 op->auto_answer_asked=TRUE;
1024 ms_message("The caller asked to automatically answer the call(Emergency?)\n");
1033 sal_add_call(op->base.root,op);
1034 sal->callbacks.call_received(op);
1037 static void handle_reinvite(Sal *sal, eXosip_event_t *ev){
1038 SalOp *op=find_op(sal,ev);
1040 IceSession *ice_session;
1043 ms_warning("Reinvite for non-existing operation !");
1048 sdp=eXosip_get_sdp_info(ev->request);
1049 if (op->base.remote_media){
1050 sal_media_description_unref(op->base.remote_media);
1051 op->base.remote_media=NULL;
1054 sal_media_description_unref(op->result);
1058 op->sdp_offering=FALSE;
1059 op->base.remote_media=sal_media_description_new();
1060 ice_session=sal_op_get_ice_session(op);
1061 sdp_to_media_description(sdp,op->base.remote_media,&ice_session);
1062 sal_op_set_ice_session(op,ice_session);
1063 sdp_message_free(sdp);
1066 op->sdp_offering=TRUE;
1068 sal->callbacks.call_updating(op);
1071 static void handle_ack(Sal *sal, eXosip_event_t *ev){
1072 SalOp *op=find_op(sal,ev);
1074 IceSession *ice_session;
1077 ms_warning("ack for non-existing call !");
1080 if (op->terminated) {
1081 ms_warning("ack for terminated call, ignoring");
1085 if (op->sdp_offering){
1086 sdp=eXosip_get_sdp_info(ev->ack);
1088 if (op->base.remote_media)
1089 sal_media_description_unref(op->base.remote_media);
1090 op->base.remote_media=sal_media_description_new();
1091 ice_session=sal_op_get_ice_session(op);
1092 sdp_to_media_description(sdp,op->base.remote_media,&ice_session);
1093 sal_op_set_ice_session(op,ice_session);
1095 sdp_message_free(sdp);
1101 sal->callbacks.call_ack(op);
1104 static void update_contact_from_response(SalOp *op, osip_message_t *response){
1105 const char *received;
1107 SalTransport transport;
1108 if (extract_received_rport(response,&received,&rport,&transport)==0){
1109 const char *contact=sal_op_get_contact(op);
1111 /*no contact given yet, use from instead*/
1112 contact=sal_op_get_from(op);
1115 SalAddress *addr=sal_address_new(contact);
1117 sal_address_set_domain(addr,received);
1118 sal_address_set_port_int(addr,rport);
1119 if (transport!=SalTransportUDP)
1120 sal_address_set_transport(addr,transport);
1121 tmp=sal_address_as_string(addr);
1122 ms_message("Contact address updated to %s",tmp);
1123 sal_op_set_contact(op,tmp);
1124 sal_address_destroy(addr);
1130 static int call_proceeding(Sal *sal, eXosip_event_t *ev){
1131 SalOp *op=find_op(sal,ev);
1133 if (op==NULL || op->terminated==TRUE) {
1134 ms_warning("This call has been canceled.");
1136 eXosip_call_terminate(ev->cid,ev->did);
1144 /* update contact if received and rport are set by the server
1145 note: will only be used by remote for next INVITE, if any...*/
1146 update_contact_from_response(op,ev->response);
1150 static void call_ringing(Sal *sal, eXosip_event_t *ev){
1152 SalOp *op=find_op(sal,ev);
1153 IceSession *ice_session;
1154 if (call_proceeding(sal, ev)==-1) return;
1156 set_remote_ua(op,ev->response);
1157 sdp=eXosip_get_sdp_info(ev->response);
1159 op->base.remote_media=sal_media_description_new();
1160 ice_session=sal_op_get_ice_session(op);
1161 sdp_to_media_description(sdp,op->base.remote_media,&ice_session);
1162 sal_op_set_ice_session(op,ice_session);
1163 sdp_message_free(sdp);
1164 if (op->base.local_media) sdp_process(op);
1166 sal->callbacks.call_ringing(op);
1169 static void call_accepted(Sal *sal, eXosip_event_t *ev){
1171 osip_message_t *msg=NULL;
1172 SalOp *op=find_op(sal,ev);
1173 const char *contact;
1174 IceSession *ice_session;
1176 if (op==NULL || op->terminated==TRUE) {
1177 ms_warning("This call has been already terminated.");
1179 eXosip_call_terminate(ev->cid,ev->did);
1185 set_remote_ua(op,ev->response);
1187 sdp=eXosip_get_sdp_info(ev->response);
1189 op->base.remote_media=sal_media_description_new();
1190 ice_session=sal_op_get_ice_session(op);
1191 sdp_to_media_description(sdp,op->base.remote_media,&ice_session);
1192 sal_op_set_ice_session(op,ice_session);
1193 sdp_message_free(sdp);
1194 if (op->base.local_media) sdp_process(op);
1196 eXosip_call_build_ack(ev->did,&msg);
1198 ms_warning("This call has been already terminated.");
1200 eXosip_call_terminate(ev->cid,ev->did);
1204 contact=sal_op_get_contact(op);
1206 _osip_list_set_empty(&msg->contacts,(void (*)(void*))osip_contact_free);
1207 osip_message_set_contact(msg,contact);
1209 if (op->sdp_answer){
1210 set_sdp(msg,op->sdp_answer);
1211 sdp_message_free(op->sdp_answer);
1212 op->sdp_answer=NULL;
1214 eXosip_call_send_ack(ev->did,msg);
1215 sal->callbacks.call_accepted(op);
1218 static void call_terminated(Sal *sal, eXosip_event_t *ev){
1220 SalOp *op=find_op(sal,ev);
1222 ms_warning("Call terminated for already closed call ?");
1226 osip_from_to_str(ev->request->from,&from);
1228 sal->callbacks.call_terminated(op,from!=NULL ? from : sal_op_get_from(op));
1229 if (from) osip_free(from);
1230 op->terminated=TRUE;
1233 static void call_released(Sal *sal, eXosip_event_t *ev){
1234 SalOp *op=find_op(sal,ev);
1236 ms_warning("No op associated to this call_released()");
1239 if (!op->terminated){
1240 /* no response received so far */
1241 call_failure(sal,ev);
1243 sal->callbacks.call_released(op);
1246 static int get_auth_data_from_response(osip_message_t *resp, const char **realm, const char **username){
1247 const char *prx_realm=NULL,*www_realm=NULL;
1248 osip_proxy_authenticate_t *prx_auth;
1249 osip_www_authenticate_t *www_auth;
1251 *username=osip_uri_get_username(resp->from->url);
1252 prx_auth=(osip_proxy_authenticate_t*)osip_list_get(&resp->proxy_authenticates,0);
1253 www_auth=(osip_proxy_authenticate_t*)osip_list_get(&resp->www_authenticates,0);
1255 prx_realm=osip_proxy_authenticate_get_realm(prx_auth);
1257 www_realm=osip_www_authenticate_get_realm(www_auth);
1261 }else if (www_realm){
1269 static int get_auth_data_from_request(osip_message_t *msg, const char **realm, const char **username){
1270 osip_authorization_t *auth=NULL;
1271 osip_proxy_authorization_t *prx_auth=NULL;
1273 *username=osip_uri_get_username(msg->from->url);
1274 osip_message_get_authorization(msg, 0, &auth);
1276 *realm=osip_authorization_get_realm(auth);
1279 osip_message_get_proxy_authorization(msg,0,&prx_auth);
1281 *realm=osip_proxy_authorization_get_realm(prx_auth);
1287 static int get_auth_data(eXosip_event_t *ev, const char **realm, const char **username){
1288 if (ev->response && get_auth_data_from_response(ev->response,realm,username)==0) return 0;
1289 if (ev->request && get_auth_data_from_request(ev->request,realm,username)==0) return 0;
1293 int sal_op_get_auth_requested(SalOp *op, const char **realm, const char **username){
1294 if (op->pending_auth){
1295 return get_auth_data(op->pending_auth,realm,username);
1300 static bool_t process_authentication(Sal *sal, eXosip_event_t *ev){
1302 const char *username,*realm;
1305 ms_warning("No operation associated with this authentication !");
1308 if (get_auth_data(ev,&realm,&username)==0){
1309 if (op->pending_auth!=NULL){
1310 eXosip_event_free(op->pending_auth);
1311 op->pending_auth=ev;
1313 op->pending_auth=ev;
1314 sal_add_pending_auth(sal,op);
1317 sal->callbacks.auth_requested(op,realm,username);
1323 static void authentication_ok(Sal *sal, eXosip_event_t *ev){
1325 const char *username,*realm;
1328 ms_warning("No operation associated with this authentication_ok!");
1331 if (op->pending_auth){
1332 eXosip_event_free(op->pending_auth);
1333 sal_remove_pending_auth(sal,op);
1334 op->pending_auth=NULL;
1336 if (get_auth_data(ev,&realm,&username)==0){
1337 sal->callbacks.auth_success(op,realm,username);
1341 static bool_t call_failure(Sal *sal, eXosip_event_t *ev){
1344 char* computedReason=NULL;
1345 const char *reason=NULL;
1346 SalError error=SalErrorUnknown;
1347 SalReason sr=SalReasonUnknown;
1350 op=(SalOp*)find_op(sal,ev);
1353 ms_warning("Call failure reported for a closed call, ignored.");
1358 code=osip_message_get_status_code(ev->response);
1359 reason=osip_message_get_reason_phrase(ev->response);
1360 osip_header_t *h=NULL;
1361 if (!osip_message_header_get_byname( ev->response
1365 computedReason = ms_strdup_printf("%s %s",reason,osip_header_get_value(h));
1366 reason = computedReason;
1374 return process_authentication(sal,ev);
1377 error=SalErrorUnknown;
1380 error=SalErrorFailure;
1381 sr=SalReasonNotFound;
1384 error=SalErrorFailure;
1388 eXosip_default_action(ev);
1392 error=SalErrorFailure;
1393 sr=SalReasonTemporarilyUnavailable;
1395 error=SalErrorFailure;
1401 error=SalErrorFailure;
1402 sr=SalReasonDoNotDisturb;
1405 error=SalErrorFailure;
1406 sr=SalReasonDeclined;
1410 error=SalErrorFailure;
1411 sr=SalReasonUnknown;
1412 }else error=SalErrorNoResponse;
1414 op->terminated=TRUE;
1415 sal->callbacks.call_failure(op,error,sr,reason,code);
1416 if (computedReason != NULL){
1417 ms_free(computedReason);
1422 /* Request remote side to send us VFU */
1423 void sal_call_send_vfu_request(SalOp *h){
1424 osip_message_t *msg=NULL;
1426 "<?xml version=\"1.0\" encoding=\"utf-8\" ?>"
1430 " <picture_fast_update></picture_fast_update>"
1438 eXosip_call_build_info(h->did,&msg);
1440 osip_message_set_body(msg,info_body,strlen(info_body));
1441 osip_message_set_content_type(msg,"application/media_control+xml");
1442 snprintf(clen,sizeof(clen),"%lu",(unsigned long)strlen(info_body));
1443 osip_message_set_content_length(msg,clen);
1444 eXosip_call_send_request(h->did,msg);
1445 ms_message("Sending VFU request !");
1450 static void process_media_control_xml(Sal *sal, eXosip_event_t *ev){
1451 SalOp *op=find_op(sal,ev);
1452 osip_body_t *body=NULL;
1455 ms_warning("media control xml received without operation context!");
1459 osip_message_get_body(ev->request,0,&body);
1460 if (body && body->body!=NULL &&
1461 strstr(body->body,"picture_fast_update")){
1462 osip_message_t *ans=NULL;
1463 ms_message("Receiving VFU request !");
1464 if (sal->callbacks.vfu_request){
1465 sal->callbacks.vfu_request(op);
1466 eXosip_call_build_answer(ev->tid,200,&ans);
1468 eXosip_call_send_answer(ev->tid,200,ans);
1472 /*in all other cases we must say it is not implemented.*/
1474 osip_message_t *ans=NULL;
1476 eXosip_call_build_answer(ev->tid,501,&ans);
1478 eXosip_call_send_answer(ev->tid,501,ans);
1483 static void process_dtmf_relay(Sal *sal, eXosip_event_t *ev){
1484 SalOp *op=find_op(sal,ev);
1485 osip_body_t *body=NULL;
1488 ms_warning("media dtmf relay received without operation context!");
1492 osip_message_get_body(ev->request,0,&body);
1493 if (body && body->body!=NULL){
1494 osip_message_t *ans=NULL;
1495 const char *name=strstr(body->body,"Signal");
1496 if (name==NULL) name=strstr(body->body,"signal");
1498 ms_warning("Could not extract the dtmf name from the SIP INFO.");
1501 name+=strlen("signal");
1502 if (sscanf(name," = %1s",tmp)==1){
1503 ms_message("Receiving dtmf %s via SIP INFO.",tmp);
1504 if (sal->callbacks.dtmf_received != NULL)
1505 sal->callbacks.dtmf_received(op, tmp[0]);
1509 eXosip_call_build_answer(ev->tid,200,&ans);
1511 eXosip_call_send_answer(ev->tid,200,ans);
1516 static void fill_options_answer(osip_message_t *options){
1517 osip_message_set_allow(options,"INVITE, ACK, BYE, CANCEL, OPTIONS, MESSAGE, SUBSCRIBE, NOTIFY, INFO");
1518 osip_message_set_accept(options,"application/sdp");
1521 static void process_refer(Sal *sal, SalOp *op, eXosip_event_t *ev){
1522 osip_header_t *h=NULL;
1523 osip_message_t *ans=NULL;
1524 ms_message("Receiving REFER request !");
1525 osip_message_header_get_byname(ev->request,"Refer-To",0,&h);
1528 osip_from_t *from=NULL;
1530 osip_from_init(&from);
1532 if (osip_from_parse(from,h->hvalue)==0){
1534 osip_uri_header_t *uh=NULL;
1535 osip_header_t *referred_by=NULL;
1536 osip_uri_header_get_byname(&from->url->url_headers,(char*)"Replaces",&uh);
1537 if (uh!=NULL && uh->gvalue && uh->gvalue[0]!='\0'){
1538 ms_message("Found replaces in Refer-To");
1540 ms_free(op->replaces);
1542 op->replaces=ms_strdup(uh->gvalue);
1544 osip_message_header_get_byname(ev->request,"Referred-By",0,&referred_by);
1545 if (referred_by && referred_by->hvalue && referred_by->hvalue[0]!='\0'){
1546 if (op->referred_by)
1547 ms_free(op->referred_by);
1548 op->referred_by=ms_strdup(referred_by->hvalue);
1551 osip_uri_header_freelist(&from->url->url_headers);
1552 osip_from_to_str(from,&tmp);
1553 sal->callbacks.refer_received(sal,op,tmp);
1555 osip_from_free(from);
1558 eXosip_call_build_answer(ev->tid,202,&ans);
1560 eXosip_call_send_answer(ev->tid,202,ans);
1565 ms_warning("cannot do anything with the refer without destination\n");
1569 static void process_notify(Sal *sal, eXosip_event_t *ev){
1570 osip_header_t *h=NULL;
1572 SalOp *op=find_op(sal,ev);
1573 osip_message_t *ans=NULL;
1575 ms_message("Receiving NOTIFY request !");
1576 osip_from_to_str(ev->request->from,&from);
1577 osip_message_header_get_byname(ev->request,"Event",0,&h);
1579 osip_body_t *body=NULL;
1580 //osip_content_type_t *ct=NULL;
1581 osip_message_get_body(ev->request,0,&body);
1582 //ct=osip_message_get_content_type(ev->request);
1583 if (h->hvalue && strcasecmp(h->hvalue,"refer")==0){
1584 /*special handling of refer events*/
1585 if (body && body->body){
1586 osip_message_t *msg;
1587 osip_message_init(&msg);
1588 if (osip_message_parse_sipfrag(msg,body->body,strlen(body->body))==0){
1589 int code=osip_message_get_status_code(msg);
1591 sal->callbacks.notify_refer(op,SalReferTrying);
1592 }else if (code==200){
1593 sal->callbacks.notify_refer(op,SalReferSuccess);
1594 }else if (code>=400){
1595 sal->callbacks.notify_refer(op,SalReferFailed);
1598 osip_message_free(msg);
1601 /*generic handling*/
1602 sal->callbacks.notify(op,from,h->hvalue);
1605 /*answer that we received the notify*/
1607 eXosip_call_build_answer(ev->tid,200,&ans);
1609 eXosip_call_send_answer(ev->tid,200,ans);
1614 static void call_message_new(Sal *sal, eXosip_event_t *ev){
1615 osip_message_t *ans=NULL;
1617 if (MSG_IS_INFO(ev->request)){
1618 osip_content_type_t *ct;
1619 ct=osip_message_get_content_type(ev->request);
1620 if (ct && ct->subtype){
1621 if (strcmp(ct->subtype,"media_control+xml")==0)
1622 process_media_control_xml(sal,ev);
1623 else if (strcmp(ct->subtype,"dtmf-relay")==0)
1624 process_dtmf_relay(sal,ev);
1626 ms_message("Unhandled SIP INFO.");
1627 /*send an "Not implemented" answer*/
1629 eXosip_call_build_answer(ev->tid,501,&ans);
1631 eXosip_call_send_answer(ev->tid,501,ans);
1635 /*empty SIP INFO, probably to test we are alive. Send an empty answer*/
1637 eXosip_call_build_answer(ev->tid,200,&ans);
1639 eXosip_call_send_answer(ev->tid,200,ans);
1642 }else if(MSG_IS_MESSAGE(ev->request)){
1643 /* SIP messages could be received into call */
1644 text_received(sal, ev);
1646 eXosip_call_build_answer(ev->tid,200,&ans);
1648 eXosip_call_send_answer(ev->tid,200,ans);
1650 }else if(MSG_IS_REFER(ev->request)){
1651 SalOp *op=find_op(sal,ev);
1653 ms_message("Receiving REFER request !");
1654 process_refer(sal,op,ev);
1655 }else if(MSG_IS_NOTIFY(ev->request)){
1656 process_notify(sal,ev);
1657 }else if (MSG_IS_OPTIONS(ev->request)){
1659 eXosip_call_build_answer(ev->tid,200,&ans);
1661 fill_options_answer(ans);
1662 eXosip_call_send_answer(ev->tid,200,ans);
1666 }else ms_warning("call_message_new: No request ?");
1669 static void inc_update(Sal *sal, eXosip_event_t *ev){
1670 osip_message_t *msg=NULL;
1671 ms_message("Processing incoming UPDATE");
1673 eXosip_message_build_answer(ev->tid,200,&msg);
1675 eXosip_message_send_answer(ev->tid,200,msg);
1679 static bool_t comes_from_local_if(osip_message_t *msg){
1680 osip_via_t *via=NULL;
1681 osip_message_get_via(msg,0,&via);
1684 host=osip_via_get_host(via);
1685 if (strcmp(host,"127.0.0.1")==0 || strcmp(host,"::1")==0){
1686 osip_generic_param_t *param=NULL;
1687 osip_via_param_get_byname(via,"received",¶m);
1688 if (param==NULL) return TRUE;
1689 if (param->gvalue &&
1690 (strcmp(param->gvalue,"127.0.0.1")==0 || strcmp(param->gvalue,"::1")==0)){
1698 static void text_received(Sal *sal, eXosip_event_t *ev){
1699 osip_body_t *body=NULL;
1700 char *from=NULL,*msg;
1702 osip_message_get_body(ev->request,0,&body);
1704 ms_error("Could not get text message from SIP body");
1708 osip_from_to_str(ev->request->from,&from);
1709 sal->callbacks.text_received(sal,from,msg);
1715 static void other_request(Sal *sal, eXosip_event_t *ev){
1716 ms_message("in other_request");
1717 if (ev->request==NULL) return;
1718 if (strcmp(ev->request->sip_method,"MESSAGE")==0){
1719 text_received(sal,ev);
1720 eXosip_message_send_answer(ev->tid,200,NULL);
1721 }else if (strcmp(ev->request->sip_method,"OPTIONS")==0){
1722 osip_message_t *options=NULL;
1723 eXosip_options_build_answer(ev->tid,200,&options);
1724 fill_options_answer(options);
1725 eXosip_options_send_answer(ev->tid,200,options);
1726 }else if (strncmp(ev->request->sip_method, "REFER", 5) == 0){
1727 ms_message("Receiving REFER request !");
1728 if (comes_from_local_if(ev->request)) {
1729 process_refer(sal,NULL,ev);
1730 }else ms_warning("Ignored REFER not coming from this local loopback interface.");
1731 }else if (strncmp(ev->request->sip_method, "UPDATE", 6) == 0){
1736 osip_message_to_str(ev->request,&tmp,&msglen);
1738 ms_message("Unsupported request received:\n%s",tmp);
1741 /*answer with a 501 Not implemented*/
1742 eXosip_message_send_answer(ev->tid,501,NULL);
1746 static void masquerade_via(osip_message_t *msg, const char *ip, const char *port){
1747 osip_via_t *via=NULL;
1748 osip_message_get_via(msg,0,&via);
1750 osip_free(via->port);
1751 via->port=osip_strdup(port);
1752 osip_free(via->host);
1753 via->host=osip_strdup(ip);
1758 static bool_t fix_message_contact(SalOp *op, osip_message_t *request,osip_message_t *last_answer, bool_t expire_last_contact) {
1759 osip_contact_t *ctt=NULL;
1760 const char *received;
1762 SalTransport transport;
1765 if (extract_received_rport(last_answer,&received,&rport,&transport)==-1) return FALSE;
1766 osip_message_get_contact(request,0,&ctt);
1768 ms_warning("fix_message_contact(): no contact to update");
1771 if (expire_last_contact){
1772 osip_contact_t *oldct=NULL,*prevct;
1773 osip_generic_param_t *param=NULL;
1774 osip_contact_clone(ctt,&oldct);
1775 while ((prevct=(osip_contact_t*)osip_list_get(&request->contacts,1))!=NULL){
1776 osip_contact_free(prevct);
1777 osip_list_remove(&request->contacts,1);
1779 osip_list_add(&request->contacts,oldct,1);
1780 osip_contact_param_get_byname(oldct,"expires",¶m);
1782 if (param->gvalue) osip_free(param->gvalue);
1783 param->gvalue=osip_strdup("0");
1785 osip_contact_param_add(oldct,osip_strdup("expires"),osip_strdup("0"));
1788 if (ctt->url->host!=NULL){
1789 osip_free(ctt->url->host);
1791 ctt->url->host=osip_strdup(received);
1792 if (ctt->url->port!=NULL){
1793 osip_free(ctt->url->port);
1795 snprintf(port,sizeof(port),"%i",rport);
1796 ctt->url->port=osip_strdup(port);
1797 if (op->masquerade_via) masquerade_via(request,received,port);
1799 if (transport != SalTransportUDP) {
1800 sal_address_set_param((SalAddress *)ctt, "transport", sal_transport_to_string(transport));
1805 static bool_t register_again_with_updated_contact(SalOp *op, osip_message_t *orig_request, osip_message_t *last_answer){
1806 osip_contact_t *ctt=NULL;
1807 SalAddress* ori_contact_address=NULL;
1808 const char *received;
1810 SalTransport transport;
1812 osip_message_t *msg=NULL;
1813 Sal* sal=op->base.root;
1815 bool_t found_valid_contact=FALSE;
1816 bool_t from_request=FALSE;
1818 if (sal->double_reg==FALSE ) return FALSE;
1820 if (extract_received_rport(last_answer,&received,&rport,&transport)==-1) return FALSE;
1823 osip_message_get_contact(last_answer,i,&ctt);
1824 if (!from_request && ctt==NULL) {
1825 osip_message_get_contact(orig_request,0,&ctt);
1829 osip_contact_to_str(ctt,&tmp);
1830 ori_contact_address = sal_address_new(tmp);
1832 /*check if contact is up to date*/
1833 if (strcmp(sal_address_get_domain(ori_contact_address),received) ==0
1834 && sal_address_get_port_int(ori_contact_address) == rport
1835 && sal_address_get_transport(ori_contact_address) == transport) {
1837 ms_message("Register response has up to date contact, doing nothing.");
1839 ms_warning("Register response does not have up to date contact, but last request had."
1840 "Stupid registrar detected, giving up.");
1842 found_valid_contact=TRUE;
1845 sal_address_destroy(ori_contact_address);
1848 }while(!found_valid_contact);
1849 if (!found_valid_contact)
1850 ms_message("Contact do not match, resending register.");
1854 eXosip_register_build_register(op->rid,op->expires,&msg);
1857 ms_warning("Fail to create a contact updated register.");
1860 if (fix_message_contact(op,msg,last_answer,op->base.root->expire_old_contact)) {
1861 eXosip_register_send_register(op->rid,msg);
1863 ms_message("Resending new register with updated contact");
1864 update_contact_from_response(op,last_answer);
1867 ms_warning("Fail to send updated register.");
1875 static void registration_success(Sal *sal, eXosip_event_t *ev){
1876 SalOp *op=sal_find_register(sal,ev->rid);
1877 osip_header_t *h=NULL;
1880 ms_error("Receiving register response for unknown operation");
1883 osip_message_get_expires(ev->request,0,&h);
1884 if (h!=NULL && atoi(h->hvalue)!=0){
1886 if (!register_again_with_updated_contact(op,ev->request,ev->response)){
1887 sal->callbacks.register_success(op,registered);
1890 sal->callbacks.register_success(op,FALSE);
1894 static bool_t registration_failure(Sal *sal, eXosip_event_t *ev){
1896 const char *reason=NULL;
1897 SalOp *op=sal_find_register(sal,ev->rid);
1898 SalReason sr=SalReasonUnknown;
1899 SalError se=SalErrorUnknown;
1902 ms_error("Receiving register failure for unknown operation");
1906 status_code=osip_message_get_status_code(ev->response);
1907 reason=osip_message_get_reason_phrase(ev->response);
1909 switch(status_code){
1912 return process_authentication(sal,ev);
1914 case 423: /*interval too brief*/
1915 {/*retry with greater interval */
1916 osip_header_t *h=NULL;
1917 osip_message_t *msg=NULL;
1918 osip_message_header_get_byname(ev->response,"min-expires",0,&h);
1919 if (h && h->hvalue && h->hvalue[0]!='\0'){
1920 int val=atoi(h->hvalue);
1921 if (val>op->expires)
1923 }else op->expires*=2;
1925 eXosip_register_build_register(op->rid,op->expires,&msg);
1926 eXosip_register_send_register(op->rid,msg);
1930 case 606: /*Not acceptable, workaround for proxies that don't like private addresses
1931 in vias, such as ekiga.net
1932 On the opposite, freephonie.net bugs when via are masqueraded.
1934 op->masquerade_via=TRUE;
1936 /* if contact is up to date, process the failure, otherwise resend a new register with
1937 updated contact first, just in case the faillure is due to incorrect contact */
1938 if (ev->response && register_again_with_updated_contact(op,ev->request,ev->response))
1939 return TRUE; /*we are retrying with an updated contact*/
1940 if (status_code==403){
1942 sr=SalReasonForbidden;
1943 }else if (status_code==0){
1944 se=SalErrorNoResponse;
1946 sal->callbacks.register_failure(op,se,sr,reason);
1951 static void other_request_reply(Sal *sal,eXosip_event_t *ev){
1952 SalOp *op=find_op(sal,ev);
1955 ms_warning("other_request_reply(): Receiving response to unknown request.");
1959 update_contact_from_response(op,ev->response);
1960 if (ev->request && strcmp(osip_message_get_method(ev->request),"OPTIONS")==0)
1961 sal->callbacks.ping_reply(op);
1965 static void process_in_call_reply(Sal *sal, eXosip_event_t *ev){
1966 SalOp *op=find_op(sal,ev);
1968 if (ev->request && strcmp(osip_message_get_method(ev->request),"NOTIFY")==0){
1969 if (op->sipfrag_pending){
1970 send_notify_for_refer(op->did,op->sipfrag_pending);
1971 op->sipfrag_pending=NULL;
1977 static bool_t process_event(Sal *sal, eXosip_event_t *ev){
1978 ms_message("linphone process event get a message %d\n",ev->type);
1980 case EXOSIP_CALL_ANSWERED:
1981 ms_message("CALL_ANSWERED\n");
1982 call_accepted(sal,ev);
1983 authentication_ok(sal,ev);
1985 case EXOSIP_CALL_CLOSED:
1986 case EXOSIP_CALL_CANCELLED:
1987 ms_message("CALL_CLOSED or CANCELLED\n");
1988 call_terminated(sal,ev);
1990 case EXOSIP_CALL_TIMEOUT:
1991 case EXOSIP_CALL_NOANSWER:
1992 ms_message("CALL_TIMEOUT or NOANSWER\n");
1993 return call_failure(sal,ev);
1995 case EXOSIP_CALL_REQUESTFAILURE:
1996 case EXOSIP_CALL_GLOBALFAILURE:
1997 case EXOSIP_CALL_SERVERFAILURE:
1998 ms_message("CALL_REQUESTFAILURE or GLOBALFAILURE or SERVERFAILURE\n");
1999 return call_failure(sal,ev);
2001 case EXOSIP_CALL_RELEASED:
2002 ms_message("CALL_RELEASED\n");
2003 call_released(sal, ev);
2005 case EXOSIP_CALL_INVITE:
2006 ms_message("CALL_NEW\n");
2007 inc_new_call(sal,ev);
2009 case EXOSIP_CALL_REINVITE:
2010 handle_reinvite(sal,ev);
2012 case EXOSIP_CALL_ACK:
2013 ms_message("CALL_ACK");
2016 case EXOSIP_CALL_REDIRECTED:
2017 ms_message("CALL_REDIRECTED");
2018 eXosip_default_action(ev);
2020 case EXOSIP_CALL_PROCEEDING:
2021 ms_message("CALL_PROCEEDING");
2022 call_proceeding(sal,ev);
2024 case EXOSIP_CALL_RINGING:
2025 ms_message("CALL_RINGING");
2026 call_ringing(sal,ev);
2027 authentication_ok(sal,ev);
2029 case EXOSIP_CALL_MESSAGE_NEW:
2030 ms_message("EXOSIP_CALL_MESSAGE_NEW");
2031 call_message_new(sal,ev);
2033 case EXOSIP_CALL_MESSAGE_REQUESTFAILURE:
2035 (ev->response->status_code==407 || ev->response->status_code==401)){
2036 return process_authentication(sal,ev);
2039 case EXOSIP_CALL_MESSAGE_ANSWERED:
2040 ms_message("EXOSIP_CALL_MESSAGE_ANSWERED ");
2041 process_in_call_reply(sal,ev);
2043 case EXOSIP_IN_SUBSCRIPTION_NEW:
2044 ms_message("CALL_IN_SUBSCRIPTION_NEW ");
2045 sal_exosip_subscription_recv(sal,ev);
2047 case EXOSIP_IN_SUBSCRIPTION_RELEASED:
2048 ms_message("CALL_SUBSCRIPTION_NEW ");
2049 sal_exosip_in_subscription_closed(sal,ev);
2051 case EXOSIP_SUBSCRIPTION_UPDATE:
2052 ms_message("CALL_SUBSCRIPTION_UPDATE");
2054 case EXOSIP_SUBSCRIPTION_NOTIFY:
2055 ms_message("CALL_SUBSCRIPTION_NOTIFY");
2056 sal_exosip_notify_recv(sal,ev);
2058 case EXOSIP_SUBSCRIPTION_ANSWERED:
2059 ms_message("EXOSIP_SUBSCRIPTION_ANSWERED, ev->sid=%i, ev->did=%i\n",ev->sid,ev->did);
2060 sal_exosip_subscription_answered(sal,ev);
2062 case EXOSIP_SUBSCRIPTION_CLOSED:
2063 ms_message("EXOSIP_SUBSCRIPTION_CLOSED\n");
2064 sal_exosip_subscription_closed(sal,ev);
2066 case EXOSIP_SUBSCRIPTION_REQUESTFAILURE: /**< announce a request failure */
2067 if (ev->response && (ev->response->status_code == 407 || ev->response->status_code == 401)){
2068 return process_authentication(sal,ev);
2070 case EXOSIP_SUBSCRIPTION_SERVERFAILURE:
2071 case EXOSIP_SUBSCRIPTION_GLOBALFAILURE:
2072 sal_exosip_subscription_closed(sal,ev);
2074 case EXOSIP_REGISTRATION_FAILURE:
2075 ms_message("REGISTRATION_FAILURE\n");
2076 return registration_failure(sal,ev);
2078 case EXOSIP_REGISTRATION_SUCCESS:
2079 authentication_ok(sal,ev);
2080 registration_success(sal,ev);
2082 case EXOSIP_MESSAGE_NEW:
2083 other_request(sal,ev);
2085 case EXOSIP_MESSAGE_PROCEEDING:
2086 case EXOSIP_MESSAGE_ANSWERED:
2087 case EXOSIP_MESSAGE_REDIRECTED:
2088 case EXOSIP_MESSAGE_SERVERFAILURE:
2089 case EXOSIP_MESSAGE_GLOBALFAILURE:
2090 other_request_reply(sal,ev);
2092 case EXOSIP_MESSAGE_REQUESTFAILURE:
2093 case EXOSIP_NOTIFICATION_REQUESTFAILURE:
2095 switch (ev->response->status_code) {
2098 return process_authentication(sal,ev);
2100 eXosip_automatic_action ();
2105 other_request_reply(sal,ev);
2108 ms_message("Unhandled exosip event ! %i",ev->type);
2114 int sal_iterate(Sal *sal){
2116 while((ev=eXosip_event_wait(0,0))!=NULL){
2117 if (process_event(sal,ev))
2118 eXosip_event_free(ev);
2120 #ifdef HAVE_EXOSIP_TRYLOCK
2121 if (eXosip_trylock()==0){
2122 eXosip_automatic_refresh();
2125 ms_warning("eXosip_trylock busy.");
2129 eXosip_automatic_refresh();
2135 static void register_set_contact(osip_message_t *msg, const char *contact){
2136 osip_uri_param_t *param = NULL;
2137 osip_contact_t *ct=NULL;
2139 /*we get the line parameter choosed by exosip, and add it to our own contact*/
2140 osip_message_get_contact(msg,0,&ct);
2142 osip_uri_uparam_get_byname(ct->url, "line", ¶m);
2143 if (param && param->gvalue)
2144 line=osip_strdup(param->gvalue);
2146 _osip_list_set_empty(&msg->contacts,(void (*)(void*))osip_contact_free);
2147 osip_message_set_contact(msg,contact);
2148 osip_message_get_contact(msg,0,&ct);
2149 osip_uri_uparam_add(ct->url,osip_strdup("line"),line);
2152 static void sal_register_add_route(osip_message_t *msg, const char *proxy){
2154 snprintf(tmp,sizeof(tmp)-1,"<%s;lr>",proxy);
2156 osip_list_special_free(&msg->routes,(void (*)(void*))osip_route_free);
2157 osip_message_set_route(msg,tmp);
2160 int sal_register(SalOp *h, const char *proxy, const char *from, int expires){
2161 osip_message_t *msg;
2162 const char *contact=sal_op_get_contact(h);
2164 sal_op_set_route(h,proxy);
2166 SalAddress *from_parsed=sal_address_new(from);
2168 if (from_parsed==NULL) {
2169 ms_warning("sal_register() bad from %s",from);
2172 snprintf(domain,sizeof(domain),"sip:%s",sal_address_get_domain(from_parsed));
2173 sal_address_destroy(from_parsed);
2175 h->rid=eXosip_register_build_initial_register(from,domain,NULL,expires,&msg);
2177 if (contact) register_set_contact(msg,contact);
2178 sal_register_add_route(msg,proxy);
2179 sal_add_register(h->base.root,h);
2181 ms_error("Could not build initial register.");
2187 eXosip_register_build_register(h->rid,expires,&msg);
2188 sal_register_add_route(msg,proxy);
2191 eXosip_register_send_register(h->rid,msg);
2194 return (msg != NULL) ? 0 : -1;
2197 int sal_register_refresh(SalOp *op, int expires){
2198 osip_message_t *msg=NULL;
2199 const char *contact=sal_op_get_contact(op);
2202 ms_error("Unexistant registration context, not possible to refresh.");
2206 eXosip_register_build_register(op->rid,expires,&msg);
2208 if (contact) register_set_contact(msg,contact);
2209 sal_register_add_route(msg,sal_op_get_route(op));
2210 eXosip_register_send_register(op->rid,msg);
2211 }else ms_error("Could not build REGISTER refresh message.");
2213 return (msg != NULL) ? 0 : -1;
2217 int sal_unregister(SalOp *h){
2218 osip_message_t *msg=NULL;
2220 eXosip_register_build_register(h->rid,0,&msg);
2221 if (msg) eXosip_register_send_register(h->rid,msg);
2222 else ms_warning("Could not build unREGISTER !");
2227 SalAddress * sal_address_new(const char *uri){
2229 osip_from_init(&from);
2231 // Remove front spaces
2232 while (uri[0]==' ') {
2236 if (osip_from_parse(from,uri)!=0){
2237 osip_from_free(from);
2240 if (from->displayname!=NULL && from->displayname[0]=='"'){
2241 char *unquoted=osip_strdup_without_quote(from->displayname);
2242 osip_free(from->displayname);
2243 from->displayname=unquoted;
2245 return (SalAddress*)from;
2248 SalAddress * sal_address_clone(const SalAddress *addr){
2249 osip_from_t *ret=NULL;
2250 osip_from_clone((osip_from_t*)addr,&ret);
2251 return (SalAddress*)ret;
2254 #define null_if_empty(s) (((s)!=NULL && (s)[0]!='\0') ? (s) : NULL )
2256 const char *sal_address_get_scheme(const SalAddress *addr){
2257 const osip_from_t *u=(const osip_from_t*)addr;
2258 return null_if_empty(u->url->scheme);
2261 const char *sal_address_get_display_name(const SalAddress* addr){
2262 const osip_from_t *u=(const osip_from_t*)addr;
2263 return null_if_empty(u->displayname);
2266 const char *sal_address_get_username(const SalAddress *addr){
2267 const osip_from_t *u=(const osip_from_t*)addr;
2268 return null_if_empty(u->url->username);
2271 const char *sal_address_get_domain(const SalAddress *addr){
2272 const osip_from_t *u=(const osip_from_t*)addr;
2273 return null_if_empty(u->url->host);
2276 void sal_address_set_display_name(SalAddress *addr, const char *display_name){
2277 osip_from_t *u=(osip_from_t*)addr;
2278 if (u->displayname!=NULL){
2279 osip_free(u->displayname);
2280 u->displayname=NULL;
2282 if (display_name!=NULL && display_name[0]!='\0'){
2283 u->displayname=osip_strdup(display_name);
2287 void sal_address_set_username(SalAddress *addr, const char *username){
2288 osip_from_t *uri=(osip_from_t*)addr;
2289 if (uri->url->username!=NULL){
2290 osip_free(uri->url->username);
2291 uri->url->username=NULL;
2294 uri->url->username=osip_strdup(username);
2297 void sal_address_set_domain(SalAddress *addr, const char *host){
2298 osip_from_t *uri=(osip_from_t*)addr;
2299 if (uri->url->host!=NULL){
2300 osip_free(uri->url->host);
2301 uri->url->host=NULL;
2304 uri->url->host=osip_strdup(host);
2307 void sal_address_set_port(SalAddress *addr, const char *port){
2308 osip_from_t *uri=(osip_from_t*)addr;
2309 if (uri->url->port!=NULL){
2310 osip_free(uri->url->port);
2311 uri->url->port=NULL;
2314 uri->url->port=osip_strdup(port);
2317 void sal_address_set_port_int(SalAddress *uri, int port){
2320 /*this is the default, special case to leave the port field blank*/
2321 sal_address_set_port(uri,NULL);
2324 snprintf(tmp,sizeof(tmp),"%i",port);
2325 sal_address_set_port(uri,tmp);
2328 void sal_address_clean(SalAddress *addr){
2329 osip_generic_param_freelist(& ((osip_from_t*)addr)->gen_params);
2330 osip_uri_param_freelist(& ((osip_from_t*)addr)->url->url_params);
2333 char *sal_address_as_string(const SalAddress *u){
2335 osip_from_t *from=(osip_from_t *)u;
2336 char *old_displayname=NULL;
2337 /* hack to force use of quotes around the displayname*/
2338 if (from->displayname!=NULL
2339 && from->displayname[0]!='"'){
2340 old_displayname=from->displayname;
2341 from->displayname=osip_enquote(from->displayname);
2343 osip_from_to_str(from,&tmp);
2344 if (old_displayname!=NULL){
2345 ms_free(from->displayname);
2346 from->displayname=old_displayname;
2353 char *sal_address_as_string_uri_only(const SalAddress *u){
2354 char *tmp=NULL,*ret;
2355 osip_uri_to_str(((osip_from_t*)u)->url,&tmp);
2360 void sal_address_set_param(SalAddress *u,const char* name,const char* value) {
2361 osip_uri_param_t *param=NULL;
2362 osip_uri_uparam_get_byname(((osip_from_t*)u)->url,(char*)name,¶m);
2364 osip_uri_uparam_add (((osip_from_t*)u)->url,ms_strdup(name),value ? ms_strdup(value) : NULL);
2366 osip_free(param->gvalue);
2367 param->gvalue=value ? osip_strdup(value) : NULL;
2372 void sal_address_destroy(SalAddress *u){
2373 osip_from_free((osip_from_t*)u);
2376 void sal_set_keepalive_period(Sal *ctx,unsigned int value) {
2377 ctx->keepalive_period=value;
2378 eXosip_set_option (EXOSIP_OPT_UDP_KEEP_ALIVE, &value);
2380 unsigned int sal_get_keepalive_period(Sal *ctx) {
2381 return ctx->keepalive_period;
2384 const char * sal_address_get_port(const SalAddress *addr) {
2385 const osip_from_t *u=(const osip_from_t*)addr;
2386 return null_if_empty(u->url->port);
2389 int sal_address_get_port_int(const SalAddress *uri) {
2390 const char* port = sal_address_get_port(uri);
2397 SalTransport sal_address_get_transport(const SalAddress* addr) {
2398 const osip_from_t *u=(const osip_from_t*)addr;
2399 osip_uri_param_t *transport_param=NULL;
2400 osip_uri_uparam_get_byname(u->url,"transport",&transport_param);
2401 if (transport_param == NULL){
2402 return SalTransportUDP;
2404 return sal_transport_parse(transport_param->gvalue);
2407 void sal_address_set_transport(SalAddress* addr,SalTransport transport) {
2408 sal_address_set_param(addr, "transport", sal_transport_to_string(transport));
2411 /* sends a reinvite. Local media description may have changed by application since call establishment*/
2412 int sal_call_update(SalOp *h, const char *subject){
2414 osip_message_t *reinvite=NULL;
2417 if(eXosip_call_build_request(h->did,"INVITE",&reinvite) != 0 || reinvite==NULL){
2422 osip_message_set_subject(reinvite,subject);
2423 osip_message_set_allow(reinvite, "INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, NOTIFY, MESSAGE, SUBSCRIBE, INFO");
2424 if (h->base.root->session_expires!=0){
2425 osip_message_set_header(reinvite, "Session-expires", "200");
2426 osip_message_set_supported(reinvite, "timer");
2428 if (h->base.local_media){
2429 h->sdp_offering=TRUE;
2430 set_sdp_from_desc(reinvite,h->base.local_media,sal_op_get_ice_session(h));
2431 }else h->sdp_offering=FALSE;
2433 err = eXosip_call_send_request(h->did, reinvite);
2437 void sal_reuse_authorization(Sal *ctx, bool_t value) {
2438 ctx->reuse_authorization=value;