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){
506 sdp_message_t *msg=media_description_to_sdp(desc);
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);
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);
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);
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);
994 set_network_origin(op,ev->request);
995 set_remote_ua(op,ev->request);
996 set_replaces(op,ev->request);
999 op->sdp_offering=FALSE;
1000 op->base.remote_media=sal_media_description_new();
1001 sdp_to_media_description(sdp,op->base.remote_media);
1002 sdp_message_free(sdp);
1003 }else op->sdp_offering=TRUE;
1005 from=osip_message_get_from(ev->request);
1006 to=osip_message_get_to(ev->request);
1007 osip_from_to_str(from,&tmp);
1008 sal_op_set_from(op,tmp);
1010 osip_from_to_str(to,&tmp);
1011 sal_op_set_to(op,tmp);
1014 osip_message_get_call_info(ev->request,0,&call_info);
1017 osip_call_info_to_str(call_info,&tmp);
1018 if( strstr(tmp,"answer-after=") != NULL)
1020 op->auto_answer_asked=TRUE;
1021 ms_message("The caller asked to automatically answer the call(Emergency?)\n");
1030 sal_add_call(op->base.root,op);
1031 sal->callbacks.call_received(op);
1034 static void handle_reinvite(Sal *sal, eXosip_event_t *ev){
1035 SalOp *op=find_op(sal,ev);
1039 ms_warning("Reinvite for non-existing operation !");
1044 sdp=eXosip_get_sdp_info(ev->request);
1045 if (op->base.remote_media){
1046 sal_media_description_unref(op->base.remote_media);
1047 op->base.remote_media=NULL;
1050 sal_media_description_unref(op->result);
1054 op->sdp_offering=FALSE;
1055 op->base.remote_media=sal_media_description_new();
1056 sdp_to_media_description(sdp,op->base.remote_media);
1057 sdp_message_free(sdp);
1060 op->sdp_offering=TRUE;
1062 sal->callbacks.call_updating(op);
1065 static void handle_ack(Sal *sal, eXosip_event_t *ev){
1066 SalOp *op=find_op(sal,ev);
1070 ms_warning("ack for non-existing call !");
1073 if (op->terminated) {
1074 ms_warning("ack for terminated call, ignoring");
1078 if (op->sdp_offering){
1079 sdp=eXosip_get_sdp_info(ev->ack);
1081 if (op->base.remote_media)
1082 sal_media_description_unref(op->base.remote_media);
1083 op->base.remote_media=sal_media_description_new();
1084 sdp_to_media_description(sdp,op->base.remote_media);
1086 sdp_message_free(sdp);
1092 sal->callbacks.call_ack(op);
1095 static void update_contact_from_response(SalOp *op, osip_message_t *response){
1096 const char *received;
1098 SalTransport transport;
1099 if (extract_received_rport(response,&received,&rport,&transport)==0){
1100 const char *contact=sal_op_get_contact(op);
1102 /*no contact given yet, use from instead*/
1103 contact=sal_op_get_from(op);
1106 SalAddress *addr=sal_address_new(contact);
1108 sal_address_set_domain(addr,received);
1109 sal_address_set_port_int(addr,rport);
1110 if (transport!=SalTransportUDP)
1111 sal_address_set_transport(addr,transport);
1112 tmp=sal_address_as_string(addr);
1113 ms_message("Contact address updated to %s",tmp);
1114 sal_op_set_contact(op,tmp);
1115 sal_address_destroy(addr);
1121 static int call_proceeding(Sal *sal, eXosip_event_t *ev){
1122 SalOp *op=find_op(sal,ev);
1124 if (op==NULL || op->terminated==TRUE) {
1125 ms_warning("This call has been canceled.");
1127 eXosip_call_terminate(ev->cid,ev->did);
1135 /* update contact if received and rport are set by the server
1136 note: will only be used by remote for next INVITE, if any...*/
1137 update_contact_from_response(op,ev->response);
1141 static void call_ringing(Sal *sal, eXosip_event_t *ev){
1143 SalOp *op=find_op(sal,ev);
1144 if (call_proceeding(sal, ev)==-1) return;
1146 set_remote_ua(op,ev->response);
1147 sdp=eXosip_get_sdp_info(ev->response);
1149 op->base.remote_media=sal_media_description_new();
1150 sdp_to_media_description(sdp,op->base.remote_media);
1151 sdp_message_free(sdp);
1152 if (op->base.local_media) sdp_process(op);
1154 sal->callbacks.call_ringing(op);
1157 static void call_accepted(Sal *sal, eXosip_event_t *ev){
1159 osip_message_t *msg=NULL;
1160 SalOp *op=find_op(sal,ev);
1161 const char *contact;
1163 if (op==NULL || op->terminated==TRUE) {
1164 ms_warning("This call has been already terminated.");
1166 eXosip_call_terminate(ev->cid,ev->did);
1172 set_remote_ua(op,ev->response);
1174 sdp=eXosip_get_sdp_info(ev->response);
1176 op->base.remote_media=sal_media_description_new();
1177 sdp_to_media_description(sdp,op->base.remote_media);
1178 sdp_message_free(sdp);
1179 if (op->base.local_media) sdp_process(op);
1181 eXosip_call_build_ack(ev->did,&msg);
1183 ms_warning("This call has been already terminated.");
1185 eXosip_call_terminate(ev->cid,ev->did);
1189 contact=sal_op_get_contact(op);
1191 _osip_list_set_empty(&msg->contacts,(void (*)(void*))osip_contact_free);
1192 osip_message_set_contact(msg,contact);
1194 if (op->sdp_answer){
1195 set_sdp(msg,op->sdp_answer);
1196 sdp_message_free(op->sdp_answer);
1197 op->sdp_answer=NULL;
1199 eXosip_call_send_ack(ev->did,msg);
1200 sal->callbacks.call_accepted(op);
1203 static void call_terminated(Sal *sal, eXosip_event_t *ev){
1205 SalOp *op=find_op(sal,ev);
1207 ms_warning("Call terminated for already closed call ?");
1211 osip_from_to_str(ev->request->from,&from);
1213 sal->callbacks.call_terminated(op,from!=NULL ? from : sal_op_get_from(op));
1214 if (from) osip_free(from);
1215 op->terminated=TRUE;
1218 static void call_released(Sal *sal, eXosip_event_t *ev){
1219 SalOp *op=find_op(sal,ev);
1221 ms_warning("No op associated to this call_released()");
1224 if (!op->terminated){
1225 /* no response received so far */
1226 call_failure(sal,ev);
1228 sal->callbacks.call_released(op);
1231 static int get_auth_data_from_response(osip_message_t *resp, const char **realm, const char **username){
1232 const char *prx_realm=NULL,*www_realm=NULL;
1233 osip_proxy_authenticate_t *prx_auth;
1234 osip_www_authenticate_t *www_auth;
1236 *username=osip_uri_get_username(resp->from->url);
1237 prx_auth=(osip_proxy_authenticate_t*)osip_list_get(&resp->proxy_authenticates,0);
1238 www_auth=(osip_proxy_authenticate_t*)osip_list_get(&resp->www_authenticates,0);
1240 prx_realm=osip_proxy_authenticate_get_realm(prx_auth);
1242 www_realm=osip_www_authenticate_get_realm(www_auth);
1246 }else if (www_realm){
1254 static int get_auth_data_from_request(osip_message_t *msg, const char **realm, const char **username){
1255 osip_authorization_t *auth=NULL;
1256 osip_proxy_authorization_t *prx_auth=NULL;
1258 *username=osip_uri_get_username(msg->from->url);
1259 osip_message_get_authorization(msg, 0, &auth);
1261 *realm=osip_authorization_get_realm(auth);
1264 osip_message_get_proxy_authorization(msg,0,&prx_auth);
1266 *realm=osip_proxy_authorization_get_realm(prx_auth);
1272 static int get_auth_data(eXosip_event_t *ev, const char **realm, const char **username){
1273 if (ev->response && get_auth_data_from_response(ev->response,realm,username)==0) return 0;
1274 if (ev->request && get_auth_data_from_request(ev->request,realm,username)==0) return 0;
1278 int sal_op_get_auth_requested(SalOp *op, const char **realm, const char **username){
1279 if (op->pending_auth){
1280 return get_auth_data(op->pending_auth,realm,username);
1285 static bool_t process_authentication(Sal *sal, eXosip_event_t *ev){
1287 const char *username,*realm;
1290 ms_warning("No operation associated with this authentication !");
1293 if (get_auth_data(ev,&realm,&username)==0){
1294 if (op->pending_auth!=NULL){
1295 eXosip_event_free(op->pending_auth);
1296 op->pending_auth=ev;
1298 op->pending_auth=ev;
1299 sal_add_pending_auth(sal,op);
1302 sal->callbacks.auth_requested(op,realm,username);
1308 static void authentication_ok(Sal *sal, eXosip_event_t *ev){
1310 const char *username,*realm;
1313 ms_warning("No operation associated with this authentication_ok!");
1316 if (op->pending_auth){
1317 eXosip_event_free(op->pending_auth);
1318 sal_remove_pending_auth(sal,op);
1319 op->pending_auth=NULL;
1321 if (get_auth_data(ev,&realm,&username)==0){
1322 sal->callbacks.auth_success(op,realm,username);
1326 static bool_t call_failure(Sal *sal, eXosip_event_t *ev){
1329 char* computedReason=NULL;
1330 const char *reason=NULL;
1331 SalError error=SalErrorUnknown;
1332 SalReason sr=SalReasonUnknown;
1335 op=(SalOp*)find_op(sal,ev);
1338 ms_warning("Call failure reported for a closed call, ignored.");
1343 code=osip_message_get_status_code(ev->response);
1344 reason=osip_message_get_reason_phrase(ev->response);
1345 osip_header_t *h=NULL;
1346 if (!osip_message_header_get_byname( ev->response
1350 computedReason = ms_strdup_printf("%s %s",reason,osip_header_get_value(h));
1351 reason = computedReason;
1359 return process_authentication(sal,ev);
1362 error=SalErrorUnknown;
1365 error=SalErrorFailure;
1366 sr=SalReasonNotFound;
1369 error=SalErrorFailure;
1373 eXosip_default_action(ev);
1377 error=SalErrorFailure;
1378 sr=SalReasonTemporarilyUnavailable;
1380 error=SalErrorFailure;
1386 error=SalErrorFailure;
1387 sr=SalReasonDoNotDisturb;
1390 error=SalErrorFailure;
1391 sr=SalReasonDeclined;
1395 error=SalErrorFailure;
1396 sr=SalReasonUnknown;
1397 }else error=SalErrorNoResponse;
1399 op->terminated=TRUE;
1400 sal->callbacks.call_failure(op,error,sr,reason,code);
1401 if (computedReason != NULL){
1402 ms_free(computedReason);
1407 /* Request remote side to send us VFU */
1408 void sal_call_send_vfu_request(SalOp *h){
1409 osip_message_t *msg=NULL;
1411 "<?xml version=\"1.0\" encoding=\"utf-8\" ?>"
1415 " <picture_fast_update></picture_fast_update>"
1423 eXosip_call_build_info(h->did,&msg);
1425 osip_message_set_body(msg,info_body,strlen(info_body));
1426 osip_message_set_content_type(msg,"application/media_control+xml");
1427 snprintf(clen,sizeof(clen),"%lu",(unsigned long)strlen(info_body));
1428 osip_message_set_content_length(msg,clen);
1429 eXosip_call_send_request(h->did,msg);
1430 ms_message("Sending VFU request !");
1435 static void process_media_control_xml(Sal *sal, eXosip_event_t *ev){
1436 SalOp *op=find_op(sal,ev);
1437 osip_body_t *body=NULL;
1440 ms_warning("media control xml received without operation context!");
1444 osip_message_get_body(ev->request,0,&body);
1445 if (body && body->body!=NULL &&
1446 strstr(body->body,"picture_fast_update")){
1447 osip_message_t *ans=NULL;
1448 ms_message("Receiving VFU request !");
1449 if (sal->callbacks.vfu_request){
1450 sal->callbacks.vfu_request(op);
1451 eXosip_call_build_answer(ev->tid,200,&ans);
1453 eXosip_call_send_answer(ev->tid,200,ans);
1457 /*in all other cases we must say it is not implemented.*/
1459 osip_message_t *ans=NULL;
1461 eXosip_call_build_answer(ev->tid,501,&ans);
1463 eXosip_call_send_answer(ev->tid,501,ans);
1468 static void process_dtmf_relay(Sal *sal, eXosip_event_t *ev){
1469 SalOp *op=find_op(sal,ev);
1470 osip_body_t *body=NULL;
1473 ms_warning("media dtmf relay received without operation context!");
1477 osip_message_get_body(ev->request,0,&body);
1478 if (body && body->body!=NULL){
1479 osip_message_t *ans=NULL;
1480 const char *name=strstr(body->body,"Signal");
1481 if (name==NULL) name=strstr(body->body,"signal");
1483 ms_warning("Could not extract the dtmf name from the SIP INFO.");
1486 name+=strlen("signal");
1487 if (sscanf(name," = %1s",tmp)==1){
1488 ms_message("Receiving dtmf %s via SIP INFO.",tmp);
1489 if (sal->callbacks.dtmf_received != NULL)
1490 sal->callbacks.dtmf_received(op, tmp[0]);
1494 eXosip_call_build_answer(ev->tid,200,&ans);
1496 eXosip_call_send_answer(ev->tid,200,ans);
1501 static void fill_options_answer(osip_message_t *options){
1502 osip_message_set_allow(options,"INVITE, ACK, BYE, CANCEL, OPTIONS, MESSAGE, SUBSCRIBE, NOTIFY, INFO");
1503 osip_message_set_accept(options,"application/sdp");
1506 static void process_refer(Sal *sal, SalOp *op, eXosip_event_t *ev){
1507 osip_header_t *h=NULL;
1508 osip_message_t *ans=NULL;
1509 ms_message("Receiving REFER request !");
1510 osip_message_header_get_byname(ev->request,"Refer-To",0,&h);
1513 osip_from_t *from=NULL;
1515 osip_from_init(&from);
1517 if (osip_from_parse(from,h->hvalue)==0){
1519 osip_uri_header_t *uh=NULL;
1520 osip_header_t *referred_by=NULL;
1521 osip_uri_header_get_byname(&from->url->url_headers,(char*)"Replaces",&uh);
1522 if (uh!=NULL && uh->gvalue && uh->gvalue[0]!='\0'){
1523 ms_message("Found replaces in Refer-To");
1525 ms_free(op->replaces);
1527 op->replaces=ms_strdup(uh->gvalue);
1529 osip_message_header_get_byname(ev->request,"Referred-By",0,&referred_by);
1530 if (referred_by && referred_by->hvalue && referred_by->hvalue[0]!='\0'){
1531 if (op->referred_by)
1532 ms_free(op->referred_by);
1533 op->referred_by=ms_strdup(referred_by->hvalue);
1536 osip_uri_header_freelist(&from->url->url_headers);
1537 osip_from_to_str(from,&tmp);
1538 sal->callbacks.refer_received(sal,op,tmp);
1540 osip_from_free(from);
1543 eXosip_call_build_answer(ev->tid,202,&ans);
1545 eXosip_call_send_answer(ev->tid,202,ans);
1550 ms_warning("cannot do anything with the refer without destination\n");
1554 static void process_notify(Sal *sal, eXosip_event_t *ev){
1555 osip_header_t *h=NULL;
1557 SalOp *op=find_op(sal,ev);
1558 osip_message_t *ans=NULL;
1560 ms_message("Receiving NOTIFY request !");
1561 osip_from_to_str(ev->request->from,&from);
1562 osip_message_header_get_byname(ev->request,"Event",0,&h);
1564 osip_body_t *body=NULL;
1565 //osip_content_type_t *ct=NULL;
1566 osip_message_get_body(ev->request,0,&body);
1567 //ct=osip_message_get_content_type(ev->request);
1568 if (h->hvalue && strcasecmp(h->hvalue,"refer")==0){
1569 /*special handling of refer events*/
1570 if (body && body->body){
1571 osip_message_t *msg;
1572 osip_message_init(&msg);
1573 if (osip_message_parse_sipfrag(msg,body->body,strlen(body->body))==0){
1574 int code=osip_message_get_status_code(msg);
1576 sal->callbacks.notify_refer(op,SalReferTrying);
1577 }else if (code==200){
1578 sal->callbacks.notify_refer(op,SalReferSuccess);
1579 }else if (code>=400){
1580 sal->callbacks.notify_refer(op,SalReferFailed);
1583 osip_message_free(msg);
1586 /*generic handling*/
1587 sal->callbacks.notify(op,from,h->hvalue);
1590 /*answer that we received the notify*/
1592 eXosip_call_build_answer(ev->tid,200,&ans);
1594 eXosip_call_send_answer(ev->tid,200,ans);
1599 static void call_message_new(Sal *sal, eXosip_event_t *ev){
1600 osip_message_t *ans=NULL;
1602 if (MSG_IS_INFO(ev->request)){
1603 osip_content_type_t *ct;
1604 ct=osip_message_get_content_type(ev->request);
1605 if (ct && ct->subtype){
1606 if (strcmp(ct->subtype,"media_control+xml")==0)
1607 process_media_control_xml(sal,ev);
1608 else if (strcmp(ct->subtype,"dtmf-relay")==0)
1609 process_dtmf_relay(sal,ev);
1611 ms_message("Unhandled SIP INFO.");
1612 /*send an "Not implemented" answer*/
1614 eXosip_call_build_answer(ev->tid,501,&ans);
1616 eXosip_call_send_answer(ev->tid,501,ans);
1620 /*empty SIP INFO, probably to test we are alive. Send an empty answer*/
1622 eXosip_call_build_answer(ev->tid,200,&ans);
1624 eXosip_call_send_answer(ev->tid,200,ans);
1627 }else if(MSG_IS_MESSAGE(ev->request)){
1628 /* SIP messages could be received into call */
1629 text_received(sal, ev);
1631 eXosip_call_build_answer(ev->tid,200,&ans);
1633 eXosip_call_send_answer(ev->tid,200,ans);
1635 }else if(MSG_IS_REFER(ev->request)){
1636 SalOp *op=find_op(sal,ev);
1638 ms_message("Receiving REFER request !");
1639 process_refer(sal,op,ev);
1640 }else if(MSG_IS_NOTIFY(ev->request)){
1641 process_notify(sal,ev);
1642 }else if (MSG_IS_OPTIONS(ev->request)){
1644 eXosip_call_build_answer(ev->tid,200,&ans);
1646 fill_options_answer(ans);
1647 eXosip_call_send_answer(ev->tid,200,ans);
1651 }else ms_warning("call_message_new: No request ?");
1654 static void inc_update(Sal *sal, eXosip_event_t *ev){
1655 osip_message_t *msg=NULL;
1656 ms_message("Processing incoming UPDATE");
1658 eXosip_message_build_answer(ev->tid,200,&msg);
1660 eXosip_message_send_answer(ev->tid,200,msg);
1664 static bool_t comes_from_local_if(osip_message_t *msg){
1665 osip_via_t *via=NULL;
1666 osip_message_get_via(msg,0,&via);
1669 host=osip_via_get_host(via);
1670 if (strcmp(host,"127.0.0.1")==0 || strcmp(host,"::1")==0){
1671 osip_generic_param_t *param=NULL;
1672 osip_via_param_get_byname(via,"received",¶m);
1673 if (param==NULL) return TRUE;
1674 if (param->gvalue &&
1675 (strcmp(param->gvalue,"127.0.0.1")==0 || strcmp(param->gvalue,"::1")==0)){
1683 static void text_received(Sal *sal, eXosip_event_t *ev){
1684 osip_body_t *body=NULL;
1685 char *from=NULL,*msg;
1687 osip_message_get_body(ev->request,0,&body);
1689 ms_error("Could not get text message from SIP body");
1693 osip_from_to_str(ev->request->from,&from);
1694 sal->callbacks.text_received(sal,from,msg);
1700 static void other_request(Sal *sal, eXosip_event_t *ev){
1701 ms_message("in other_request");
1702 if (ev->request==NULL) return;
1703 if (strcmp(ev->request->sip_method,"MESSAGE")==0){
1704 text_received(sal,ev);
1705 eXosip_message_send_answer(ev->tid,200,NULL);
1706 }else if (strcmp(ev->request->sip_method,"OPTIONS")==0){
1707 osip_message_t *options=NULL;
1708 eXosip_options_build_answer(ev->tid,200,&options);
1709 fill_options_answer(options);
1710 eXosip_options_send_answer(ev->tid,200,options);
1711 }else if (strncmp(ev->request->sip_method, "REFER", 5) == 0){
1712 ms_message("Receiving REFER request !");
1713 if (comes_from_local_if(ev->request)) {
1714 process_refer(sal,NULL,ev);
1715 }else ms_warning("Ignored REFER not coming from this local loopback interface.");
1716 }else if (strncmp(ev->request->sip_method, "UPDATE", 6) == 0){
1721 osip_message_to_str(ev->request,&tmp,&msglen);
1723 ms_message("Unsupported request received:\n%s",tmp);
1726 /*answer with a 501 Not implemented*/
1727 eXosip_message_send_answer(ev->tid,501,NULL);
1731 static void masquerade_via(osip_message_t *msg, const char *ip, const char *port){
1732 osip_via_t *via=NULL;
1733 osip_message_get_via(msg,0,&via);
1735 osip_free(via->port);
1736 via->port=osip_strdup(port);
1737 osip_free(via->host);
1738 via->host=osip_strdup(ip);
1743 static bool_t fix_message_contact(SalOp *op, osip_message_t *request,osip_message_t *last_answer, bool_t expire_last_contact) {
1744 osip_contact_t *ctt=NULL;
1745 const char *received;
1747 SalTransport transport;
1750 if (extract_received_rport(last_answer,&received,&rport,&transport)==-1) return FALSE;
1751 osip_message_get_contact(request,0,&ctt);
1753 ms_warning("fix_message_contact(): no contact to update");
1756 if (expire_last_contact){
1757 osip_contact_t *oldct=NULL,*prevct;
1758 osip_generic_param_t *param=NULL;
1759 osip_contact_clone(ctt,&oldct);
1760 while ((prevct=(osip_contact_t*)osip_list_get(&request->contacts,1))!=NULL){
1761 osip_contact_free(prevct);
1762 osip_list_remove(&request->contacts,1);
1764 osip_list_add(&request->contacts,oldct,1);
1765 osip_contact_param_get_byname(oldct,"expires",¶m);
1767 if (param->gvalue) osip_free(param->gvalue);
1768 param->gvalue=osip_strdup("0");
1770 osip_contact_param_add(oldct,osip_strdup("expires"),osip_strdup("0"));
1773 if (ctt->url->host!=NULL){
1774 osip_free(ctt->url->host);
1776 ctt->url->host=osip_strdup(received);
1777 if (ctt->url->port!=NULL){
1778 osip_free(ctt->url->port);
1780 snprintf(port,sizeof(port),"%i",rport);
1781 ctt->url->port=osip_strdup(port);
1782 if (op->masquerade_via) masquerade_via(request,received,port);
1784 if (transport != SalTransportUDP) {
1785 sal_address_set_param((SalAddress *)ctt, "transport", sal_transport_to_string(transport));
1790 static bool_t register_again_with_updated_contact(SalOp *op, osip_message_t *orig_request, osip_message_t *last_answer){
1791 osip_contact_t *ctt=NULL;
1792 SalAddress* ori_contact_address=NULL;
1793 const char *received;
1795 SalTransport transport;
1797 osip_message_t *msg=NULL;
1798 Sal* sal=op->base.root;
1800 bool_t found_valid_contact=FALSE;
1801 bool_t from_request=FALSE;
1803 if (sal->double_reg==FALSE ) return FALSE;
1805 if (extract_received_rport(last_answer,&received,&rport,&transport)==-1) return FALSE;
1808 osip_message_get_contact(last_answer,i,&ctt);
1809 if (!from_request && ctt==NULL) {
1810 osip_message_get_contact(orig_request,0,&ctt);
1814 osip_contact_to_str(ctt,&tmp);
1815 ori_contact_address = sal_address_new(tmp);
1817 /*check if contact is up to date*/
1818 if (strcmp(sal_address_get_domain(ori_contact_address),received) ==0
1819 && sal_address_get_port_int(ori_contact_address) == rport
1820 && sal_address_get_transport(ori_contact_address) == transport) {
1822 ms_message("Register response has up to date contact, doing nothing.");
1824 ms_warning("Register response does not have up to date contact, but last request had."
1825 "Stupid registrar detected, giving up.");
1827 found_valid_contact=TRUE;
1830 sal_address_destroy(ori_contact_address);
1833 }while(!found_valid_contact);
1834 if (!found_valid_contact)
1835 ms_message("Contact do not match, resending register.");
1839 eXosip_register_build_register(op->rid,op->expires,&msg);
1842 ms_warning("Fail to create a contact updated register.");
1845 if (fix_message_contact(op,msg,last_answer,op->base.root->expire_old_contact)) {
1846 eXosip_register_send_register(op->rid,msg);
1848 ms_message("Resending new register with updated contact");
1849 update_contact_from_response(op,last_answer);
1852 ms_warning("Fail to send updated register.");
1860 static void registration_success(Sal *sal, eXosip_event_t *ev){
1861 SalOp *op=sal_find_register(sal,ev->rid);
1862 osip_header_t *h=NULL;
1865 ms_error("Receiving register response for unknown operation");
1868 osip_message_get_expires(ev->request,0,&h);
1869 if (h!=NULL && atoi(h->hvalue)!=0){
1871 if (!register_again_with_updated_contact(op,ev->request,ev->response)){
1872 sal->callbacks.register_success(op,registered);
1875 sal->callbacks.register_success(op,FALSE);
1879 static bool_t registration_failure(Sal *sal, eXosip_event_t *ev){
1881 const char *reason=NULL;
1882 SalOp *op=sal_find_register(sal,ev->rid);
1883 SalReason sr=SalReasonUnknown;
1884 SalError se=SalErrorUnknown;
1887 ms_error("Receiving register failure for unknown operation");
1891 status_code=osip_message_get_status_code(ev->response);
1892 reason=osip_message_get_reason_phrase(ev->response);
1894 switch(status_code){
1897 return process_authentication(sal,ev);
1899 case 423: /*interval too brief*/
1900 {/*retry with greater interval */
1901 osip_header_t *h=NULL;
1902 osip_message_t *msg=NULL;
1903 osip_message_header_get_byname(ev->response,"min-expires",0,&h);
1904 if (h && h->hvalue && h->hvalue[0]!='\0'){
1905 int val=atoi(h->hvalue);
1906 if (val>op->expires)
1908 }else op->expires*=2;
1910 eXosip_register_build_register(op->rid,op->expires,&msg);
1911 eXosip_register_send_register(op->rid,msg);
1915 case 606: /*Not acceptable, workaround for proxies that don't like private addresses
1916 in vias, such as ekiga.net
1917 On the opposite, freephonie.net bugs when via are masqueraded.
1919 op->masquerade_via=TRUE;
1921 /* if contact is up to date, process the failure, otherwise resend a new register with
1922 updated contact first, just in case the faillure is due to incorrect contact */
1923 if (ev->response && register_again_with_updated_contact(op,ev->request,ev->response))
1924 return TRUE; /*we are retrying with an updated contact*/
1925 if (status_code==403){
1927 sr=SalReasonForbidden;
1928 }else if (status_code==0){
1929 se=SalErrorNoResponse;
1931 sal->callbacks.register_failure(op,se,sr,reason);
1936 static void other_request_reply(Sal *sal,eXosip_event_t *ev){
1937 SalOp *op=find_op(sal,ev);
1940 ms_warning("other_request_reply(): Receiving response to unknown request.");
1944 update_contact_from_response(op,ev->response);
1945 if (ev->request && strcmp(osip_message_get_method(ev->request),"OPTIONS")==0)
1946 sal->callbacks.ping_reply(op);
1950 static void process_in_call_reply(Sal *sal, eXosip_event_t *ev){
1951 SalOp *op=find_op(sal,ev);
1953 if (ev->request && strcmp(osip_message_get_method(ev->request),"NOTIFY")==0){
1954 if (op->sipfrag_pending){
1955 send_notify_for_refer(op->did,op->sipfrag_pending);
1956 op->sipfrag_pending=NULL;
1962 static bool_t process_event(Sal *sal, eXosip_event_t *ev){
1963 ms_message("linphone process event get a message %d\n",ev->type);
1965 case EXOSIP_CALL_ANSWERED:
1966 ms_message("CALL_ANSWERED\n");
1967 call_accepted(sal,ev);
1968 authentication_ok(sal,ev);
1970 case EXOSIP_CALL_CLOSED:
1971 case EXOSIP_CALL_CANCELLED:
1972 ms_message("CALL_CLOSED or CANCELLED\n");
1973 call_terminated(sal,ev);
1975 case EXOSIP_CALL_TIMEOUT:
1976 case EXOSIP_CALL_NOANSWER:
1977 ms_message("CALL_TIMEOUT or NOANSWER\n");
1978 return call_failure(sal,ev);
1980 case EXOSIP_CALL_REQUESTFAILURE:
1981 case EXOSIP_CALL_GLOBALFAILURE:
1982 case EXOSIP_CALL_SERVERFAILURE:
1983 ms_message("CALL_REQUESTFAILURE or GLOBALFAILURE or SERVERFAILURE\n");
1984 return call_failure(sal,ev);
1986 case EXOSIP_CALL_RELEASED:
1987 ms_message("CALL_RELEASED\n");
1988 call_released(sal, ev);
1990 case EXOSIP_CALL_INVITE:
1991 ms_message("CALL_NEW\n");
1992 inc_new_call(sal,ev);
1994 case EXOSIP_CALL_REINVITE:
1995 handle_reinvite(sal,ev);
1997 case EXOSIP_CALL_ACK:
1998 ms_message("CALL_ACK");
2001 case EXOSIP_CALL_REDIRECTED:
2002 ms_message("CALL_REDIRECTED");
2003 eXosip_default_action(ev);
2005 case EXOSIP_CALL_PROCEEDING:
2006 ms_message("CALL_PROCEEDING");
2007 call_proceeding(sal,ev);
2009 case EXOSIP_CALL_RINGING:
2010 ms_message("CALL_RINGING");
2011 call_ringing(sal,ev);
2012 authentication_ok(sal,ev);
2014 case EXOSIP_CALL_MESSAGE_NEW:
2015 ms_message("EXOSIP_CALL_MESSAGE_NEW");
2016 call_message_new(sal,ev);
2018 case EXOSIP_CALL_MESSAGE_REQUESTFAILURE:
2020 (ev->response->status_code==407 || ev->response->status_code==401)){
2021 return process_authentication(sal,ev);
2024 case EXOSIP_CALL_MESSAGE_ANSWERED:
2025 ms_message("EXOSIP_CALL_MESSAGE_ANSWERED ");
2026 process_in_call_reply(sal,ev);
2028 case EXOSIP_IN_SUBSCRIPTION_NEW:
2029 ms_message("CALL_IN_SUBSCRIPTION_NEW ");
2030 sal_exosip_subscription_recv(sal,ev);
2032 case EXOSIP_IN_SUBSCRIPTION_RELEASED:
2033 ms_message("CALL_SUBSCRIPTION_NEW ");
2034 sal_exosip_in_subscription_closed(sal,ev);
2036 case EXOSIP_SUBSCRIPTION_UPDATE:
2037 ms_message("CALL_SUBSCRIPTION_UPDATE");
2039 case EXOSIP_SUBSCRIPTION_NOTIFY:
2040 ms_message("CALL_SUBSCRIPTION_NOTIFY");
2041 sal_exosip_notify_recv(sal,ev);
2043 case EXOSIP_SUBSCRIPTION_ANSWERED:
2044 ms_message("EXOSIP_SUBSCRIPTION_ANSWERED, ev->sid=%i, ev->did=%i\n",ev->sid,ev->did);
2045 sal_exosip_subscription_answered(sal,ev);
2047 case EXOSIP_SUBSCRIPTION_CLOSED:
2048 ms_message("EXOSIP_SUBSCRIPTION_CLOSED\n");
2049 sal_exosip_subscription_closed(sal,ev);
2051 case EXOSIP_SUBSCRIPTION_REQUESTFAILURE: /**< announce a request failure */
2052 if (ev->response && (ev->response->status_code == 407 || ev->response->status_code == 401)){
2053 return process_authentication(sal,ev);
2055 case EXOSIP_SUBSCRIPTION_SERVERFAILURE:
2056 case EXOSIP_SUBSCRIPTION_GLOBALFAILURE:
2057 sal_exosip_subscription_closed(sal,ev);
2059 case EXOSIP_REGISTRATION_FAILURE:
2060 ms_message("REGISTRATION_FAILURE\n");
2061 return registration_failure(sal,ev);
2063 case EXOSIP_REGISTRATION_SUCCESS:
2064 authentication_ok(sal,ev);
2065 registration_success(sal,ev);
2067 case EXOSIP_MESSAGE_NEW:
2068 other_request(sal,ev);
2070 case EXOSIP_MESSAGE_PROCEEDING:
2071 case EXOSIP_MESSAGE_ANSWERED:
2072 case EXOSIP_MESSAGE_REDIRECTED:
2073 case EXOSIP_MESSAGE_SERVERFAILURE:
2074 case EXOSIP_MESSAGE_GLOBALFAILURE:
2075 other_request_reply(sal,ev);
2077 case EXOSIP_MESSAGE_REQUESTFAILURE:
2078 case EXOSIP_NOTIFICATION_REQUESTFAILURE:
2080 switch (ev->response->status_code) {
2083 return process_authentication(sal,ev);
2085 eXosip_automatic_action ();
2090 other_request_reply(sal,ev);
2093 ms_message("Unhandled exosip event ! %i",ev->type);
2099 int sal_iterate(Sal *sal){
2101 while((ev=eXosip_event_wait(0,0))!=NULL){
2102 if (process_event(sal,ev))
2103 eXosip_event_free(ev);
2105 #ifdef HAVE_EXOSIP_TRYLOCK
2106 if (eXosip_trylock()==0){
2107 eXosip_automatic_refresh();
2110 ms_warning("eXosip_trylock busy.");
2114 eXosip_automatic_refresh();
2120 static void register_set_contact(osip_message_t *msg, const char *contact){
2121 osip_uri_param_t *param = NULL;
2122 osip_contact_t *ct=NULL;
2124 /*we get the line parameter choosed by exosip, and add it to our own contact*/
2125 osip_message_get_contact(msg,0,&ct);
2127 osip_uri_uparam_get_byname(ct->url, "line", ¶m);
2128 if (param && param->gvalue)
2129 line=osip_strdup(param->gvalue);
2131 _osip_list_set_empty(&msg->contacts,(void (*)(void*))osip_contact_free);
2132 osip_message_set_contact(msg,contact);
2133 osip_message_get_contact(msg,0,&ct);
2134 osip_uri_uparam_add(ct->url,osip_strdup("line"),line);
2137 static void sal_register_add_route(osip_message_t *msg, const char *proxy){
2139 snprintf(tmp,sizeof(tmp)-1,"<%s;lr>",proxy);
2141 osip_list_special_free(&msg->routes,(void (*)(void*))osip_route_free);
2142 osip_message_set_route(msg,tmp);
2145 int sal_register(SalOp *h, const char *proxy, const char *from, int expires){
2146 osip_message_t *msg;
2147 const char *contact=sal_op_get_contact(h);
2149 sal_op_set_route(h,proxy);
2151 SalAddress *from_parsed=sal_address_new(from);
2153 if (from_parsed==NULL) {
2154 ms_warning("sal_register() bad from %s",from);
2157 snprintf(domain,sizeof(domain),"sip:%s",sal_address_get_domain(from_parsed));
2158 sal_address_destroy(from_parsed);
2160 h->rid=eXosip_register_build_initial_register(from,domain,NULL,expires,&msg);
2162 if (contact) register_set_contact(msg,contact);
2163 sal_register_add_route(msg,proxy);
2164 sal_add_register(h->base.root,h);
2166 ms_error("Could not build initial register.");
2172 eXosip_register_build_register(h->rid,expires,&msg);
2173 sal_register_add_route(msg,proxy);
2176 eXosip_register_send_register(h->rid,msg);
2179 return (msg != NULL) ? 0 : -1;
2182 int sal_register_refresh(SalOp *op, int expires){
2183 osip_message_t *msg=NULL;
2184 const char *contact=sal_op_get_contact(op);
2187 ms_error("Unexistant registration context, not possible to refresh.");
2191 eXosip_register_build_register(op->rid,expires,&msg);
2193 if (contact) register_set_contact(msg,contact);
2194 sal_register_add_route(msg,sal_op_get_route(op));
2195 eXosip_register_send_register(op->rid,msg);
2196 }else ms_error("Could not build REGISTER refresh message.");
2198 return (msg != NULL) ? 0 : -1;
2202 int sal_unregister(SalOp *h){
2203 osip_message_t *msg=NULL;
2205 eXosip_register_build_register(h->rid,0,&msg);
2206 if (msg) eXosip_register_send_register(h->rid,msg);
2207 else ms_warning("Could not build unREGISTER !");
2212 SalAddress * sal_address_new(const char *uri){
2214 osip_from_init(&from);
2216 // Remove front spaces
2217 while (uri[0]==' ') {
2221 if (osip_from_parse(from,uri)!=0){
2222 osip_from_free(from);
2225 if (from->displayname!=NULL && from->displayname[0]=='"'){
2226 char *unquoted=osip_strdup_without_quote(from->displayname);
2227 osip_free(from->displayname);
2228 from->displayname=unquoted;
2230 return (SalAddress*)from;
2233 SalAddress * sal_address_clone(const SalAddress *addr){
2234 osip_from_t *ret=NULL;
2235 osip_from_clone((osip_from_t*)addr,&ret);
2236 return (SalAddress*)ret;
2239 #define null_if_empty(s) (((s)!=NULL && (s)[0]!='\0') ? (s) : NULL )
2241 const char *sal_address_get_scheme(const SalAddress *addr){
2242 const osip_from_t *u=(const osip_from_t*)addr;
2243 return null_if_empty(u->url->scheme);
2246 const char *sal_address_get_display_name(const SalAddress* addr){
2247 const osip_from_t *u=(const osip_from_t*)addr;
2248 return null_if_empty(u->displayname);
2251 const char *sal_address_get_username(const SalAddress *addr){
2252 const osip_from_t *u=(const osip_from_t*)addr;
2253 return null_if_empty(u->url->username);
2256 const char *sal_address_get_domain(const SalAddress *addr){
2257 const osip_from_t *u=(const osip_from_t*)addr;
2258 return null_if_empty(u->url->host);
2261 void sal_address_set_display_name(SalAddress *addr, const char *display_name){
2262 osip_from_t *u=(osip_from_t*)addr;
2263 if (u->displayname!=NULL){
2264 osip_free(u->displayname);
2265 u->displayname=NULL;
2267 if (display_name!=NULL && display_name[0]!='\0'){
2268 u->displayname=osip_strdup(display_name);
2272 void sal_address_set_username(SalAddress *addr, const char *username){
2273 osip_from_t *uri=(osip_from_t*)addr;
2274 if (uri->url->username!=NULL){
2275 osip_free(uri->url->username);
2276 uri->url->username=NULL;
2279 uri->url->username=osip_strdup(username);
2282 void sal_address_set_domain(SalAddress *addr, const char *host){
2283 osip_from_t *uri=(osip_from_t*)addr;
2284 if (uri->url->host!=NULL){
2285 osip_free(uri->url->host);
2286 uri->url->host=NULL;
2289 uri->url->host=osip_strdup(host);
2292 void sal_address_set_port(SalAddress *addr, const char *port){
2293 osip_from_t *uri=(osip_from_t*)addr;
2294 if (uri->url->port!=NULL){
2295 osip_free(uri->url->port);
2296 uri->url->port=NULL;
2299 uri->url->port=osip_strdup(port);
2302 void sal_address_set_port_int(SalAddress *uri, int port){
2305 /*this is the default, special case to leave the port field blank*/
2306 sal_address_set_port(uri,NULL);
2309 snprintf(tmp,sizeof(tmp),"%i",port);
2310 sal_address_set_port(uri,tmp);
2313 void sal_address_clean(SalAddress *addr){
2314 osip_generic_param_freelist(& ((osip_from_t*)addr)->gen_params);
2315 osip_uri_param_freelist(& ((osip_from_t*)addr)->url->url_params);
2318 char *sal_address_as_string(const SalAddress *u){
2320 osip_from_t *from=(osip_from_t *)u;
2321 char *old_displayname=NULL;
2322 /* hack to force use of quotes around the displayname*/
2323 if (from->displayname!=NULL
2324 && from->displayname[0]!='"'){
2325 old_displayname=from->displayname;
2326 from->displayname=osip_enquote(from->displayname);
2328 osip_from_to_str(from,&tmp);
2329 if (old_displayname!=NULL){
2330 ms_free(from->displayname);
2331 from->displayname=old_displayname;
2338 char *sal_address_as_string_uri_only(const SalAddress *u){
2339 char *tmp=NULL,*ret;
2340 osip_uri_to_str(((osip_from_t*)u)->url,&tmp);
2345 void sal_address_set_param(SalAddress *u,const char* name,const char* value) {
2346 osip_uri_param_t *param=NULL;
2347 osip_uri_uparam_get_byname(((osip_from_t*)u)->url,(char*)name,¶m);
2349 osip_uri_uparam_add (((osip_from_t*)u)->url,ms_strdup(name),value ? ms_strdup(value) : NULL);
2351 osip_free(param->gvalue);
2352 param->gvalue=value ? osip_strdup(value) : NULL;
2357 void sal_address_destroy(SalAddress *u){
2358 osip_from_free((osip_from_t*)u);
2361 void sal_set_keepalive_period(Sal *ctx,unsigned int value) {
2362 ctx->keepalive_period=value;
2363 eXosip_set_option (EXOSIP_OPT_UDP_KEEP_ALIVE, &value);
2365 unsigned int sal_get_keepalive_period(Sal *ctx) {
2366 return ctx->keepalive_period;
2369 const char * sal_address_get_port(const SalAddress *addr) {
2370 const osip_from_t *u=(const osip_from_t*)addr;
2371 return null_if_empty(u->url->port);
2374 int sal_address_get_port_int(const SalAddress *uri) {
2375 const char* port = sal_address_get_port(uri);
2382 SalTransport sal_address_get_transport(const SalAddress* addr) {
2383 const osip_from_t *u=(const osip_from_t*)addr;
2384 osip_uri_param_t *transport_param=NULL;
2385 osip_uri_uparam_get_byname(u->url,"transport",&transport_param);
2386 if (transport_param == NULL){
2387 return SalTransportUDP;
2389 return sal_transport_parse(transport_param->gvalue);
2392 void sal_address_set_transport(SalAddress* addr,SalTransport transport) {
2393 sal_address_set_param(addr, "transport", sal_transport_to_string(transport));
2396 /* sends a reinvite. Local media description may have changed by application since call establishment*/
2397 int sal_call_update(SalOp *h, const char *subject){
2399 osip_message_t *reinvite=NULL;
2402 if(eXosip_call_build_request(h->did,"INVITE",&reinvite) != 0 || reinvite==NULL){
2407 osip_message_set_subject(reinvite,subject);
2408 osip_message_set_allow(reinvite, "INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, NOTIFY, MESSAGE, SUBSCRIBE, INFO");
2409 if (h->base.contact){
2410 _osip_list_set_empty(&reinvite->contacts,(void (*)(void*))osip_contact_free);
2411 osip_message_set_contact(reinvite,h->base.contact);
2413 if (h->base.root->session_expires!=0){
2414 osip_message_set_header(reinvite, "Session-expires", "200");
2415 osip_message_set_supported(reinvite, "timer");
2417 if (h->base.local_media){
2418 h->sdp_offering=TRUE;
2419 set_sdp_from_desc(reinvite,h->base.local_media);
2420 }else h->sdp_offering=FALSE;
2422 err = eXosip_call_send_request(h->did, reinvite);
2426 void sal_reuse_authorization(Sal *ctx, bool_t value) {
2427 ctx->reuse_authorization=value;