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;
519 for(i=0;i<h->result->nstreams;++i){
520 if (h->result->streams[i].port>0){
521 strcpy(h->result->streams[i].addr,h->base.remote_media->streams[i].addr);
522 h->result->streams[i].ptime=h->base.remote_media->streams[i].ptime;
523 h->result->streams[i].bandwidth=h->base.remote_media->streams[i].bandwidth;
524 h->result->streams[i].port=h->base.remote_media->streams[i].port;
526 if (h->result->streams[i].proto == SalProtoRtpSavp) {
527 h->result->streams[i].crypto[0] = h->base.remote_media->streams[i].crypto[0];
535 int sal_call_is_offerer(const SalOp *h){
536 return h->sdp_offering;
539 int sal_call_set_local_media_description(SalOp *h, SalMediaDescription *desc){
541 sal_media_description_ref(desc);
542 if (h->base.local_media)
543 sal_media_description_unref(h->base.local_media);
544 h->base.local_media=desc;
548 int sal_call(SalOp *h, const char *from, const char *to){
550 osip_message_t *invite=NULL;
551 sal_op_set_from(h,from);
553 sal_exosip_fix_route(h);
555 h->terminated = FALSE;
556 err=eXosip_call_build_initial_invite(&invite,to,from,sal_op_get_route(h),"Phone call");
558 ms_error("Could not create call.");
561 osip_message_set_allow(invite, "INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, NOTIFY, MESSAGE, SUBSCRIBE, INFO");
562 if (h->base.contact){
563 _osip_list_set_empty(&invite->contacts,(void (*)(void*))osip_contact_free);
564 osip_message_set_contact(invite,h->base.contact);
566 if (h->base.root->session_expires!=0){
567 osip_message_set_header(invite, "Session-expires", "200");
568 osip_message_set_supported(invite, "timer");
570 if (h->base.local_media){
571 h->sdp_offering=TRUE;
572 set_sdp_from_desc(invite,h->base.local_media);
573 }else h->sdp_offering=FALSE;
575 osip_message_set_header(invite,"Replaces",h->replaces);
577 osip_message_set_header(invite,"Referred-By",h->referred_by);
581 err=eXosip_call_send_initial_invite(invite);
585 ms_error("Fail to send invite !");
588 sal_add_call(h->base.root,h);
593 int sal_call_notify_ringing(SalOp *h, bool_t early_media){
596 /*if early media send also 180 and 183 */
597 if (early_media && h->sdp_answer){
600 eXosip_call_build_answer(h->tid,180,&msg);
602 set_sdp(msg,h->sdp_answer);
603 eXosip_call_send_answer(h->tid,180,msg);
606 eXosip_call_build_answer(h->tid,183,&msg);
608 set_sdp(msg,h->sdp_answer);
609 eXosip_call_send_answer(h->tid,183,msg);
614 eXosip_call_send_answer(h->tid,180,NULL);
620 int sal_call_accept(SalOp * h){
622 const char *contact=sal_op_get_contact(h);
624 int err=eXosip_call_build_answer(h->tid,200,&msg);
625 if (err<0 || msg==NULL){
626 ms_error("Fail to build answer for call: err=%i",err);
629 if (h->base.root->session_expires!=0){
630 if (h->supports_session_timers) osip_message_set_supported(msg, "timer");
634 _osip_list_set_empty(&msg->contacts,(void (*)(void*))osip_contact_free);
635 osip_message_set_contact(msg,contact);
638 if (h->base.local_media){
639 /*this is the case where we received an invite without SDP*/
640 if (h->sdp_offering) {
641 set_sdp_from_desc(msg,h->base.local_media);
644 set_sdp(msg,h->sdp_answer);
645 sdp_message_free(h->sdp_answer);
650 ms_error("You are accepting a call but not defined any media capabilities !");
652 eXosip_call_send_answer(h->tid,200,msg);
656 int sal_call_decline(SalOp *h, SalReason reason, const char *redirect){
657 if (reason==SalReasonBusy){
659 eXosip_call_send_answer(h->tid,486,NULL);
662 else if (reason==SalReasonTemporarilyUnavailable){
664 eXosip_call_send_answer(h->tid,480,NULL);
666 }else if (reason==SalReasonDoNotDisturb){
668 eXosip_call_send_answer(h->tid,600,NULL);
670 }else if (reason==SalReasonMedia){
672 eXosip_call_send_answer(h->tid,415,NULL);
674 }else if (redirect!=NULL && reason==SalReasonRedirect){
677 if (strstr(redirect,"sip:")!=0) code=302;
680 eXosip_call_build_answer(h->tid,code,&msg);
681 osip_message_set_contact(msg,redirect);
682 eXosip_call_send_answer(h->tid,code,msg);
684 }else sal_call_terminate(h);
688 SalMediaDescription * sal_call_get_final_media_description(SalOp *h){
689 if (h->base.local_media && h->base.remote_media && !h->result){
695 int sal_call_set_referer(SalOp *h, SalOp *refered_call){
696 if (refered_call->replaces)
697 h->replaces=ms_strdup(refered_call->replaces);
698 if (refered_call->referred_by)
699 h->referred_by=ms_strdup(refered_call->referred_by);
703 int sal_ping(SalOp *op, const char *from, const char *to){
704 osip_message_t *options=NULL;
706 sal_op_set_from(op,from);
707 sal_op_set_to(op,to);
708 /*bug here: eXosip2 does not honor the route argument*/
709 eXosip_options_build_request (&options, sal_op_get_to(op),
710 sal_op_get_from(op),sal_op_get_route(op));
712 if (op->base.root->session_expires!=0){
713 osip_message_set_header(options, "Session-expires", "200");
714 osip_message_set_supported(options, "timer");
716 sal_add_other(sal_op_get_sal(op),op,options);
717 return eXosip_options_send_request(options);
722 int sal_call_accept_refer(SalOp *op){
723 osip_message_t *msg=NULL;
726 err = eXosip_call_build_notify(op->did,EXOSIP_SUBCRSTATE_ACTIVE,&msg);
729 osip_message_set_header(msg,(const char *)"event","refer");
730 osip_message_set_content_type(msg,"message/sipfrag");
731 osip_message_set_body(msg,"SIP/2.0 100 Trying",sizeof("SIP/2.0 100 Trying"));
732 eXosip_call_send_request(op->did,msg);
736 ms_error("could not get a notify built\n");
742 int sal_call_refer(SalOp *h, const char *refer_to){
743 osip_message_t *msg=NULL;
746 eXosip_call_build_refer(h->did,refer_to, &msg);
747 if (msg) err=eXosip_call_send_request(h->did, msg);
753 int sal_call_refer_with_replaces(SalOp *h, SalOp *other_call_h){
754 osip_message_t *msg=NULL;
755 char referto[256]={0};
758 if (eXosip_call_get_referto(other_call_h->did,referto,sizeof(referto)-1)!=0){
759 ms_error("eXosip_call_get_referto() failed for did=%i",other_call_h->did);
763 eXosip_call_build_refer(h->did,referto, &msg);
764 osip_message_set_header(msg,"Referred-By",h->base.from);
765 if (msg) err=eXosip_call_send_request(h->did, msg);
771 SalOp *sal_call_get_replaces(SalOp *h){
772 if (h!=NULL && h->replaces!=NULL){
775 cid=eXosip_call_find_by_replaces(h->replaces);
778 SalOp *ret=sal_find_call(h->base.root,cid);
785 int sal_call_send_dtmf(SalOp *h, char dtmf){
786 osip_message_t *msg=NULL;
791 eXosip_call_build_info(h->did,&msg);
793 snprintf(dtmf_body, sizeof(dtmf_body), "Signal=%c\r\nDuration=250\r\n", dtmf);
794 osip_message_set_body(msg,dtmf_body,strlen(dtmf_body));
795 osip_message_set_content_type(msg,"application/dtmf-relay");
796 snprintf(clen,sizeof(clen),"%lu",(unsigned long)strlen(dtmf_body));
797 osip_message_set_content_length(msg,clen);
798 eXosip_call_send_request(h->did,msg);
804 static void push_auth_to_exosip(const SalAuthInfo *info){
806 if (info->userid==NULL || info->userid[0]=='\0') userid=info->username;
807 else userid=info->userid;
808 ms_message("Authentication info for username [%s], id[%s], realm [%s] added to eXosip", info->username,userid, info->realm);
809 eXosip_add_authentication_info (info->username,userid,
810 info->password, NULL,info->realm);
813 * Just for symmetry ;-)
815 static void pop_auth_from_exosip() {
816 eXosip_clear_authentication_info();
819 int sal_call_terminate(SalOp *h){
821 if (h->auth_info) push_auth_to_exosip(h->auth_info);
823 err=eXosip_call_terminate(h->cid,h->did);
825 if (!h->base.root->reuse_authorization) pop_auth_from_exosip();
827 ms_warning("Exosip could not terminate the call: cid=%i did=%i", h->cid,h->did);
833 void sal_op_authenticate(SalOp *h, const SalAuthInfo *info){
834 if (h->pending_auth){
835 push_auth_to_exosip(info);
837 /*FIXME exosip does not take into account this update register message*/
839 if (fix_message_contact(h, h->pending_auth->request,h->pending_auth->response)) {
843 update_contact_from_response(h,h->pending_auth->response);
845 eXosip_default_action(h->pending_auth);
847 ms_message("eXosip_default_action() done");
848 if (!h->base.root->reuse_authorization) pop_auth_from_exosip();
850 if (h->auth_info) sal_auth_info_delete(h->auth_info); /*if already exist*/
851 h->auth_info=sal_auth_info_clone(info); /*store auth info for subsequent request*/
854 void sal_op_cancel_authentication(SalOp *h) {
856 sal_op_get_sal(h)->callbacks.register_failure(h,SalErrorFailure, SalReasonForbidden,_("Authentication failure"));
857 } else if (h->cid >0) {
858 sal_op_get_sal(h)->callbacks.call_failure(h,SalErrorFailure, SalReasonForbidden,_("Authentication failure"),0);
860 ms_warning("Auth failure not handled");
864 static void set_network_origin(SalOp *op, osip_message_t *req){
865 const char *received=NULL;
868 SalTransport transport;
869 if (extract_received_rport(req,&received,&rport,&transport)!=0){
870 osip_via_t *via=NULL;
872 osip_message_get_via(req,0,&via);
873 received=osip_via_get_host(via);
874 tmp=osip_via_get_port(via);
875 if (tmp) rport=atoi(tmp);
877 if (transport != SalTransportUDP) {
878 snprintf(origin,sizeof(origin)-1,"sip:%s:%i",received,rport);
880 snprintf(origin,sizeof(origin)-1,"sip:%s:%i;transport=%s",received,rport,sal_transport_to_string(transport));
882 __sal_op_set_network_origin(op,origin);
885 static void set_remote_ua(SalOp* op, osip_message_t *req){
886 if (op->base.remote_ua==NULL){
887 osip_header_t *h=NULL;
888 osip_message_get_user_agent(req,0,&h);
890 op->base.remote_ua=ms_strdup(h->hvalue);
895 static void set_replaces(SalOp *op, osip_message_t *req){
896 osip_header_t *h=NULL;
899 ms_free(op->replaces);
902 osip_message_header_get_byname(req,"replaces",0,&h);
904 if (h->hvalue && h->hvalue[0]!='\0'){
905 op->replaces=ms_strdup(h->hvalue);
910 static SalOp *find_op(Sal *sal, eXosip_event_t *ev){
912 return sal_find_call(sal,ev->cid);
915 return sal_find_register(sal,ev->rid);
918 return sal_find_out_subscribe(sal,ev->sid);
921 return sal_find_in_subscribe(sal,ev->nid);
923 if (ev->response) return sal_find_other(sal,ev->response);
927 static void inc_new_call(Sal *sal, eXosip_event_t *ev){
928 SalOp *op=sal_op_new(sal);
929 osip_from_t *from,*to;
930 osip_call_info_t *call_info;
932 sdp_message_t *sdp=eXosip_get_sdp_info(ev->request);
934 set_network_origin(op,ev->request);
935 set_remote_ua(op,ev->request);
936 set_replaces(op,ev->request);
939 op->sdp_offering=FALSE;
940 op->base.remote_media=sal_media_description_new();
941 sdp_to_media_description(sdp,op->base.remote_media);
942 sdp_message_free(sdp);
943 }else op->sdp_offering=TRUE;
945 from=osip_message_get_from(ev->request);
946 to=osip_message_get_to(ev->request);
947 osip_from_to_str(from,&tmp);
948 sal_op_set_from(op,tmp);
950 osip_from_to_str(to,&tmp);
951 sal_op_set_to(op,tmp);
954 osip_message_get_call_info(ev->request,0,&call_info);
957 osip_call_info_to_str(call_info,&tmp);
958 if( strstr(tmp,"answer-after=") != NULL)
960 op->auto_answer_asked=TRUE;
961 ms_message("The caller asked to automatically answer the call(Emergency?)\n");
970 sal_add_call(op->base.root,op);
971 sal->callbacks.call_received(op);
974 static void handle_reinvite(Sal *sal, eXosip_event_t *ev){
975 SalOp *op=find_op(sal,ev);
977 osip_message_t *msg=NULL;
980 ms_warning("Reinvite for non-existing operation !");
985 sdp=eXosip_get_sdp_info(ev->request);
986 if (op->base.remote_media){
987 sal_media_description_unref(op->base.remote_media);
988 op->base.remote_media=NULL;
991 sal_media_description_unref(op->result);
995 op->sdp_offering=FALSE;
996 op->base.remote_media=sal_media_description_new();
997 sdp_to_media_description(sdp,op->base.remote_media);
998 sdp_message_free(sdp);
999 sal->callbacks.call_updating(op);
1001 op->sdp_offering=TRUE;
1003 eXosip_call_build_answer(ev->tid,200,&msg);
1005 set_sdp_from_desc(msg,op->base.local_media);
1006 eXosip_call_send_answer(ev->tid,200,msg);
1013 static void handle_ack(Sal *sal, eXosip_event_t *ev){
1014 SalOp *op=find_op(sal,ev);
1018 ms_warning("ack for non-existing call !");
1021 sdp=eXosip_get_sdp_info(ev->ack);
1023 op->base.remote_media=sal_media_description_new();
1024 sdp_to_media_description(sdp,op->base.remote_media);
1026 sdp_message_free(sdp);
1029 if (sdp) sal->callbacks.call_updating(op);
1032 sal->callbacks.call_ack(op);
1036 static void update_contact_from_response(SalOp *op, osip_message_t *response){
1037 const char *received;
1039 SalTransport transport;
1040 if (extract_received_rport(response,&received,&rport,&transport)==0){
1041 const char *contact=sal_op_get_contact(op);
1043 /*no contact given yet, use from instead*/
1044 contact=sal_op_get_from(op);
1047 SalAddress *addr=sal_address_new(contact);
1049 sal_address_set_domain(addr,received);
1050 sal_address_set_port_int(addr,rport);
1051 if (transport!=SalTransportUDP)
1052 sal_address_set_transport(addr,transport);
1053 tmp=sal_address_as_string(addr);
1054 ms_message("Contact address updated to %s",tmp);
1055 sal_op_set_contact(op,tmp);
1056 sal_address_destroy(addr);
1062 static int call_proceeding(Sal *sal, eXosip_event_t *ev){
1063 SalOp *op=find_op(sal,ev);
1065 if (op==NULL || op->terminated==TRUE) {
1066 ms_warning("This call has been canceled.");
1068 eXosip_call_terminate(ev->cid,ev->did);
1076 /* update contact if received and rport are set by the server
1077 note: will only be used by remote for next INVITE, if any...*/
1078 update_contact_from_response(op,ev->response);
1082 static void call_ringing(Sal *sal, eXosip_event_t *ev){
1084 SalOp *op=find_op(sal,ev);
1085 if (call_proceeding(sal, ev)==-1) return;
1087 set_remote_ua(op,ev->response);
1088 sdp=eXosip_get_sdp_info(ev->response);
1090 op->base.remote_media=sal_media_description_new();
1091 sdp_to_media_description(sdp,op->base.remote_media);
1092 sdp_message_free(sdp);
1093 if (op->base.local_media) sdp_process(op);
1095 sal->callbacks.call_ringing(op);
1098 static void call_accepted(Sal *sal, eXosip_event_t *ev){
1100 osip_message_t *msg=NULL;
1101 SalOp *op=find_op(sal,ev);
1102 const char *contact;
1104 if (op==NULL || op->terminated==TRUE) {
1105 ms_warning("This call has been already terminated.");
1107 eXosip_call_terminate(ev->cid,ev->did);
1113 set_remote_ua(op,ev->response);
1115 sdp=eXosip_get_sdp_info(ev->response);
1117 op->base.remote_media=sal_media_description_new();
1118 sdp_to_media_description(sdp,op->base.remote_media);
1119 sdp_message_free(sdp);
1120 if (op->base.local_media) sdp_process(op);
1122 eXosip_call_build_ack(ev->did,&msg);
1124 ms_warning("This call has been already terminated.");
1126 eXosip_call_terminate(ev->cid,ev->did);
1130 contact=sal_op_get_contact(op);
1132 _osip_list_set_empty(&msg->contacts,(void (*)(void*))osip_contact_free);
1133 osip_message_set_contact(msg,contact);
1135 if (op->sdp_answer){
1136 set_sdp(msg,op->sdp_answer);
1137 sdp_message_free(op->sdp_answer);
1138 op->sdp_answer=NULL;
1140 eXosip_call_send_ack(ev->did,msg);
1141 sal->callbacks.call_accepted(op);
1144 static void call_terminated(Sal *sal, eXosip_event_t *ev){
1146 SalOp *op=find_op(sal,ev);
1148 ms_warning("Call terminated for already closed call ?");
1152 osip_from_to_str(ev->request->from,&from);
1154 sal->callbacks.call_terminated(op,from!=NULL ? from : sal_op_get_from(op));
1155 if (from) osip_free(from);
1156 op->terminated=TRUE;
1159 static void call_released(Sal *sal, eXosip_event_t *ev){
1160 SalOp *op=find_op(sal,ev);
1162 ms_warning("No op associated to this call_released()");
1165 if (!op->terminated){
1166 /* no response received so far */
1167 call_failure(sal,ev);
1169 sal->callbacks.call_released(op);
1172 static int get_auth_data_from_response(osip_message_t *resp, const char **realm, const char **username){
1173 const char *prx_realm=NULL,*www_realm=NULL;
1174 osip_proxy_authenticate_t *prx_auth;
1175 osip_www_authenticate_t *www_auth;
1177 *username=osip_uri_get_username(resp->from->url);
1178 prx_auth=(osip_proxy_authenticate_t*)osip_list_get(&resp->proxy_authenticates,0);
1179 www_auth=(osip_proxy_authenticate_t*)osip_list_get(&resp->www_authenticates,0);
1181 prx_realm=osip_proxy_authenticate_get_realm(prx_auth);
1183 www_realm=osip_www_authenticate_get_realm(www_auth);
1187 }else if (www_realm){
1195 static int get_auth_data_from_request(osip_message_t *msg, const char **realm, const char **username){
1196 osip_authorization_t *auth=NULL;
1197 osip_proxy_authorization_t *prx_auth=NULL;
1199 *username=osip_uri_get_username(msg->from->url);
1200 osip_message_get_authorization(msg, 0, &auth);
1202 *realm=osip_authorization_get_realm(auth);
1205 osip_message_get_proxy_authorization(msg,0,&prx_auth);
1207 *realm=osip_proxy_authorization_get_realm(prx_auth);
1213 static int get_auth_data(eXosip_event_t *ev, const char **realm, const char **username){
1214 if (ev->response && get_auth_data_from_response(ev->response,realm,username)==0) return 0;
1215 if (ev->request && get_auth_data_from_request(ev->request,realm,username)==0) return 0;
1219 int sal_op_get_auth_requested(SalOp *op, const char **realm, const char **username){
1220 if (op->pending_auth){
1221 return get_auth_data(op->pending_auth,realm,username);
1226 static bool_t process_authentication(Sal *sal, eXosip_event_t *ev){
1228 const char *username,*realm;
1231 ms_warning("No operation associated with this authentication !");
1234 if (get_auth_data(ev,&realm,&username)==0){
1235 if (op->pending_auth!=NULL){
1236 eXosip_event_free(op->pending_auth);
1237 op->pending_auth=ev;
1239 op->pending_auth=ev;
1240 sal_add_pending_auth(sal,op);
1243 sal->callbacks.auth_requested(op,realm,username);
1249 static void authentication_ok(Sal *sal, eXosip_event_t *ev){
1251 const char *username,*realm;
1254 ms_warning("No operation associated with this authentication_ok!");
1257 if (op->pending_auth){
1258 eXosip_event_free(op->pending_auth);
1259 sal_remove_pending_auth(sal,op);
1260 op->pending_auth=NULL;
1262 if (get_auth_data(ev,&realm,&username)==0){
1263 sal->callbacks.auth_success(op,realm,username);
1267 static bool_t call_failure(Sal *sal, eXosip_event_t *ev){
1270 char* computedReason=NULL;
1271 const char *reason=NULL;
1272 SalError error=SalErrorUnknown;
1273 SalReason sr=SalReasonUnknown;
1276 op=(SalOp*)find_op(sal,ev);
1279 ms_warning("Call failure reported for a closed call, ignored.");
1284 code=osip_message_get_status_code(ev->response);
1285 reason=osip_message_get_reason_phrase(ev->response);
1286 osip_header_t *h=NULL;
1287 if (!osip_message_header_get_byname( ev->response
1291 computedReason = ms_strdup_printf("%s %s",reason,osip_header_get_value(h));
1292 reason = computedReason;
1300 return process_authentication(sal,ev);
1303 error=SalErrorUnknown;
1306 error=SalErrorFailure;
1307 sr=SalReasonNotFound;
1310 error=SalErrorFailure;
1314 eXosip_default_action(ev);
1318 error=SalErrorFailure;
1319 sr=SalReasonTemporarilyUnavailable;
1321 error=SalErrorFailure;
1327 error=SalErrorFailure;
1328 sr=SalReasonDoNotDisturb;
1331 error=SalErrorFailure;
1332 sr=SalReasonDeclined;
1336 error=SalErrorFailure;
1337 sr=SalReasonUnknown;
1338 }else error=SalErrorNoResponse;
1340 op->terminated=TRUE;
1341 sal->callbacks.call_failure(op,error,sr,reason,code);
1342 if (computedReason != NULL){
1343 ms_free(computedReason);
1348 /* Request remote side to send us VFU */
1349 void sal_call_send_vfu_request(SalOp *h){
1350 osip_message_t *msg=NULL;
1352 "<?xml version=\"1.0\" encoding=\"utf-8\" ?>"
1356 " <picture_fast_update></picture_fast_update>"
1364 eXosip_call_build_info(h->did,&msg);
1366 osip_message_set_body(msg,info_body,strlen(info_body));
1367 osip_message_set_content_type(msg,"application/media_control+xml");
1368 snprintf(clen,sizeof(clen),"%lu",(unsigned long)strlen(info_body));
1369 osip_message_set_content_length(msg,clen);
1370 eXosip_call_send_request(h->did,msg);
1371 ms_message("Sending VFU request !");
1376 static void process_media_control_xml(Sal *sal, eXosip_event_t *ev){
1377 SalOp *op=find_op(sal,ev);
1378 osip_body_t *body=NULL;
1381 ms_warning("media control xml received without operation context!");
1385 osip_message_get_body(ev->request,0,&body);
1386 if (body && body->body!=NULL &&
1387 strstr(body->body,"picture_fast_update")){
1388 osip_message_t *ans=NULL;
1389 ms_message("Receiving VFU request !");
1390 if (sal->callbacks.vfu_request){
1391 sal->callbacks.vfu_request(op);
1392 eXosip_call_build_answer(ev->tid,200,&ans);
1394 eXosip_call_send_answer(ev->tid,200,ans);
1398 /*in all other cases we must say it is not implemented.*/
1400 osip_message_t *ans=NULL;
1402 eXosip_call_build_answer(ev->tid,501,&ans);
1404 eXosip_call_send_answer(ev->tid,501,ans);
1409 static void process_dtmf_relay(Sal *sal, eXosip_event_t *ev){
1410 SalOp *op=find_op(sal,ev);
1411 osip_body_t *body=NULL;
1414 ms_warning("media dtmf relay received without operation context!");
1418 osip_message_get_body(ev->request,0,&body);
1419 if (body && body->body!=NULL){
1420 osip_message_t *ans=NULL;
1421 const char *name=strstr(body->body,"Signal");
1422 if (name==NULL) name=strstr(body->body,"signal");
1424 ms_warning("Could not extract the dtmf name from the SIP INFO.");
1427 name+=strlen("signal");
1428 if (sscanf(name," = %1s",tmp)==1){
1429 ms_message("Receiving dtmf %s via SIP INFO.",tmp);
1430 if (sal->callbacks.dtmf_received != NULL)
1431 sal->callbacks.dtmf_received(op, tmp[0]);
1435 eXosip_call_build_answer(ev->tid,200,&ans);
1437 eXosip_call_send_answer(ev->tid,200,ans);
1442 static void fill_options_answer(osip_message_t *options){
1443 osip_message_set_allow(options,"INVITE, ACK, BYE, CANCEL, OPTIONS, MESSAGE, SUBSCRIBE, NOTIFY, INFO");
1444 osip_message_set_accept(options,"application/sdp");
1447 static void process_refer(Sal *sal, SalOp *op, eXosip_event_t *ev){
1448 osip_header_t *h=NULL;
1449 osip_message_t *ans=NULL;
1450 ms_message("Receiving REFER request !");
1451 osip_message_header_get_byname(ev->request,"Refer-To",0,&h);
1454 osip_from_t *from=NULL;
1456 osip_from_init(&from);
1458 if (osip_from_parse(from,h->hvalue)==0){
1460 osip_uri_header_t *uh=NULL;
1461 osip_header_t *referred_by=NULL;
1462 osip_uri_header_get_byname(&from->url->url_headers,(char*)"Replaces",&uh);
1463 if (uh!=NULL && uh->gvalue && uh->gvalue[0]!='\0'){
1464 ms_message("Found replaces in Refer-To");
1466 ms_free(op->replaces);
1468 op->replaces=ms_strdup(uh->gvalue);
1470 osip_message_header_get_byname(ev->request,"Referred-By",0,&referred_by);
1471 if (referred_by && referred_by->hvalue && referred_by->hvalue[0]!='\0'){
1472 if (op->referred_by)
1473 ms_free(op->referred_by);
1474 op->referred_by=ms_strdup(referred_by->hvalue);
1477 osip_uri_header_freelist(&from->url->url_headers);
1478 osip_from_to_str(from,&tmp);
1479 sal->callbacks.refer_received(sal,op,tmp);
1481 osip_from_free(from);
1484 eXosip_call_build_answer(ev->tid,202,&ans);
1486 eXosip_call_send_answer(ev->tid,202,ans);
1491 ms_warning("cannot do anything with the refer without destination\n");
1495 static void call_message_new(Sal *sal, eXosip_event_t *ev){
1496 osip_message_t *ans=NULL;
1498 if (MSG_IS_INFO(ev->request)){
1499 osip_content_type_t *ct;
1500 ct=osip_message_get_content_type(ev->request);
1501 if (ct && ct->subtype){
1502 if (strcmp(ct->subtype,"media_control+xml")==0)
1503 process_media_control_xml(sal,ev);
1504 else if (strcmp(ct->subtype,"dtmf-relay")==0)
1505 process_dtmf_relay(sal,ev);
1507 ms_message("Unhandled SIP INFO.");
1508 /*send an "Not implemented" answer*/
1510 eXosip_call_build_answer(ev->tid,501,&ans);
1512 eXosip_call_send_answer(ev->tid,501,ans);
1516 /*empty SIP INFO, probably to test we are alive. Send an empty answer*/
1518 eXosip_call_build_answer(ev->tid,200,&ans);
1520 eXosip_call_send_answer(ev->tid,200,ans);
1523 }else if(MSG_IS_MESSAGE(ev->request)){
1524 /* SIP messages could be received into call */
1525 text_received(sal, ev);
1527 eXosip_call_build_answer(ev->tid,200,&ans);
1529 eXosip_call_send_answer(ev->tid,200,ans);
1531 }else if(MSG_IS_REFER(ev->request)){
1532 SalOp *op=find_op(sal,ev);
1534 ms_message("Receiving REFER request !");
1535 process_refer(sal,op,ev);
1536 }else if(MSG_IS_NOTIFY(ev->request)){
1537 osip_header_t *h=NULL;
1539 SalOp *op=find_op(sal,ev);
1541 ms_message("Receiving NOTIFY request !");
1542 osip_from_to_str(ev->request->from,&from);
1543 osip_message_header_get_byname(ev->request,"Event",0,&h);
1545 sal->callbacks.notify(op,from,h->hvalue);
1546 /*answer that we received the notify*/
1548 eXosip_call_build_answer(ev->tid,200,&ans);
1550 eXosip_call_send_answer(ev->tid,200,ans);
1553 }else if (MSG_IS_OPTIONS(ev->request)){
1555 eXosip_call_build_answer(ev->tid,200,&ans);
1557 fill_options_answer(ans);
1558 eXosip_call_send_answer(ev->tid,200,ans);
1562 }else ms_warning("call_message_new: No request ?");
1565 static void inc_update(Sal *sal, eXosip_event_t *ev){
1566 osip_message_t *msg=NULL;
1567 ms_message("Processing incoming UPDATE");
1569 eXosip_message_build_answer(ev->tid,200,&msg);
1571 eXosip_message_send_answer(ev->tid,200,msg);
1575 static bool_t comes_from_local_if(osip_message_t *msg){
1576 osip_via_t *via=NULL;
1577 osip_message_get_via(msg,0,&via);
1580 host=osip_via_get_host(via);
1581 if (strcmp(host,"127.0.0.1")==0 || strcmp(host,"::1")==0){
1582 osip_generic_param_t *param=NULL;
1583 osip_via_param_get_byname(via,"received",¶m);
1584 if (param==NULL) return TRUE;
1585 if (param->gvalue &&
1586 (strcmp(param->gvalue,"127.0.0.1")==0 || strcmp(param->gvalue,"::1")==0)){
1594 static void text_received(Sal *sal, eXosip_event_t *ev){
1595 osip_body_t *body=NULL;
1596 char *from=NULL,*msg;
1598 osip_message_get_body(ev->request,0,&body);
1600 ms_error("Could not get text message from SIP body");
1604 osip_from_to_str(ev->request->from,&from);
1605 sal->callbacks.text_received(sal,from,msg);
1611 static void other_request(Sal *sal, eXosip_event_t *ev){
1612 ms_message("in other_request");
1613 if (ev->request==NULL) return;
1614 if (strcmp(ev->request->sip_method,"MESSAGE")==0){
1615 text_received(sal,ev);
1616 eXosip_message_send_answer(ev->tid,200,NULL);
1617 }else if (strcmp(ev->request->sip_method,"OPTIONS")==0){
1618 osip_message_t *options=NULL;
1619 eXosip_options_build_answer(ev->tid,200,&options);
1620 fill_options_answer(options);
1621 eXosip_options_send_answer(ev->tid,200,options);
1622 }else if (strncmp(ev->request->sip_method, "REFER", 5) == 0){
1623 ms_message("Receiving REFER request !");
1624 if (comes_from_local_if(ev->request)) {
1625 process_refer(sal,NULL,ev);
1626 }else ms_warning("Ignored REFER not coming from this local loopback interface.");
1627 }else if (strncmp(ev->request->sip_method, "UPDATE", 6) == 0){
1632 osip_message_to_str(ev->request,&tmp,&msglen);
1634 ms_message("Unsupported request received:\n%s",tmp);
1637 /*answer with a 501 Not implemented*/
1638 eXosip_message_send_answer(ev->tid,501,NULL);
1642 static void masquerade_via(osip_message_t *msg, const char *ip, const char *port){
1643 osip_via_t *via=NULL;
1644 osip_message_get_via(msg,0,&via);
1646 osip_free(via->port);
1647 via->port=osip_strdup(port);
1648 osip_free(via->host);
1649 via->host=osip_strdup(ip);
1654 static bool_t fix_message_contact(SalOp *op, osip_message_t *request,osip_message_t *last_answer) {
1655 osip_contact_t *ctt=NULL;
1656 const char *received;
1658 SalTransport transport;
1661 if (extract_received_rport(last_answer,&received,&rport,&transport)==-1) return FALSE;
1662 osip_message_get_contact(request,0,&ctt);
1664 /*nothing to update*/
1667 if (ctt->url->host!=NULL){
1668 osip_free(ctt->url->host);
1670 ctt->url->host=osip_strdup(received);
1671 if (ctt->url->port!=NULL){
1672 osip_free(ctt->url->port);
1674 snprintf(port,sizeof(port),"%i",rport);
1675 ctt->url->port=osip_strdup(port);
1676 if (op->masquerade_via) masquerade_via(request,received,port);
1678 if (transport != SalTransportUDP) {
1679 sal_address_set_param((SalAddress *)ctt, "transport", sal_transport_to_string(transport));
1684 static bool_t register_again_with_updated_contact(SalOp *op, osip_message_t *orig_request, osip_message_t *last_answer){
1685 osip_contact_t *ctt=NULL;
1686 SalAddress* ori_contact_address=NULL;
1687 const char *received;
1689 SalTransport transport;
1691 osip_message_t *msg=NULL;
1692 Sal* sal=op->base.root;
1694 if (sal->double_reg==FALSE ) return FALSE;
1696 if (extract_received_rport(last_answer,&received,&rport,&transport)==-1) return FALSE;
1697 osip_message_get_contact(orig_request,0,&ctt);
1698 osip_contact_to_str(ctt,&tmp);
1699 ori_contact_address = sal_address_new((const char*)tmp);
1701 /*check if contact is up to date*/
1702 if (strcmp(sal_address_get_domain(ori_contact_address),received) ==0
1703 && sal_address_get_port_int(ori_contact_address) == rport
1704 && sal_address_get_transport(ori_contact_address) == transport) {
1705 ms_message("Register has up to date contact, doing nothing.");
1708 } else ms_message("contact do not match, need to update the register (%s with %s:%i;transport=%s)"
1712 ,sal_transport_to_string(transport));
1714 sal_address_destroy(ori_contact_address);
1716 if (transport == SalTransportUDP) {
1718 eXosip_register_build_register(op->rid,op->expires,&msg);
1721 ms_warning("Fail to create a contact updated register.");
1724 if (fix_message_contact(op,msg,last_answer)) {
1725 eXosip_register_send_register(op->rid,msg);
1727 ms_message("Resending new register with updated contact");
1730 ms_warning("Fail to send updated register.");
1737 update_contact_from_response(op,last_answer);
1741 static void registration_success(Sal *sal, eXosip_event_t *ev){
1742 SalOp *op=sal_find_register(sal,ev->rid);
1743 osip_header_t *h=NULL;
1746 ms_error("Receiving register response for unknown operation");
1749 osip_message_get_expires(ev->request,0,&h);
1750 if (h!=NULL && atoi(h->hvalue)!=0){
1752 if (!register_again_with_updated_contact(op,ev->request,ev->response)){
1753 sal->callbacks.register_success(op,registered);
1756 sal->callbacks.register_success(op,FALSE);
1760 static bool_t registration_failure(Sal *sal, eXosip_event_t *ev){
1762 const char *reason=NULL;
1763 SalOp *op=sal_find_register(sal,ev->rid);
1764 SalReason sr=SalReasonUnknown;
1765 SalError se=SalErrorUnknown;
1768 ms_error("Receiving register failure for unknown operation");
1772 status_code=osip_message_get_status_code(ev->response);
1773 reason=osip_message_get_reason_phrase(ev->response);
1775 switch(status_code){
1778 return process_authentication(sal,ev);
1780 case 423: /*interval too brief*/
1781 {/*retry with greater interval */
1782 osip_header_t *h=NULL;
1783 osip_message_t *msg=NULL;
1784 osip_message_header_get_byname(ev->response,"min-expires",0,&h);
1785 if (h && h->hvalue && h->hvalue[0]!='\0'){
1786 int val=atoi(h->hvalue);
1787 if (val>op->expires)
1789 }else op->expires*=2;
1791 eXosip_register_build_register(op->rid,op->expires,&msg);
1792 eXosip_register_send_register(op->rid,msg);
1796 case 606: /*Not acceptable, workaround for proxies that don't like private addresses
1797 in vias, such as ekiga.net
1798 On the opposite, freephonie.net bugs when via are masqueraded.
1800 op->masquerade_via=TRUE;
1802 /* if contact is up to date, process the failure, otherwise resend a new register with
1803 updated contact first, just in case the faillure is due to incorrect contact */
1804 if (ev->response && register_again_with_updated_contact(op,ev->request,ev->response))
1805 return TRUE; /*we are retrying with an updated contact*/
1806 if (status_code==403){
1808 sr=SalReasonForbidden;
1809 }else if (status_code==0){
1810 se=SalErrorNoResponse;
1812 sal->callbacks.register_failure(op,se,sr,reason);
1817 static void other_request_reply(Sal *sal,eXosip_event_t *ev){
1818 SalOp *op=find_op(sal,ev);
1821 ms_warning("other_request_reply(): Receiving response to unknown request.");
1825 update_contact_from_response(op,ev->response);
1826 if (ev->request && strcmp(osip_message_get_method(ev->request),"OPTIONS")==0)
1827 sal->callbacks.ping_reply(op);
1831 static bool_t process_event(Sal *sal, eXosip_event_t *ev){
1832 ms_message("linphone process event get a message %d\n",ev->type);
1834 case EXOSIP_CALL_ANSWERED:
1835 ms_message("CALL_ANSWERED\n");
1836 call_accepted(sal,ev);
1837 authentication_ok(sal,ev);
1839 case EXOSIP_CALL_CLOSED:
1840 case EXOSIP_CALL_CANCELLED:
1841 ms_message("CALL_CLOSED or CANCELLED\n");
1842 call_terminated(sal,ev);
1844 case EXOSIP_CALL_TIMEOUT:
1845 case EXOSIP_CALL_NOANSWER:
1846 ms_message("CALL_TIMEOUT or NOANSWER\n");
1847 return call_failure(sal,ev);
1849 case EXOSIP_CALL_REQUESTFAILURE:
1850 case EXOSIP_CALL_GLOBALFAILURE:
1851 case EXOSIP_CALL_SERVERFAILURE:
1852 ms_message("CALL_REQUESTFAILURE or GLOBALFAILURE or SERVERFAILURE\n");
1853 return call_failure(sal,ev);
1855 case EXOSIP_CALL_RELEASED:
1856 ms_message("CALL_RELEASED\n");
1857 call_released(sal, ev);
1859 case EXOSIP_CALL_INVITE:
1860 ms_message("CALL_NEW\n");
1861 inc_new_call(sal,ev);
1863 case EXOSIP_CALL_REINVITE:
1864 handle_reinvite(sal,ev);
1866 case EXOSIP_CALL_ACK:
1867 ms_message("CALL_ACK");
1870 case EXOSIP_CALL_REDIRECTED:
1871 ms_message("CALL_REDIRECTED");
1872 eXosip_default_action(ev);
1874 case EXOSIP_CALL_PROCEEDING:
1875 ms_message("CALL_PROCEEDING");
1876 call_proceeding(sal,ev);
1878 case EXOSIP_CALL_RINGING:
1879 ms_message("CALL_RINGING");
1880 call_ringing(sal,ev);
1882 case EXOSIP_CALL_MESSAGE_NEW:
1883 ms_message("EXOSIP_CALL_MESSAGE_NEW");
1884 call_message_new(sal,ev);
1886 case EXOSIP_CALL_MESSAGE_REQUESTFAILURE:
1888 (ev->response->status_code==407 || ev->response->status_code==401)){
1889 return process_authentication(sal,ev);
1892 case EXOSIP_IN_SUBSCRIPTION_NEW:
1893 ms_message("CALL_IN_SUBSCRIPTION_NEW ");
1894 sal_exosip_subscription_recv(sal,ev);
1896 case EXOSIP_IN_SUBSCRIPTION_RELEASED:
1897 ms_message("CALL_SUBSCRIPTION_NEW ");
1898 sal_exosip_in_subscription_closed(sal,ev);
1900 case EXOSIP_SUBSCRIPTION_UPDATE:
1901 ms_message("CALL_SUBSCRIPTION_UPDATE");
1903 case EXOSIP_SUBSCRIPTION_NOTIFY:
1904 ms_message("CALL_SUBSCRIPTION_NOTIFY");
1905 sal_exosip_notify_recv(sal,ev);
1907 case EXOSIP_SUBSCRIPTION_ANSWERED:
1908 ms_message("EXOSIP_SUBSCRIPTION_ANSWERED, ev->sid=%i, ev->did=%i\n",ev->sid,ev->did);
1909 sal_exosip_subscription_answered(sal,ev);
1911 case EXOSIP_SUBSCRIPTION_CLOSED:
1912 ms_message("EXOSIP_SUBSCRIPTION_CLOSED\n");
1913 sal_exosip_subscription_closed(sal,ev);
1915 case EXOSIP_SUBSCRIPTION_REQUESTFAILURE: /**< announce a request failure */
1916 if (ev->response && (ev->response->status_code == 407 || ev->response->status_code == 401)){
1917 return process_authentication(sal,ev);
1919 case EXOSIP_SUBSCRIPTION_SERVERFAILURE:
1920 case EXOSIP_SUBSCRIPTION_GLOBALFAILURE:
1921 sal_exosip_subscription_closed(sal,ev);
1923 case EXOSIP_REGISTRATION_FAILURE:
1924 ms_message("REGISTRATION_FAILURE\n");
1925 return registration_failure(sal,ev);
1927 case EXOSIP_REGISTRATION_SUCCESS:
1928 authentication_ok(sal,ev);
1929 registration_success(sal,ev);
1931 case EXOSIP_MESSAGE_NEW:
1932 other_request(sal,ev);
1934 case EXOSIP_MESSAGE_PROCEEDING:
1935 case EXOSIP_MESSAGE_ANSWERED:
1936 case EXOSIP_MESSAGE_REDIRECTED:
1937 case EXOSIP_MESSAGE_SERVERFAILURE:
1938 case EXOSIP_MESSAGE_GLOBALFAILURE:
1939 other_request_reply(sal,ev);
1941 case EXOSIP_MESSAGE_REQUESTFAILURE:
1942 case EXOSIP_NOTIFICATION_REQUESTFAILURE:
1944 switch (ev->response->status_code) {
1947 return process_authentication(sal,ev);
1949 eXosip_automatic_action ();
1954 other_request_reply(sal,ev);
1957 ms_message("Unhandled exosip event ! %i",ev->type);
1963 int sal_iterate(Sal *sal){
1965 while((ev=eXosip_event_wait(0,0))!=NULL){
1966 if (process_event(sal,ev))
1967 eXosip_event_free(ev);
1970 eXosip_automatic_refresh();
1975 static void register_set_contact(osip_message_t *msg, const char *contact){
1976 osip_uri_param_t *param = NULL;
1977 osip_contact_t *ct=NULL;
1979 /*we get the line parameter choosed by exosip, and add it to our own contact*/
1980 osip_message_get_contact(msg,0,&ct);
1982 osip_uri_uparam_get_byname(ct->url, "line", ¶m);
1983 if (param && param->gvalue)
1984 line=osip_strdup(param->gvalue);
1986 _osip_list_set_empty(&msg->contacts,(void (*)(void*))osip_contact_free);
1987 osip_message_set_contact(msg,contact);
1988 osip_message_get_contact(msg,0,&ct);
1989 osip_uri_uparam_add(ct->url,osip_strdup("line"),line);
1992 int sal_register(SalOp *h, const char *proxy, const char *from, int expires){
1993 osip_message_t *msg;
1994 const char *contact=sal_op_get_contact(h);
1996 sal_op_set_route(h,proxy);
1999 h->rid=eXosip_register_build_initial_register(from,proxy,NULL,expires,&msg);
2001 if (contact) register_set_contact(msg,contact);
2002 sal_add_register(h->base.root,h);
2004 ms_error("Could not build initial register.");
2010 eXosip_register_build_register(h->rid,expires,&msg);
2012 eXosip_register_send_register(h->rid,msg);
2018 int sal_register_refresh(SalOp *op, int expires){
2019 osip_message_t *msg=NULL;
2020 const char *contact=sal_op_get_contact(op);
2023 ms_error("Unexistant registration context, not possible to refresh.");
2027 eXosip_register_build_register(op->rid,expires,&msg);
2029 if (contact) register_set_contact(msg,contact);
2030 eXosip_register_send_register(op->rid,msg);
2031 }else ms_error("Could not build REGISTER refresh message.");
2037 int sal_unregister(SalOp *h){
2038 osip_message_t *msg=NULL;
2040 eXosip_register_build_register(h->rid,0,&msg);
2041 if (msg) eXosip_register_send_register(h->rid,msg);
2042 else ms_warning("Could not build unREGISTER !");
2047 SalAddress * sal_address_new(const char *uri){
2049 osip_from_init(&from);
2051 // Remove front spaces
2052 while (uri[0]==' ') {
2056 if (osip_from_parse(from,uri)!=0){
2057 osip_from_free(from);
2060 if (from->displayname!=NULL && from->displayname[0]=='"'){
2061 char *unquoted=osip_strdup_without_quote(from->displayname);
2062 osip_free(from->displayname);
2063 from->displayname=unquoted;
2065 return (SalAddress*)from;
2068 SalAddress * sal_address_clone(const SalAddress *addr){
2069 osip_from_t *ret=NULL;
2070 osip_from_clone((osip_from_t*)addr,&ret);
2071 return (SalAddress*)ret;
2074 #define null_if_empty(s) (((s)!=NULL && (s)[0]!='\0') ? (s) : NULL )
2076 const char *sal_address_get_scheme(const SalAddress *addr){
2077 const osip_from_t *u=(const osip_from_t*)addr;
2078 return null_if_empty(u->url->scheme);
2081 const char *sal_address_get_display_name(const SalAddress* addr){
2082 const osip_from_t *u=(const osip_from_t*)addr;
2083 return null_if_empty(u->displayname);
2086 const char *sal_address_get_username(const SalAddress *addr){
2087 const osip_from_t *u=(const osip_from_t*)addr;
2088 return null_if_empty(u->url->username);
2091 const char *sal_address_get_domain(const SalAddress *addr){
2092 const osip_from_t *u=(const osip_from_t*)addr;
2093 return null_if_empty(u->url->host);
2096 void sal_address_set_display_name(SalAddress *addr, const char *display_name){
2097 osip_from_t *u=(osip_from_t*)addr;
2098 if (u->displayname!=NULL){
2099 osip_free(u->displayname);
2100 u->displayname=NULL;
2102 if (display_name!=NULL && display_name[0]!='\0'){
2103 u->displayname=osip_strdup(display_name);
2107 void sal_address_set_username(SalAddress *addr, const char *username){
2108 osip_from_t *uri=(osip_from_t*)addr;
2109 if (uri->url->username!=NULL){
2110 osip_free(uri->url->username);
2111 uri->url->username=NULL;
2114 uri->url->username=osip_strdup(username);
2117 void sal_address_set_domain(SalAddress *addr, const char *host){
2118 osip_from_t *uri=(osip_from_t*)addr;
2119 if (uri->url->host!=NULL){
2120 osip_free(uri->url->host);
2121 uri->url->host=NULL;
2124 uri->url->host=osip_strdup(host);
2127 void sal_address_set_port(SalAddress *addr, const char *port){
2128 osip_from_t *uri=(osip_from_t*)addr;
2129 if (uri->url->port!=NULL){
2130 osip_free(uri->url->port);
2131 uri->url->port=NULL;
2134 uri->url->port=osip_strdup(port);
2137 void sal_address_set_port_int(SalAddress *uri, int port){
2140 /*this is the default, special case to leave the port field blank*/
2141 sal_address_set_port(uri,NULL);
2144 snprintf(tmp,sizeof(tmp),"%i",port);
2145 sal_address_set_port(uri,tmp);
2148 void sal_address_clean(SalAddress *addr){
2149 osip_generic_param_freelist(& ((osip_from_t*)addr)->gen_params);
2150 osip_uri_param_freelist(& ((osip_from_t*)addr)->url->url_params);
2153 char *sal_address_as_string(const SalAddress *u){
2155 osip_from_t *from=(osip_from_t *)u;
2156 char *old_displayname=NULL;
2157 /* hack to force use of quotes around the displayname*/
2158 if (from->displayname!=NULL
2159 && from->displayname[0]!='"'){
2160 old_displayname=from->displayname;
2161 from->displayname=osip_enquote(from->displayname);
2163 osip_from_to_str(from,&tmp);
2164 if (old_displayname!=NULL){
2165 ms_free(from->displayname);
2166 from->displayname=old_displayname;
2173 char *sal_address_as_string_uri_only(const SalAddress *u){
2174 char *tmp=NULL,*ret;
2175 osip_uri_to_str(((osip_from_t*)u)->url,&tmp);
2180 void sal_address_set_param(SalAddress *u,const char* name,const char* value) {
2181 osip_uri_param_t *param=NULL;
2182 osip_uri_uparam_get_byname(((osip_from_t*)u)->url,(char*)name,¶m);
2184 osip_uri_uparam_add (((osip_from_t*)u)->url,ms_strdup(name),ms_strdup(value));
2186 osip_free(param->gvalue);
2187 param->gvalue=osip_strdup(value);
2192 void sal_address_destroy(SalAddress *u){
2193 osip_from_free((osip_from_t*)u);
2196 void sal_set_keepalive_period(Sal *ctx,unsigned int value) {
2197 ctx->keepalive_period=value;
2198 eXosip_set_option (EXOSIP_OPT_UDP_KEEP_ALIVE, &value);
2200 unsigned int sal_get_keepalive_period(Sal *ctx) {
2201 return ctx->keepalive_period;
2204 const char * sal_address_get_port(const SalAddress *addr) {
2205 const osip_from_t *u=(const osip_from_t*)addr;
2206 return null_if_empty(u->url->port);
2209 int sal_address_get_port_int(const SalAddress *uri) {
2210 const char* port = sal_address_get_port(uri);
2217 SalTransport sal_address_get_transport(const SalAddress* addr) {
2218 const osip_from_t *u=(const osip_from_t*)addr;
2219 osip_uri_param_t *transport_param=NULL;
2220 osip_uri_uparam_get_byname(u->url,"transport",&transport_param);
2221 if (transport_param == NULL){
2222 return SalTransportUDP;
2224 return sal_transport_parse(transport_param->gvalue);
2227 void sal_address_set_transport(SalAddress* addr,SalTransport transport) {
2228 sal_address_set_param(addr, "transport", sal_transport_to_string(transport));
2231 /* sends a reinvite. Local media description may have changed by application since call establishment*/
2232 int sal_call_update(SalOp *h, const char *subject){
2234 osip_message_t *reinvite=NULL;
2237 if(eXosip_call_build_request(h->did,"INVITE",&reinvite) != 0 || reinvite==NULL){
2242 osip_message_set_subject(reinvite,subject);
2243 osip_message_set_allow(reinvite, "INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, NOTIFY, MESSAGE, SUBSCRIBE, INFO");
2244 if (h->base.root->session_expires!=0){
2245 osip_message_set_header(reinvite, "Session-expires", "200");
2246 osip_message_set_supported(reinvite, "timer");
2248 if (h->base.local_media){
2249 h->sdp_offering=TRUE;
2250 set_sdp_from_desc(reinvite,h->base.local_media);
2251 }else h->sdp_offering=FALSE;
2253 err = eXosip_call_send_request(h->did, reinvite);
2257 void sal_reuse_authorization(Sal *ctx, bool_t value) {
2258 ctx->reuse_authorization=value;