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;
288 void sal_uninit(Sal* sal){
291 ms_free(sal->rootCa);
295 void sal_set_user_pointer(Sal *sal, void *user_data){
299 void *sal_get_user_pointer(const Sal *sal){
303 static void unimplemented_stub(){
304 ms_warning("Unimplemented SAL callback");
307 void sal_set_callbacks(Sal *ctx, const SalCallbacks *cbs){
308 memcpy(&ctx->callbacks,cbs,sizeof(*cbs));
309 if (ctx->callbacks.call_received==NULL)
310 ctx->callbacks.call_received=(SalOnCallReceived)unimplemented_stub;
311 if (ctx->callbacks.call_ringing==NULL)
312 ctx->callbacks.call_ringing=(SalOnCallRinging)unimplemented_stub;
313 if (ctx->callbacks.call_accepted==NULL)
314 ctx->callbacks.call_accepted=(SalOnCallAccepted)unimplemented_stub;
315 if (ctx->callbacks.call_failure==NULL)
316 ctx->callbacks.call_failure=(SalOnCallFailure)unimplemented_stub;
317 if (ctx->callbacks.call_terminated==NULL)
318 ctx->callbacks.call_terminated=(SalOnCallTerminated)unimplemented_stub;
319 if (ctx->callbacks.call_released==NULL)
320 ctx->callbacks.call_released=(SalOnCallReleased)unimplemented_stub;
321 if (ctx->callbacks.call_updating==NULL)
322 ctx->callbacks.call_updating=(SalOnCallUpdating)unimplemented_stub;
323 if (ctx->callbacks.auth_requested==NULL)
324 ctx->callbacks.auth_requested=(SalOnAuthRequested)unimplemented_stub;
325 if (ctx->callbacks.auth_success==NULL)
326 ctx->callbacks.auth_success=(SalOnAuthSuccess)unimplemented_stub;
327 if (ctx->callbacks.register_success==NULL)
328 ctx->callbacks.register_success=(SalOnRegisterSuccess)unimplemented_stub;
329 if (ctx->callbacks.register_failure==NULL)
330 ctx->callbacks.register_failure=(SalOnRegisterFailure)unimplemented_stub;
331 if (ctx->callbacks.dtmf_received==NULL)
332 ctx->callbacks.dtmf_received=(SalOnDtmfReceived)unimplemented_stub;
333 if (ctx->callbacks.notify==NULL)
334 ctx->callbacks.notify=(SalOnNotify)unimplemented_stub;
335 if (ctx->callbacks.notify_presence==NULL)
336 ctx->callbacks.notify_presence=(SalOnNotifyPresence)unimplemented_stub;
337 if (ctx->callbacks.subscribe_received==NULL)
338 ctx->callbacks.subscribe_received=(SalOnSubscribeReceived)unimplemented_stub;
339 if (ctx->callbacks.text_received==NULL)
340 ctx->callbacks.text_received=(SalOnTextReceived)unimplemented_stub;
341 if (ctx->callbacks.ping_reply==NULL)
342 ctx->callbacks.ping_reply=(SalOnPingReply)unimplemented_stub;
345 int sal_unlisten_ports(Sal *ctx){
354 int sal_listen_port(Sal *ctx, const char *addr, int port, SalTransport tr, int is_secure){
357 int proto=IPPROTO_UDP;
358 int keepalive = ctx->keepalive_period;
361 case SalTransportUDP:
363 eXosip_set_option (EXOSIP_OPT_UDP_KEEP_ALIVE, &keepalive);
365 case SalTransportTCP:
366 case SalTransportTLS:
369 eXosip_set_option (EXOSIP_OPT_UDP_KEEP_ALIVE,&keepalive);
372 eXosip_tls_ctx_t tlsCtx;
373 memset(&tlsCtx, 0, sizeof(tlsCtx));
374 snprintf(tlsCtx.root_ca_cert, sizeof(tlsCtx.client.cert), "%s", ctx->rootCa);
375 eXosip_set_tls_ctx(&tlsCtx);
379 ms_warning("unexpected proto, using datagram");
383 eXosip_set_option(13,&err); /*13=EXOSIP_OPT_SRV_WITH_NAPTR, as it is an enum value, we can't use it unless we are sure of the
384 version of eXosip, which is not the case*/
385 /*see if it looks like an IPv6 address*/
386 int use_rports = ctx->use_rports; // Copy char to int to avoid bad alignment
387 eXosip_set_option(EXOSIP_OPT_USE_RPORT,&use_rports);
388 int dont_use_101 = !ctx->use_101; // Copy char to int to avoid bad alignment
389 eXosip_set_option(EXOSIP_OPT_DONT_SEND_101,&dont_use_101);
391 ipv6=strchr(addr,':')!=NULL;
392 eXosip_enable_ipv6(ipv6);
394 if (is_secure && tr == SalTransportUDP){
395 ms_fatal("SIP over DTLS is not supported yet.");
398 err=eXosip_listen_addr(proto, addr, port, ipv6 ? PF_INET6 : PF_INET, is_secure);
399 #ifdef HAVE_EXOSIP_GET_SOCKET
400 ms_message("Exosip has socket number %i",eXosip_get_socket(proto));
407 ortp_socket_t sal_get_socket(Sal *ctx){
408 #ifdef HAVE_EXOSIP_GET_SOCKET
409 return eXosip_get_socket(IPPROTO_UDP);
411 ms_warning("Sorry, eXosip does not have eXosip_get_socket() method");
416 void sal_set_user_agent(Sal *ctx, const char *user_agent){
417 eXosip_set_user_agent(user_agent);
420 void sal_use_session_timers(Sal *ctx, int expires){
421 ctx->session_expires=expires;
424 void sal_use_one_matching_codec_policy(Sal *ctx, bool_t one_matching_codec){
425 ctx->one_matching_codec=one_matching_codec;
428 MSList *sal_get_pending_auths(Sal *sal){
429 return ms_list_copy(sal->pending_auths);
432 void sal_use_double_registrations(Sal *ctx, bool_t enabled){
433 ctx->double_reg=enabled;
436 void sal_use_rport(Sal *ctx, bool_t use_rports){
437 ctx->use_rports=use_rports;
439 void sal_use_101(Sal *ctx, bool_t use_101){
440 ctx->use_101=use_101;
443 void sal_root_ca(Sal* ctx, const char* rootCa) {
445 ms_free(ctx->rootCa);
446 ctx->rootCa = ms_strdup(rootCa);
449 static int extract_received_rport(osip_message_t *msg, const char **received, int *rportval,SalTransport* transport){
450 osip_via_t *via=NULL;
451 osip_generic_param_t *param=NULL;
452 const char *rport=NULL;
456 osip_message_get_via(msg,0,&via);
459 *transport = sal_transport_parse(via->protocol);
461 if (via->port && via->port[0]!='\0')
462 *rportval=atoi(via->port);
464 osip_via_param_get_byname(via,"rport",¶m);
467 if (rport && rport[0]!='\0') *rportval=atoi(rport);
471 osip_via_param_get_byname(via,"received",¶m);
472 if (param) *received=param->gvalue;
474 if (rport==NULL && *received==NULL) return -1;
478 static void set_sdp(osip_message_t *sip,sdp_message_t *msg){
482 sdp_message_to_str(msg,&sdp);
484 snprintf(clen,sizeof(clen),"%i",sdplen);
485 osip_message_set_body(sip,sdp,sdplen);
486 osip_message_set_content_type(sip,"application/sdp");
487 osip_message_set_content_length(sip,clen);
491 static void set_sdp_from_desc(osip_message_t *sip, const SalMediaDescription *desc){
492 sdp_message_t *msg=media_description_to_sdp(desc);
494 ms_error("Fail to print sdp message !");
498 sdp_message_free(msg);
501 static void sdp_process(SalOp *h){
502 ms_message("Doing SDP offer/answer process");
504 sal_media_description_unref(h->result);
506 h->result=sal_media_description_new();
507 if (h->sdp_offering){
508 offer_answer_initiate_outgoing(h->base.local_media,h->base.remote_media,h->result);
511 offer_answer_initiate_incoming(h->base.local_media,h->base.remote_media,h->result,h->base.root->one_matching_codec);
512 h->sdp_answer=media_description_to_sdp(h->result);
513 /*once we have generated the SDP answer, we modify the result description for processing by the upper layer.
514 It should contains media parameters constraint from the remote offer, not our response*/
515 strcpy(h->result->addr,h->base.remote_media->addr);
516 h->result->bandwidth=h->base.remote_media->bandwidth;
517 for(i=0;i<h->result->nstreams;++i){
518 if (h->result->streams[i].port>0){
519 strcpy(h->result->streams[i].addr,h->base.remote_media->streams[i].addr);
520 h->result->streams[i].ptime=h->base.remote_media->streams[i].ptime;
521 h->result->streams[i].bandwidth=h->base.remote_media->streams[i].bandwidth;
522 h->result->streams[i].port=h->base.remote_media->streams[i].port;
529 int sal_call_is_offerer(const SalOp *h){
530 return h->sdp_offering;
533 int sal_call_set_local_media_description(SalOp *h, SalMediaDescription *desc){
535 sal_media_description_ref(desc);
536 if (h->base.local_media)
537 sal_media_description_unref(h->base.local_media);
538 h->base.local_media=desc;
542 int sal_call(SalOp *h, const char *from, const char *to){
544 osip_message_t *invite=NULL;
545 sal_op_set_from(h,from);
547 sal_exosip_fix_route(h);
548 err=eXosip_call_build_initial_invite(&invite,to,from,sal_op_get_route(h),"Phone call");
550 ms_error("Could not create call.");
553 osip_message_set_allow(invite, "INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, NOTIFY, MESSAGE, SUBSCRIBE, INFO");
554 if (h->base.contact){
555 _osip_list_set_empty(&invite->contacts,(void (*)(void*))osip_contact_free);
556 osip_message_set_contact(invite,h->base.contact);
558 if (h->base.root->session_expires!=0){
559 osip_message_set_header(invite, "Session-expires", "200");
560 osip_message_set_supported(invite, "timer");
562 if (h->base.local_media){
563 h->sdp_offering=TRUE;
564 set_sdp_from_desc(invite,h->base.local_media);
565 }else h->sdp_offering=FALSE;
567 osip_message_set_header(invite,"Replaces",h->replaces);
569 osip_message_set_header(invite,"Referred-By",h->referred_by);
573 err=eXosip_call_send_initial_invite(invite);
577 ms_error("Fail to send invite !");
580 sal_add_call(h->base.root,h);
585 int sal_call_notify_ringing(SalOp *h, bool_t early_media){
588 /*if early media send also 180 and 183 */
589 if (early_media && h->sdp_answer){
592 eXosip_call_build_answer(h->tid,180,&msg);
594 set_sdp(msg,h->sdp_answer);
595 eXosip_call_send_answer(h->tid,180,msg);
598 eXosip_call_build_answer(h->tid,183,&msg);
600 set_sdp(msg,h->sdp_answer);
601 eXosip_call_send_answer(h->tid,183,msg);
606 eXosip_call_send_answer(h->tid,180,NULL);
612 int sal_call_accept(SalOp * h){
614 const char *contact=sal_op_get_contact(h);
616 int err=eXosip_call_build_answer(h->tid,200,&msg);
617 if (err<0 || msg==NULL){
618 ms_error("Fail to build answer for call: err=%i",err);
621 if (h->base.root->session_expires!=0){
622 if (h->supports_session_timers) osip_message_set_supported(msg, "timer");
626 _osip_list_set_empty(&msg->contacts,(void (*)(void*))osip_contact_free);
627 osip_message_set_contact(msg,contact);
630 if (h->base.local_media){
631 /*this is the case where we received an invite without SDP*/
632 if (h->sdp_offering) {
633 set_sdp_from_desc(msg,h->base.local_media);
636 set_sdp(msg,h->sdp_answer);
637 sdp_message_free(h->sdp_answer);
642 ms_error("You are accepting a call but not defined any media capabilities !");
644 eXosip_call_send_answer(h->tid,200,msg);
648 int sal_call_decline(SalOp *h, SalReason reason, const char *redirect){
649 if (reason==SalReasonBusy){
651 eXosip_call_send_answer(h->tid,486,NULL);
654 else if (reason==SalReasonTemporarilyUnavailable){
656 eXosip_call_send_answer(h->tid,480,NULL);
658 }else if (reason==SalReasonDoNotDisturb){
660 eXosip_call_send_answer(h->tid,600,NULL);
662 }else if (reason==SalReasonMedia){
664 eXosip_call_send_answer(h->tid,415,NULL);
666 }else if (redirect!=NULL && reason==SalReasonRedirect){
669 if (strstr(redirect,"sip:")!=0) code=302;
672 eXosip_call_build_answer(h->tid,code,&msg);
673 osip_message_set_contact(msg,redirect);
674 eXosip_call_send_answer(h->tid,code,msg);
676 }else sal_call_terminate(h);
680 SalMediaDescription * sal_call_get_final_media_description(SalOp *h){
681 if (h->base.local_media && h->base.remote_media && !h->result){
687 int sal_call_set_referer(SalOp *h, SalOp *refered_call){
688 if (refered_call->replaces)
689 h->replaces=ms_strdup(refered_call->replaces);
690 if (refered_call->referred_by)
691 h->referred_by=ms_strdup(refered_call->referred_by);
695 int sal_ping(SalOp *op, const char *from, const char *to){
696 osip_message_t *options=NULL;
698 sal_op_set_from(op,from);
699 sal_op_set_to(op,to);
700 /*bug here: eXosip2 does not honor the route argument*/
701 eXosip_options_build_request (&options, sal_op_get_to(op),
702 sal_op_get_from(op),sal_op_get_route(op));
704 if (op->base.root->session_expires!=0){
705 osip_message_set_header(options, "Session-expires", "200");
706 osip_message_set_supported(options, "timer");
708 sal_add_other(sal_op_get_sal(op),op,options);
709 return eXosip_options_send_request(options);
714 int sal_call_accept_refer(SalOp *op){
715 osip_message_t *msg=NULL;
718 err = eXosip_call_build_notify(op->did,EXOSIP_SUBCRSTATE_ACTIVE,&msg);
721 osip_message_set_header(msg,(const char *)"event","refer");
722 osip_message_set_content_type(msg,"message/sipfrag");
723 osip_message_set_body(msg,"SIP/2.0 100 Trying",sizeof("SIP/2.0 100 Trying"));
724 eXosip_call_send_request(op->did,msg);
728 ms_error("could not get a notify built\n");
734 int sal_call_refer(SalOp *h, const char *refer_to){
735 osip_message_t *msg=NULL;
738 eXosip_call_build_refer(h->did,refer_to, &msg);
739 if (msg) err=eXosip_call_send_request(h->did, msg);
745 int sal_call_refer_with_replaces(SalOp *h, SalOp *other_call_h){
746 osip_message_t *msg=NULL;
747 char referto[256]={0};
750 if (eXosip_call_get_referto(other_call_h->did,referto,sizeof(referto)-1)!=0){
751 ms_error("eXosip_call_get_referto() failed for did=%i",other_call_h->did);
755 eXosip_call_build_refer(h->did,referto, &msg);
756 osip_message_set_header(msg,"Referred-By",h->base.from);
757 if (msg) err=eXosip_call_send_request(h->did, msg);
763 SalOp *sal_call_get_replaces(SalOp *h){
764 if (h!=NULL && h->replaces!=NULL){
767 cid=eXosip_call_find_by_replaces(h->replaces);
770 SalOp *ret=sal_find_call(h->base.root,cid);
777 int sal_call_send_dtmf(SalOp *h, char dtmf){
778 osip_message_t *msg=NULL;
783 eXosip_call_build_info(h->did,&msg);
785 snprintf(dtmf_body, sizeof(dtmf_body), "Signal=%c\r\nDuration=250\r\n", dtmf);
786 osip_message_set_body(msg,dtmf_body,strlen(dtmf_body));
787 osip_message_set_content_type(msg,"application/dtmf-relay");
788 snprintf(clen,sizeof(clen),"%lu",(unsigned long)strlen(dtmf_body));
789 osip_message_set_content_length(msg,clen);
790 eXosip_call_send_request(h->did,msg);
796 static void push_auth_to_exosip(const SalAuthInfo *info){
798 if (info->userid==NULL || info->userid[0]=='\0') userid=info->username;
799 else userid=info->userid;
800 ms_message("Authentication info for username [%s], id[%s], realm [%s] added to eXosip", info->username,userid, info->realm);
801 eXosip_add_authentication_info (info->username,userid,
802 info->password, NULL,info->realm);
805 * Just for symmetry ;-)
807 static void pop_auth_from_exosip() {
808 eXosip_clear_authentication_info();
811 int sal_call_terminate(SalOp *h){
813 if (h == NULL) return -1;
814 if (h->auth_info) push_auth_to_exosip(h->auth_info);
816 err=eXosip_call_terminate(h->cid,h->did);
818 if (!h->base.root->reuse_authorization) pop_auth_from_exosip();
820 ms_warning("Exosip could not terminate the call: cid=%i did=%i", h->cid,h->did);
826 void sal_op_authenticate(SalOp *h, const SalAuthInfo *info){
827 if (h->pending_auth){
828 push_auth_to_exosip(info);
830 /*FIXME exosip does not take into account this update register message*/
832 if (fix_message_contact(h, h->pending_auth->request,h->pending_auth->response)) {
836 update_contact_from_response(h,h->pending_auth->response);
838 eXosip_default_action(h->pending_auth);
840 ms_message("eXosip_default_action() done");
841 if (!h->base.root->reuse_authorization) pop_auth_from_exosip();
843 if (h->auth_info) sal_auth_info_delete(h->auth_info); /*if already exist*/
844 h->auth_info=sal_auth_info_clone(info); /*store auth info for subsequent request*/
847 void sal_op_cancel_authentication(SalOp *h) {
849 sal_op_get_sal(h)->callbacks.register_failure(h,SalErrorFailure, SalReasonForbidden,_("Authentication failure"));
850 } else if (h->cid >0) {
851 sal_op_get_sal(h)->callbacks.call_failure(h,SalErrorFailure, SalReasonForbidden,_("Authentication failure"),0);
853 ms_warning("Auth failure not handled");
857 static void set_network_origin(SalOp *op, osip_message_t *req){
858 const char *received=NULL;
861 SalTransport transport;
862 if (extract_received_rport(req,&received,&rport,&transport)!=0){
863 osip_via_t *via=NULL;
865 osip_message_get_via(req,0,&via);
866 received=osip_via_get_host(via);
867 tmp=osip_via_get_port(via);
868 if (tmp) rport=atoi(tmp);
870 if (transport != SalTransportUDP) {
871 snprintf(origin,sizeof(origin)-1,"sip:%s:%i",received,rport);
873 snprintf(origin,sizeof(origin)-1,"sip:%s:%i;transport=%s",received,rport,sal_transport_to_string(transport));
875 __sal_op_set_network_origin(op,origin);
878 static void set_remote_ua(SalOp* op, osip_message_t *req){
879 if (op->base.remote_ua==NULL){
880 osip_header_t *h=NULL;
881 osip_message_get_user_agent(req,0,&h);
883 op->base.remote_ua=ms_strdup(h->hvalue);
888 static void set_replaces(SalOp *op, osip_message_t *req){
889 osip_header_t *h=NULL;
892 ms_free(op->replaces);
895 osip_message_header_get_byname(req,"replaces",0,&h);
897 if (h->hvalue && h->hvalue[0]!='\0'){
898 op->replaces=ms_strdup(h->hvalue);
903 static SalOp *find_op(Sal *sal, eXosip_event_t *ev){
905 return sal_find_call(sal,ev->cid);
908 return sal_find_register(sal,ev->rid);
911 return sal_find_out_subscribe(sal,ev->sid);
914 return sal_find_in_subscribe(sal,ev->nid);
916 if (ev->response) return sal_find_other(sal,ev->response);
920 static void inc_new_call(Sal *sal, eXosip_event_t *ev){
921 SalOp *op=sal_op_new(sal);
922 osip_from_t *from,*to;
923 osip_call_info_t *call_info;
925 sdp_message_t *sdp=eXosip_get_sdp_info(ev->request);
927 set_network_origin(op,ev->request);
928 set_remote_ua(op,ev->request);
929 set_replaces(op,ev->request);
932 op->sdp_offering=FALSE;
933 op->base.remote_media=sal_media_description_new();
934 sdp_to_media_description(sdp,op->base.remote_media);
935 sdp_message_free(sdp);
936 }else op->sdp_offering=TRUE;
938 from=osip_message_get_from(ev->request);
939 to=osip_message_get_to(ev->request);
940 osip_from_to_str(from,&tmp);
941 sal_op_set_from(op,tmp);
943 osip_from_to_str(to,&tmp);
944 sal_op_set_to(op,tmp);
947 osip_message_get_call_info(ev->request,0,&call_info);
950 osip_call_info_to_str(call_info,&tmp);
951 if( strstr(tmp,"answer-after=") != NULL)
953 op->auto_answer_asked=TRUE;
954 ms_message("The caller asked to automatically answer the call(Emergency?)\n");
963 sal_add_call(op->base.root,op);
964 sal->callbacks.call_received(op);
967 static void handle_reinvite(Sal *sal, eXosip_event_t *ev){
968 SalOp *op=find_op(sal,ev);
970 osip_message_t *msg=NULL;
973 ms_warning("Reinvite for non-existing operation !");
978 sdp=eXosip_get_sdp_info(ev->request);
979 if (op->base.remote_media){
980 sal_media_description_unref(op->base.remote_media);
981 op->base.remote_media=NULL;
984 sal_media_description_unref(op->result);
988 op->sdp_offering=FALSE;
989 op->base.remote_media=sal_media_description_new();
990 sdp_to_media_description(sdp,op->base.remote_media);
991 sdp_message_free(sdp);
992 sal->callbacks.call_updating(op);
994 op->sdp_offering=TRUE;
996 eXosip_call_build_answer(ev->tid,200,&msg);
998 set_sdp_from_desc(msg,op->base.local_media);
999 eXosip_call_send_answer(ev->tid,200,msg);
1006 static void handle_ack(Sal *sal, eXosip_event_t *ev){
1007 SalOp *op=find_op(sal,ev);
1011 ms_warning("ack for non-existing call !");
1014 sdp=eXosip_get_sdp_info(ev->ack);
1016 op->base.remote_media=sal_media_description_new();
1017 sdp_to_media_description(sdp,op->base.remote_media);
1019 sdp_message_free(sdp);
1022 if (sdp) sal->callbacks.call_updating(op);
1025 sal->callbacks.call_ack(op);
1029 static void update_contact_from_response(SalOp *op, osip_message_t *response){
1030 const char *received;
1032 SalTransport transport;
1033 if (extract_received_rport(response,&received,&rport,&transport)==0){
1034 const char *contact=sal_op_get_contact(op);
1036 /*no contact given yet, use from instead*/
1037 contact=sal_op_get_from(op);
1040 SalAddress *addr=sal_address_new(contact);
1042 sal_address_set_domain(addr,received);
1043 sal_address_set_port_int(addr,rport);
1044 if (transport!=SalTransportUDP)
1045 sal_address_set_transport(addr,transport);
1046 tmp=sal_address_as_string(addr);
1047 ms_message("Contact address updated to %s",tmp);
1048 sal_op_set_contact(op,tmp);
1049 sal_address_destroy(addr);
1055 static int call_proceeding(Sal *sal, eXosip_event_t *ev){
1056 SalOp *op=find_op(sal,ev);
1058 if (op==NULL || op->terminated==TRUE) {
1059 ms_warning("This call has been canceled.");
1061 eXosip_call_terminate(ev->cid,ev->did);
1069 /* update contact if received and rport are set by the server
1070 note: will only be used by remote for next INVITE, if any...*/
1071 update_contact_from_response(op,ev->response);
1075 static void call_ringing(Sal *sal, eXosip_event_t *ev){
1077 SalOp *op=find_op(sal,ev);
1078 if (call_proceeding(sal, ev)==-1) return;
1080 set_remote_ua(op,ev->response);
1081 sdp=eXosip_get_sdp_info(ev->response);
1083 op->base.remote_media=sal_media_description_new();
1084 sdp_to_media_description(sdp,op->base.remote_media);
1085 sdp_message_free(sdp);
1086 if (op->base.local_media) sdp_process(op);
1088 sal->callbacks.call_ringing(op);
1091 static void call_accepted(Sal *sal, eXosip_event_t *ev){
1093 osip_message_t *msg=NULL;
1094 SalOp *op=find_op(sal,ev);
1095 const char *contact;
1097 if (op==NULL || op->terminated==TRUE) {
1098 ms_warning("This call has been already terminated.");
1100 eXosip_call_terminate(ev->cid,ev->did);
1106 set_remote_ua(op,ev->response);
1108 sdp=eXosip_get_sdp_info(ev->response);
1110 op->base.remote_media=sal_media_description_new();
1111 sdp_to_media_description(sdp,op->base.remote_media);
1112 sdp_message_free(sdp);
1113 if (op->base.local_media) sdp_process(op);
1115 eXosip_call_build_ack(ev->did,&msg);
1117 ms_warning("This call has been already terminated.");
1119 eXosip_call_terminate(ev->cid,ev->did);
1123 contact=sal_op_get_contact(op);
1125 _osip_list_set_empty(&msg->contacts,(void (*)(void*))osip_contact_free);
1126 osip_message_set_contact(msg,contact);
1128 if (op->sdp_answer){
1129 set_sdp(msg,op->sdp_answer);
1130 sdp_message_free(op->sdp_answer);
1131 op->sdp_answer=NULL;
1133 eXosip_call_send_ack(ev->did,msg);
1134 sal->callbacks.call_accepted(op);
1137 static void call_terminated(Sal *sal, eXosip_event_t *ev){
1139 SalOp *op=find_op(sal,ev);
1141 ms_warning("Call terminated for already closed call ?");
1145 osip_from_to_str(ev->request->from,&from);
1147 sal->callbacks.call_terminated(op,from!=NULL ? from : sal_op_get_from(op));
1148 if (from) osip_free(from);
1149 op->terminated=TRUE;
1152 static void call_released(Sal *sal, eXosip_event_t *ev){
1153 SalOp *op=find_op(sal,ev);
1155 ms_warning("No op associated to this call_released()");
1158 if (!op->terminated){
1159 /* no response received so far */
1160 call_failure(sal,ev);
1162 sal->callbacks.call_released(op);
1165 static int get_auth_data_from_response(osip_message_t *resp, const char **realm, const char **username){
1166 const char *prx_realm=NULL,*www_realm=NULL;
1167 osip_proxy_authenticate_t *prx_auth;
1168 osip_www_authenticate_t *www_auth;
1170 *username=osip_uri_get_username(resp->from->url);
1171 prx_auth=(osip_proxy_authenticate_t*)osip_list_get(&resp->proxy_authenticates,0);
1172 www_auth=(osip_proxy_authenticate_t*)osip_list_get(&resp->www_authenticates,0);
1174 prx_realm=osip_proxy_authenticate_get_realm(prx_auth);
1176 www_realm=osip_www_authenticate_get_realm(www_auth);
1180 }else if (www_realm){
1188 static int get_auth_data_from_request(osip_message_t *msg, const char **realm, const char **username){
1189 osip_authorization_t *auth=NULL;
1190 osip_proxy_authorization_t *prx_auth=NULL;
1192 *username=osip_uri_get_username(msg->from->url);
1193 osip_message_get_authorization(msg, 0, &auth);
1195 *realm=osip_authorization_get_realm(auth);
1198 osip_message_get_proxy_authorization(msg,0,&prx_auth);
1200 *realm=osip_proxy_authorization_get_realm(prx_auth);
1206 static int get_auth_data(eXosip_event_t *ev, const char **realm, const char **username){
1207 if (ev->response && get_auth_data_from_response(ev->response,realm,username)==0) return 0;
1208 if (ev->request && get_auth_data_from_request(ev->request,realm,username)==0) return 0;
1212 int sal_op_get_auth_requested(SalOp *op, const char **realm, const char **username){
1213 if (op->pending_auth){
1214 return get_auth_data(op->pending_auth,realm,username);
1219 static bool_t process_authentication(Sal *sal, eXosip_event_t *ev){
1221 const char *username,*realm;
1224 ms_warning("No operation associated with this authentication !");
1227 if (get_auth_data(ev,&realm,&username)==0){
1228 if (op->pending_auth!=NULL){
1229 eXosip_event_free(op->pending_auth);
1230 op->pending_auth=ev;
1232 op->pending_auth=ev;
1233 sal_add_pending_auth(sal,op);
1236 sal->callbacks.auth_requested(op,realm,username);
1242 static void authentication_ok(Sal *sal, eXosip_event_t *ev){
1244 const char *username,*realm;
1247 ms_warning("No operation associated with this authentication_ok!");
1250 if (op->pending_auth){
1251 eXosip_event_free(op->pending_auth);
1252 sal_remove_pending_auth(sal,op);
1253 op->pending_auth=NULL;
1255 if (get_auth_data(ev,&realm,&username)==0){
1256 sal->callbacks.auth_success(op,realm,username);
1260 static bool_t call_failure(Sal *sal, eXosip_event_t *ev){
1263 char* computedReason=NULL;
1264 const char *reason=NULL;
1265 SalError error=SalErrorUnknown;
1266 SalReason sr=SalReasonUnknown;
1269 op=(SalOp*)find_op(sal,ev);
1272 ms_warning("Call failure reported for a closed call, ignored.");
1277 code=osip_message_get_status_code(ev->response);
1278 reason=osip_message_get_reason_phrase(ev->response);
1279 osip_header_t *h=NULL;
1280 if (!osip_message_header_get_byname( ev->response
1284 computedReason = ms_strdup_printf("%s %s",reason,osip_header_get_value(h));
1285 reason = computedReason;
1293 return process_authentication(sal,ev);
1296 error=SalErrorUnknown;
1299 error=SalErrorFailure;
1300 sr=SalReasonNotFound;
1303 error=SalErrorFailure;
1307 eXosip_default_action(ev);
1311 error=SalErrorFailure;
1312 sr=SalReasonTemporarilyUnavailable;
1314 error=SalErrorFailure;
1320 error=SalErrorFailure;
1321 sr=SalReasonDoNotDisturb;
1324 error=SalErrorFailure;
1325 sr=SalReasonDeclined;
1329 error=SalErrorFailure;
1330 sr=SalReasonUnknown;
1331 }else error=SalErrorNoResponse;
1333 op->terminated=TRUE;
1334 sal->callbacks.call_failure(op,error,sr,reason,code);
1335 if (computedReason != NULL){
1336 ms_free(computedReason);
1341 /* Request remote side to send us VFU */
1342 void sal_call_send_vfu_request(SalOp *h){
1343 osip_message_t *msg=NULL;
1345 "<?xml version=\"1.0\" encoding=\"utf-8\" ?>"
1349 " <picture_fast_update></picture_fast_update>"
1357 eXosip_call_build_info(h->did,&msg);
1359 osip_message_set_body(msg,info_body,strlen(info_body));
1360 osip_message_set_content_type(msg,"application/media_control+xml");
1361 snprintf(clen,sizeof(clen),"%lu",(unsigned long)strlen(info_body));
1362 osip_message_set_content_length(msg,clen);
1363 eXosip_call_send_request(h->did,msg);
1364 ms_message("Sending VFU request !");
1369 static void process_media_control_xml(Sal *sal, eXosip_event_t *ev){
1370 SalOp *op=find_op(sal,ev);
1371 osip_body_t *body=NULL;
1374 ms_warning("media control xml received without operation context!");
1378 osip_message_get_body(ev->request,0,&body);
1379 if (body && body->body!=NULL &&
1380 strstr(body->body,"picture_fast_update")){
1381 osip_message_t *ans=NULL;
1382 ms_message("Receiving VFU request !");
1383 if (sal->callbacks.vfu_request){
1384 sal->callbacks.vfu_request(op);
1385 eXosip_call_build_answer(ev->tid,200,&ans);
1387 eXosip_call_send_answer(ev->tid,200,ans);
1391 /*in all other cases we must say it is not implemented.*/
1393 osip_message_t *ans=NULL;
1395 eXosip_call_build_answer(ev->tid,501,&ans);
1397 eXosip_call_send_answer(ev->tid,501,ans);
1402 static void process_dtmf_relay(Sal *sal, eXosip_event_t *ev){
1403 SalOp *op=find_op(sal,ev);
1404 osip_body_t *body=NULL;
1407 ms_warning("media dtmf relay received without operation context!");
1411 osip_message_get_body(ev->request,0,&body);
1412 if (body && body->body!=NULL){
1413 osip_message_t *ans=NULL;
1414 const char *name=strstr(body->body,"Signal");
1415 if (name==NULL) name=strstr(body->body,"signal");
1417 ms_warning("Could not extract the dtmf name from the SIP INFO.");
1420 name+=strlen("signal");
1421 if (sscanf(name," = %1s",tmp)==1){
1422 ms_message("Receiving dtmf %s via SIP INFO.",tmp);
1423 if (sal->callbacks.dtmf_received != NULL)
1424 sal->callbacks.dtmf_received(op, tmp[0]);
1428 eXosip_call_build_answer(ev->tid,200,&ans);
1430 eXosip_call_send_answer(ev->tid,200,ans);
1435 static void fill_options_answer(osip_message_t *options){
1436 osip_message_set_allow(options,"INVITE, ACK, BYE, CANCEL, OPTIONS, MESSAGE, SUBSCRIBE, NOTIFY, INFO");
1437 osip_message_set_accept(options,"application/sdp");
1440 static void process_refer(Sal *sal, SalOp *op, eXosip_event_t *ev){
1441 osip_header_t *h=NULL;
1442 osip_message_t *ans=NULL;
1443 ms_message("Receiving REFER request !");
1444 osip_message_header_get_byname(ev->request,"Refer-To",0,&h);
1447 osip_from_t *from=NULL;
1449 osip_from_init(&from);
1451 if (osip_from_parse(from,h->hvalue)==0){
1453 osip_uri_header_t *uh=NULL;
1454 osip_header_t *referred_by=NULL;
1455 osip_uri_header_get_byname(&from->url->url_headers,(char*)"Replaces",&uh);
1456 if (uh!=NULL && uh->gvalue && uh->gvalue[0]!='\0'){
1457 ms_message("Found replaces in Refer-To");
1459 ms_free(op->replaces);
1461 op->replaces=ms_strdup(uh->gvalue);
1463 osip_message_header_get_byname(ev->request,"Referred-By",0,&referred_by);
1464 if (referred_by && referred_by->hvalue && referred_by->hvalue[0]!='\0'){
1465 if (op->referred_by)
1466 ms_free(op->referred_by);
1467 op->referred_by=ms_strdup(referred_by->hvalue);
1470 osip_uri_header_freelist(&from->url->url_headers);
1471 osip_from_to_str(from,&tmp);
1472 sal->callbacks.refer_received(sal,op,tmp);
1474 osip_from_free(from);
1477 eXosip_call_build_answer(ev->tid,202,&ans);
1479 eXosip_call_send_answer(ev->tid,202,ans);
1484 ms_warning("cannot do anything with the refer without destination\n");
1488 static void call_message_new(Sal *sal, eXosip_event_t *ev){
1489 osip_message_t *ans=NULL;
1491 if (MSG_IS_INFO(ev->request)){
1492 osip_content_type_t *ct;
1493 ct=osip_message_get_content_type(ev->request);
1494 if (ct && ct->subtype){
1495 if (strcmp(ct->subtype,"media_control+xml")==0)
1496 process_media_control_xml(sal,ev);
1497 else if (strcmp(ct->subtype,"dtmf-relay")==0)
1498 process_dtmf_relay(sal,ev);
1500 ms_message("Unhandled SIP INFO.");
1501 /*send an "Not implemented" answer*/
1503 eXosip_call_build_answer(ev->tid,501,&ans);
1505 eXosip_call_send_answer(ev->tid,501,ans);
1509 /*empty SIP INFO, probably to test we are alive. Send an empty answer*/
1511 eXosip_call_build_answer(ev->tid,200,&ans);
1513 eXosip_call_send_answer(ev->tid,200,ans);
1516 }else if(MSG_IS_MESSAGE(ev->request)){
1517 /* SIP messages could be received into call */
1518 text_received(sal, ev);
1520 eXosip_call_build_answer(ev->tid,200,&ans);
1522 eXosip_call_send_answer(ev->tid,200,ans);
1524 }else if(MSG_IS_REFER(ev->request)){
1525 SalOp *op=find_op(sal,ev);
1527 ms_message("Receiving REFER request !");
1528 process_refer(sal,op,ev);
1529 }else if(MSG_IS_NOTIFY(ev->request)){
1530 osip_header_t *h=NULL;
1532 SalOp *op=find_op(sal,ev);
1534 ms_message("Receiving NOTIFY request !");
1535 osip_from_to_str(ev->request->from,&from);
1536 osip_message_header_get_byname(ev->request,"Event",0,&h);
1538 sal->callbacks.notify(op,from,h->hvalue);
1539 /*answer that we received the notify*/
1541 eXosip_call_build_answer(ev->tid,200,&ans);
1543 eXosip_call_send_answer(ev->tid,200,ans);
1546 }else if (MSG_IS_OPTIONS(ev->request)){
1548 eXosip_call_build_answer(ev->tid,200,&ans);
1550 fill_options_answer(ans);
1551 eXosip_call_send_answer(ev->tid,200,ans);
1555 }else ms_warning("call_message_new: No request ?");
1558 static void inc_update(Sal *sal, eXosip_event_t *ev){
1559 osip_message_t *msg=NULL;
1560 ms_message("Processing incoming UPDATE");
1562 eXosip_message_build_answer(ev->tid,200,&msg);
1564 eXosip_message_send_answer(ev->tid,200,msg);
1568 static bool_t comes_from_local_if(osip_message_t *msg){
1569 osip_via_t *via=NULL;
1570 osip_message_get_via(msg,0,&via);
1573 host=osip_via_get_host(via);
1574 if (strcmp(host,"127.0.0.1")==0 || strcmp(host,"::1")==0){
1575 osip_generic_param_t *param=NULL;
1576 osip_via_param_get_byname(via,"received",¶m);
1577 if (param==NULL) return TRUE;
1578 if (param->gvalue &&
1579 (strcmp(param->gvalue,"127.0.0.1")==0 || strcmp(param->gvalue,"::1")==0)){
1587 static void text_received(Sal *sal, eXosip_event_t *ev){
1588 osip_body_t *body=NULL;
1589 char *from=NULL,*msg;
1591 osip_message_get_body(ev->request,0,&body);
1593 ms_error("Could not get text message from SIP body");
1597 osip_from_to_str(ev->request->from,&from);
1598 sal->callbacks.text_received(sal,from,msg);
1604 static void other_request(Sal *sal, eXosip_event_t *ev){
1605 ms_message("in other_request");
1606 if (ev->request==NULL) return;
1607 if (strcmp(ev->request->sip_method,"MESSAGE")==0){
1608 text_received(sal,ev);
1609 eXosip_message_send_answer(ev->tid,200,NULL);
1610 }else if (strcmp(ev->request->sip_method,"OPTIONS")==0){
1611 osip_message_t *options=NULL;
1612 eXosip_options_build_answer(ev->tid,200,&options);
1613 fill_options_answer(options);
1614 eXosip_options_send_answer(ev->tid,200,options);
1615 }else if (strncmp(ev->request->sip_method, "REFER", 5) == 0){
1616 ms_message("Receiving REFER request !");
1617 if (comes_from_local_if(ev->request)) {
1618 process_refer(sal,NULL,ev);
1619 }else ms_warning("Ignored REFER not coming from this local loopback interface.");
1620 }else if (strncmp(ev->request->sip_method, "UPDATE", 6) == 0){
1625 osip_message_to_str(ev->request,&tmp,&msglen);
1627 ms_message("Unsupported request received:\n%s",tmp);
1630 /*answer with a 501 Not implemented*/
1631 eXosip_message_send_answer(ev->tid,501,NULL);
1635 static void masquerade_via(osip_message_t *msg, const char *ip, const char *port){
1636 osip_via_t *via=NULL;
1637 osip_message_get_via(msg,0,&via);
1639 osip_free(via->port);
1640 via->port=osip_strdup(port);
1641 osip_free(via->host);
1642 via->host=osip_strdup(ip);
1647 static bool_t fix_message_contact(SalOp *op, osip_message_t *request,osip_message_t *last_answer) {
1648 osip_contact_t *ctt=NULL;
1649 const char *received;
1651 SalTransport transport;
1654 if (extract_received_rport(last_answer,&received,&rport,&transport)==-1) return FALSE;
1655 osip_message_get_contact(request,0,&ctt);
1657 /*nothing to update*/
1660 if (ctt->url->host!=NULL){
1661 osip_free(ctt->url->host);
1663 ctt->url->host=osip_strdup(received);
1664 if (ctt->url->port!=NULL){
1665 osip_free(ctt->url->port);
1667 snprintf(port,sizeof(port),"%i",rport);
1668 ctt->url->port=osip_strdup(port);
1669 if (op->masquerade_via) masquerade_via(request,received,port);
1671 if (transport != SalTransportUDP) {
1672 sal_address_set_param((SalAddress *)ctt, "transport", sal_transport_to_string(transport));
1677 static bool_t register_again_with_updated_contact(SalOp *op, osip_message_t *orig_request, osip_message_t *last_answer){
1678 osip_contact_t *ctt=NULL;
1679 SalAddress* ori_contact_address=NULL;
1680 const char *received;
1682 SalTransport transport;
1684 osip_message_t *msg=NULL;
1685 Sal* sal=op->base.root;
1687 if (sal->double_reg==FALSE ) return FALSE;
1689 if (extract_received_rport(last_answer,&received,&rport,&transport)==-1) return FALSE;
1690 osip_message_get_contact(orig_request,0,&ctt);
1691 osip_contact_to_str(ctt,&tmp);
1692 ori_contact_address = sal_address_new((const char*)tmp);
1694 /*check if contact is up to date*/
1695 if (strcmp(sal_address_get_domain(ori_contact_address),received) ==0
1696 && sal_address_get_port_int(ori_contact_address) == rport
1697 && sal_address_get_transport(ori_contact_address) == transport) {
1698 ms_message("Register has up to date contact, doing nothing.");
1701 } else ms_message("contact do not match, need to update the register (%s with %s:%i;transport=%s)"
1705 ,sal_transport_to_string(transport));
1707 sal_address_destroy(ori_contact_address);
1709 if (transport == SalTransportUDP) {
1711 eXosip_register_build_register(op->rid,op->expires,&msg);
1714 ms_warning("Fail to create a contact updated register.");
1717 if (fix_message_contact(op,msg,last_answer)) {
1718 eXosip_register_send_register(op->rid,msg);
1720 ms_message("Resending new register with updated contact");
1723 ms_warning("Fail to send updated register.");
1730 update_contact_from_response(op,last_answer);
1734 static void registration_success(Sal *sal, eXosip_event_t *ev){
1735 SalOp *op=sal_find_register(sal,ev->rid);
1736 osip_header_t *h=NULL;
1739 ms_error("Receiving register response for unknown operation");
1742 osip_message_get_expires(ev->request,0,&h);
1743 if (h!=NULL && atoi(h->hvalue)!=0){
1745 if (!register_again_with_updated_contact(op,ev->request,ev->response)){
1746 sal->callbacks.register_success(op,registered);
1749 sal->callbacks.register_success(op,FALSE);
1753 static bool_t registration_failure(Sal *sal, eXosip_event_t *ev){
1755 const char *reason=NULL;
1756 SalOp *op=sal_find_register(sal,ev->rid);
1757 SalReason sr=SalReasonUnknown;
1758 SalError se=SalErrorUnknown;
1761 ms_error("Receiving register failure for unknown operation");
1765 status_code=osip_message_get_status_code(ev->response);
1766 reason=osip_message_get_reason_phrase(ev->response);
1768 switch(status_code){
1771 return process_authentication(sal,ev);
1773 case 423: /*interval too brief*/
1774 {/*retry with greater interval */
1775 osip_header_t *h=NULL;
1776 osip_message_t *msg=NULL;
1777 osip_message_header_get_byname(ev->response,"min-expires",0,&h);
1778 if (h && h->hvalue && h->hvalue[0]!='\0'){
1779 int val=atoi(h->hvalue);
1780 if (val>op->expires)
1782 }else op->expires*=2;
1784 eXosip_register_build_register(op->rid,op->expires,&msg);
1785 eXosip_register_send_register(op->rid,msg);
1789 case 606: /*Not acceptable, workaround for proxies that don't like private addresses
1790 in vias, such as ekiga.net
1791 On the opposite, freephonie.net bugs when via are masqueraded.
1793 op->masquerade_via=TRUE;
1795 /* if contact is up to date, process the failure, otherwise resend a new register with
1796 updated contact first, just in case the faillure is due to incorrect contact */
1797 if (ev->response && register_again_with_updated_contact(op,ev->request,ev->response))
1798 return TRUE; /*we are retrying with an updated contact*/
1799 if (status_code==403){
1801 sr=SalReasonForbidden;
1802 }else if (status_code==0){
1803 se=SalErrorNoResponse;
1805 sal->callbacks.register_failure(op,se,sr,reason);
1810 static void other_request_reply(Sal *sal,eXosip_event_t *ev){
1811 SalOp *op=find_op(sal,ev);
1814 ms_warning("other_request_reply(): Receiving response to unknown request.");
1818 update_contact_from_response(op,ev->response);
1819 if (ev->request && strcmp(osip_message_get_method(ev->request),"OPTIONS")==0)
1820 sal->callbacks.ping_reply(op);
1824 static bool_t process_event(Sal *sal, eXosip_event_t *ev){
1825 ms_message("linphone process event get a message %d\n",ev->type);
1827 case EXOSIP_CALL_ANSWERED:
1828 ms_message("CALL_ANSWERED\n");
1829 call_accepted(sal,ev);
1830 authentication_ok(sal,ev);
1832 case EXOSIP_CALL_CLOSED:
1833 case EXOSIP_CALL_CANCELLED:
1834 ms_message("CALL_CLOSED or CANCELLED\n");
1835 call_terminated(sal,ev);
1837 case EXOSIP_CALL_TIMEOUT:
1838 case EXOSIP_CALL_NOANSWER:
1839 ms_message("CALL_TIMEOUT or NOANSWER\n");
1840 return call_failure(sal,ev);
1842 case EXOSIP_CALL_REQUESTFAILURE:
1843 case EXOSIP_CALL_GLOBALFAILURE:
1844 case EXOSIP_CALL_SERVERFAILURE:
1845 ms_message("CALL_REQUESTFAILURE or GLOBALFAILURE or SERVERFAILURE\n");
1846 return call_failure(sal,ev);
1848 case EXOSIP_CALL_RELEASED:
1849 ms_message("CALL_RELEASED\n");
1850 call_released(sal, ev);
1852 case EXOSIP_CALL_INVITE:
1853 ms_message("CALL_NEW\n");
1854 inc_new_call(sal,ev);
1856 case EXOSIP_CALL_REINVITE:
1857 handle_reinvite(sal,ev);
1859 case EXOSIP_CALL_ACK:
1860 ms_message("CALL_ACK");
1863 case EXOSIP_CALL_REDIRECTED:
1864 ms_message("CALL_REDIRECTED");
1865 eXosip_default_action(ev);
1867 case EXOSIP_CALL_PROCEEDING:
1868 ms_message("CALL_PROCEEDING");
1869 call_proceeding(sal,ev);
1871 case EXOSIP_CALL_RINGING:
1872 ms_message("CALL_RINGING");
1873 call_ringing(sal,ev);
1875 case EXOSIP_CALL_MESSAGE_NEW:
1876 ms_message("EXOSIP_CALL_MESSAGE_NEW");
1877 call_message_new(sal,ev);
1879 case EXOSIP_CALL_MESSAGE_REQUESTFAILURE:
1881 (ev->response->status_code==407 || ev->response->status_code==401)){
1882 return process_authentication(sal,ev);
1885 case EXOSIP_IN_SUBSCRIPTION_NEW:
1886 ms_message("CALL_IN_SUBSCRIPTION_NEW ");
1887 sal_exosip_subscription_recv(sal,ev);
1889 case EXOSIP_IN_SUBSCRIPTION_RELEASED:
1890 ms_message("CALL_SUBSCRIPTION_NEW ");
1891 sal_exosip_in_subscription_closed(sal,ev);
1893 case EXOSIP_SUBSCRIPTION_UPDATE:
1894 ms_message("CALL_SUBSCRIPTION_UPDATE");
1896 case EXOSIP_SUBSCRIPTION_NOTIFY:
1897 ms_message("CALL_SUBSCRIPTION_NOTIFY");
1898 sal_exosip_notify_recv(sal,ev);
1900 case EXOSIP_SUBSCRIPTION_ANSWERED:
1901 ms_message("EXOSIP_SUBSCRIPTION_ANSWERED, ev->sid=%i, ev->did=%i\n",ev->sid,ev->did);
1902 sal_exosip_subscription_answered(sal,ev);
1904 case EXOSIP_SUBSCRIPTION_CLOSED:
1905 ms_message("EXOSIP_SUBSCRIPTION_CLOSED\n");
1906 sal_exosip_subscription_closed(sal,ev);
1908 case EXOSIP_SUBSCRIPTION_REQUESTFAILURE: /**< announce a request failure */
1909 if (ev->response && (ev->response->status_code == 407 || ev->response->status_code == 401)){
1910 return process_authentication(sal,ev);
1912 case EXOSIP_SUBSCRIPTION_SERVERFAILURE:
1913 case EXOSIP_SUBSCRIPTION_GLOBALFAILURE:
1914 sal_exosip_subscription_closed(sal,ev);
1916 case EXOSIP_REGISTRATION_FAILURE:
1917 ms_message("REGISTRATION_FAILURE\n");
1918 return registration_failure(sal,ev);
1920 case EXOSIP_REGISTRATION_SUCCESS:
1921 authentication_ok(sal,ev);
1922 registration_success(sal,ev);
1924 case EXOSIP_MESSAGE_NEW:
1925 other_request(sal,ev);
1927 case EXOSIP_MESSAGE_PROCEEDING:
1928 case EXOSIP_MESSAGE_ANSWERED:
1929 case EXOSIP_MESSAGE_REDIRECTED:
1930 case EXOSIP_MESSAGE_SERVERFAILURE:
1931 case EXOSIP_MESSAGE_GLOBALFAILURE:
1932 other_request_reply(sal,ev);
1934 case EXOSIP_MESSAGE_REQUESTFAILURE:
1935 case EXOSIP_NOTIFICATION_REQUESTFAILURE:
1937 switch (ev->response->status_code) {
1940 return process_authentication(sal,ev);
1942 eXosip_automatic_action ();
1947 other_request_reply(sal,ev);
1950 ms_message("Unhandled exosip event ! %i",ev->type);
1956 int sal_iterate(Sal *sal){
1958 while((ev=eXosip_event_wait(0,0))!=NULL){
1959 if (process_event(sal,ev))
1960 eXosip_event_free(ev);
1963 eXosip_automatic_refresh();
1968 static void register_set_contact(osip_message_t *msg, const char *contact){
1969 osip_uri_param_t *param = NULL;
1970 osip_contact_t *ct=NULL;
1972 /*we get the line parameter choosed by exosip, and add it to our own contact*/
1973 osip_message_get_contact(msg,0,&ct);
1975 osip_uri_uparam_get_byname(ct->url, "line", ¶m);
1976 if (param && param->gvalue)
1977 line=osip_strdup(param->gvalue);
1979 _osip_list_set_empty(&msg->contacts,(void (*)(void*))osip_contact_free);
1980 osip_message_set_contact(msg,contact);
1981 osip_message_get_contact(msg,0,&ct);
1982 osip_uri_uparam_add(ct->url,osip_strdup("line"),line);
1985 int sal_register(SalOp *h, const char *proxy, const char *from, int expires){
1986 osip_message_t *msg;
1987 const char *contact=sal_op_get_contact(h);
1989 sal_op_set_route(h,proxy);
1992 h->rid=eXosip_register_build_initial_register(from,proxy,NULL,expires,&msg);
1994 if (contact) register_set_contact(msg,contact);
1995 sal_add_register(h->base.root,h);
1997 ms_error("Could not build initial register.");
2003 eXosip_register_build_register(h->rid,expires,&msg);
2005 eXosip_register_send_register(h->rid,msg);
2011 int sal_register_refresh(SalOp *op, int expires){
2012 osip_message_t *msg=NULL;
2013 const char *contact=sal_op_get_contact(op);
2016 ms_error("Unexistant registration context, not possible to refresh.");
2020 eXosip_register_build_register(op->rid,expires,&msg);
2022 if (contact) register_set_contact(msg,contact);
2023 eXosip_register_send_register(op->rid,msg);
2024 }else ms_error("Could not build REGISTER refresh message.");
2030 int sal_unregister(SalOp *h){
2031 osip_message_t *msg=NULL;
2033 eXosip_register_build_register(h->rid,0,&msg);
2034 if (msg) eXosip_register_send_register(h->rid,msg);
2035 else ms_warning("Could not build unREGISTER !");
2040 SalAddress * sal_address_new(const char *uri){
2042 osip_from_init(&from);
2044 // Remove front spaces
2045 while (uri[0]==' ') {
2049 if (osip_from_parse(from,uri)!=0){
2050 osip_from_free(from);
2053 if (from->displayname!=NULL && from->displayname[0]=='"'){
2054 char *unquoted=osip_strdup_without_quote(from->displayname);
2055 osip_free(from->displayname);
2056 from->displayname=unquoted;
2058 return (SalAddress*)from;
2061 SalAddress * sal_address_clone(const SalAddress *addr){
2062 osip_from_t *ret=NULL;
2063 osip_from_clone((osip_from_t*)addr,&ret);
2064 return (SalAddress*)ret;
2067 #define null_if_empty(s) (((s)!=NULL && (s)[0]!='\0') ? (s) : NULL )
2069 const char *sal_address_get_scheme(const SalAddress *addr){
2070 const osip_from_t *u=(const osip_from_t*)addr;
2071 return null_if_empty(u->url->scheme);
2074 const char *sal_address_get_display_name(const SalAddress* addr){
2075 const osip_from_t *u=(const osip_from_t*)addr;
2076 return null_if_empty(u->displayname);
2079 const char *sal_address_get_username(const SalAddress *addr){
2080 const osip_from_t *u=(const osip_from_t*)addr;
2081 return null_if_empty(u->url->username);
2084 const char *sal_address_get_domain(const SalAddress *addr){
2085 const osip_from_t *u=(const osip_from_t*)addr;
2086 return null_if_empty(u->url->host);
2089 void sal_address_set_display_name(SalAddress *addr, const char *display_name){
2090 osip_from_t *u=(osip_from_t*)addr;
2091 if (u->displayname!=NULL){
2092 osip_free(u->displayname);
2093 u->displayname=NULL;
2095 if (display_name!=NULL && display_name[0]!='\0'){
2096 u->displayname=osip_strdup(display_name);
2100 void sal_address_set_username(SalAddress *addr, const char *username){
2101 osip_from_t *uri=(osip_from_t*)addr;
2102 if (uri->url->username!=NULL){
2103 osip_free(uri->url->username);
2104 uri->url->username=NULL;
2107 uri->url->username=osip_strdup(username);
2110 void sal_address_set_domain(SalAddress *addr, const char *host){
2111 osip_from_t *uri=(osip_from_t*)addr;
2112 if (uri->url->host!=NULL){
2113 osip_free(uri->url->host);
2114 uri->url->host=NULL;
2117 uri->url->host=osip_strdup(host);
2120 void sal_address_set_port(SalAddress *addr, const char *port){
2121 osip_from_t *uri=(osip_from_t*)addr;
2122 if (uri->url->port!=NULL){
2123 osip_free(uri->url->port);
2124 uri->url->port=NULL;
2127 uri->url->port=osip_strdup(port);
2130 void sal_address_set_port_int(SalAddress *uri, int port){
2133 /*this is the default, special case to leave the port field blank*/
2134 sal_address_set_port(uri,NULL);
2137 snprintf(tmp,sizeof(tmp),"%i",port);
2138 sal_address_set_port(uri,tmp);
2141 void sal_address_clean(SalAddress *addr){
2142 osip_generic_param_freelist(& ((osip_from_t*)addr)->gen_params);
2143 osip_uri_param_freelist(& ((osip_from_t*)addr)->url->url_params);
2146 char *sal_address_as_string(const SalAddress *u){
2148 osip_from_t *from=(osip_from_t *)u;
2149 char *old_displayname=NULL;
2150 /* hack to force use of quotes around the displayname*/
2151 if (from->displayname!=NULL
2152 && from->displayname[0]!='"'){
2153 old_displayname=from->displayname;
2154 from->displayname=osip_enquote(from->displayname);
2156 osip_from_to_str(from,&tmp);
2157 if (old_displayname!=NULL){
2158 ms_free(from->displayname);
2159 from->displayname=old_displayname;
2166 char *sal_address_as_string_uri_only(const SalAddress *u){
2167 char *tmp=NULL,*ret;
2168 osip_uri_to_str(((osip_from_t*)u)->url,&tmp);
2173 void sal_address_set_param(SalAddress *u,const char* name,const char* value) {
2174 osip_uri_param_t *param=NULL;
2175 osip_uri_uparam_get_byname(((osip_from_t*)u)->url,(char*)name,¶m);
2177 osip_uri_uparam_add (((osip_from_t*)u)->url,ms_strdup(name),ms_strdup(value));
2179 osip_free(param->gvalue);
2180 param->gvalue=osip_strdup(value);
2185 void sal_address_destroy(SalAddress *u){
2186 osip_from_free((osip_from_t*)u);
2189 void sal_set_keepalive_period(Sal *ctx,unsigned int value) {
2190 ctx->keepalive_period=value;
2191 eXosip_set_option (EXOSIP_OPT_UDP_KEEP_ALIVE, &value);
2193 unsigned int sal_get_keepalive_period(Sal *ctx) {
2194 return ctx->keepalive_period;
2197 const char * sal_address_get_port(const SalAddress *addr) {
2198 const osip_from_t *u=(const osip_from_t*)addr;
2199 return null_if_empty(u->url->port);
2202 int sal_address_get_port_int(const SalAddress *uri) {
2203 const char* port = sal_address_get_port(uri);
2210 SalTransport sal_address_get_transport(const SalAddress* addr) {
2211 const osip_from_t *u=(const osip_from_t*)addr;
2212 osip_uri_param_t *transport_param=NULL;
2213 osip_uri_uparam_get_byname(u->url,"transport",&transport_param);
2214 if (transport_param == NULL){
2215 return SalTransportUDP;
2217 return sal_transport_parse(transport_param->gvalue);
2220 void sal_address_set_transport(SalAddress* addr,SalTransport transport) {
2221 sal_address_set_param(addr, "transport", sal_transport_to_string(transport));
2224 /* sends a reinvite. Local media description may have changed by application since call establishment*/
2225 int sal_call_update(SalOp *h, const char *subject){
2227 osip_message_t *reinvite=NULL;
2230 if(eXosip_call_build_request(h->did,"INVITE",&reinvite) != 0 || reinvite==NULL){
2235 osip_message_set_subject(reinvite,subject);
2236 osip_message_set_allow(reinvite, "INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, NOTIFY, MESSAGE, SUBSCRIBE, INFO");
2237 if (h->base.root->session_expires!=0){
2238 osip_message_set_header(reinvite, "Session-expires", "200");
2239 osip_message_set_supported(reinvite, "timer");
2241 if (h->base.local_media){
2242 h->sdp_offering=TRUE;
2243 set_sdp_from_desc(reinvite,h->base.local_media);
2244 }else h->sdp_offering=FALSE;
2246 err = eXosip_call_send_request(h->did, reinvite);
2250 void sal_reuse_authorization(Sal *ctx, bool_t value) {
2251 ctx->reuse_authorization=value;