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);
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_new(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;
289 void sal_uninit(Sal* sal){
292 ms_free(sal->rootCa);
296 void sal_set_user_pointer(Sal *sal, void *user_data){
300 void *sal_get_user_pointer(const Sal *sal){
304 static void unimplemented_stub(){
305 ms_warning("Unimplemented SAL callback");
308 void sal_set_callbacks(Sal *ctx, const SalCallbacks *cbs){
309 memcpy(&ctx->callbacks,cbs,sizeof(*cbs));
310 if (ctx->callbacks.call_received==NULL)
311 ctx->callbacks.call_received=(SalOnCallReceived)unimplemented_stub;
312 if (ctx->callbacks.call_ringing==NULL)
313 ctx->callbacks.call_ringing=(SalOnCallRinging)unimplemented_stub;
314 if (ctx->callbacks.call_accepted==NULL)
315 ctx->callbacks.call_accepted=(SalOnCallAccepted)unimplemented_stub;
316 if (ctx->callbacks.call_failure==NULL)
317 ctx->callbacks.call_failure=(SalOnCallFailure)unimplemented_stub;
318 if (ctx->callbacks.call_terminated==NULL)
319 ctx->callbacks.call_terminated=(SalOnCallTerminated)unimplemented_stub;
320 if (ctx->callbacks.call_released==NULL)
321 ctx->callbacks.call_released=(SalOnCallReleased)unimplemented_stub;
322 if (ctx->callbacks.call_updating==NULL)
323 ctx->callbacks.call_updating=(SalOnCallUpdating)unimplemented_stub;
324 if (ctx->callbacks.auth_requested==NULL)
325 ctx->callbacks.auth_requested=(SalOnAuthRequested)unimplemented_stub;
326 if (ctx->callbacks.auth_success==NULL)
327 ctx->callbacks.auth_success=(SalOnAuthSuccess)unimplemented_stub;
328 if (ctx->callbacks.register_success==NULL)
329 ctx->callbacks.register_success=(SalOnRegisterSuccess)unimplemented_stub;
330 if (ctx->callbacks.register_failure==NULL)
331 ctx->callbacks.register_failure=(SalOnRegisterFailure)unimplemented_stub;
332 if (ctx->callbacks.dtmf_received==NULL)
333 ctx->callbacks.dtmf_received=(SalOnDtmfReceived)unimplemented_stub;
334 if (ctx->callbacks.notify==NULL)
335 ctx->callbacks.notify=(SalOnNotify)unimplemented_stub;
336 if (ctx->callbacks.notify_presence==NULL)
337 ctx->callbacks.notify_presence=(SalOnNotifyPresence)unimplemented_stub;
338 if (ctx->callbacks.subscribe_received==NULL)
339 ctx->callbacks.subscribe_received=(SalOnSubscribeReceived)unimplemented_stub;
340 if (ctx->callbacks.text_received==NULL)
341 ctx->callbacks.text_received=(SalOnTextReceived)unimplemented_stub;
342 if (ctx->callbacks.ping_reply==NULL)
343 ctx->callbacks.ping_reply=(SalOnPingReply)unimplemented_stub;
346 int sal_unlisten_ports(Sal *ctx){
355 int sal_listen_port(Sal *ctx, const char *addr, int port, SalTransport tr, int is_secure){
358 int proto=IPPROTO_UDP;
359 int keepalive = ctx->keepalive_period;
362 case SalTransportUDP:
364 eXosip_set_option (EXOSIP_OPT_UDP_KEEP_ALIVE, &keepalive);
366 case SalTransportTCP:
367 case SalTransportTLS:
370 eXosip_set_option (EXOSIP_OPT_UDP_KEEP_ALIVE,&keepalive);
373 eXosip_tls_ctx_t tlsCtx;
374 memset(&tlsCtx, 0, sizeof(tlsCtx));
375 snprintf(tlsCtx.root_ca_cert, sizeof(tlsCtx.client.cert), "%s", ctx->rootCa);
376 eXosip_set_tls_ctx(&tlsCtx);
378 eXosip_tls_verify_certificate(ctx->verify_server_certs);
381 ms_warning("unexpected proto, using datagram");
384 /* it does not work, exosip does not implement this option correctly*/
386 eXosip_set_option(EXOSIP_OPT_DNS_CAPABILITIES,&err); /*0=no NAPTR */
388 /*see if it looks like an IPv6 address*/
389 int use_rports = ctx->use_rports; // Copy char to int to avoid bad alignment
390 eXosip_set_option(EXOSIP_OPT_USE_RPORT,&use_rports);
391 int dont_use_101 = !ctx->use_101; // Copy char to int to avoid bad alignment
392 eXosip_set_option(EXOSIP_OPT_DONT_SEND_101,&dont_use_101);
394 ipv6=strchr(addr,':')!=NULL;
395 eXosip_enable_ipv6(ipv6);
397 if (is_secure && tr == SalTransportUDP){
398 ms_fatal("SIP over DTLS is not supported yet.");
401 err=eXosip_listen_addr(proto, addr, port, ipv6 ? PF_INET6 : PF_INET, is_secure);
402 #ifdef HAVE_EXOSIP_GET_SOCKET
403 ms_message("Exosip has socket number %i",eXosip_get_socket(proto));
410 ortp_socket_t sal_get_socket(Sal *ctx){
411 #ifdef HAVE_EXOSIP_GET_SOCKET
412 return eXosip_get_socket(IPPROTO_UDP);
414 ms_warning("Sorry, eXosip does not have eXosip_get_socket() method");
419 void sal_set_user_agent(Sal *ctx, const char *user_agent){
420 eXosip_set_user_agent(user_agent);
423 void sal_use_session_timers(Sal *ctx, int expires){
424 ctx->session_expires=expires;
427 void sal_use_one_matching_codec_policy(Sal *ctx, bool_t one_matching_codec){
428 ctx->one_matching_codec=one_matching_codec;
431 MSList *sal_get_pending_auths(Sal *sal){
432 return ms_list_copy(sal->pending_auths);
435 void sal_use_double_registrations(Sal *ctx, bool_t enabled){
436 ctx->double_reg=enabled;
439 void sal_use_rport(Sal *ctx, bool_t use_rports){
440 ctx->use_rports=use_rports;
442 void sal_use_101(Sal *ctx, bool_t use_101){
443 ctx->use_101=use_101;
446 void sal_set_root_ca(Sal* ctx, const char* rootCa) {
448 ms_free(ctx->rootCa);
449 ctx->rootCa = ms_strdup(rootCa);
452 void sal_verify_server_certificates(Sal *ctx, bool_t verify){
453 ctx->verify_server_certs=verify;
454 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");
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);
525 offer_answer_initiate_incoming(h->base.local_media,h->base.remote_media,h->result,h->base.root->one_matching_codec);
526 h->sdp_answer=media_description_to_sdp(h->result);
527 /*once we have generated the SDP answer, we modify the result description for processing by the upper layer.
528 It should contains media parameters constraint from the remote offer, not our response*/
529 strcpy(h->result->addr,h->base.remote_media->addr);
530 h->result->bandwidth=h->base.remote_media->bandwidth;
532 for(i=0;i<h->result->nstreams;++i){
533 if (h->result->streams[i].port>0){
534 strcpy(h->result->streams[i].addr,h->base.remote_media->streams[i].addr);
535 h->result->streams[i].ptime=h->base.remote_media->streams[i].ptime;
536 h->result->streams[i].bandwidth=h->base.remote_media->streams[i].bandwidth;
537 h->result->streams[i].port=h->base.remote_media->streams[i].port;
539 if (h->result->streams[i].proto == SalProtoRtpSavp) {
540 h->result->streams[i].crypto[0] = h->base.remote_media->streams[i].crypto[0];
548 int sal_call_is_offerer(const SalOp *h){
549 return h->sdp_offering;
552 int sal_call_set_local_media_description(SalOp *h, SalMediaDescription *desc){
554 sal_media_description_ref(desc);
555 if (h->base.local_media)
556 sal_media_description_unref(h->base.local_media);
557 h->base.local_media=desc;
561 int sal_call(SalOp *h, const char *from, const char *to){
564 osip_message_t *invite=NULL;
565 sal_op_set_from(h,from);
567 sal_exosip_fix_route(h);
569 h->terminated = FALSE;
571 route = sal_op_get_route(h);
572 err=eXosip_call_build_initial_invite(&invite,to,from,route,"Phone call");
574 ms_error("Could not create call. Error %d (from=%s to=%s route=%s)",
575 err, from, to, route);
578 osip_message_set_allow(invite, "INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, NOTIFY, MESSAGE, SUBSCRIBE, INFO");
579 if (h->base.contact){
580 _osip_list_set_empty(&invite->contacts,(void (*)(void*))osip_contact_free);
581 osip_message_set_contact(invite,h->base.contact);
583 if (h->base.root->session_expires!=0){
584 osip_message_set_header(invite, "Session-expires", "200");
585 osip_message_set_supported(invite, "timer");
587 if (h->base.local_media){
588 h->sdp_offering=TRUE;
589 set_sdp_from_desc(invite,h->base.local_media);
590 }else h->sdp_offering=FALSE;
592 osip_message_set_header(invite,"Replaces",h->replaces);
594 osip_message_set_header(invite,"Referred-By",h->referred_by);
598 err=eXosip_call_send_initial_invite(invite);
602 ms_error("Fail to send invite ! Error code %d", err);
605 sal_add_call(h->base.root,h);
610 int sal_call_notify_ringing(SalOp *h, bool_t early_media){
613 /*if early media send also 180 and 183 */
614 if (early_media && h->sdp_answer){
617 eXosip_call_build_answer(h->tid,180,&msg);
619 set_sdp(msg,h->sdp_answer);
620 eXosip_call_send_answer(h->tid,180,msg);
623 eXosip_call_build_answer(h->tid,183,&msg);
625 set_sdp(msg,h->sdp_answer);
626 eXosip_call_send_answer(h->tid,183,msg);
631 eXosip_call_send_answer(h->tid,180,NULL);
637 int sal_call_accept(SalOp * h){
639 const char *contact=sal_op_get_contact(h);
641 int err=eXosip_call_build_answer(h->tid,200,&msg);
642 if (err<0 || msg==NULL){
643 ms_error("Fail to build answer for call: err=%i",err);
646 if (h->base.root->session_expires!=0){
647 if (h->supports_session_timers) osip_message_set_supported(msg, "timer");
651 _osip_list_set_empty(&msg->contacts,(void (*)(void*))osip_contact_free);
652 osip_message_set_contact(msg,contact);
655 if (h->base.local_media){
656 /*this is the case where we received an invite without SDP*/
657 if (h->sdp_offering) {
658 set_sdp_from_desc(msg,h->base.local_media);
661 set_sdp(msg,h->sdp_answer);
662 sdp_message_free(h->sdp_answer);
667 ms_error("You are accepting a call but not defined any media capabilities !");
669 eXosip_call_send_answer(h->tid,200,msg);
673 int sal_call_decline(SalOp *h, SalReason reason, const char *redirect){
674 if (reason==SalReasonBusy){
676 eXosip_call_send_answer(h->tid,486,NULL);
679 else if (reason==SalReasonTemporarilyUnavailable){
681 eXosip_call_send_answer(h->tid,480,NULL);
683 }else if (reason==SalReasonDoNotDisturb){
685 eXosip_call_send_answer(h->tid,600,NULL);
687 }else if (reason==SalReasonMedia){
689 eXosip_call_send_answer(h->tid,415,NULL);
691 }else if (redirect!=NULL && reason==SalReasonRedirect){
694 if (strstr(redirect,"sip:")!=0) code=302;
697 eXosip_call_build_answer(h->tid,code,&msg);
698 osip_message_set_contact(msg,redirect);
699 eXosip_call_send_answer(h->tid,code,msg);
701 }else sal_call_terminate(h);
705 SalMediaDescription * sal_call_get_final_media_description(SalOp *h){
706 if (h->base.local_media && h->base.remote_media && !h->result){
712 int sal_call_set_referer(SalOp *h, SalOp *refered_call){
713 if (refered_call->replaces)
714 h->replaces=ms_strdup(refered_call->replaces);
715 if (refered_call->referred_by)
716 h->referred_by=ms_strdup(refered_call->referred_by);
720 int sal_ping(SalOp *op, const char *from, const char *to){
721 osip_message_t *options=NULL;
723 sal_op_set_from(op,from);
724 sal_op_set_to(op,to);
725 /*bug here: eXosip2 does not honor the route argument*/
726 eXosip_options_build_request (&options, sal_op_get_to(op),
727 sal_op_get_from(op),sal_op_get_route(op));
729 if (op->base.root->session_expires!=0){
730 osip_message_set_header(options, "Session-expires", "200");
731 osip_message_set_supported(options, "timer");
733 sal_add_other(sal_op_get_sal(op),op,options);
734 return eXosip_options_send_request(options);
739 int sal_call_accept_refer(SalOp *op){
740 osip_message_t *msg=NULL;
743 err = eXosip_call_build_notify(op->did,EXOSIP_SUBCRSTATE_ACTIVE,&msg);
746 osip_message_set_header(msg,(const char *)"event","refer");
747 osip_message_set_content_type(msg,"message/sipfrag");
748 osip_message_set_body(msg,"SIP/2.0 100 Trying",sizeof("SIP/2.0 100 Trying"));
749 eXosip_call_send_request(op->did,msg);
753 ms_error("could not get a notify built\n");
759 int sal_call_refer(SalOp *h, const char *refer_to){
760 osip_message_t *msg=NULL;
763 eXosip_call_build_refer(h->did,refer_to, &msg);
764 if (msg) err=eXosip_call_send_request(h->did, msg);
770 int sal_call_refer_with_replaces(SalOp *h, SalOp *other_call_h){
771 osip_message_t *msg=NULL;
772 char referto[256]={0};
775 if (eXosip_call_get_referto(other_call_h->did,referto,sizeof(referto)-1)!=0){
776 ms_error("eXosip_call_get_referto() failed for did=%i",other_call_h->did);
780 eXosip_call_build_refer(h->did,referto, &msg);
781 osip_message_set_header(msg,"Referred-By",h->base.from);
782 if (msg) err=eXosip_call_send_request(h->did, msg);
788 SalOp *sal_call_get_replaces(SalOp *h){
789 if (h!=NULL && h->replaces!=NULL){
792 cid=eXosip_call_find_by_replaces(h->replaces);
795 SalOp *ret=sal_find_call(h->base.root,cid);
802 int sal_call_send_dtmf(SalOp *h, char dtmf){
803 osip_message_t *msg=NULL;
808 eXosip_call_build_info(h->did,&msg);
810 snprintf(dtmf_body, sizeof(dtmf_body), "Signal=%c\r\nDuration=250\r\n", dtmf);
811 osip_message_set_body(msg,dtmf_body,strlen(dtmf_body));
812 osip_message_set_content_type(msg,"application/dtmf-relay");
813 snprintf(clen,sizeof(clen),"%lu",(unsigned long)strlen(dtmf_body));
814 osip_message_set_content_length(msg,clen);
815 eXosip_call_send_request(h->did,msg);
821 static void push_auth_to_exosip(const SalAuthInfo *info){
823 if (info->userid==NULL || info->userid[0]=='\0') userid=info->username;
824 else userid=info->userid;
825 ms_message("Authentication info for username [%s], id[%s], realm [%s] added to eXosip", info->username,userid, info->realm);
826 eXosip_add_authentication_info (info->username,userid,
827 info->password, NULL,info->realm);
830 * Just for symmetry ;-)
832 static void pop_auth_from_exosip() {
833 eXosip_clear_authentication_info();
836 int sal_call_terminate(SalOp *h){
838 if (h == NULL) return -1;
839 if (h->auth_info) push_auth_to_exosip(h->auth_info);
841 err=eXosip_call_terminate(h->cid,h->did);
843 if (!h->base.root->reuse_authorization) pop_auth_from_exosip();
845 ms_warning("Exosip could not terminate the call: cid=%i did=%i", h->cid,h->did);
851 void sal_op_authenticate(SalOp *h, const SalAuthInfo *info){
852 if (h->pending_auth){
853 push_auth_to_exosip(info);
855 /*FIXME exosip does not take into account this update register message*/
857 if (fix_message_contact(h, h->pending_auth->request,h->pending_auth->response)) {
861 update_contact_from_response(h,h->pending_auth->response);
863 eXosip_default_action(h->pending_auth);
865 ms_message("eXosip_default_action() done");
866 if (!h->base.root->reuse_authorization) pop_auth_from_exosip();
868 if (h->auth_info) sal_auth_info_delete(h->auth_info); /*if already exist*/
869 h->auth_info=sal_auth_info_clone(info); /*store auth info for subsequent request*/
872 void sal_op_cancel_authentication(SalOp *h) {
874 sal_op_get_sal(h)->callbacks.register_failure(h,SalErrorFailure, SalReasonForbidden,_("Authentication failure"));
875 } else if (h->cid >0) {
876 sal_op_get_sal(h)->callbacks.call_failure(h,SalErrorFailure, SalReasonForbidden,_("Authentication failure"),0);
878 ms_warning("Auth failure not handled");
882 static void set_network_origin(SalOp *op, osip_message_t *req){
883 const char *received=NULL;
886 SalTransport transport;
887 if (extract_received_rport(req,&received,&rport,&transport)!=0){
888 osip_via_t *via=NULL;
890 osip_message_get_via(req,0,&via);
891 received=osip_via_get_host(via);
892 tmp=osip_via_get_port(via);
893 if (tmp) rport=atoi(tmp);
895 if (transport != SalTransportUDP) {
896 snprintf(origin,sizeof(origin)-1,"sip:%s:%i",received,rport);
898 snprintf(origin,sizeof(origin)-1,"sip:%s:%i;transport=%s",received,rport,sal_transport_to_string(transport));
900 __sal_op_set_network_origin(op,origin);
903 static void set_remote_ua(SalOp* op, osip_message_t *req){
904 if (op->base.remote_ua==NULL){
905 osip_header_t *h=NULL;
906 osip_message_get_user_agent(req,0,&h);
908 op->base.remote_ua=ms_strdup(h->hvalue);
913 static void set_replaces(SalOp *op, osip_message_t *req){
914 osip_header_t *h=NULL;
917 ms_free(op->replaces);
920 osip_message_header_get_byname(req,"replaces",0,&h);
922 if (h->hvalue && h->hvalue[0]!='\0'){
923 op->replaces=ms_strdup(h->hvalue);
928 static SalOp *find_op(Sal *sal, eXosip_event_t *ev){
930 return sal_find_call(sal,ev->cid);
933 return sal_find_register(sal,ev->rid);
936 return sal_find_out_subscribe(sal,ev->sid);
939 return sal_find_in_subscribe(sal,ev->nid);
941 if (ev->response) return sal_find_other(sal,ev->response);
945 static void inc_new_call(Sal *sal, eXosip_event_t *ev){
946 SalOp *op=sal_op_new(sal);
947 osip_from_t *from,*to;
948 osip_call_info_t *call_info;
950 sdp_message_t *sdp=eXosip_get_sdp_info(ev->request);
952 set_network_origin(op,ev->request);
953 set_remote_ua(op,ev->request);
954 set_replaces(op,ev->request);
957 op->sdp_offering=FALSE;
958 op->base.remote_media=sal_media_description_new();
959 sdp_to_media_description(sdp,op->base.remote_media);
960 sdp_message_free(sdp);
961 }else op->sdp_offering=TRUE;
963 from=osip_message_get_from(ev->request);
964 to=osip_message_get_to(ev->request);
965 osip_from_to_str(from,&tmp);
966 sal_op_set_from(op,tmp);
968 osip_from_to_str(to,&tmp);
969 sal_op_set_to(op,tmp);
972 osip_message_get_call_info(ev->request,0,&call_info);
975 osip_call_info_to_str(call_info,&tmp);
976 if( strstr(tmp,"answer-after=") != NULL)
978 op->auto_answer_asked=TRUE;
979 ms_message("The caller asked to automatically answer the call(Emergency?)\n");
988 sal_add_call(op->base.root,op);
989 sal->callbacks.call_received(op);
992 static void handle_reinvite(Sal *sal, eXosip_event_t *ev){
993 SalOp *op=find_op(sal,ev);
995 osip_message_t *msg=NULL;
998 ms_warning("Reinvite for non-existing operation !");
1003 sdp=eXosip_get_sdp_info(ev->request);
1004 if (op->base.remote_media){
1005 sal_media_description_unref(op->base.remote_media);
1006 op->base.remote_media=NULL;
1009 sal_media_description_unref(op->result);
1013 op->sdp_offering=FALSE;
1014 op->base.remote_media=sal_media_description_new();
1015 sdp_to_media_description(sdp,op->base.remote_media);
1016 sdp_message_free(sdp);
1017 sal->callbacks.call_updating(op);
1019 op->sdp_offering=TRUE;
1021 eXosip_call_build_answer(ev->tid,200,&msg);
1023 set_sdp_from_desc(msg,op->base.local_media);
1024 eXosip_call_send_answer(ev->tid,200,msg);
1031 static void handle_ack(Sal *sal, eXosip_event_t *ev){
1032 SalOp *op=find_op(sal,ev);
1036 ms_warning("ack for non-existing call !");
1039 sdp=eXosip_get_sdp_info(ev->ack);
1041 op->base.remote_media=sal_media_description_new();
1042 sdp_to_media_description(sdp,op->base.remote_media);
1044 sdp_message_free(sdp);
1047 if (sdp) sal->callbacks.call_updating(op);
1050 sal->callbacks.call_ack(op);
1054 static void update_contact_from_response(SalOp *op, osip_message_t *response){
1055 const char *received;
1057 SalTransport transport;
1058 if (extract_received_rport(response,&received,&rport,&transport)==0){
1059 const char *contact=sal_op_get_contact(op);
1061 /*no contact given yet, use from instead*/
1062 contact=sal_op_get_from(op);
1065 SalAddress *addr=sal_address_new(contact);
1067 sal_address_set_domain(addr,received);
1068 sal_address_set_port_int(addr,rport);
1069 if (transport!=SalTransportUDP)
1070 sal_address_set_transport(addr,transport);
1071 tmp=sal_address_as_string(addr);
1072 ms_message("Contact address updated to %s",tmp);
1073 sal_op_set_contact(op,tmp);
1074 sal_address_destroy(addr);
1080 static int call_proceeding(Sal *sal, eXosip_event_t *ev){
1081 SalOp *op=find_op(sal,ev);
1083 if (op==NULL || op->terminated==TRUE) {
1084 ms_warning("This call has been canceled.");
1086 eXosip_call_terminate(ev->cid,ev->did);
1094 /* update contact if received and rport are set by the server
1095 note: will only be used by remote for next INVITE, if any...*/
1096 update_contact_from_response(op,ev->response);
1100 static void call_ringing(Sal *sal, eXosip_event_t *ev){
1102 SalOp *op=find_op(sal,ev);
1103 if (call_proceeding(sal, ev)==-1) return;
1105 set_remote_ua(op,ev->response);
1106 sdp=eXosip_get_sdp_info(ev->response);
1108 op->base.remote_media=sal_media_description_new();
1109 sdp_to_media_description(sdp,op->base.remote_media);
1110 sdp_message_free(sdp);
1111 if (op->base.local_media) sdp_process(op);
1113 sal->callbacks.call_ringing(op);
1116 static void call_accepted(Sal *sal, eXosip_event_t *ev){
1118 osip_message_t *msg=NULL;
1119 SalOp *op=find_op(sal,ev);
1120 const char *contact;
1122 if (op==NULL || op->terminated==TRUE) {
1123 ms_warning("This call has been already terminated.");
1125 eXosip_call_terminate(ev->cid,ev->did);
1131 set_remote_ua(op,ev->response);
1133 sdp=eXosip_get_sdp_info(ev->response);
1135 op->base.remote_media=sal_media_description_new();
1136 sdp_to_media_description(sdp,op->base.remote_media);
1137 sdp_message_free(sdp);
1138 if (op->base.local_media) sdp_process(op);
1140 eXosip_call_build_ack(ev->did,&msg);
1142 ms_warning("This call has been already terminated.");
1144 eXosip_call_terminate(ev->cid,ev->did);
1148 contact=sal_op_get_contact(op);
1150 _osip_list_set_empty(&msg->contacts,(void (*)(void*))osip_contact_free);
1151 osip_message_set_contact(msg,contact);
1153 if (op->sdp_answer){
1154 set_sdp(msg,op->sdp_answer);
1155 sdp_message_free(op->sdp_answer);
1156 op->sdp_answer=NULL;
1158 eXosip_call_send_ack(ev->did,msg);
1159 sal->callbacks.call_accepted(op);
1162 static void call_terminated(Sal *sal, eXosip_event_t *ev){
1164 SalOp *op=find_op(sal,ev);
1166 ms_warning("Call terminated for already closed call ?");
1170 osip_from_to_str(ev->request->from,&from);
1172 sal->callbacks.call_terminated(op,from!=NULL ? from : sal_op_get_from(op));
1173 if (from) osip_free(from);
1174 op->terminated=TRUE;
1177 static void call_released(Sal *sal, eXosip_event_t *ev){
1178 SalOp *op=find_op(sal,ev);
1180 ms_warning("No op associated to this call_released()");
1183 if (!op->terminated){
1184 /* no response received so far */
1185 call_failure(sal,ev);
1187 sal->callbacks.call_released(op);
1190 static int get_auth_data_from_response(osip_message_t *resp, const char **realm, const char **username){
1191 const char *prx_realm=NULL,*www_realm=NULL;
1192 osip_proxy_authenticate_t *prx_auth;
1193 osip_www_authenticate_t *www_auth;
1195 *username=osip_uri_get_username(resp->from->url);
1196 prx_auth=(osip_proxy_authenticate_t*)osip_list_get(&resp->proxy_authenticates,0);
1197 www_auth=(osip_proxy_authenticate_t*)osip_list_get(&resp->www_authenticates,0);
1199 prx_realm=osip_proxy_authenticate_get_realm(prx_auth);
1201 www_realm=osip_www_authenticate_get_realm(www_auth);
1205 }else if (www_realm){
1213 static int get_auth_data_from_request(osip_message_t *msg, const char **realm, const char **username){
1214 osip_authorization_t *auth=NULL;
1215 osip_proxy_authorization_t *prx_auth=NULL;
1217 *username=osip_uri_get_username(msg->from->url);
1218 osip_message_get_authorization(msg, 0, &auth);
1220 *realm=osip_authorization_get_realm(auth);
1223 osip_message_get_proxy_authorization(msg,0,&prx_auth);
1225 *realm=osip_proxy_authorization_get_realm(prx_auth);
1231 static int get_auth_data(eXosip_event_t *ev, const char **realm, const char **username){
1232 if (ev->response && get_auth_data_from_response(ev->response,realm,username)==0) return 0;
1233 if (ev->request && get_auth_data_from_request(ev->request,realm,username)==0) return 0;
1237 int sal_op_get_auth_requested(SalOp *op, const char **realm, const char **username){
1238 if (op->pending_auth){
1239 return get_auth_data(op->pending_auth,realm,username);
1244 static bool_t process_authentication(Sal *sal, eXosip_event_t *ev){
1246 const char *username,*realm;
1249 ms_warning("No operation associated with this authentication !");
1252 if (get_auth_data(ev,&realm,&username)==0){
1253 if (op->pending_auth!=NULL){
1254 eXosip_event_free(op->pending_auth);
1255 op->pending_auth=ev;
1257 op->pending_auth=ev;
1258 sal_add_pending_auth(sal,op);
1261 sal->callbacks.auth_requested(op,realm,username);
1267 static void authentication_ok(Sal *sal, eXosip_event_t *ev){
1269 const char *username,*realm;
1272 ms_warning("No operation associated with this authentication_ok!");
1275 if (op->pending_auth){
1276 eXosip_event_free(op->pending_auth);
1277 sal_remove_pending_auth(sal,op);
1278 op->pending_auth=NULL;
1280 if (get_auth_data(ev,&realm,&username)==0){
1281 sal->callbacks.auth_success(op,realm,username);
1285 static bool_t call_failure(Sal *sal, eXosip_event_t *ev){
1288 char* computedReason=NULL;
1289 const char *reason=NULL;
1290 SalError error=SalErrorUnknown;
1291 SalReason sr=SalReasonUnknown;
1294 op=(SalOp*)find_op(sal,ev);
1297 ms_warning("Call failure reported for a closed call, ignored.");
1302 code=osip_message_get_status_code(ev->response);
1303 reason=osip_message_get_reason_phrase(ev->response);
1304 osip_header_t *h=NULL;
1305 if (!osip_message_header_get_byname( ev->response
1309 computedReason = ms_strdup_printf("%s %s",reason,osip_header_get_value(h));
1310 reason = computedReason;
1318 return process_authentication(sal,ev);
1321 error=SalErrorUnknown;
1324 error=SalErrorFailure;
1325 sr=SalReasonNotFound;
1328 error=SalErrorFailure;
1332 eXosip_default_action(ev);
1336 error=SalErrorFailure;
1337 sr=SalReasonTemporarilyUnavailable;
1339 error=SalErrorFailure;
1345 error=SalErrorFailure;
1346 sr=SalReasonDoNotDisturb;
1349 error=SalErrorFailure;
1350 sr=SalReasonDeclined;
1354 error=SalErrorFailure;
1355 sr=SalReasonUnknown;
1356 }else error=SalErrorNoResponse;
1358 op->terminated=TRUE;
1359 sal->callbacks.call_failure(op,error,sr,reason,code);
1360 if (computedReason != NULL){
1361 ms_free(computedReason);
1366 /* Request remote side to send us VFU */
1367 void sal_call_send_vfu_request(SalOp *h){
1368 osip_message_t *msg=NULL;
1370 "<?xml version=\"1.0\" encoding=\"utf-8\" ?>"
1374 " <picture_fast_update></picture_fast_update>"
1382 eXosip_call_build_info(h->did,&msg);
1384 osip_message_set_body(msg,info_body,strlen(info_body));
1385 osip_message_set_content_type(msg,"application/media_control+xml");
1386 snprintf(clen,sizeof(clen),"%lu",(unsigned long)strlen(info_body));
1387 osip_message_set_content_length(msg,clen);
1388 eXosip_call_send_request(h->did,msg);
1389 ms_message("Sending VFU request !");
1394 static void process_media_control_xml(Sal *sal, eXosip_event_t *ev){
1395 SalOp *op=find_op(sal,ev);
1396 osip_body_t *body=NULL;
1399 ms_warning("media control xml received without operation context!");
1403 osip_message_get_body(ev->request,0,&body);
1404 if (body && body->body!=NULL &&
1405 strstr(body->body,"picture_fast_update")){
1406 osip_message_t *ans=NULL;
1407 ms_message("Receiving VFU request !");
1408 if (sal->callbacks.vfu_request){
1409 sal->callbacks.vfu_request(op);
1410 eXosip_call_build_answer(ev->tid,200,&ans);
1412 eXosip_call_send_answer(ev->tid,200,ans);
1416 /*in all other cases we must say it is not implemented.*/
1418 osip_message_t *ans=NULL;
1420 eXosip_call_build_answer(ev->tid,501,&ans);
1422 eXosip_call_send_answer(ev->tid,501,ans);
1427 static void process_dtmf_relay(Sal *sal, eXosip_event_t *ev){
1428 SalOp *op=find_op(sal,ev);
1429 osip_body_t *body=NULL;
1432 ms_warning("media dtmf relay received without operation context!");
1436 osip_message_get_body(ev->request,0,&body);
1437 if (body && body->body!=NULL){
1438 osip_message_t *ans=NULL;
1439 const char *name=strstr(body->body,"Signal");
1440 if (name==NULL) name=strstr(body->body,"signal");
1442 ms_warning("Could not extract the dtmf name from the SIP INFO.");
1445 name+=strlen("signal");
1446 if (sscanf(name," = %1s",tmp)==1){
1447 ms_message("Receiving dtmf %s via SIP INFO.",tmp);
1448 if (sal->callbacks.dtmf_received != NULL)
1449 sal->callbacks.dtmf_received(op, tmp[0]);
1453 eXosip_call_build_answer(ev->tid,200,&ans);
1455 eXosip_call_send_answer(ev->tid,200,ans);
1460 static void fill_options_answer(osip_message_t *options){
1461 osip_message_set_allow(options,"INVITE, ACK, BYE, CANCEL, OPTIONS, MESSAGE, SUBSCRIBE, NOTIFY, INFO");
1462 osip_message_set_accept(options,"application/sdp");
1465 static void process_refer(Sal *sal, SalOp *op, eXosip_event_t *ev){
1466 osip_header_t *h=NULL;
1467 osip_message_t *ans=NULL;
1468 ms_message("Receiving REFER request !");
1469 osip_message_header_get_byname(ev->request,"Refer-To",0,&h);
1472 osip_from_t *from=NULL;
1474 osip_from_init(&from);
1476 if (osip_from_parse(from,h->hvalue)==0){
1478 osip_uri_header_t *uh=NULL;
1479 osip_header_t *referred_by=NULL;
1480 osip_uri_header_get_byname(&from->url->url_headers,(char*)"Replaces",&uh);
1481 if (uh!=NULL && uh->gvalue && uh->gvalue[0]!='\0'){
1482 ms_message("Found replaces in Refer-To");
1484 ms_free(op->replaces);
1486 op->replaces=ms_strdup(uh->gvalue);
1488 osip_message_header_get_byname(ev->request,"Referred-By",0,&referred_by);
1489 if (referred_by && referred_by->hvalue && referred_by->hvalue[0]!='\0'){
1490 if (op->referred_by)
1491 ms_free(op->referred_by);
1492 op->referred_by=ms_strdup(referred_by->hvalue);
1495 osip_uri_header_freelist(&from->url->url_headers);
1496 osip_from_to_str(from,&tmp);
1497 sal->callbacks.refer_received(sal,op,tmp);
1499 osip_from_free(from);
1502 eXosip_call_build_answer(ev->tid,202,&ans);
1504 eXosip_call_send_answer(ev->tid,202,ans);
1509 ms_warning("cannot do anything with the refer without destination\n");
1513 static void call_message_new(Sal *sal, eXosip_event_t *ev){
1514 osip_message_t *ans=NULL;
1516 if (MSG_IS_INFO(ev->request)){
1517 osip_content_type_t *ct;
1518 ct=osip_message_get_content_type(ev->request);
1519 if (ct && ct->subtype){
1520 if (strcmp(ct->subtype,"media_control+xml")==0)
1521 process_media_control_xml(sal,ev);
1522 else if (strcmp(ct->subtype,"dtmf-relay")==0)
1523 process_dtmf_relay(sal,ev);
1525 ms_message("Unhandled SIP INFO.");
1526 /*send an "Not implemented" answer*/
1528 eXosip_call_build_answer(ev->tid,501,&ans);
1530 eXosip_call_send_answer(ev->tid,501,ans);
1534 /*empty SIP INFO, probably to test we are alive. Send an empty answer*/
1536 eXosip_call_build_answer(ev->tid,200,&ans);
1538 eXosip_call_send_answer(ev->tid,200,ans);
1541 }else if(MSG_IS_MESSAGE(ev->request)){
1542 /* SIP messages could be received into call */
1543 text_received(sal, ev);
1545 eXosip_call_build_answer(ev->tid,200,&ans);
1547 eXosip_call_send_answer(ev->tid,200,ans);
1549 }else if(MSG_IS_REFER(ev->request)){
1550 SalOp *op=find_op(sal,ev);
1552 ms_message("Receiving REFER request !");
1553 process_refer(sal,op,ev);
1554 }else if(MSG_IS_NOTIFY(ev->request)){
1555 osip_header_t *h=NULL;
1557 SalOp *op=find_op(sal,ev);
1559 ms_message("Receiving NOTIFY request !");
1560 osip_from_to_str(ev->request->from,&from);
1561 osip_message_header_get_byname(ev->request,"Event",0,&h);
1563 sal->callbacks.notify(op,from,h->hvalue);
1564 /*answer that we received the notify*/
1566 eXosip_call_build_answer(ev->tid,200,&ans);
1568 eXosip_call_send_answer(ev->tid,200,ans);
1571 }else if (MSG_IS_OPTIONS(ev->request)){
1573 eXosip_call_build_answer(ev->tid,200,&ans);
1575 fill_options_answer(ans);
1576 eXosip_call_send_answer(ev->tid,200,ans);
1580 }else ms_warning("call_message_new: No request ?");
1583 static void inc_update(Sal *sal, eXosip_event_t *ev){
1584 osip_message_t *msg=NULL;
1585 ms_message("Processing incoming UPDATE");
1587 eXosip_message_build_answer(ev->tid,200,&msg);
1589 eXosip_message_send_answer(ev->tid,200,msg);
1593 static bool_t comes_from_local_if(osip_message_t *msg){
1594 osip_via_t *via=NULL;
1595 osip_message_get_via(msg,0,&via);
1598 host=osip_via_get_host(via);
1599 if (strcmp(host,"127.0.0.1")==0 || strcmp(host,"::1")==0){
1600 osip_generic_param_t *param=NULL;
1601 osip_via_param_get_byname(via,"received",¶m);
1602 if (param==NULL) return TRUE;
1603 if (param->gvalue &&
1604 (strcmp(param->gvalue,"127.0.0.1")==0 || strcmp(param->gvalue,"::1")==0)){
1612 static void text_received(Sal *sal, eXosip_event_t *ev){
1613 osip_body_t *body=NULL;
1614 char *from=NULL,*msg;
1616 osip_message_get_body(ev->request,0,&body);
1618 ms_error("Could not get text message from SIP body");
1622 osip_from_to_str(ev->request->from,&from);
1623 sal->callbacks.text_received(sal,from,msg);
1629 static void other_request(Sal *sal, eXosip_event_t *ev){
1630 ms_message("in other_request");
1631 if (ev->request==NULL) return;
1632 if (strcmp(ev->request->sip_method,"MESSAGE")==0){
1633 text_received(sal,ev);
1634 eXosip_message_send_answer(ev->tid,200,NULL);
1635 }else if (strcmp(ev->request->sip_method,"OPTIONS")==0){
1636 osip_message_t *options=NULL;
1637 eXosip_options_build_answer(ev->tid,200,&options);
1638 fill_options_answer(options);
1639 eXosip_options_send_answer(ev->tid,200,options);
1640 }else if (strncmp(ev->request->sip_method, "REFER", 5) == 0){
1641 ms_message("Receiving REFER request !");
1642 if (comes_from_local_if(ev->request)) {
1643 process_refer(sal,NULL,ev);
1644 }else ms_warning("Ignored REFER not coming from this local loopback interface.");
1645 }else if (strncmp(ev->request->sip_method, "UPDATE", 6) == 0){
1650 osip_message_to_str(ev->request,&tmp,&msglen);
1652 ms_message("Unsupported request received:\n%s",tmp);
1655 /*answer with a 501 Not implemented*/
1656 eXosip_message_send_answer(ev->tid,501,NULL);
1660 static void masquerade_via(osip_message_t *msg, const char *ip, const char *port){
1661 osip_via_t *via=NULL;
1662 osip_message_get_via(msg,0,&via);
1664 osip_free(via->port);
1665 via->port=osip_strdup(port);
1666 osip_free(via->host);
1667 via->host=osip_strdup(ip);
1672 static bool_t fix_message_contact(SalOp *op, osip_message_t *request,osip_message_t *last_answer) {
1673 osip_contact_t *ctt=NULL;
1674 const char *received;
1676 SalTransport transport;
1679 if (extract_received_rport(last_answer,&received,&rport,&transport)==-1) return FALSE;
1680 osip_message_get_contact(request,0,&ctt);
1682 ms_warning("fix_message_contact(): no contact to update");
1685 if (ctt->url->host!=NULL){
1686 osip_free(ctt->url->host);
1688 ctt->url->host=osip_strdup(received);
1689 if (ctt->url->port!=NULL){
1690 osip_free(ctt->url->port);
1692 snprintf(port,sizeof(port),"%i",rport);
1693 ctt->url->port=osip_strdup(port);
1694 if (op->masquerade_via) masquerade_via(request,received,port);
1696 if (transport != SalTransportUDP) {
1697 sal_address_set_param((SalAddress *)ctt, "transport", sal_transport_to_string(transport));
1702 static bool_t register_again_with_updated_contact(SalOp *op, osip_message_t *orig_request, osip_message_t *last_answer){
1703 osip_contact_t *ctt=NULL;
1704 SalAddress* ori_contact_address=NULL;
1705 const char *received;
1707 SalTransport transport;
1709 osip_message_t *msg=NULL;
1710 Sal* sal=op->base.root;
1712 if (sal->double_reg==FALSE ) return FALSE;
1714 if (extract_received_rport(last_answer,&received,&rport,&transport)==-1) return FALSE;
1715 osip_message_get_contact(orig_request,0,&ctt);
1716 osip_contact_to_str(ctt,&tmp);
1717 ori_contact_address = sal_address_new(tmp);
1719 /*check if contact is up to date*/
1720 if (strcmp(sal_address_get_domain(ori_contact_address),received) ==0
1721 && sal_address_get_port_int(ori_contact_address) == rport
1722 && sal_address_get_transport(ori_contact_address) == transport) {
1723 ms_message("Register has up to date contact, doing nothing.");
1725 sal_address_destroy(ori_contact_address);
1727 } else ms_message("contact do not match, need to update the register (%s with %s:%i;transport=%s)"
1731 ,sal_transport_to_string(transport));
1733 sal_address_destroy(ori_contact_address);
1735 if (transport == SalTransportUDP) {
1737 eXosip_register_build_register(op->rid,op->expires,&msg);
1740 ms_warning("Fail to create a contact updated register.");
1743 if (fix_message_contact(op,msg,last_answer)) {
1744 eXosip_register_send_register(op->rid,msg);
1746 ms_message("Resending new register with updated contact");
1749 ms_warning("Fail to send updated register.");
1756 update_contact_from_response(op,last_answer);
1760 static void registration_success(Sal *sal, eXosip_event_t *ev){
1761 SalOp *op=sal_find_register(sal,ev->rid);
1762 osip_header_t *h=NULL;
1765 ms_error("Receiving register response for unknown operation");
1768 osip_message_get_expires(ev->request,0,&h);
1769 if (h!=NULL && atoi(h->hvalue)!=0){
1771 if (!register_again_with_updated_contact(op,ev->request,ev->response)){
1772 sal->callbacks.register_success(op,registered);
1775 sal->callbacks.register_success(op,FALSE);
1779 static bool_t registration_failure(Sal *sal, eXosip_event_t *ev){
1781 const char *reason=NULL;
1782 SalOp *op=sal_find_register(sal,ev->rid);
1783 SalReason sr=SalReasonUnknown;
1784 SalError se=SalErrorUnknown;
1787 ms_error("Receiving register failure for unknown operation");
1791 status_code=osip_message_get_status_code(ev->response);
1792 reason=osip_message_get_reason_phrase(ev->response);
1794 switch(status_code){
1797 return process_authentication(sal,ev);
1799 case 423: /*interval too brief*/
1800 {/*retry with greater interval */
1801 osip_header_t *h=NULL;
1802 osip_message_t *msg=NULL;
1803 osip_message_header_get_byname(ev->response,"min-expires",0,&h);
1804 if (h && h->hvalue && h->hvalue[0]!='\0'){
1805 int val=atoi(h->hvalue);
1806 if (val>op->expires)
1808 }else op->expires*=2;
1810 eXosip_register_build_register(op->rid,op->expires,&msg);
1811 eXosip_register_send_register(op->rid,msg);
1815 case 606: /*Not acceptable, workaround for proxies that don't like private addresses
1816 in vias, such as ekiga.net
1817 On the opposite, freephonie.net bugs when via are masqueraded.
1819 op->masquerade_via=TRUE;
1821 /* if contact is up to date, process the failure, otherwise resend a new register with
1822 updated contact first, just in case the faillure is due to incorrect contact */
1823 if (ev->response && register_again_with_updated_contact(op,ev->request,ev->response))
1824 return TRUE; /*we are retrying with an updated contact*/
1825 if (status_code==403){
1827 sr=SalReasonForbidden;
1828 }else if (status_code==0){
1829 se=SalErrorNoResponse;
1831 sal->callbacks.register_failure(op,se,sr,reason);
1836 static void other_request_reply(Sal *sal,eXosip_event_t *ev){
1837 SalOp *op=find_op(sal,ev);
1840 ms_warning("other_request_reply(): Receiving response to unknown request.");
1844 update_contact_from_response(op,ev->response);
1845 if (ev->request && strcmp(osip_message_get_method(ev->request),"OPTIONS")==0)
1846 sal->callbacks.ping_reply(op);
1850 static bool_t process_event(Sal *sal, eXosip_event_t *ev){
1851 ms_message("linphone process event get a message %d\n",ev->type);
1853 case EXOSIP_CALL_ANSWERED:
1854 ms_message("CALL_ANSWERED\n");
1855 call_accepted(sal,ev);
1856 authentication_ok(sal,ev);
1858 case EXOSIP_CALL_CLOSED:
1859 case EXOSIP_CALL_CANCELLED:
1860 ms_message("CALL_CLOSED or CANCELLED\n");
1861 call_terminated(sal,ev);
1863 case EXOSIP_CALL_TIMEOUT:
1864 case EXOSIP_CALL_NOANSWER:
1865 ms_message("CALL_TIMEOUT or NOANSWER\n");
1866 return call_failure(sal,ev);
1868 case EXOSIP_CALL_REQUESTFAILURE:
1869 case EXOSIP_CALL_GLOBALFAILURE:
1870 case EXOSIP_CALL_SERVERFAILURE:
1871 ms_message("CALL_REQUESTFAILURE or GLOBALFAILURE or SERVERFAILURE\n");
1872 return call_failure(sal,ev);
1874 case EXOSIP_CALL_RELEASED:
1875 ms_message("CALL_RELEASED\n");
1876 call_released(sal, ev);
1878 case EXOSIP_CALL_INVITE:
1879 ms_message("CALL_NEW\n");
1880 inc_new_call(sal,ev);
1882 case EXOSIP_CALL_REINVITE:
1883 handle_reinvite(sal,ev);
1885 case EXOSIP_CALL_ACK:
1886 ms_message("CALL_ACK");
1889 case EXOSIP_CALL_REDIRECTED:
1890 ms_message("CALL_REDIRECTED");
1891 eXosip_default_action(ev);
1893 case EXOSIP_CALL_PROCEEDING:
1894 ms_message("CALL_PROCEEDING");
1895 call_proceeding(sal,ev);
1897 case EXOSIP_CALL_RINGING:
1898 ms_message("CALL_RINGING");
1899 call_ringing(sal,ev);
1901 case EXOSIP_CALL_MESSAGE_NEW:
1902 ms_message("EXOSIP_CALL_MESSAGE_NEW");
1903 call_message_new(sal,ev);
1905 case EXOSIP_CALL_MESSAGE_REQUESTFAILURE:
1907 (ev->response->status_code==407 || ev->response->status_code==401)){
1908 return process_authentication(sal,ev);
1911 case EXOSIP_IN_SUBSCRIPTION_NEW:
1912 ms_message("CALL_IN_SUBSCRIPTION_NEW ");
1913 sal_exosip_subscription_recv(sal,ev);
1915 case EXOSIP_IN_SUBSCRIPTION_RELEASED:
1916 ms_message("CALL_SUBSCRIPTION_NEW ");
1917 sal_exosip_in_subscription_closed(sal,ev);
1919 case EXOSIP_SUBSCRIPTION_UPDATE:
1920 ms_message("CALL_SUBSCRIPTION_UPDATE");
1922 case EXOSIP_SUBSCRIPTION_NOTIFY:
1923 ms_message("CALL_SUBSCRIPTION_NOTIFY");
1924 sal_exosip_notify_recv(sal,ev);
1926 case EXOSIP_SUBSCRIPTION_ANSWERED:
1927 ms_message("EXOSIP_SUBSCRIPTION_ANSWERED, ev->sid=%i, ev->did=%i\n",ev->sid,ev->did);
1928 sal_exosip_subscription_answered(sal,ev);
1930 case EXOSIP_SUBSCRIPTION_CLOSED:
1931 ms_message("EXOSIP_SUBSCRIPTION_CLOSED\n");
1932 sal_exosip_subscription_closed(sal,ev);
1934 case EXOSIP_SUBSCRIPTION_REQUESTFAILURE: /**< announce a request failure */
1935 if (ev->response && (ev->response->status_code == 407 || ev->response->status_code == 401)){
1936 return process_authentication(sal,ev);
1938 case EXOSIP_SUBSCRIPTION_SERVERFAILURE:
1939 case EXOSIP_SUBSCRIPTION_GLOBALFAILURE:
1940 sal_exosip_subscription_closed(sal,ev);
1942 case EXOSIP_REGISTRATION_FAILURE:
1943 ms_message("REGISTRATION_FAILURE\n");
1944 return registration_failure(sal,ev);
1946 case EXOSIP_REGISTRATION_SUCCESS:
1947 authentication_ok(sal,ev);
1948 registration_success(sal,ev);
1950 case EXOSIP_MESSAGE_NEW:
1951 other_request(sal,ev);
1953 case EXOSIP_MESSAGE_PROCEEDING:
1954 case EXOSIP_MESSAGE_ANSWERED:
1955 case EXOSIP_MESSAGE_REDIRECTED:
1956 case EXOSIP_MESSAGE_SERVERFAILURE:
1957 case EXOSIP_MESSAGE_GLOBALFAILURE:
1958 other_request_reply(sal,ev);
1960 case EXOSIP_MESSAGE_REQUESTFAILURE:
1961 case EXOSIP_NOTIFICATION_REQUESTFAILURE:
1963 switch (ev->response->status_code) {
1966 return process_authentication(sal,ev);
1968 eXosip_automatic_action ();
1973 other_request_reply(sal,ev);
1976 ms_message("Unhandled exosip event ! %i",ev->type);
1982 int sal_iterate(Sal *sal){
1984 while((ev=eXosip_event_wait(0,0))!=NULL){
1985 if (process_event(sal,ev))
1986 eXosip_event_free(ev);
1989 eXosip_automatic_refresh();
1994 static void register_set_contact(osip_message_t *msg, const char *contact){
1995 osip_uri_param_t *param = NULL;
1996 osip_contact_t *ct=NULL;
1998 /*we get the line parameter choosed by exosip, and add it to our own contact*/
1999 osip_message_get_contact(msg,0,&ct);
2001 osip_uri_uparam_get_byname(ct->url, "line", ¶m);
2002 if (param && param->gvalue)
2003 line=osip_strdup(param->gvalue);
2005 _osip_list_set_empty(&msg->contacts,(void (*)(void*))osip_contact_free);
2006 osip_message_set_contact(msg,contact);
2007 osip_message_get_contact(msg,0,&ct);
2008 osip_uri_uparam_add(ct->url,osip_strdup("line"),line);
2011 static void sal_register_add_route(osip_message_t *msg, const char *proxy){
2013 snprintf(tmp,sizeof(tmp)-1,"<%s;lr>",proxy);
2014 osip_message_set_route(msg,tmp);
2017 int sal_register(SalOp *h, const char *proxy, const char *from, int expires){
2018 osip_message_t *msg;
2019 const char *contact=sal_op_get_contact(h);
2021 sal_op_set_route(h,proxy);
2023 SalAddress *from_parsed=sal_address_new(from);
2025 if (from_parsed==NULL) {
2026 ms_warning("sal_register() bad from %s",from);
2029 snprintf(domain,sizeof(domain),"sip:%s",sal_address_get_domain(from_parsed));
2030 sal_address_destroy(from_parsed);
2032 h->rid=eXosip_register_build_initial_register(from,domain,NULL,expires,&msg);
2034 if (contact) register_set_contact(msg,contact);
2035 sal_register_add_route(msg,proxy);
2036 sal_add_register(h->base.root,h);
2038 ms_error("Could not build initial register.");
2044 eXosip_register_build_register(h->rid,expires,&msg);
2045 sal_register_add_route(msg,proxy);
2047 eXosip_register_send_register(h->rid,msg);
2053 int sal_register_refresh(SalOp *op, int expires){
2054 osip_message_t *msg=NULL;
2055 const char *contact=sal_op_get_contact(op);
2058 ms_error("Unexistant registration context, not possible to refresh.");
2062 eXosip_register_build_register(op->rid,expires,&msg);
2064 if (contact) register_set_contact(msg,contact);
2065 sal_register_add_route(msg,sal_op_get_route(op));
2066 eXosip_register_send_register(op->rid,msg);
2067 }else ms_error("Could not build REGISTER refresh message.");
2073 int sal_unregister(SalOp *h){
2074 osip_message_t *msg=NULL;
2076 eXosip_register_build_register(h->rid,0,&msg);
2077 if (msg) eXosip_register_send_register(h->rid,msg);
2078 else ms_warning("Could not build unREGISTER !");
2083 SalAddress * sal_address_new(const char *uri){
2085 osip_from_init(&from);
2087 // Remove front spaces
2088 while (uri[0]==' ') {
2092 if (osip_from_parse(from,uri)!=0){
2093 osip_from_free(from);
2096 if (from->displayname!=NULL && from->displayname[0]=='"'){
2097 char *unquoted=osip_strdup_without_quote(from->displayname);
2098 osip_free(from->displayname);
2099 from->displayname=unquoted;
2101 return (SalAddress*)from;
2104 SalAddress * sal_address_clone(const SalAddress *addr){
2105 osip_from_t *ret=NULL;
2106 osip_from_clone((osip_from_t*)addr,&ret);
2107 return (SalAddress*)ret;
2110 #define null_if_empty(s) (((s)!=NULL && (s)[0]!='\0') ? (s) : NULL )
2112 const char *sal_address_get_scheme(const SalAddress *addr){
2113 const osip_from_t *u=(const osip_from_t*)addr;
2114 return null_if_empty(u->url->scheme);
2117 const char *sal_address_get_display_name(const SalAddress* addr){
2118 const osip_from_t *u=(const osip_from_t*)addr;
2119 return null_if_empty(u->displayname);
2122 const char *sal_address_get_username(const SalAddress *addr){
2123 const osip_from_t *u=(const osip_from_t*)addr;
2124 return null_if_empty(u->url->username);
2127 const char *sal_address_get_domain(const SalAddress *addr){
2128 const osip_from_t *u=(const osip_from_t*)addr;
2129 return null_if_empty(u->url->host);
2132 void sal_address_set_display_name(SalAddress *addr, const char *display_name){
2133 osip_from_t *u=(osip_from_t*)addr;
2134 if (u->displayname!=NULL){
2135 osip_free(u->displayname);
2136 u->displayname=NULL;
2138 if (display_name!=NULL && display_name[0]!='\0'){
2139 u->displayname=osip_strdup(display_name);
2143 void sal_address_set_username(SalAddress *addr, const char *username){
2144 osip_from_t *uri=(osip_from_t*)addr;
2145 if (uri->url->username!=NULL){
2146 osip_free(uri->url->username);
2147 uri->url->username=NULL;
2150 uri->url->username=osip_strdup(username);
2153 void sal_address_set_domain(SalAddress *addr, const char *host){
2154 osip_from_t *uri=(osip_from_t*)addr;
2155 if (uri->url->host!=NULL){
2156 osip_free(uri->url->host);
2157 uri->url->host=NULL;
2160 uri->url->host=osip_strdup(host);
2163 void sal_address_set_port(SalAddress *addr, const char *port){
2164 osip_from_t *uri=(osip_from_t*)addr;
2165 if (uri->url->port!=NULL){
2166 osip_free(uri->url->port);
2167 uri->url->port=NULL;
2170 uri->url->port=osip_strdup(port);
2173 void sal_address_set_port_int(SalAddress *uri, int port){
2176 /*this is the default, special case to leave the port field blank*/
2177 sal_address_set_port(uri,NULL);
2180 snprintf(tmp,sizeof(tmp),"%i",port);
2181 sal_address_set_port(uri,tmp);
2184 void sal_address_clean(SalAddress *addr){
2185 osip_generic_param_freelist(& ((osip_from_t*)addr)->gen_params);
2186 osip_uri_param_freelist(& ((osip_from_t*)addr)->url->url_params);
2189 char *sal_address_as_string(const SalAddress *u){
2191 osip_from_t *from=(osip_from_t *)u;
2192 char *old_displayname=NULL;
2193 /* hack to force use of quotes around the displayname*/
2194 if (from->displayname!=NULL
2195 && from->displayname[0]!='"'){
2196 old_displayname=from->displayname;
2197 from->displayname=osip_enquote(from->displayname);
2199 osip_from_to_str(from,&tmp);
2200 if (old_displayname!=NULL){
2201 ms_free(from->displayname);
2202 from->displayname=old_displayname;
2209 char *sal_address_as_string_uri_only(const SalAddress *u){
2210 char *tmp=NULL,*ret;
2211 osip_uri_to_str(((osip_from_t*)u)->url,&tmp);
2216 void sal_address_set_param(SalAddress *u,const char* name,const char* value) {
2217 osip_uri_param_t *param=NULL;
2218 osip_uri_uparam_get_byname(((osip_from_t*)u)->url,(char*)name,¶m);
2220 osip_uri_uparam_add (((osip_from_t*)u)->url,ms_strdup(name),ms_strdup(value));
2222 osip_free(param->gvalue);
2223 param->gvalue=osip_strdup(value);
2228 void sal_address_destroy(SalAddress *u){
2229 osip_from_free((osip_from_t*)u);
2232 void sal_set_keepalive_period(Sal *ctx,unsigned int value) {
2233 ctx->keepalive_period=value;
2234 eXosip_set_option (EXOSIP_OPT_UDP_KEEP_ALIVE, &value);
2236 unsigned int sal_get_keepalive_period(Sal *ctx) {
2237 return ctx->keepalive_period;
2240 const char * sal_address_get_port(const SalAddress *addr) {
2241 const osip_from_t *u=(const osip_from_t*)addr;
2242 return null_if_empty(u->url->port);
2245 int sal_address_get_port_int(const SalAddress *uri) {
2246 const char* port = sal_address_get_port(uri);
2253 SalTransport sal_address_get_transport(const SalAddress* addr) {
2254 const osip_from_t *u=(const osip_from_t*)addr;
2255 osip_uri_param_t *transport_param=NULL;
2256 osip_uri_uparam_get_byname(u->url,"transport",&transport_param);
2257 if (transport_param == NULL){
2258 return SalTransportUDP;
2260 return sal_transport_parse(transport_param->gvalue);
2263 void sal_address_set_transport(SalAddress* addr,SalTransport transport) {
2264 sal_address_set_param(addr, "transport", sal_transport_to_string(transport));
2267 /* sends a reinvite. Local media description may have changed by application since call establishment*/
2268 int sal_call_update(SalOp *h, const char *subject){
2270 osip_message_t *reinvite=NULL;
2273 if(eXosip_call_build_request(h->did,"INVITE",&reinvite) != 0 || reinvite==NULL){
2278 osip_message_set_subject(reinvite,subject);
2279 osip_message_set_allow(reinvite, "INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, NOTIFY, MESSAGE, SUBSCRIBE, INFO");
2280 if (h->base.root->session_expires!=0){
2281 osip_message_set_header(reinvite, "Session-expires", "200");
2282 osip_message_set_supported(reinvite, "timer");
2284 if (h->base.local_media){
2285 h->sdp_offering=TRUE;
2286 set_sdp_from_desc(reinvite,h->base.local_media);
2287 }else h->sdp_offering=FALSE;
2289 err = eXosip_call_send_request(h->did, reinvite);
2293 void sal_reuse_authorization(Sal *ctx, bool_t value) {
2294 ctx->reuse_authorization=value;