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.internal_message==NULL)
342 ctx->callbacks.internal_message=(SalOnInternalMsg)unimplemented_stub;
343 if (ctx->callbacks.ping_reply==NULL)
344 ctx->callbacks.ping_reply=(SalOnPingReply)unimplemented_stub;
347 int sal_unlisten_ports(Sal *ctx){
356 int sal_listen_port(Sal *ctx, const char *addr, int port, SalTransport tr, int is_secure){
359 int proto=IPPROTO_UDP;
360 int keepalive = ctx->keepalive_period;
363 case SalTransportUDP:
365 eXosip_set_option (EXOSIP_OPT_UDP_KEEP_ALIVE, &keepalive);
367 case SalTransportTCP:
368 case SalTransportTLS:
371 eXosip_set_option (EXOSIP_OPT_UDP_KEEP_ALIVE,&keepalive);
374 eXosip_tls_ctx_t tlsCtx;
375 memset(&tlsCtx, 0, sizeof(tlsCtx));
376 snprintf(tlsCtx.root_ca_cert, sizeof(tlsCtx.client.cert), "%s", ctx->rootCa);
377 eXosip_set_tls_ctx(&tlsCtx);
381 ms_warning("unexpected proto, using datagram");
385 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
386 version of eXosip, which is not the case*/
387 /*see if it looks like an IPv6 address*/
388 int use_rports = ctx->use_rports; // Copy char to int to avoid bad alignment
389 eXosip_set_option(EXOSIP_OPT_USE_RPORT,&use_rports);
390 int dont_use_101 = !ctx->use_101; // Copy char to int to avoid bad alignment
391 eXosip_set_option(EXOSIP_OPT_DONT_SEND_101,&dont_use_101);
393 ipv6=strchr(addr,':')!=NULL;
394 eXosip_enable_ipv6(ipv6);
396 if (is_secure && tr == SalTransportUDP){
397 ms_fatal("SIP over DTLS is not supported yet.");
400 err=eXosip_listen_addr(proto, addr, port, ipv6 ? PF_INET6 : PF_INET, is_secure);
401 #ifdef HAVE_EXOSIP_GET_SOCKET
402 ms_message("Exosip has socket number %i",eXosip_get_socket(proto));
409 ortp_socket_t sal_get_socket(Sal *ctx){
410 #ifdef HAVE_EXOSIP_GET_SOCKET
411 return eXosip_get_socket(IPPROTO_UDP);
413 ms_warning("Sorry, eXosip does not have eXosip_get_socket() method");
418 void sal_set_user_agent(Sal *ctx, const char *user_agent){
419 eXosip_set_user_agent(user_agent);
422 void sal_use_session_timers(Sal *ctx, int expires){
423 ctx->session_expires=expires;
426 void sal_use_one_matching_codec_policy(Sal *ctx, bool_t one_matching_codec){
427 ctx->one_matching_codec=one_matching_codec;
430 MSList *sal_get_pending_auths(Sal *sal){
431 return ms_list_copy(sal->pending_auths);
434 void sal_use_double_registrations(Sal *ctx, bool_t enabled){
435 ctx->double_reg=enabled;
438 void sal_use_rport(Sal *ctx, bool_t use_rports){
439 ctx->use_rports=use_rports;
441 void sal_use_101(Sal *ctx, bool_t use_101){
442 ctx->use_101=use_101;
445 void sal_root_ca(Sal* ctx, const char* rootCa) {
447 ms_free(ctx->rootCa);
448 ctx->rootCa = ms_strdup(rootCa);
449 ms_error("YIPI : %s == %s\n", rootCa, ctx->rootCa);
452 static int extract_received_rport(osip_message_t *msg, const char **received, int *rportval,SalTransport* transport){
453 osip_via_t *via=NULL;
454 osip_generic_param_t *param=NULL;
455 const char *rport=NULL;
459 osip_message_get_via(msg,0,&via);
462 *transport = sal_transport_parse(via->protocol);
464 if (via->port && via->port[0]!='\0')
465 *rportval=atoi(via->port);
467 osip_via_param_get_byname(via,"rport",¶m);
470 if (rport && rport[0]!='\0') *rportval=atoi(rport);
474 osip_via_param_get_byname(via,"received",¶m);
475 if (param) *received=param->gvalue;
477 if (rport==NULL && *received==NULL) return -1;
481 static void set_sdp(osip_message_t *sip,sdp_message_t *msg){
485 sdp_message_to_str(msg,&sdp);
487 snprintf(clen,sizeof(clen),"%i",sdplen);
488 osip_message_set_body(sip,sdp,sdplen);
489 osip_message_set_content_type(sip,"application/sdp");
490 osip_message_set_content_length(sip,clen);
494 static void set_sdp_from_desc(osip_message_t *sip, const SalMediaDescription *desc){
495 sdp_message_t *msg=media_description_to_sdp(desc);
497 ms_error("Fail to print sdp message !");
501 sdp_message_free(msg);
504 static void sdp_process(SalOp *h){
505 ms_message("Doing SDP offer/answer process");
507 sal_media_description_unref(h->result);
509 h->result=sal_media_description_new();
510 if (h->sdp_offering){
511 offer_answer_initiate_outgoing(h->base.local_media,h->base.remote_media,h->result);
514 offer_answer_initiate_incoming(h->base.local_media,h->base.remote_media,h->result,h->base.root->one_matching_codec);
515 h->sdp_answer=media_description_to_sdp(h->result);
516 /*once we have generated the SDP answer, we modify the result description for processing by the upper layer.
517 It should contains media parameters constraint from the remote offer, not our response*/
518 strcpy(h->result->addr,h->base.remote_media->addr);
519 h->result->bandwidth=h->base.remote_media->bandwidth;
520 for(i=0;i<h->result->nstreams;++i){
521 if (h->result->streams[i].port>0){
522 strcpy(h->result->streams[i].addr,h->base.remote_media->streams[i].addr);
523 h->result->streams[i].ptime=h->base.remote_media->streams[i].ptime;
524 h->result->streams[i].bandwidth=h->base.remote_media->streams[i].bandwidth;
525 h->result->streams[i].port=h->base.remote_media->streams[i].port;
532 int sal_call_is_offerer(const SalOp *h){
533 return h->sdp_offering;
536 int sal_call_set_local_media_description(SalOp *h, SalMediaDescription *desc){
538 sal_media_description_ref(desc);
539 if (h->base.local_media)
540 sal_media_description_unref(h->base.local_media);
541 h->base.local_media=desc;
545 int sal_call(SalOp *h, const char *from, const char *to){
547 osip_message_t *invite=NULL;
548 sal_op_set_from(h,from);
550 sal_exosip_fix_route(h);
551 err=eXosip_call_build_initial_invite(&invite,to,from,sal_op_get_route(h),"Phone call");
553 ms_error("Could not create call.");
556 osip_message_set_allow(invite, "INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, NOTIFY, MESSAGE, SUBSCRIBE, INFO");
557 if (h->base.contact){
558 _osip_list_set_empty(&invite->contacts,(void (*)(void*))osip_contact_free);
559 osip_message_set_contact(invite,h->base.contact);
561 if (h->base.root->session_expires!=0){
562 osip_message_set_header(invite, "Session-expires", "200");
563 osip_message_set_supported(invite, "timer");
565 if (h->base.local_media){
566 h->sdp_offering=TRUE;
567 set_sdp_from_desc(invite,h->base.local_media);
568 }else h->sdp_offering=FALSE;
570 osip_message_set_header(invite,"Replaces",h->replaces);
572 osip_message_set_header(invite,"Referred-By",h->referred_by);
576 err=eXosip_call_send_initial_invite(invite);
580 ms_error("Fail to send invite !");
583 sal_add_call(h->base.root,h);
588 int sal_call_notify_ringing(SalOp *h, bool_t early_media){
591 /*if early media send also 180 and 183 */
592 if (early_media && h->sdp_answer){
595 eXosip_call_build_answer(h->tid,180,&msg);
597 set_sdp(msg,h->sdp_answer);
598 eXosip_call_send_answer(h->tid,180,msg);
601 eXosip_call_build_answer(h->tid,183,&msg);
603 set_sdp(msg,h->sdp_answer);
604 eXosip_call_send_answer(h->tid,183,msg);
609 eXosip_call_send_answer(h->tid,180,NULL);
615 int sal_call_accept(SalOp * h){
617 const char *contact=sal_op_get_contact(h);
619 int err=eXosip_call_build_answer(h->tid,200,&msg);
620 if (err<0 || msg==NULL){
621 ms_error("Fail to build answer for call: err=%i",err);
624 if (h->base.root->session_expires!=0){
625 if (h->supports_session_timers) osip_message_set_supported(msg, "timer");
629 _osip_list_set_empty(&msg->contacts,(void (*)(void*))osip_contact_free);
630 osip_message_set_contact(msg,contact);
633 if (h->base.local_media){
634 /*this is the case where we received an invite without SDP*/
635 if (h->sdp_offering) {
636 set_sdp_from_desc(msg,h->base.local_media);
639 set_sdp(msg,h->sdp_answer);
640 sdp_message_free(h->sdp_answer);
645 ms_error("You are accepting a call but not defined any media capabilities !");
647 eXosip_call_send_answer(h->tid,200,msg);
651 int sal_call_decline(SalOp *h, SalReason reason, const char *redirect){
652 if (reason==SalReasonBusy){
654 eXosip_call_send_answer(h->tid,486,NULL);
657 else if (reason==SalReasonTemporarilyUnavailable){
659 eXosip_call_send_answer(h->tid,480,NULL);
661 }else if (reason==SalReasonDoNotDisturb){
663 eXosip_call_send_answer(h->tid,600,NULL);
665 }else if (reason==SalReasonMedia){
667 eXosip_call_send_answer(h->tid,415,NULL);
669 }else if (redirect!=NULL && reason==SalReasonRedirect){
672 if (strstr(redirect,"sip:")!=0) code=302;
675 eXosip_call_build_answer(h->tid,code,&msg);
676 osip_message_set_contact(msg,redirect);
677 eXosip_call_send_answer(h->tid,code,msg);
679 }else sal_call_terminate(h);
683 SalMediaDescription * sal_call_get_final_media_description(SalOp *h){
684 if (h->base.local_media && h->base.remote_media && !h->result){
690 int sal_call_set_referer(SalOp *h, SalOp *refered_call){
691 if (refered_call->replaces)
692 h->replaces=ms_strdup(refered_call->replaces);
693 if (refered_call->referred_by)
694 h->referred_by=ms_strdup(refered_call->referred_by);
698 int sal_ping(SalOp *op, const char *from, const char *to){
699 osip_message_t *options=NULL;
701 sal_op_set_from(op,from);
702 sal_op_set_to(op,to);
703 /*bug here: eXosip2 does not honor the route argument*/
704 eXosip_options_build_request (&options, sal_op_get_to(op),
705 sal_op_get_from(op),sal_op_get_route(op));
707 if (op->base.root->session_expires!=0){
708 osip_message_set_header(options, "Session-expires", "200");
709 osip_message_set_supported(options, "timer");
711 sal_add_other(sal_op_get_sal(op),op,options);
712 return eXosip_options_send_request(options);
717 int sal_call_accept_refer(SalOp *op){
718 osip_message_t *msg=NULL;
721 err = eXosip_call_build_notify(op->did,EXOSIP_SUBCRSTATE_ACTIVE,&msg);
724 osip_message_set_header(msg,(const char *)"event","refer");
725 osip_message_set_content_type(msg,"message/sipfrag");
726 osip_message_set_body(msg,"SIP/2.0 100 Trying",sizeof("SIP/2.0 100 Trying"));
727 eXosip_call_send_request(op->did,msg);
731 ms_error("could not get a notify built\n");
737 int sal_call_refer(SalOp *h, const char *refer_to){
738 osip_message_t *msg=NULL;
741 eXosip_call_build_refer(h->did,refer_to, &msg);
742 if (msg) err=eXosip_call_send_request(h->did, msg);
748 int sal_call_refer_with_replaces(SalOp *h, SalOp *other_call_h){
749 osip_message_t *msg=NULL;
750 char referto[256]={0};
753 if (eXosip_call_get_referto(other_call_h->did,referto,sizeof(referto)-1)!=0){
754 ms_error("eXosip_call_get_referto() failed for did=%i",other_call_h->did);
758 eXosip_call_build_refer(h->did,referto, &msg);
759 osip_message_set_header(msg,"Referred-By",h->base.from);
760 if (msg) err=eXosip_call_send_request(h->did, msg);
766 SalOp *sal_call_get_replaces(SalOp *h){
767 if (h->replaces!=NULL){
770 cid=eXosip_call_find_by_replaces(h->replaces);
773 SalOp *ret=sal_find_call(h->base.root,cid);
780 int sal_call_send_dtmf(SalOp *h, char dtmf){
781 osip_message_t *msg=NULL;
786 eXosip_call_build_info(h->did,&msg);
788 snprintf(dtmf_body, sizeof(dtmf_body), "Signal=%c\r\nDuration=250\r\n", dtmf);
789 osip_message_set_body(msg,dtmf_body,strlen(dtmf_body));
790 osip_message_set_content_type(msg,"application/dtmf-relay");
791 snprintf(clen,sizeof(clen),"%lu",(unsigned long)strlen(dtmf_body));
792 osip_message_set_content_length(msg,clen);
793 eXosip_call_send_request(h->did,msg);
799 static void push_auth_to_exosip(const SalAuthInfo *info){
801 if (info->userid==NULL || info->userid[0]=='\0') userid=info->username;
802 else userid=info->userid;
803 ms_message("Authentication info for username [%s], id[%s], realm [%s] added to eXosip", info->username,userid, info->realm);
804 eXosip_add_authentication_info (info->username,userid,
805 info->password, NULL,info->realm);
808 * Just for symmetry ;-)
810 static void pop_auth_from_exosip() {
811 eXosip_clear_authentication_info();
814 int sal_call_terminate(SalOp *h){
816 if (h->auth_info) push_auth_to_exosip(h->auth_info);
818 err=eXosip_call_terminate(h->cid,h->did);
820 if (!h->base.root->reuse_authorization) pop_auth_from_exosip();
822 ms_warning("Exosip could not terminate the call: cid=%i did=%i", h->cid,h->did);
828 void sal_op_authenticate(SalOp *h, const SalAuthInfo *info){
829 if (h->pending_auth){
830 push_auth_to_exosip(info);
832 /*FIXME exosip does not take into account this update register message*/
834 if (fix_message_contact(h, h->pending_auth->request,h->pending_auth->response)) {
838 update_contact_from_response(h,h->pending_auth->response);
840 eXosip_default_action(h->pending_auth);
842 ms_message("eXosip_default_action() done");
843 if (!h->base.root->reuse_authorization) pop_auth_from_exosip();
845 if (h->auth_info) sal_auth_info_delete(h->auth_info); /*if already exist*/
846 h->auth_info=sal_auth_info_clone(info); /*store auth info for subsequent request*/
849 void sal_op_cancel_authentication(SalOp *h) {
851 sal_op_get_sal(h)->callbacks.register_failure(h,SalErrorFailure, SalReasonForbidden,_("Authentication failure"));
852 } else if (h->cid >0) {
853 sal_op_get_sal(h)->callbacks.call_failure(h,SalErrorFailure, SalReasonForbidden,_("Authentication failure"),0);
855 ms_warning("Auth failure not handled");
859 static void set_network_origin(SalOp *op, osip_message_t *req){
860 const char *received=NULL;
863 SalTransport transport;
864 if (extract_received_rport(req,&received,&rport,&transport)!=0){
865 osip_via_t *via=NULL;
867 osip_message_get_via(req,0,&via);
868 received=osip_via_get_host(via);
869 tmp=osip_via_get_port(via);
870 if (tmp) rport=atoi(tmp);
872 if (transport != SalTransportUDP) {
873 snprintf(origin,sizeof(origin)-1,"sip:%s:%i",received,rport);
875 snprintf(origin,sizeof(origin)-1,"sip:%s:%i;transport=%s",received,rport,sal_transport_to_string(transport));
877 __sal_op_set_network_origin(op,origin);
880 static void set_remote_ua(SalOp* op, osip_message_t *req){
881 if (op->base.remote_ua==NULL){
882 osip_header_t *h=NULL;
883 osip_message_get_user_agent(req,0,&h);
885 op->base.remote_ua=ms_strdup(h->hvalue);
890 static void set_replaces(SalOp *op, osip_message_t *req){
891 osip_header_t *h=NULL;
894 ms_free(op->replaces);
897 osip_message_header_get_byname(req,"replaces",0,&h);
899 if (h->hvalue && h->hvalue[0]!='\0'){
900 op->replaces=ms_strdup(h->hvalue);
905 static SalOp *find_op(Sal *sal, eXosip_event_t *ev){
907 return sal_find_call(sal,ev->cid);
910 return sal_find_register(sal,ev->rid);
913 return sal_find_out_subscribe(sal,ev->sid);
916 return sal_find_in_subscribe(sal,ev->nid);
918 if (ev->response) return sal_find_other(sal,ev->response);
922 static void inc_new_call(Sal *sal, eXosip_event_t *ev){
923 SalOp *op=sal_op_new(sal);
924 osip_from_t *from,*to;
925 osip_call_info_t *call_info;
927 sdp_message_t *sdp=eXosip_get_sdp_info(ev->request);
929 set_network_origin(op,ev->request);
930 set_remote_ua(op,ev->request);
931 set_replaces(op,ev->request);
934 op->sdp_offering=FALSE;
935 op->base.remote_media=sal_media_description_new();
936 sdp_to_media_description(sdp,op->base.remote_media);
937 sdp_message_free(sdp);
938 }else op->sdp_offering=TRUE;
940 from=osip_message_get_from(ev->request);
941 to=osip_message_get_to(ev->request);
942 osip_from_to_str(from,&tmp);
943 sal_op_set_from(op,tmp);
945 osip_from_to_str(to,&tmp);
946 sal_op_set_to(op,tmp);
949 osip_message_get_call_info(ev->request,0,&call_info);
952 osip_call_info_to_str(call_info,&tmp);
953 if( strstr(tmp,"answer-after=") != NULL)
955 op->auto_answer_asked=TRUE;
956 ms_message("The caller asked to automatically answer the call(Emergency?)\n");
965 sal_add_call(op->base.root,op);
966 sal->callbacks.call_received(op);
969 static void handle_reinvite(Sal *sal, eXosip_event_t *ev){
970 SalOp *op=find_op(sal,ev);
972 osip_message_t *msg=NULL;
975 ms_warning("Reinvite for non-existing operation !");
980 sdp=eXosip_get_sdp_info(ev->request);
981 if (op->base.remote_media){
982 sal_media_description_unref(op->base.remote_media);
983 op->base.remote_media=NULL;
986 sal_media_description_unref(op->result);
990 op->sdp_offering=FALSE;
991 op->base.remote_media=sal_media_description_new();
992 sdp_to_media_description(sdp,op->base.remote_media);
993 sdp_message_free(sdp);
994 sal->callbacks.call_updating(op);
996 op->sdp_offering=TRUE;
998 eXosip_call_build_answer(ev->tid,200,&msg);
1000 set_sdp_from_desc(msg,op->base.local_media);
1001 eXosip_call_send_answer(ev->tid,200,msg);
1008 static void handle_ack(Sal *sal, eXosip_event_t *ev){
1009 SalOp *op=find_op(sal,ev);
1013 ms_warning("ack for non-existing call !");
1016 sdp=eXosip_get_sdp_info(ev->ack);
1018 op->base.remote_media=sal_media_description_new();
1019 sdp_to_media_description(sdp,op->base.remote_media);
1021 sdp_message_free(sdp);
1024 if (sdp) sal->callbacks.call_updating(op);
1027 sal->callbacks.call_ack(op);
1031 static void update_contact_from_response(SalOp *op, osip_message_t *response){
1032 const char *received;
1034 SalTransport transport;
1035 if (extract_received_rport(response,&received,&rport,&transport)==0){
1036 const char *contact=sal_op_get_contact(op);
1038 /*no contact given yet, use from instead*/
1039 contact=sal_op_get_from(op);
1042 SalAddress *addr=sal_address_new(contact);
1044 sal_address_set_domain(addr,received);
1045 sal_address_set_port_int(addr,rport);
1046 if (transport!=SalTransportUDP)
1047 sal_address_set_transport(addr,transport);
1048 tmp=sal_address_as_string(addr);
1049 ms_message("Contact address updated to %s",tmp);
1050 sal_op_set_contact(op,tmp);
1051 sal_address_destroy(addr);
1057 static int call_proceeding(Sal *sal, eXosip_event_t *ev){
1058 SalOp *op=find_op(sal,ev);
1060 if (op==NULL || op->terminated==TRUE) {
1061 ms_warning("This call has been canceled.");
1063 eXosip_call_terminate(ev->cid,ev->did);
1071 /* update contact if received and rport are set by the server
1072 note: will only be used by remote for next INVITE, if any...*/
1073 update_contact_from_response(op,ev->response);
1077 static void call_ringing(Sal *sal, eXosip_event_t *ev){
1079 SalOp *op=find_op(sal,ev);
1080 if (call_proceeding(sal, ev)==-1) return;
1082 set_remote_ua(op,ev->response);
1083 sdp=eXosip_get_sdp_info(ev->response);
1085 op->base.remote_media=sal_media_description_new();
1086 sdp_to_media_description(sdp,op->base.remote_media);
1087 sdp_message_free(sdp);
1088 if (op->base.local_media) sdp_process(op);
1090 sal->callbacks.call_ringing(op);
1093 static void call_accepted(Sal *sal, eXosip_event_t *ev){
1095 osip_message_t *msg=NULL;
1096 SalOp *op=find_op(sal,ev);
1097 const char *contact;
1099 if (op==NULL || op->terminated==TRUE) {
1100 ms_warning("This call has been already terminated.");
1102 eXosip_call_terminate(ev->cid,ev->did);
1108 set_remote_ua(op,ev->response);
1110 sdp=eXosip_get_sdp_info(ev->response);
1112 op->base.remote_media=sal_media_description_new();
1113 sdp_to_media_description(sdp,op->base.remote_media);
1114 sdp_message_free(sdp);
1115 if (op->base.local_media) sdp_process(op);
1117 eXosip_call_build_ack(ev->did,&msg);
1118 contact=sal_op_get_contact(op);
1120 _osip_list_set_empty(&msg->contacts,(void (*)(void*))osip_contact_free);
1121 osip_message_set_contact(msg,contact);
1123 if (op->sdp_answer){
1124 set_sdp(msg,op->sdp_answer);
1125 sdp_message_free(op->sdp_answer);
1126 op->sdp_answer=NULL;
1128 eXosip_call_send_ack(ev->did,msg);
1129 sal->callbacks.call_accepted(op);
1132 static void call_terminated(Sal *sal, eXosip_event_t *ev){
1134 SalOp *op=find_op(sal,ev);
1136 ms_warning("Call terminated for already closed call ?");
1140 osip_from_to_str(ev->request->from,&from);
1142 sal->callbacks.call_terminated(op,from!=NULL ? from : sal_op_get_from(op));
1143 if (from) osip_free(from);
1144 op->terminated=TRUE;
1147 static void call_released(Sal *sal, eXosip_event_t *ev){
1148 SalOp *op=find_op(sal,ev);
1150 ms_warning("No op associated to this call_released()");
1153 if (!op->terminated){
1154 /* no response received so far */
1155 call_failure(sal,ev);
1157 sal->callbacks.call_released(op);
1160 static int get_auth_data_from_response(osip_message_t *resp, const char **realm, const char **username){
1161 const char *prx_realm=NULL,*www_realm=NULL;
1162 osip_proxy_authenticate_t *prx_auth;
1163 osip_www_authenticate_t *www_auth;
1165 *username=osip_uri_get_username(resp->from->url);
1166 prx_auth=(osip_proxy_authenticate_t*)osip_list_get(&resp->proxy_authenticates,0);
1167 www_auth=(osip_proxy_authenticate_t*)osip_list_get(&resp->www_authenticates,0);
1169 prx_realm=osip_proxy_authenticate_get_realm(prx_auth);
1171 www_realm=osip_www_authenticate_get_realm(www_auth);
1175 }else if (www_realm){
1183 static int get_auth_data_from_request(osip_message_t *msg, const char **realm, const char **username){
1184 osip_authorization_t *auth=NULL;
1185 osip_proxy_authorization_t *prx_auth=NULL;
1187 *username=osip_uri_get_username(msg->from->url);
1188 osip_message_get_authorization(msg, 0, &auth);
1190 *realm=osip_authorization_get_realm(auth);
1193 osip_message_get_proxy_authorization(msg,0,&prx_auth);
1195 *realm=osip_proxy_authorization_get_realm(prx_auth);
1201 static int get_auth_data(eXosip_event_t *ev, const char **realm, const char **username){
1202 if (ev->response && get_auth_data_from_response(ev->response,realm,username)==0) return 0;
1203 if (ev->request && get_auth_data_from_request(ev->request,realm,username)==0) return 0;
1207 int sal_op_get_auth_requested(SalOp *op, const char **realm, const char **username){
1208 if (op->pending_auth){
1209 return get_auth_data(op->pending_auth,realm,username);
1214 static bool_t process_authentication(Sal *sal, eXosip_event_t *ev){
1216 const char *username,*realm;
1219 ms_warning("No operation associated with this authentication !");
1222 if (get_auth_data(ev,&realm,&username)==0){
1223 if (op->pending_auth!=NULL){
1224 eXosip_event_free(op->pending_auth);
1225 op->pending_auth=ev;
1227 op->pending_auth=ev;
1228 sal_add_pending_auth(sal,op);
1231 sal->callbacks.auth_requested(op,realm,username);
1237 static void authentication_ok(Sal *sal, eXosip_event_t *ev){
1239 const char *username,*realm;
1242 ms_warning("No operation associated with this authentication_ok!");
1245 if (op->pending_auth){
1246 eXosip_event_free(op->pending_auth);
1247 sal_remove_pending_auth(sal,op);
1248 op->pending_auth=NULL;
1250 if (get_auth_data(ev,&realm,&username)==0){
1251 sal->callbacks.auth_success(op,realm,username);
1255 static bool_t call_failure(Sal *sal, eXosip_event_t *ev){
1258 char* computedReason=NULL;
1259 const char *reason=NULL;
1260 SalError error=SalErrorUnknown;
1261 SalReason sr=SalReasonUnknown;
1264 op=(SalOp*)find_op(sal,ev);
1267 ms_warning("Call failure reported for a closed call, ignored.");
1272 code=osip_message_get_status_code(ev->response);
1273 reason=osip_message_get_reason_phrase(ev->response);
1274 osip_header_t *h=NULL;
1275 if (!osip_message_header_get_byname( ev->response
1279 computedReason = ms_strdup_printf("%s %s",reason,osip_header_get_value(h));
1280 reason = computedReason;
1288 return process_authentication(sal,ev);
1291 error=SalErrorUnknown;
1294 error=SalErrorFailure;
1295 sr=SalReasonNotFound;
1298 error=SalErrorFailure;
1302 eXosip_default_action(ev);
1306 error=SalErrorFailure;
1307 sr=SalReasonTemporarilyUnavailable;
1309 error=SalErrorFailure;
1315 error=SalErrorFailure;
1316 sr=SalReasonDoNotDisturb;
1319 error=SalErrorFailure;
1320 sr=SalReasonDeclined;
1324 error=SalErrorFailure;
1325 sr=SalReasonUnknown;
1326 }else error=SalErrorNoResponse;
1328 op->terminated=TRUE;
1329 sal->callbacks.call_failure(op,error,sr,reason,code);
1330 if (computedReason != NULL){
1331 ms_free(computedReason);
1336 /* Request remote side to send us VFU */
1337 void sal_call_send_vfu_request(SalOp *h){
1338 osip_message_t *msg=NULL;
1340 "<?xml version=\"1.0\" encoding=\"utf-8\" ?>"
1344 " <picture_fast_update></picture_fast_update>"
1352 eXosip_call_build_info(h->did,&msg);
1354 osip_message_set_body(msg,info_body,strlen(info_body));
1355 osip_message_set_content_type(msg,"application/media_control+xml");
1356 snprintf(clen,sizeof(clen),"%lu",(unsigned long)strlen(info_body));
1357 osip_message_set_content_length(msg,clen);
1358 eXosip_call_send_request(h->did,msg);
1359 ms_message("Sending VFU request !");
1364 static void process_media_control_xml(Sal *sal, eXosip_event_t *ev){
1365 SalOp *op=find_op(sal,ev);
1366 osip_body_t *body=NULL;
1369 ms_warning("media control xml received without operation context!");
1373 osip_message_get_body(ev->request,0,&body);
1374 if (body && body->body!=NULL &&
1375 strstr(body->body,"picture_fast_update")){
1376 osip_message_t *ans=NULL;
1377 ms_message("Receiving VFU request !");
1378 if (sal->callbacks.vfu_request){
1379 sal->callbacks.vfu_request(op);
1380 eXosip_call_build_answer(ev->tid,200,&ans);
1382 eXosip_call_send_answer(ev->tid,200,ans);
1386 /*in all other cases we must say it is not implemented.*/
1388 osip_message_t *ans=NULL;
1390 eXosip_call_build_answer(ev->tid,501,&ans);
1392 eXosip_call_send_answer(ev->tid,501,ans);
1397 static void process_dtmf_relay(Sal *sal, eXosip_event_t *ev){
1398 SalOp *op=find_op(sal,ev);
1399 osip_body_t *body=NULL;
1402 ms_warning("media dtmf relay received without operation context!");
1406 osip_message_get_body(ev->request,0,&body);
1407 if (body && body->body!=NULL){
1408 osip_message_t *ans=NULL;
1409 const char *name=strstr(body->body,"Signal");
1410 if (name==NULL) name=strstr(body->body,"signal");
1412 ms_warning("Could not extract the dtmf name from the SIP INFO.");
1415 name+=strlen("signal");
1416 if (sscanf(name," = %1s",tmp)==1){
1417 ms_message("Receiving dtmf %s via SIP INFO.",tmp);
1418 if (sal->callbacks.dtmf_received != NULL)
1419 sal->callbacks.dtmf_received(op, tmp[0]);
1423 eXosip_call_build_answer(ev->tid,200,&ans);
1425 eXosip_call_send_answer(ev->tid,200,ans);
1430 static void fill_options_answer(osip_message_t *options){
1431 osip_message_set_allow(options,"INVITE, ACK, BYE, CANCEL, OPTIONS, MESSAGE, SUBSCRIBE, NOTIFY, INFO");
1432 osip_message_set_accept(options,"application/sdp");
1435 static void process_refer(Sal *sal, SalOp *op, eXosip_event_t *ev){
1436 osip_header_t *h=NULL;
1437 osip_message_t *ans=NULL;
1438 ms_message("Receiving REFER request !");
1439 osip_message_header_get_byname(ev->request,"Refer-To",0,&h);
1442 osip_from_t *from=NULL;
1444 osip_from_init(&from);
1446 if (osip_from_parse(from,h->hvalue)==0){
1448 osip_uri_header_t *uh=NULL;
1449 osip_header_t *referred_by=NULL;
1450 osip_uri_header_get_byname(&from->url->url_headers,(char*)"Replaces",&uh);
1451 if (uh!=NULL && uh->gvalue && uh->gvalue[0]!='\0'){
1452 ms_message("Found replaces in Refer-To");
1454 ms_free(op->replaces);
1456 op->replaces=ms_strdup(uh->gvalue);
1458 osip_message_header_get_byname(ev->request,"Referred-By",0,&referred_by);
1459 if (referred_by && referred_by->hvalue && referred_by->hvalue[0]!='\0'){
1460 if (op->referred_by)
1461 ms_free(op->referred_by);
1462 op->referred_by=ms_strdup(referred_by->hvalue);
1465 osip_uri_header_freelist(&from->url->url_headers);
1466 osip_from_to_str(from,&tmp);
1467 sal->callbacks.refer_received(sal,op,tmp);
1469 osip_from_free(from);
1472 eXosip_call_build_answer(ev->tid,202,&ans);
1474 eXosip_call_send_answer(ev->tid,202,ans);
1479 ms_warning("cannot do anything with the refer without destination\n");
1483 static void call_message_new(Sal *sal, eXosip_event_t *ev){
1484 osip_message_t *ans=NULL;
1486 if (MSG_IS_INFO(ev->request)){
1487 osip_content_type_t *ct;
1488 ct=osip_message_get_content_type(ev->request);
1489 if (ct && ct->subtype){
1490 if (strcmp(ct->subtype,"media_control+xml")==0)
1491 process_media_control_xml(sal,ev);
1492 else if (strcmp(ct->subtype,"dtmf-relay")==0)
1493 process_dtmf_relay(sal,ev);
1495 ms_message("Unhandled SIP INFO.");
1496 /*send an "Not implemented" answer*/
1498 eXosip_call_build_answer(ev->tid,501,&ans);
1500 eXosip_call_send_answer(ev->tid,501,ans);
1504 /*empty SIP INFO, probably to test we are alive. Send an empty answer*/
1506 eXosip_call_build_answer(ev->tid,200,&ans);
1508 eXosip_call_send_answer(ev->tid,200,ans);
1511 }else if(MSG_IS_MESSAGE(ev->request)){
1512 /* SIP messages could be received into call */
1513 text_received(sal, ev);
1515 eXosip_call_build_answer(ev->tid,200,&ans);
1517 eXosip_call_send_answer(ev->tid,200,ans);
1519 }else if(MSG_IS_REFER(ev->request)){
1520 SalOp *op=find_op(sal,ev);
1522 ms_message("Receiving REFER request !");
1523 process_refer(sal,op,ev);
1524 }else if(MSG_IS_NOTIFY(ev->request)){
1525 osip_header_t *h=NULL;
1527 SalOp *op=find_op(sal,ev);
1529 ms_message("Receiving NOTIFY request !");
1530 osip_from_to_str(ev->request->from,&from);
1531 osip_message_header_get_byname(ev->request,"Event",0,&h);
1533 sal->callbacks.notify(op,from,h->hvalue);
1534 /*answer that we received the notify*/
1536 eXosip_call_build_answer(ev->tid,200,&ans);
1538 eXosip_call_send_answer(ev->tid,200,ans);
1541 }else if (MSG_IS_OPTIONS(ev->request)){
1543 eXosip_call_build_answer(ev->tid,200,&ans);
1545 fill_options_answer(ans);
1546 eXosip_call_send_answer(ev->tid,200,ans);
1550 }else ms_warning("call_message_new: No request ?");
1553 static void inc_update(Sal *sal, eXosip_event_t *ev){
1554 osip_message_t *msg=NULL;
1555 ms_message("Processing incoming UPDATE");
1557 eXosip_message_build_answer(ev->tid,200,&msg);
1559 eXosip_message_send_answer(ev->tid,200,msg);
1563 static bool_t comes_from_local_if(osip_message_t *msg){
1564 osip_via_t *via=NULL;
1565 osip_message_get_via(msg,0,&via);
1568 host=osip_via_get_host(via);
1569 if (strcmp(host,"127.0.0.1")==0 || strcmp(host,"::1")==0){
1570 osip_generic_param_t *param=NULL;
1571 osip_via_param_get_byname(via,"received",¶m);
1572 if (param==NULL) return TRUE;
1573 if (param->gvalue &&
1574 (strcmp(param->gvalue,"127.0.0.1")==0 || strcmp(param->gvalue,"::1")==0)){
1582 static void text_received(Sal *sal, eXosip_event_t *ev){
1583 osip_body_t *body=NULL;
1584 char *from=NULL,*msg;
1586 osip_message_get_body(ev->request,0,&body);
1588 ms_error("Could not get text message from SIP body");
1592 osip_from_to_str(ev->request->from,&from);
1593 sal->callbacks.text_received(sal,from,msg);
1599 static void other_request(Sal *sal, eXosip_event_t *ev){
1600 ms_message("in other_request");
1601 if (ev->request==NULL) return;
1602 if (strcmp(ev->request->sip_method,"MESSAGE")==0){
1603 text_received(sal,ev);
1604 eXosip_message_send_answer(ev->tid,200,NULL);
1605 }else if (strcmp(ev->request->sip_method,"OPTIONS")==0){
1606 osip_message_t *options=NULL;
1607 eXosip_options_build_answer(ev->tid,200,&options);
1608 fill_options_answer(options);
1609 eXosip_options_send_answer(ev->tid,200,options);
1610 }else if (strcmp(ev->request->sip_method,"WAKEUP")==0
1611 && comes_from_local_if(ev->request)) {
1612 eXosip_message_send_answer(ev->tid,200,NULL);
1613 ms_message("Receiving WAKEUP request !");
1614 sal->callbacks.internal_message(sal,"WAKEUP");
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 606: /*Not acceptable, workaround for proxies that don't like private addresses
1774 in vias, such as ekiga.net
1775 On the opposite, freephonie.net bugs when via are masqueraded.
1777 op->masquerade_via=TRUE;
1779 /* if contact is up to date, process the failure, otherwise resend a new register with
1780 updated contact first, just in case the faillure is due to incorrect contact */
1781 if (ev->response && register_again_with_updated_contact(op,ev->request,ev->response))
1782 return TRUE; /*we are retrying with an updated contact*/
1783 if (status_code==403){
1785 sr=SalReasonForbidden;
1786 }else if (status_code==0){
1787 se=SalErrorNoResponse;
1789 sal->callbacks.register_failure(op,se,sr,reason);
1794 static void other_request_reply(Sal *sal,eXosip_event_t *ev){
1795 SalOp *op=find_op(sal,ev);
1798 ms_warning("other_request_reply(): Receiving response to unknown request.");
1802 update_contact_from_response(op,ev->response);
1803 if (ev->request && strcmp(osip_message_get_method(ev->request),"OPTIONS")==0)
1804 sal->callbacks.ping_reply(op);
1808 static bool_t process_event(Sal *sal, eXosip_event_t *ev){
1809 ms_message("linphone process event get a message %d\n",ev->type);
1811 case EXOSIP_CALL_ANSWERED:
1812 ms_message("CALL_ANSWERED\n");
1813 call_accepted(sal,ev);
1814 authentication_ok(sal,ev);
1816 case EXOSIP_CALL_CLOSED:
1817 case EXOSIP_CALL_CANCELLED:
1818 ms_message("CALL_CLOSED or CANCELLED\n");
1819 call_terminated(sal,ev);
1821 case EXOSIP_CALL_TIMEOUT:
1822 case EXOSIP_CALL_NOANSWER:
1823 ms_message("CALL_TIMEOUT or NOANSWER\n");
1824 return call_failure(sal,ev);
1826 case EXOSIP_CALL_REQUESTFAILURE:
1827 case EXOSIP_CALL_GLOBALFAILURE:
1828 case EXOSIP_CALL_SERVERFAILURE:
1829 ms_message("CALL_REQUESTFAILURE or GLOBALFAILURE or SERVERFAILURE\n");
1830 return call_failure(sal,ev);
1832 case EXOSIP_CALL_RELEASED:
1833 ms_message("CALL_RELEASED\n");
1834 call_released(sal, ev);
1836 case EXOSIP_CALL_INVITE:
1837 ms_message("CALL_NEW\n");
1838 inc_new_call(sal,ev);
1840 case EXOSIP_CALL_REINVITE:
1841 handle_reinvite(sal,ev);
1843 case EXOSIP_CALL_ACK:
1844 ms_message("CALL_ACK");
1847 case EXOSIP_CALL_REDIRECTED:
1848 ms_message("CALL_REDIRECTED");
1849 eXosip_default_action(ev);
1851 case EXOSIP_CALL_PROCEEDING:
1852 ms_message("CALL_PROCEEDING");
1853 call_proceeding(sal,ev);
1855 case EXOSIP_CALL_RINGING:
1856 ms_message("CALL_RINGING");
1857 call_ringing(sal,ev);
1859 case EXOSIP_CALL_MESSAGE_NEW:
1860 ms_message("EXOSIP_CALL_MESSAGE_NEW");
1861 call_message_new(sal,ev);
1863 case EXOSIP_CALL_MESSAGE_REQUESTFAILURE:
1865 (ev->response->status_code==407 || ev->response->status_code==401)){
1866 return process_authentication(sal,ev);
1869 case EXOSIP_IN_SUBSCRIPTION_NEW:
1870 ms_message("CALL_IN_SUBSCRIPTION_NEW ");
1871 sal_exosip_subscription_recv(sal,ev);
1873 case EXOSIP_IN_SUBSCRIPTION_RELEASED:
1874 ms_message("CALL_SUBSCRIPTION_NEW ");
1875 sal_exosip_in_subscription_closed(sal,ev);
1877 case EXOSIP_SUBSCRIPTION_UPDATE:
1878 ms_message("CALL_SUBSCRIPTION_UPDATE");
1880 case EXOSIP_SUBSCRIPTION_NOTIFY:
1881 ms_message("CALL_SUBSCRIPTION_NOTIFY");
1882 sal_exosip_notify_recv(sal,ev);
1884 case EXOSIP_SUBSCRIPTION_ANSWERED:
1885 ms_message("EXOSIP_SUBSCRIPTION_ANSWERED, ev->sid=%i, ev->did=%i\n",ev->sid,ev->did);
1886 sal_exosip_subscription_answered(sal,ev);
1888 case EXOSIP_SUBSCRIPTION_CLOSED:
1889 ms_message("EXOSIP_SUBSCRIPTION_CLOSED\n");
1890 sal_exosip_subscription_closed(sal,ev);
1892 case EXOSIP_SUBSCRIPTION_REQUESTFAILURE: /**< announce a request failure */
1893 if (ev->response && (ev->response->status_code == 407 || ev->response->status_code == 401)){
1894 return process_authentication(sal,ev);
1896 case EXOSIP_SUBSCRIPTION_SERVERFAILURE:
1897 case EXOSIP_SUBSCRIPTION_GLOBALFAILURE:
1898 sal_exosip_subscription_closed(sal,ev);
1900 case EXOSIP_REGISTRATION_FAILURE:
1901 ms_message("REGISTRATION_FAILURE\n");
1902 return registration_failure(sal,ev);
1904 case EXOSIP_REGISTRATION_SUCCESS:
1905 authentication_ok(sal,ev);
1906 registration_success(sal,ev);
1908 case EXOSIP_MESSAGE_NEW:
1909 other_request(sal,ev);
1911 case EXOSIP_MESSAGE_PROCEEDING:
1912 case EXOSIP_MESSAGE_ANSWERED:
1913 case EXOSIP_MESSAGE_REDIRECTED:
1914 case EXOSIP_MESSAGE_SERVERFAILURE:
1915 case EXOSIP_MESSAGE_GLOBALFAILURE:
1916 other_request_reply(sal,ev);
1918 case EXOSIP_MESSAGE_REQUESTFAILURE:
1919 case EXOSIP_NOTIFICATION_REQUESTFAILURE:
1921 switch (ev->response->status_code) {
1924 return process_authentication(sal,ev);
1926 eXosip_automatic_action ();
1931 other_request_reply(sal,ev);
1934 ms_message("Unhandled exosip event ! %i",ev->type);
1940 int sal_iterate(Sal *sal){
1942 while((ev=eXosip_event_wait(0,0))!=NULL){
1943 if (process_event(sal,ev))
1944 eXosip_event_free(ev);
1947 eXosip_automatic_refresh();
1952 static void register_set_contact(osip_message_t *msg, const char *contact){
1953 osip_uri_param_t *param = NULL;
1954 osip_contact_t *ct=NULL;
1956 /*we get the line parameter choosed by exosip, and add it to our own contact*/
1957 osip_message_get_contact(msg,0,&ct);
1959 osip_uri_uparam_get_byname(ct->url, "line", ¶m);
1960 if (param && param->gvalue)
1961 line=osip_strdup(param->gvalue);
1963 _osip_list_set_empty(&msg->contacts,(void (*)(void*))osip_contact_free);
1964 osip_message_set_contact(msg,contact);
1965 osip_message_get_contact(msg,0,&ct);
1966 osip_uri_uparam_add(ct->url,osip_strdup("line"),line);
1969 int sal_register(SalOp *h, const char *proxy, const char *from, int expires){
1970 osip_message_t *msg;
1971 const char *contact=sal_op_get_contact(h);
1973 sal_op_set_route(h,proxy);
1976 h->rid=eXosip_register_build_initial_register(from,proxy,NULL,expires,&msg);
1978 if (contact) register_set_contact(msg,contact);
1979 sal_add_register(h->base.root,h);
1981 ms_error("Could not build initial register.");
1987 eXosip_register_build_register(h->rid,expires,&msg);
1989 eXosip_register_send_register(h->rid,msg);
1995 int sal_register_refresh(SalOp *op, int expires){
1996 osip_message_t *msg=NULL;
1997 const char *contact=sal_op_get_contact(op);
2000 ms_error("Unexistant registration context, not possible to refresh.");
2004 eXosip_register_build_register(op->rid,expires,&msg);
2006 if (contact) register_set_contact(msg,contact);
2007 eXosip_register_send_register(op->rid,msg);
2008 }else ms_error("Could not build REGISTER refresh message.");
2014 int sal_unregister(SalOp *h){
2015 osip_message_t *msg=NULL;
2017 eXosip_register_build_register(h->rid,0,&msg);
2018 if (msg) eXosip_register_send_register(h->rid,msg);
2019 else ms_warning("Could not build unREGISTER !");
2024 SalAddress * sal_address_new(const char *uri){
2026 osip_from_init(&from);
2028 // Remove front spaces
2029 while (uri[0]==' ') {
2033 if (osip_from_parse(from,uri)!=0){
2034 osip_from_free(from);
2037 if (from->displayname!=NULL && from->displayname[0]=='"'){
2038 char *unquoted=osip_strdup_without_quote(from->displayname);
2039 osip_free(from->displayname);
2040 from->displayname=unquoted;
2042 return (SalAddress*)from;
2045 SalAddress * sal_address_clone(const SalAddress *addr){
2046 osip_from_t *ret=NULL;
2047 osip_from_clone((osip_from_t*)addr,&ret);
2048 return (SalAddress*)ret;
2051 #define null_if_empty(s) (((s)!=NULL && (s)[0]!='\0') ? (s) : NULL )
2053 const char *sal_address_get_scheme(const SalAddress *addr){
2054 const osip_from_t *u=(const osip_from_t*)addr;
2055 return null_if_empty(u->url->scheme);
2058 const char *sal_address_get_display_name(const SalAddress* addr){
2059 const osip_from_t *u=(const osip_from_t*)addr;
2060 return null_if_empty(u->displayname);
2063 const char *sal_address_get_username(const SalAddress *addr){
2064 const osip_from_t *u=(const osip_from_t*)addr;
2065 return null_if_empty(u->url->username);
2068 const char *sal_address_get_domain(const SalAddress *addr){
2069 const osip_from_t *u=(const osip_from_t*)addr;
2070 return null_if_empty(u->url->host);
2073 void sal_address_set_display_name(SalAddress *addr, const char *display_name){
2074 osip_from_t *u=(osip_from_t*)addr;
2075 if (u->displayname!=NULL){
2076 osip_free(u->displayname);
2077 u->displayname=NULL;
2079 if (display_name!=NULL && display_name[0]!='\0'){
2080 u->displayname=osip_strdup(display_name);
2084 void sal_address_set_username(SalAddress *addr, const char *username){
2085 osip_from_t *uri=(osip_from_t*)addr;
2086 if (uri->url->username!=NULL){
2087 osip_free(uri->url->username);
2088 uri->url->username=NULL;
2091 uri->url->username=osip_strdup(username);
2094 void sal_address_set_domain(SalAddress *addr, const char *host){
2095 osip_from_t *uri=(osip_from_t*)addr;
2096 if (uri->url->host!=NULL){
2097 osip_free(uri->url->host);
2098 uri->url->host=NULL;
2101 uri->url->host=osip_strdup(host);
2104 void sal_address_set_port(SalAddress *addr, const char *port){
2105 osip_from_t *uri=(osip_from_t*)addr;
2106 if (uri->url->port!=NULL){
2107 osip_free(uri->url->port);
2108 uri->url->port=NULL;
2111 uri->url->port=osip_strdup(port);
2114 void sal_address_set_port_int(SalAddress *uri, int port){
2117 /*this is the default, special case to leave the port field blank*/
2118 sal_address_set_port(uri,NULL);
2121 snprintf(tmp,sizeof(tmp),"%i",port);
2122 sal_address_set_port(uri,tmp);
2125 void sal_address_clean(SalAddress *addr){
2126 osip_generic_param_freelist(& ((osip_from_t*)addr)->gen_params);
2127 osip_uri_param_freelist(& ((osip_from_t*)addr)->url->url_params);
2130 char *sal_address_as_string(const SalAddress *u){
2132 osip_from_t *from=(osip_from_t *)u;
2133 char *old_displayname=NULL;
2134 /* hack to force use of quotes around the displayname*/
2135 if (from->displayname!=NULL
2136 && from->displayname[0]!='"'){
2137 old_displayname=from->displayname;
2138 from->displayname=osip_enquote(from->displayname);
2140 osip_from_to_str(from,&tmp);
2141 if (old_displayname!=NULL){
2142 ms_free(from->displayname);
2143 from->displayname=old_displayname;
2150 char *sal_address_as_string_uri_only(const SalAddress *u){
2151 char *tmp=NULL,*ret;
2152 osip_uri_to_str(((osip_from_t*)u)->url,&tmp);
2157 void sal_address_set_param(SalAddress *u,const char* name,const char* value) {
2158 osip_uri_param_t *param=NULL;
2159 osip_uri_uparam_get_byname(((osip_from_t*)u)->url,(char*)name,¶m);
2161 osip_uri_uparam_add (((osip_from_t*)u)->url,ms_strdup(name),ms_strdup(value));
2163 osip_free(param->gvalue);
2164 param->gvalue=osip_strdup(value);
2169 void sal_address_destroy(SalAddress *u){
2170 osip_from_free((osip_from_t*)u);
2173 void sal_set_keepalive_period(Sal *ctx,unsigned int value) {
2174 ctx->keepalive_period=value;
2175 eXosip_set_option (EXOSIP_OPT_UDP_KEEP_ALIVE, &value);
2177 unsigned int sal_get_keepalive_period(Sal *ctx) {
2178 return ctx->keepalive_period;
2181 const char * sal_address_get_port(const SalAddress *addr) {
2182 const osip_from_t *u=(const osip_from_t*)addr;
2183 return null_if_empty(u->url->port);
2186 int sal_address_get_port_int(const SalAddress *uri) {
2187 const char* port = sal_address_get_port(uri);
2194 SalTransport sal_address_get_transport(const SalAddress* addr) {
2195 const osip_from_t *u=(const osip_from_t*)addr;
2196 osip_uri_param_t *transport_param=NULL;
2197 osip_uri_uparam_get_byname(u->url,"transport",&transport_param);
2198 if (transport_param == NULL){
2199 return SalTransportUDP;
2201 return sal_transport_parse(transport_param->gvalue);
2204 void sal_address_set_transport(SalAddress* addr,SalTransport transport) {
2205 sal_address_set_param(addr, "transport", sal_transport_to_string(transport));
2208 /* sends a reinvite. Local media description may have changed by application since call establishment*/
2209 int sal_call_update(SalOp *h, const char *subject){
2211 osip_message_t *reinvite=NULL;
2214 if(eXosip_call_build_request(h->did,"INVITE",&reinvite) != 0 || reinvite==NULL){
2219 osip_message_set_subject(reinvite,subject);
2220 osip_message_set_allow(reinvite, "INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, NOTIFY, MESSAGE, SUBSCRIBE, INFO");
2221 if (h->base.root->session_expires!=0){
2222 osip_message_set_header(reinvite, "Session-expires", "200");
2223 osip_message_set_supported(reinvite, "timer");
2225 if (h->base.local_media){
2226 h->sdp_offering=TRUE;
2227 set_sdp_from_desc(reinvite,h->base.local_media);
2228 }else h->sdp_offering=FALSE;
2230 err = eXosip_call_send_request(h->did, reinvite);
2234 void sal_reuse_authorization(Sal *ctx, bool_t value) {
2235 ctx->reuse_authorization=value;