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;
287 void sal_uninit(Sal* sal){
292 void sal_set_user_pointer(Sal *sal, void *user_data){
296 void *sal_get_user_pointer(const Sal *sal){
300 static void unimplemented_stub(){
301 ms_warning("Unimplemented SAL callback");
304 void sal_set_callbacks(Sal *ctx, const SalCallbacks *cbs){
305 memcpy(&ctx->callbacks,cbs,sizeof(*cbs));
306 if (ctx->callbacks.call_received==NULL)
307 ctx->callbacks.call_received=(SalOnCallReceived)unimplemented_stub;
308 if (ctx->callbacks.call_ringing==NULL)
309 ctx->callbacks.call_ringing=(SalOnCallRinging)unimplemented_stub;
310 if (ctx->callbacks.call_accepted==NULL)
311 ctx->callbacks.call_accepted=(SalOnCallAccepted)unimplemented_stub;
312 if (ctx->callbacks.call_failure==NULL)
313 ctx->callbacks.call_failure=(SalOnCallFailure)unimplemented_stub;
314 if (ctx->callbacks.call_terminated==NULL)
315 ctx->callbacks.call_terminated=(SalOnCallTerminated)unimplemented_stub;
316 if (ctx->callbacks.call_released==NULL)
317 ctx->callbacks.call_released=(SalOnCallReleased)unimplemented_stub;
318 if (ctx->callbacks.call_updating==NULL)
319 ctx->callbacks.call_updating=(SalOnCallUpdating)unimplemented_stub;
320 if (ctx->callbacks.auth_requested==NULL)
321 ctx->callbacks.auth_requested=(SalOnAuthRequested)unimplemented_stub;
322 if (ctx->callbacks.auth_success==NULL)
323 ctx->callbacks.auth_success=(SalOnAuthSuccess)unimplemented_stub;
324 if (ctx->callbacks.register_success==NULL)
325 ctx->callbacks.register_success=(SalOnRegisterSuccess)unimplemented_stub;
326 if (ctx->callbacks.register_failure==NULL)
327 ctx->callbacks.register_failure=(SalOnRegisterFailure)unimplemented_stub;
328 if (ctx->callbacks.dtmf_received==NULL)
329 ctx->callbacks.dtmf_received=(SalOnDtmfReceived)unimplemented_stub;
330 if (ctx->callbacks.notify==NULL)
331 ctx->callbacks.notify=(SalOnNotify)unimplemented_stub;
332 if (ctx->callbacks.notify_presence==NULL)
333 ctx->callbacks.notify_presence=(SalOnNotifyPresence)unimplemented_stub;
334 if (ctx->callbacks.subscribe_received==NULL)
335 ctx->callbacks.subscribe_received=(SalOnSubscribeReceived)unimplemented_stub;
336 if (ctx->callbacks.text_received==NULL)
337 ctx->callbacks.text_received=(SalOnTextReceived)unimplemented_stub;
338 if (ctx->callbacks.internal_message==NULL)
339 ctx->callbacks.internal_message=(SalOnInternalMsg)unimplemented_stub;
340 if (ctx->callbacks.ping_reply==NULL)
341 ctx->callbacks.ping_reply=(SalOnPingReply)unimplemented_stub;
344 int sal_unlisten_ports(Sal *ctx){
353 int sal_listen_port(Sal *ctx, const char *addr, int port, SalTransport tr, int is_secure){
356 int proto=IPPROTO_UDP;
357 int keepalive = ctx->keepalive_period;
360 case SalTransportUDP:
362 eXosip_set_option (EXOSIP_OPT_UDP_KEEP_ALIVE, &keepalive);
364 case SalTransportTCP:
367 eXosip_set_option (EXOSIP_OPT_UDP_KEEP_ALIVE,&keepalive);
370 ms_warning("unexpected proto, using datagram");
374 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
375 version of eXosip, which is not the case*/
376 /*see if it looks like an IPv6 address*/
377 int use_rports = ctx->use_rports; // Copy char to int to avoid bad alignment
378 eXosip_set_option(EXOSIP_OPT_USE_RPORT,&use_rports);
379 int dont_use_101 = !ctx->use_101; // Copy char to int to avoid bad alignment
380 eXosip_set_option(EXOSIP_OPT_DONT_SEND_101,&dont_use_101);
382 ipv6=strchr(addr,':')!=NULL;
383 eXosip_enable_ipv6(ipv6);
386 ms_fatal("SIP over TLS or DTLS is not supported yet.");
389 err=eXosip_listen_addr(proto, addr, port, ipv6 ? PF_INET6 : PF_INET, 0);
390 #ifdef HAVE_EXOSIP_GET_SOCKET
391 ms_message("Exosip has socket number %i",eXosip_get_socket(proto));
398 ortp_socket_t sal_get_socket(Sal *ctx){
399 #ifdef HAVE_EXOSIP_GET_SOCKET
400 return eXosip_get_socket(IPPROTO_UDP);
402 ms_warning("Sorry, eXosip does not have eXosip_get_socket() method");
407 void sal_set_user_agent(Sal *ctx, const char *user_agent){
408 eXosip_set_user_agent(user_agent);
411 void sal_use_session_timers(Sal *ctx, int expires){
412 ctx->session_expires=expires;
415 void sal_use_one_matching_codec_policy(Sal *ctx, bool_t one_matching_codec){
416 ctx->one_matching_codec=one_matching_codec;
419 MSList *sal_get_pending_auths(Sal *sal){
420 return ms_list_copy(sal->pending_auths);
423 void sal_use_double_registrations(Sal *ctx, bool_t enabled){
424 ctx->double_reg=enabled;
427 void sal_use_rport(Sal *ctx, bool_t use_rports){
428 ctx->use_rports=use_rports;
430 void sal_use_101(Sal *ctx, bool_t use_101){
431 ctx->use_101=use_101;
434 static int extract_received_rport(osip_message_t *msg, const char **received, int *rportval,SalTransport* transport){
435 osip_via_t *via=NULL;
436 osip_generic_param_t *param=NULL;
437 const char *rport=NULL;
441 osip_message_get_via(msg,0,&via);
444 *transport = sal_transport_parse(via->protocol);
446 if (via->port && via->port[0]!='\0')
447 *rportval=atoi(via->port);
449 osip_via_param_get_byname(via,"rport",¶m);
452 if (rport && rport[0]!='\0') *rportval=atoi(rport);
456 osip_via_param_get_byname(via,"received",¶m);
457 if (param) *received=param->gvalue;
459 if (rport==NULL && *received==NULL) return -1;
463 static void set_sdp(osip_message_t *sip,sdp_message_t *msg){
467 sdp_message_to_str(msg,&sdp);
469 snprintf(clen,sizeof(clen),"%i",sdplen);
470 osip_message_set_body(sip,sdp,sdplen);
471 osip_message_set_content_type(sip,"application/sdp");
472 osip_message_set_content_length(sip,clen);
476 static void set_sdp_from_desc(osip_message_t *sip, const SalMediaDescription *desc){
477 sdp_message_t *msg=media_description_to_sdp(desc);
479 ms_error("Fail to print sdp message !");
483 sdp_message_free(msg);
486 static void sdp_process(SalOp *h){
487 ms_message("Doing SDP offer/answer process");
489 sal_media_description_unref(h->result);
491 h->result=sal_media_description_new();
492 if (h->sdp_offering){
493 offer_answer_initiate_outgoing(h->base.local_media,h->base.remote_media,h->result);
496 offer_answer_initiate_incoming(h->base.local_media,h->base.remote_media,h->result,h->base.root->one_matching_codec);
497 h->sdp_answer=media_description_to_sdp(h->result);
498 /*once we have generated the SDP answer, we modify the result description for processing by the upper layer.
499 It should contains media parameters constraint from the remote offer, not our response*/
500 strcpy(h->result->addr,h->base.remote_media->addr);
501 h->result->bandwidth=h->base.remote_media->bandwidth;
502 for(i=0;i<h->result->nstreams;++i){
503 if (h->result->streams[i].port>0){
504 strcpy(h->result->streams[i].addr,h->base.remote_media->streams[i].addr);
505 h->result->streams[i].ptime=h->base.remote_media->streams[i].ptime;
506 h->result->streams[i].bandwidth=h->base.remote_media->streams[i].bandwidth;
507 h->result->streams[i].port=h->base.remote_media->streams[i].port;
514 int sal_call_is_offerer(const SalOp *h){
515 return h->sdp_offering;
518 int sal_call_set_local_media_description(SalOp *h, SalMediaDescription *desc){
520 sal_media_description_ref(desc);
521 if (h->base.local_media)
522 sal_media_description_unref(h->base.local_media);
523 h->base.local_media=desc;
527 int sal_call(SalOp *h, const char *from, const char *to){
529 osip_message_t *invite=NULL;
530 sal_op_set_from(h,from);
532 sal_exosip_fix_route(h);
533 err=eXosip_call_build_initial_invite(&invite,to,from,sal_op_get_route(h),"Phone call");
535 ms_error("Could not create call.");
538 osip_message_set_allow(invite, "INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, NOTIFY, MESSAGE, SUBSCRIBE, INFO");
539 if (h->base.contact){
540 _osip_list_set_empty(&invite->contacts,(void (*)(void*))osip_contact_free);
541 osip_message_set_contact(invite,h->base.contact);
543 if (h->base.root->session_expires!=0){
544 osip_message_set_header(invite, "Session-expires", "200");
545 osip_message_set_supported(invite, "timer");
547 if (h->base.local_media){
548 h->sdp_offering=TRUE;
549 set_sdp_from_desc(invite,h->base.local_media);
550 }else h->sdp_offering=FALSE;
552 osip_message_set_header(invite,"Replaces",h->replaces);
554 osip_message_set_header(invite,"Referred-By",h->referred_by);
558 err=eXosip_call_send_initial_invite(invite);
562 ms_error("Fail to send invite !");
565 sal_add_call(h->base.root,h);
570 int sal_call_notify_ringing(SalOp *h, bool_t early_media){
573 /*if early media send also 180 and 183 */
574 if (early_media && h->sdp_answer){
577 eXosip_call_build_answer(h->tid,180,&msg);
579 set_sdp(msg,h->sdp_answer);
580 eXosip_call_send_answer(h->tid,180,msg);
583 eXosip_call_build_answer(h->tid,183,&msg);
585 set_sdp(msg,h->sdp_answer);
586 eXosip_call_send_answer(h->tid,183,msg);
591 eXosip_call_send_answer(h->tid,180,NULL);
597 int sal_call_accept(SalOp * h){
599 const char *contact=sal_op_get_contact(h);
601 int err=eXosip_call_build_answer(h->tid,200,&msg);
602 if (err<0 || msg==NULL){
603 ms_error("Fail to build answer for call: err=%i",err);
606 if (h->base.root->session_expires!=0){
607 if (h->supports_session_timers) osip_message_set_supported(msg, "timer");
611 _osip_list_set_empty(&msg->contacts,(void (*)(void*))osip_contact_free);
612 osip_message_set_contact(msg,contact);
615 if (h->base.local_media){
616 /*this is the case where we received an invite without SDP*/
617 if (h->sdp_offering) {
618 set_sdp_from_desc(msg,h->base.local_media);
621 set_sdp(msg,h->sdp_answer);
622 sdp_message_free(h->sdp_answer);
627 ms_error("You are accepting a call but not defined any media capabilities !");
629 eXosip_call_send_answer(h->tid,200,msg);
633 int sal_call_decline(SalOp *h, SalReason reason, const char *redirect){
634 if (reason==SalReasonBusy){
636 eXosip_call_send_answer(h->tid,486,NULL);
639 else if (reason==SalReasonTemporarilyUnavailable){
641 eXosip_call_send_answer(h->tid,480,NULL);
643 }else if (reason==SalReasonDoNotDisturb){
645 eXosip_call_send_answer(h->tid,600,NULL);
647 }else if (reason==SalReasonMedia){
649 eXosip_call_send_answer(h->tid,415,NULL);
651 }else if (redirect!=NULL && reason==SalReasonRedirect){
654 if (strstr(redirect,"sip:")!=0) code=302;
657 eXosip_call_build_answer(h->tid,code,&msg);
658 osip_message_set_contact(msg,redirect);
659 eXosip_call_send_answer(h->tid,code,msg);
661 }else sal_call_terminate(h);
665 SalMediaDescription * sal_call_get_final_media_description(SalOp *h){
666 if (h->base.local_media && h->base.remote_media && !h->result){
672 int sal_call_set_referer(SalOp *h, SalOp *refered_call){
673 if (refered_call->replaces)
674 h->replaces=ms_strdup(refered_call->replaces);
675 if (refered_call->referred_by)
676 h->referred_by=ms_strdup(refered_call->referred_by);
680 int sal_ping(SalOp *op, const char *from, const char *to){
681 osip_message_t *options=NULL;
683 sal_op_set_from(op,from);
684 sal_op_set_to(op,to);
685 /*bug here: eXosip2 does not honor the route argument*/
686 eXosip_options_build_request (&options, sal_op_get_to(op),
687 sal_op_get_from(op),sal_op_get_route(op));
689 if (op->base.root->session_expires!=0){
690 osip_message_set_header(options, "Session-expires", "200");
691 osip_message_set_supported(options, "timer");
693 sal_add_other(sal_op_get_sal(op),op,options);
694 return eXosip_options_send_request(options);
699 int sal_call_accept_refer(SalOp *op){
700 osip_message_t *msg=NULL;
703 err = eXosip_call_build_notify(op->did,EXOSIP_SUBCRSTATE_ACTIVE,&msg);
706 osip_message_set_header(msg,(const char *)"event","refer");
707 osip_message_set_content_type(msg,"message/sipfrag");
708 osip_message_set_body(msg,"SIP/2.0 100 Trying",sizeof("SIP/2.0 100 Trying"));
709 eXosip_call_send_request(op->did,msg);
713 ms_error("could not get a notify built\n");
719 int sal_call_refer(SalOp *h, const char *refer_to){
720 osip_message_t *msg=NULL;
723 eXosip_call_build_refer(h->did,refer_to, &msg);
724 if (msg) err=eXosip_call_send_request(h->did, msg);
730 int sal_call_refer_with_replaces(SalOp *h, SalOp *other_call_h){
731 osip_message_t *msg=NULL;
732 char referto[256]={0};
735 if (eXosip_call_get_referto(other_call_h->did,referto,sizeof(referto)-1)!=0){
736 ms_error("eXosip_call_get_referto() failed for did=%i",other_call_h->did);
740 eXosip_call_build_refer(h->did,referto, &msg);
741 osip_message_set_header(msg,"Referred-By",h->base.from);
742 if (msg) err=eXosip_call_send_request(h->did, msg);
748 SalOp *sal_call_get_replaces(SalOp *h){
749 if (h->replaces!=NULL){
752 cid=eXosip_call_find_by_replaces(h->replaces);
755 SalOp *ret=sal_find_call(h->base.root,cid);
762 int sal_call_send_dtmf(SalOp *h, char dtmf){
763 osip_message_t *msg=NULL;
768 eXosip_call_build_info(h->did,&msg);
770 snprintf(dtmf_body, sizeof(dtmf_body), "Signal=%c\r\nDuration=250\r\n", dtmf);
771 osip_message_set_body(msg,dtmf_body,strlen(dtmf_body));
772 osip_message_set_content_type(msg,"application/dtmf-relay");
773 snprintf(clen,sizeof(clen),"%lu",(unsigned long)strlen(dtmf_body));
774 osip_message_set_content_length(msg,clen);
775 eXosip_call_send_request(h->did,msg);
781 static void push_auth_to_exosip(const SalAuthInfo *info){
783 if (info->userid==NULL || info->userid[0]=='\0') userid=info->username;
784 else userid=info->userid;
785 ms_message("Authentication info for username [%s], id[%s], realm [%s] added to eXosip", info->username,userid, info->realm);
786 eXosip_add_authentication_info (info->username,userid,
787 info->password, NULL,info->realm);
790 * Just for symmetry ;-)
792 static void pop_auth_from_exosip() {
793 eXosip_clear_authentication_info();
796 int sal_call_terminate(SalOp *h){
798 if (h->auth_info) push_auth_to_exosip(h->auth_info);
800 err=eXosip_call_terminate(h->cid,h->did);
802 if (!h->base.root->reuse_authorization) pop_auth_from_exosip();
804 ms_warning("Exosip could not terminate the call: cid=%i did=%i", h->cid,h->did);
810 void sal_op_authenticate(SalOp *h, const SalAuthInfo *info){
811 if (h->pending_auth){
812 push_auth_to_exosip(info);
814 /*FIXME exosip does not take into account this update register message*/
816 if (fix_message_contact(h, h->pending_auth->request,h->pending_auth->response)) {
820 update_contact_from_response(h,h->pending_auth->response);
822 eXosip_default_action(h->pending_auth);
824 ms_message("eXosip_default_action() done");
825 if (!h->base.root->reuse_authorization) pop_auth_from_exosip();
827 if (h->auth_info) sal_auth_info_delete(h->auth_info); /*if already exist*/
828 h->auth_info=sal_auth_info_clone(info); /*store auth info for subsequent request*/
831 void sal_op_cancel_authentication(SalOp *h) {
833 sal_op_get_sal(h)->callbacks.register_failure(h,SalErrorFailure, SalReasonForbidden,_("Authentication failure"));
834 } else if (h->cid >0) {
835 sal_op_get_sal(h)->callbacks.call_failure(h,SalErrorFailure, SalReasonForbidden,_("Authentication failure"),0);
837 ms_warning("Auth failure not handled");
841 static void set_network_origin(SalOp *op, osip_message_t *req){
842 const char *received=NULL;
845 SalTransport transport;
846 if (extract_received_rport(req,&received,&rport,&transport)!=0){
847 osip_via_t *via=NULL;
849 osip_message_get_via(req,0,&via);
850 received=osip_via_get_host(via);
851 tmp=osip_via_get_port(via);
852 if (tmp) rport=atoi(tmp);
854 if (transport != SalTransportUDP) {
855 snprintf(origin,sizeof(origin)-1,"sip:%s:%i",received,rport);
857 snprintf(origin,sizeof(origin)-1,"sip:%s:%i;transport=%s",received,rport,sal_transport_to_string(transport));
859 __sal_op_set_network_origin(op,origin);
862 static void set_remote_ua(SalOp* op, osip_message_t *req){
863 if (op->base.remote_ua==NULL){
864 osip_header_t *h=NULL;
865 osip_message_get_user_agent(req,0,&h);
867 op->base.remote_ua=ms_strdup(h->hvalue);
872 static void set_replaces(SalOp *op, osip_message_t *req){
873 osip_header_t *h=NULL;
876 ms_free(op->replaces);
879 osip_message_header_get_byname(req,"replaces",0,&h);
881 if (h->hvalue && h->hvalue[0]!='\0'){
882 op->replaces=ms_strdup(h->hvalue);
887 static SalOp *find_op(Sal *sal, eXosip_event_t *ev){
889 return sal_find_call(sal,ev->cid);
892 return sal_find_register(sal,ev->rid);
895 return sal_find_out_subscribe(sal,ev->sid);
898 return sal_find_in_subscribe(sal,ev->nid);
900 if (ev->response) return sal_find_other(sal,ev->response);
904 static void inc_new_call(Sal *sal, eXosip_event_t *ev){
905 SalOp *op=sal_op_new(sal);
906 osip_from_t *from,*to;
907 osip_call_info_t *call_info;
909 sdp_message_t *sdp=eXosip_get_sdp_info(ev->request);
911 set_network_origin(op,ev->request);
912 set_remote_ua(op,ev->request);
913 set_replaces(op,ev->request);
916 op->sdp_offering=FALSE;
917 op->base.remote_media=sal_media_description_new();
918 sdp_to_media_description(sdp,op->base.remote_media);
919 sdp_message_free(sdp);
920 }else op->sdp_offering=TRUE;
922 from=osip_message_get_from(ev->request);
923 to=osip_message_get_to(ev->request);
924 osip_from_to_str(from,&tmp);
925 sal_op_set_from(op,tmp);
927 osip_from_to_str(to,&tmp);
928 sal_op_set_to(op,tmp);
931 osip_message_get_call_info(ev->request,0,&call_info);
934 osip_call_info_to_str(call_info,&tmp);
935 if( strstr(tmp,"answer-after=") != NULL)
937 op->auto_answer_asked=TRUE;
938 ms_message("The caller asked to automatically answer the call(Emergency?)\n");
947 sal_add_call(op->base.root,op);
948 sal->callbacks.call_received(op);
951 static void handle_reinvite(Sal *sal, eXosip_event_t *ev){
952 SalOp *op=find_op(sal,ev);
954 osip_message_t *msg=NULL;
957 ms_warning("Reinvite for non-existing operation !");
962 sdp=eXosip_get_sdp_info(ev->request);
963 if (op->base.remote_media){
964 sal_media_description_unref(op->base.remote_media);
965 op->base.remote_media=NULL;
968 sal_media_description_unref(op->result);
972 op->sdp_offering=FALSE;
973 op->base.remote_media=sal_media_description_new();
974 sdp_to_media_description(sdp,op->base.remote_media);
975 sdp_message_free(sdp);
976 sal->callbacks.call_updating(op);
978 op->sdp_offering=TRUE;
980 eXosip_call_build_answer(ev->tid,200,&msg);
982 set_sdp_from_desc(msg,op->base.local_media);
983 eXosip_call_send_answer(ev->tid,200,msg);
990 static void handle_ack(Sal *sal, eXosip_event_t *ev){
991 SalOp *op=find_op(sal,ev);
995 ms_warning("ack for non-existing call !");
998 sdp=eXosip_get_sdp_info(ev->ack);
1000 op->base.remote_media=sal_media_description_new();
1001 sdp_to_media_description(sdp,op->base.remote_media);
1003 sdp_message_free(sdp);
1006 if (sdp) sal->callbacks.call_updating(op);
1009 sal->callbacks.call_ack(op);
1013 static void update_contact_from_response(SalOp *op, osip_message_t *response){
1014 const char *received;
1016 SalTransport transport;
1017 if (extract_received_rport(response,&received,&rport,&transport)==0){
1018 const char *contact=sal_op_get_contact(op);
1020 /*no contact given yet, use from instead*/
1021 contact=sal_op_get_from(op);
1024 SalAddress *addr=sal_address_new(contact);
1026 sal_address_set_domain(addr,received);
1027 sal_address_set_port_int(addr,rport);
1028 if (transport!=SalTransportUDP)
1029 sal_address_set_transport(addr,transport);
1030 tmp=sal_address_as_string(addr);
1031 ms_message("Contact address updated to %s",tmp);
1032 sal_op_set_contact(op,tmp);
1033 sal_address_destroy(addr);
1039 static int call_proceeding(Sal *sal, eXosip_event_t *ev){
1040 SalOp *op=find_op(sal,ev);
1042 if (op==NULL || op->terminated==TRUE) {
1043 ms_warning("This call has been canceled.");
1045 eXosip_call_terminate(ev->cid,ev->did);
1053 /* update contact if received and rport are set by the server
1054 note: will only be used by remote for next INVITE, if any...*/
1055 update_contact_from_response(op,ev->response);
1059 static void call_ringing(Sal *sal, eXosip_event_t *ev){
1061 SalOp *op=find_op(sal,ev);
1062 if (call_proceeding(sal, ev)==-1) return;
1064 set_remote_ua(op,ev->response);
1065 sdp=eXosip_get_sdp_info(ev->response);
1067 op->base.remote_media=sal_media_description_new();
1068 sdp_to_media_description(sdp,op->base.remote_media);
1069 sdp_message_free(sdp);
1070 if (op->base.local_media) sdp_process(op);
1072 sal->callbacks.call_ringing(op);
1075 static void call_accepted(Sal *sal, eXosip_event_t *ev){
1077 osip_message_t *msg=NULL;
1078 SalOp *op=find_op(sal,ev);
1079 const char *contact;
1081 if (op==NULL || op->terminated==TRUE) {
1082 ms_warning("This call has been already terminated.");
1084 eXosip_call_terminate(ev->cid,ev->did);
1090 set_remote_ua(op,ev->response);
1092 sdp=eXosip_get_sdp_info(ev->response);
1094 op->base.remote_media=sal_media_description_new();
1095 sdp_to_media_description(sdp,op->base.remote_media);
1096 sdp_message_free(sdp);
1097 if (op->base.local_media) sdp_process(op);
1099 eXosip_call_build_ack(ev->did,&msg);
1100 contact=sal_op_get_contact(op);
1102 _osip_list_set_empty(&msg->contacts,(void (*)(void*))osip_contact_free);
1103 osip_message_set_contact(msg,contact);
1105 if (op->sdp_answer){
1106 set_sdp(msg,op->sdp_answer);
1107 sdp_message_free(op->sdp_answer);
1108 op->sdp_answer=NULL;
1110 eXosip_call_send_ack(ev->did,msg);
1111 sal->callbacks.call_accepted(op);
1114 static void call_terminated(Sal *sal, eXosip_event_t *ev){
1116 SalOp *op=find_op(sal,ev);
1118 ms_warning("Call terminated for already closed call ?");
1122 osip_from_to_str(ev->request->from,&from);
1124 sal->callbacks.call_terminated(op,from!=NULL ? from : sal_op_get_from(op));
1125 if (from) osip_free(from);
1126 op->terminated=TRUE;
1129 static void call_released(Sal *sal, eXosip_event_t *ev){
1130 SalOp *op=find_op(sal,ev);
1132 ms_warning("No op associated to this call_released()");
1135 if (!op->terminated){
1136 /* no response received so far */
1137 call_failure(sal,ev);
1139 sal->callbacks.call_released(op);
1142 static int get_auth_data_from_response(osip_message_t *resp, const char **realm, const char **username){
1143 const char *prx_realm=NULL,*www_realm=NULL;
1144 osip_proxy_authenticate_t *prx_auth;
1145 osip_www_authenticate_t *www_auth;
1147 *username=osip_uri_get_username(resp->from->url);
1148 prx_auth=(osip_proxy_authenticate_t*)osip_list_get(&resp->proxy_authenticates,0);
1149 www_auth=(osip_proxy_authenticate_t*)osip_list_get(&resp->www_authenticates,0);
1151 prx_realm=osip_proxy_authenticate_get_realm(prx_auth);
1153 www_realm=osip_www_authenticate_get_realm(www_auth);
1157 }else if (www_realm){
1165 static int get_auth_data_from_request(osip_message_t *msg, const char **realm, const char **username){
1166 osip_authorization_t *auth=NULL;
1167 osip_proxy_authorization_t *prx_auth=NULL;
1169 *username=osip_uri_get_username(msg->from->url);
1170 osip_message_get_authorization(msg, 0, &auth);
1172 *realm=osip_authorization_get_realm(auth);
1175 osip_message_get_proxy_authorization(msg,0,&prx_auth);
1177 *realm=osip_proxy_authorization_get_realm(prx_auth);
1183 static int get_auth_data(eXosip_event_t *ev, const char **realm, const char **username){
1184 if (ev->response && get_auth_data_from_response(ev->response,realm,username)==0) return 0;
1185 if (ev->request && get_auth_data_from_request(ev->request,realm,username)==0) return 0;
1189 int sal_op_get_auth_requested(SalOp *op, const char **realm, const char **username){
1190 if (op->pending_auth){
1191 return get_auth_data(op->pending_auth,realm,username);
1196 static bool_t process_authentication(Sal *sal, eXosip_event_t *ev){
1198 const char *username,*realm;
1201 ms_warning("No operation associated with this authentication !");
1204 if (get_auth_data(ev,&realm,&username)==0){
1205 if (op->pending_auth!=NULL){
1206 eXosip_event_free(op->pending_auth);
1207 op->pending_auth=ev;
1209 op->pending_auth=ev;
1210 sal_add_pending_auth(sal,op);
1213 sal->callbacks.auth_requested(op,realm,username);
1219 static void authentication_ok(Sal *sal, eXosip_event_t *ev){
1221 const char *username,*realm;
1224 ms_warning("No operation associated with this authentication_ok!");
1227 if (op->pending_auth){
1228 eXosip_event_free(op->pending_auth);
1229 sal_remove_pending_auth(sal,op);
1230 op->pending_auth=NULL;
1232 if (get_auth_data(ev,&realm,&username)==0){
1233 sal->callbacks.auth_success(op,realm,username);
1237 static bool_t call_failure(Sal *sal, eXosip_event_t *ev){
1240 char* computedReason=NULL;
1241 const char *reason=NULL;
1242 SalError error=SalErrorUnknown;
1243 SalReason sr=SalReasonUnknown;
1246 op=(SalOp*)find_op(sal,ev);
1249 ms_warning("Call failure reported for a closed call, ignored.");
1254 code=osip_message_get_status_code(ev->response);
1255 reason=osip_message_get_reason_phrase(ev->response);
1256 osip_header_t *h=NULL;
1257 if (!osip_message_header_get_byname( ev->response
1261 computedReason = ms_strdup_printf("%s %s",reason,osip_header_get_value(h));
1262 reason = computedReason;
1270 return process_authentication(sal,ev);
1273 error=SalErrorUnknown;
1276 error=SalErrorFailure;
1277 sr=SalReasonNotFound;
1280 error=SalErrorFailure;
1284 eXosip_default_action(ev);
1288 error=SalErrorFailure;
1289 sr=SalReasonTemporarilyUnavailable;
1291 error=SalErrorFailure;
1297 error=SalErrorFailure;
1298 sr=SalReasonDoNotDisturb;
1301 error=SalErrorFailure;
1302 sr=SalReasonDeclined;
1306 error=SalErrorFailure;
1307 sr=SalReasonUnknown;
1308 }else error=SalErrorNoResponse;
1310 op->terminated=TRUE;
1311 sal->callbacks.call_failure(op,error,sr,reason,code);
1312 if (computedReason != NULL){
1313 ms_free(computedReason);
1318 /* Request remote side to send us VFU */
1319 void sal_call_send_vfu_request(SalOp *h){
1320 osip_message_t *msg=NULL;
1322 "<?xml version=\"1.0\" encoding=\"utf-8\" ?>"
1326 " <picture_fast_update></picture_fast_update>"
1334 eXosip_call_build_info(h->did,&msg);
1336 osip_message_set_body(msg,info_body,strlen(info_body));
1337 osip_message_set_content_type(msg,"application/media_control+xml");
1338 snprintf(clen,sizeof(clen),"%lu",(unsigned long)strlen(info_body));
1339 osip_message_set_content_length(msg,clen);
1340 eXosip_call_send_request(h->did,msg);
1341 ms_message("Sending VFU request !");
1346 static void process_media_control_xml(Sal *sal, eXosip_event_t *ev){
1347 SalOp *op=find_op(sal,ev);
1348 osip_body_t *body=NULL;
1351 ms_warning("media control xml received without operation context!");
1355 osip_message_get_body(ev->request,0,&body);
1356 if (body && body->body!=NULL &&
1357 strstr(body->body,"picture_fast_update")){
1358 osip_message_t *ans=NULL;
1359 ms_message("Receiving VFU request !");
1360 if (sal->callbacks.vfu_request){
1361 sal->callbacks.vfu_request(op);
1362 eXosip_call_build_answer(ev->tid,200,&ans);
1364 eXosip_call_send_answer(ev->tid,200,ans);
1368 /*in all other cases we must say it is not implemented.*/
1370 osip_message_t *ans=NULL;
1372 eXosip_call_build_answer(ev->tid,501,&ans);
1374 eXosip_call_send_answer(ev->tid,501,ans);
1379 static void process_dtmf_relay(Sal *sal, eXosip_event_t *ev){
1380 SalOp *op=find_op(sal,ev);
1381 osip_body_t *body=NULL;
1384 ms_warning("media dtmf relay received without operation context!");
1388 osip_message_get_body(ev->request,0,&body);
1389 if (body && body->body!=NULL){
1390 osip_message_t *ans=NULL;
1391 const char *name=strstr(body->body,"Signal");
1392 if (name==NULL) name=strstr(body->body,"signal");
1394 ms_warning("Could not extract the dtmf name from the SIP INFO.");
1397 name+=strlen("signal");
1398 if (sscanf(name," = %1s",tmp)==1){
1399 ms_message("Receiving dtmf %s via SIP INFO.",tmp);
1400 if (sal->callbacks.dtmf_received != NULL)
1401 sal->callbacks.dtmf_received(op, tmp[0]);
1405 eXosip_call_build_answer(ev->tid,200,&ans);
1407 eXosip_call_send_answer(ev->tid,200,ans);
1412 static void fill_options_answer(osip_message_t *options){
1413 osip_message_set_allow(options,"INVITE, ACK, BYE, CANCEL, OPTIONS, MESSAGE, SUBSCRIBE, NOTIFY, INFO");
1414 osip_message_set_accept(options,"application/sdp");
1417 static void process_refer(Sal *sal, SalOp *op, eXosip_event_t *ev){
1418 osip_header_t *h=NULL;
1419 osip_message_t *ans=NULL;
1420 ms_message("Receiving REFER request !");
1421 osip_message_header_get_byname(ev->request,"Refer-To",0,&h);
1424 osip_from_t *from=NULL;
1426 osip_from_init(&from);
1428 if (osip_from_parse(from,h->hvalue)==0){
1430 osip_uri_header_t *uh=NULL;
1431 osip_header_t *referred_by=NULL;
1432 osip_uri_header_get_byname(&from->url->url_headers,(char*)"Replaces",&uh);
1433 if (uh!=NULL && uh->gvalue && uh->gvalue[0]!='\0'){
1434 ms_message("Found replaces in Refer-To");
1436 ms_free(op->replaces);
1438 op->replaces=ms_strdup(uh->gvalue);
1440 osip_message_header_get_byname(ev->request,"Referred-By",0,&referred_by);
1441 if (referred_by && referred_by->hvalue && referred_by->hvalue[0]!='\0'){
1442 if (op->referred_by)
1443 ms_free(op->referred_by);
1444 op->referred_by=ms_strdup(referred_by->hvalue);
1447 osip_uri_header_freelist(&from->url->url_headers);
1448 osip_from_to_str(from,&tmp);
1449 sal->callbacks.refer_received(sal,op,tmp);
1451 osip_from_free(from);
1454 eXosip_call_build_answer(ev->tid,202,&ans);
1456 eXosip_call_send_answer(ev->tid,202,ans);
1461 ms_warning("cannot do anything with the refer without destination\n");
1465 static void call_message_new(Sal *sal, eXosip_event_t *ev){
1466 osip_message_t *ans=NULL;
1468 if (MSG_IS_INFO(ev->request)){
1469 osip_content_type_t *ct;
1470 ct=osip_message_get_content_type(ev->request);
1471 if (ct && ct->subtype){
1472 if (strcmp(ct->subtype,"media_control+xml")==0)
1473 process_media_control_xml(sal,ev);
1474 else if (strcmp(ct->subtype,"dtmf-relay")==0)
1475 process_dtmf_relay(sal,ev);
1477 ms_message("Unhandled SIP INFO.");
1478 /*send an "Not implemented" answer*/
1480 eXosip_call_build_answer(ev->tid,501,&ans);
1482 eXosip_call_send_answer(ev->tid,501,ans);
1486 /*empty SIP INFO, probably to test we are alive. Send an empty answer*/
1488 eXosip_call_build_answer(ev->tid,200,&ans);
1490 eXosip_call_send_answer(ev->tid,200,ans);
1493 }else if(MSG_IS_MESSAGE(ev->request)){
1494 /* SIP messages could be received into call */
1495 text_received(sal, ev);
1497 eXosip_call_build_answer(ev->tid,200,&ans);
1499 eXosip_call_send_answer(ev->tid,200,ans);
1501 }else if(MSG_IS_REFER(ev->request)){
1502 SalOp *op=find_op(sal,ev);
1504 ms_message("Receiving REFER request !");
1505 process_refer(sal,op,ev);
1506 }else if(MSG_IS_NOTIFY(ev->request)){
1507 osip_header_t *h=NULL;
1509 SalOp *op=find_op(sal,ev);
1511 ms_message("Receiving NOTIFY request !");
1512 osip_from_to_str(ev->request->from,&from);
1513 osip_message_header_get_byname(ev->request,"Event",0,&h);
1515 sal->callbacks.notify(op,from,h->hvalue);
1516 /*answer that we received the notify*/
1518 eXosip_call_build_answer(ev->tid,200,&ans);
1520 eXosip_call_send_answer(ev->tid,200,ans);
1523 }else if (MSG_IS_OPTIONS(ev->request)){
1525 eXosip_call_build_answer(ev->tid,200,&ans);
1527 fill_options_answer(ans);
1528 eXosip_call_send_answer(ev->tid,200,ans);
1532 }else ms_warning("call_message_new: No request ?");
1535 static void inc_update(Sal *sal, eXosip_event_t *ev){
1536 osip_message_t *msg=NULL;
1537 ms_message("Processing incoming UPDATE");
1539 eXosip_message_build_answer(ev->tid,200,&msg);
1541 eXosip_message_send_answer(ev->tid,200,msg);
1545 static bool_t comes_from_local_if(osip_message_t *msg){
1546 osip_via_t *via=NULL;
1547 osip_message_get_via(msg,0,&via);
1550 host=osip_via_get_host(via);
1551 if (strcmp(host,"127.0.0.1")==0 || strcmp(host,"::1")==0){
1552 osip_generic_param_t *param=NULL;
1553 osip_via_param_get_byname(via,"received",¶m);
1554 if (param==NULL) return TRUE;
1555 if (param->gvalue &&
1556 (strcmp(param->gvalue,"127.0.0.1")==0 || strcmp(param->gvalue,"::1")==0)){
1564 static void text_received(Sal *sal, eXosip_event_t *ev){
1565 osip_body_t *body=NULL;
1566 char *from=NULL,*msg;
1568 osip_message_get_body(ev->request,0,&body);
1570 ms_error("Could not get text message from SIP body");
1574 osip_from_to_str(ev->request->from,&from);
1575 sal->callbacks.text_received(sal,from,msg);
1581 static void other_request(Sal *sal, eXosip_event_t *ev){
1582 ms_message("in other_request");
1583 if (ev->request==NULL) return;
1584 if (strcmp(ev->request->sip_method,"MESSAGE")==0){
1585 text_received(sal,ev);
1586 eXosip_message_send_answer(ev->tid,200,NULL);
1587 }else if (strcmp(ev->request->sip_method,"OPTIONS")==0){
1588 osip_message_t *options=NULL;
1589 eXosip_options_build_answer(ev->tid,200,&options);
1590 fill_options_answer(options);
1591 eXosip_options_send_answer(ev->tid,200,options);
1592 }else if (strcmp(ev->request->sip_method,"WAKEUP")==0
1593 && comes_from_local_if(ev->request)) {
1594 eXosip_message_send_answer(ev->tid,200,NULL);
1595 ms_message("Receiving WAKEUP request !");
1596 sal->callbacks.internal_message(sal,"WAKEUP");
1597 }else if (strncmp(ev->request->sip_method, "REFER", 5) == 0){
1598 ms_message("Receiving REFER request !");
1599 if (comes_from_local_if(ev->request)) {
1600 process_refer(sal,NULL,ev);
1601 }else ms_warning("Ignored REFER not coming from this local loopback interface.");
1602 }else if (strncmp(ev->request->sip_method, "UPDATE", 6) == 0){
1607 osip_message_to_str(ev->request,&tmp,&msglen);
1609 ms_message("Unsupported request received:\n%s",tmp);
1612 /*answer with a 501 Not implemented*/
1613 eXosip_message_send_answer(ev->tid,501,NULL);
1617 static void masquerade_via(osip_message_t *msg, const char *ip, const char *port){
1618 osip_via_t *via=NULL;
1619 osip_message_get_via(msg,0,&via);
1621 osip_free(via->port);
1622 via->port=osip_strdup(port);
1623 osip_free(via->host);
1624 via->host=osip_strdup(ip);
1629 static bool_t fix_message_contact(SalOp *op, osip_message_t *request,osip_message_t *last_answer) {
1630 osip_contact_t *ctt=NULL;
1631 const char *received;
1633 SalTransport transport;
1636 if (extract_received_rport(last_answer,&received,&rport,&transport)==-1) return FALSE;
1637 osip_message_get_contact(request,0,&ctt);
1639 /*nothing to update*/
1642 if (ctt->url->host!=NULL){
1643 osip_free(ctt->url->host);
1645 ctt->url->host=osip_strdup(received);
1646 if (ctt->url->port!=NULL){
1647 osip_free(ctt->url->port);
1649 snprintf(port,sizeof(port),"%i",rport);
1650 ctt->url->port=osip_strdup(port);
1651 if (op->masquerade_via) masquerade_via(request,received,port);
1653 if (transport != SalTransportUDP) {
1654 sal_address_set_param((SalAddress *)ctt, "transport", sal_transport_to_string(transport));
1659 static bool_t register_again_with_updated_contact(SalOp *op, osip_message_t *orig_request, osip_message_t *last_answer){
1660 osip_contact_t *ctt=NULL;
1661 SalAddress* ori_contact_address=NULL;
1662 const char *received;
1664 SalTransport transport;
1666 osip_message_t *msg=NULL;
1667 Sal* sal=op->base.root;
1669 if (sal->double_reg==FALSE ) return FALSE;
1671 if (extract_received_rport(last_answer,&received,&rport,&transport)==-1) return FALSE;
1672 osip_message_get_contact(orig_request,0,&ctt);
1673 osip_contact_to_str(ctt,&tmp);
1674 ori_contact_address = sal_address_new((const char*)tmp);
1676 /*check if contact is up to date*/
1677 if (strcmp(sal_address_get_domain(ori_contact_address),received) ==0
1678 && sal_address_get_port_int(ori_contact_address) == rport
1679 && sal_address_get_transport(ori_contact_address) == transport) {
1680 ms_message("Register has up to date contact, doing nothing.");
1683 } else ms_message("contact do not match, need to update the register (%s with %s:%i;transport=%s)"
1687 ,sal_transport_to_string(transport));
1689 sal_address_destroy(ori_contact_address);
1691 if (transport == SalTransportUDP) {
1693 eXosip_register_build_register(op->rid,op->expires,&msg);
1696 ms_warning("Fail to create a contact updated register.");
1699 if (fix_message_contact(op,msg,last_answer)) {
1700 eXosip_register_send_register(op->rid,msg);
1702 ms_message("Resending new register with updated contact");
1705 ms_warning("Fail to send updated register.");
1712 update_contact_from_response(op,last_answer);
1716 static void registration_success(Sal *sal, eXosip_event_t *ev){
1717 SalOp *op=sal_find_register(sal,ev->rid);
1718 osip_header_t *h=NULL;
1721 ms_error("Receiving register response for unknown operation");
1724 osip_message_get_expires(ev->request,0,&h);
1725 if (h!=NULL && atoi(h->hvalue)!=0){
1727 if (!register_again_with_updated_contact(op,ev->request,ev->response)){
1728 sal->callbacks.register_success(op,registered);
1731 sal->callbacks.register_success(op,FALSE);
1735 static bool_t registration_failure(Sal *sal, eXosip_event_t *ev){
1737 const char *reason=NULL;
1738 SalOp *op=sal_find_register(sal,ev->rid);
1739 SalReason sr=SalReasonUnknown;
1740 SalError se=SalErrorUnknown;
1743 ms_error("Receiving register failure for unknown operation");
1747 status_code=osip_message_get_status_code(ev->response);
1748 reason=osip_message_get_reason_phrase(ev->response);
1750 switch(status_code){
1753 return process_authentication(sal,ev);
1755 case 606: /*Not acceptable, workaround for proxies that don't like private addresses
1756 in vias, such as ekiga.net
1757 On the opposite, freephonie.net bugs when via are masqueraded.
1759 op->masquerade_via=TRUE;
1761 /* if contact is up to date, process the failure, otherwise resend a new register with
1762 updated contact first, just in case the faillure is due to incorrect contact */
1763 if (ev->response && register_again_with_updated_contact(op,ev->request,ev->response))
1764 return TRUE; /*we are retrying with an updated contact*/
1765 if (status_code==403){
1767 sr=SalReasonForbidden;
1768 }else if (status_code==0){
1769 se=SalErrorNoResponse;
1771 sal->callbacks.register_failure(op,se,sr,reason);
1776 static void other_request_reply(Sal *sal,eXosip_event_t *ev){
1777 SalOp *op=find_op(sal,ev);
1780 ms_warning("other_request_reply(): Receiving response to unknown request.");
1784 update_contact_from_response(op,ev->response);
1785 if (ev->request && strcmp(osip_message_get_method(ev->request),"OPTIONS")==0)
1786 sal->callbacks.ping_reply(op);
1790 static bool_t process_event(Sal *sal, eXosip_event_t *ev){
1791 ms_message("linphone process event get a message %d\n",ev->type);
1793 case EXOSIP_CALL_ANSWERED:
1794 ms_message("CALL_ANSWERED\n");
1795 call_accepted(sal,ev);
1796 authentication_ok(sal,ev);
1798 case EXOSIP_CALL_CLOSED:
1799 case EXOSIP_CALL_CANCELLED:
1800 ms_message("CALL_CLOSED or CANCELLED\n");
1801 call_terminated(sal,ev);
1803 case EXOSIP_CALL_TIMEOUT:
1804 case EXOSIP_CALL_NOANSWER:
1805 ms_message("CALL_TIMEOUT or NOANSWER\n");
1806 return call_failure(sal,ev);
1808 case EXOSIP_CALL_REQUESTFAILURE:
1809 case EXOSIP_CALL_GLOBALFAILURE:
1810 case EXOSIP_CALL_SERVERFAILURE:
1811 ms_message("CALL_REQUESTFAILURE or GLOBALFAILURE or SERVERFAILURE\n");
1812 return call_failure(sal,ev);
1814 case EXOSIP_CALL_RELEASED:
1815 ms_message("CALL_RELEASED\n");
1816 call_released(sal, ev);
1818 case EXOSIP_CALL_INVITE:
1819 ms_message("CALL_NEW\n");
1820 inc_new_call(sal,ev);
1822 case EXOSIP_CALL_REINVITE:
1823 handle_reinvite(sal,ev);
1825 case EXOSIP_CALL_ACK:
1826 ms_message("CALL_ACK");
1829 case EXOSIP_CALL_REDIRECTED:
1830 ms_message("CALL_REDIRECTED");
1831 eXosip_default_action(ev);
1833 case EXOSIP_CALL_PROCEEDING:
1834 ms_message("CALL_PROCEEDING");
1835 call_proceeding(sal,ev);
1837 case EXOSIP_CALL_RINGING:
1838 ms_message("CALL_RINGING");
1839 call_ringing(sal,ev);
1841 case EXOSIP_CALL_MESSAGE_NEW:
1842 ms_message("EXOSIP_CALL_MESSAGE_NEW");
1843 call_message_new(sal,ev);
1845 case EXOSIP_CALL_MESSAGE_REQUESTFAILURE:
1847 (ev->response->status_code==407 || ev->response->status_code==401)){
1848 return process_authentication(sal,ev);
1851 case EXOSIP_IN_SUBSCRIPTION_NEW:
1852 ms_message("CALL_IN_SUBSCRIPTION_NEW ");
1853 sal_exosip_subscription_recv(sal,ev);
1855 case EXOSIP_IN_SUBSCRIPTION_RELEASED:
1856 ms_message("CALL_SUBSCRIPTION_NEW ");
1857 sal_exosip_in_subscription_closed(sal,ev);
1859 case EXOSIP_SUBSCRIPTION_UPDATE:
1860 ms_message("CALL_SUBSCRIPTION_UPDATE");
1862 case EXOSIP_SUBSCRIPTION_NOTIFY:
1863 ms_message("CALL_SUBSCRIPTION_NOTIFY");
1864 sal_exosip_notify_recv(sal,ev);
1866 case EXOSIP_SUBSCRIPTION_ANSWERED:
1867 ms_message("EXOSIP_SUBSCRIPTION_ANSWERED, ev->sid=%i, ev->did=%i\n",ev->sid,ev->did);
1868 sal_exosip_subscription_answered(sal,ev);
1870 case EXOSIP_SUBSCRIPTION_CLOSED:
1871 ms_message("EXOSIP_SUBSCRIPTION_CLOSED\n");
1872 sal_exosip_subscription_closed(sal,ev);
1874 case EXOSIP_SUBSCRIPTION_REQUESTFAILURE: /**< announce a request failure */
1875 if (ev->response && (ev->response->status_code == 407 || ev->response->status_code == 401)){
1876 return process_authentication(sal,ev);
1878 case EXOSIP_SUBSCRIPTION_SERVERFAILURE:
1879 case EXOSIP_SUBSCRIPTION_GLOBALFAILURE:
1880 sal_exosip_subscription_closed(sal,ev);
1882 case EXOSIP_REGISTRATION_FAILURE:
1883 ms_message("REGISTRATION_FAILURE\n");
1884 return registration_failure(sal,ev);
1886 case EXOSIP_REGISTRATION_SUCCESS:
1887 authentication_ok(sal,ev);
1888 registration_success(sal,ev);
1890 case EXOSIP_MESSAGE_NEW:
1891 other_request(sal,ev);
1893 case EXOSIP_MESSAGE_PROCEEDING:
1894 case EXOSIP_MESSAGE_ANSWERED:
1895 case EXOSIP_MESSAGE_REDIRECTED:
1896 case EXOSIP_MESSAGE_SERVERFAILURE:
1897 case EXOSIP_MESSAGE_GLOBALFAILURE:
1898 other_request_reply(sal,ev);
1900 case EXOSIP_MESSAGE_REQUESTFAILURE:
1901 case EXOSIP_NOTIFICATION_REQUESTFAILURE:
1903 switch (ev->response->status_code) {
1906 return process_authentication(sal,ev);
1908 eXosip_automatic_action ();
1913 other_request_reply(sal,ev);
1916 ms_message("Unhandled exosip event ! %i",ev->type);
1922 int sal_iterate(Sal *sal){
1924 while((ev=eXosip_event_wait(0,0))!=NULL){
1925 if (process_event(sal,ev))
1926 eXosip_event_free(ev);
1929 eXosip_automatic_refresh();
1934 static void register_set_contact(osip_message_t *msg, const char *contact){
1935 osip_uri_param_t *param = NULL;
1936 osip_contact_t *ct=NULL;
1938 /*we get the line parameter choosed by exosip, and add it to our own contact*/
1939 osip_message_get_contact(msg,0,&ct);
1941 osip_uri_uparam_get_byname(ct->url, "line", ¶m);
1942 if (param && param->gvalue)
1943 line=osip_strdup(param->gvalue);
1945 _osip_list_set_empty(&msg->contacts,(void (*)(void*))osip_contact_free);
1946 osip_message_set_contact(msg,contact);
1947 osip_message_get_contact(msg,0,&ct);
1948 osip_uri_uparam_add(ct->url,osip_strdup("line"),line);
1951 int sal_register(SalOp *h, const char *proxy, const char *from, int expires){
1952 osip_message_t *msg;
1953 const char *contact=sal_op_get_contact(h);
1955 sal_op_set_route(h,proxy);
1958 h->rid=eXosip_register_build_initial_register(from,proxy,NULL,expires,&msg);
1960 if (contact) register_set_contact(msg,contact);
1961 sal_add_register(h->base.root,h);
1963 ms_error("Could not build initial register.");
1969 eXosip_register_build_register(h->rid,expires,&msg);
1971 eXosip_register_send_register(h->rid,msg);
1977 int sal_register_refresh(SalOp *op, int expires){
1978 osip_message_t *msg=NULL;
1979 const char *contact=sal_op_get_contact(op);
1982 ms_error("Unexistant registration context, not possible to refresh.");
1986 eXosip_register_build_register(op->rid,expires,&msg);
1988 if (contact) register_set_contact(msg,contact);
1989 eXosip_register_send_register(op->rid,msg);
1990 }else ms_error("Could not build REGISTER refresh message.");
1996 int sal_unregister(SalOp *h){
1997 osip_message_t *msg=NULL;
1999 eXosip_register_build_register(h->rid,0,&msg);
2000 if (msg) eXosip_register_send_register(h->rid,msg);
2001 else ms_warning("Could not build unREGISTER !");
2006 SalAddress * sal_address_new(const char *uri){
2008 osip_from_init(&from);
2010 // Remove front spaces
2011 while (uri[0]==' ') {
2015 if (osip_from_parse(from,uri)!=0){
2016 osip_from_free(from);
2019 if (from->displayname!=NULL && from->displayname[0]=='"'){
2020 char *unquoted=osip_strdup_without_quote(from->displayname);
2021 osip_free(from->displayname);
2022 from->displayname=unquoted;
2024 return (SalAddress*)from;
2027 SalAddress * sal_address_clone(const SalAddress *addr){
2028 osip_from_t *ret=NULL;
2029 osip_from_clone((osip_from_t*)addr,&ret);
2030 return (SalAddress*)ret;
2033 #define null_if_empty(s) (((s)!=NULL && (s)[0]!='\0') ? (s) : NULL )
2035 const char *sal_address_get_scheme(const SalAddress *addr){
2036 const osip_from_t *u=(const osip_from_t*)addr;
2037 return null_if_empty(u->url->scheme);
2040 const char *sal_address_get_display_name(const SalAddress* addr){
2041 const osip_from_t *u=(const osip_from_t*)addr;
2042 return null_if_empty(u->displayname);
2045 const char *sal_address_get_username(const SalAddress *addr){
2046 const osip_from_t *u=(const osip_from_t*)addr;
2047 return null_if_empty(u->url->username);
2050 const char *sal_address_get_domain(const SalAddress *addr){
2051 const osip_from_t *u=(const osip_from_t*)addr;
2052 return null_if_empty(u->url->host);
2055 void sal_address_set_display_name(SalAddress *addr, const char *display_name){
2056 osip_from_t *u=(osip_from_t*)addr;
2057 if (u->displayname!=NULL){
2058 osip_free(u->displayname);
2059 u->displayname=NULL;
2061 if (display_name!=NULL && display_name[0]!='\0'){
2062 u->displayname=osip_strdup(display_name);
2066 void sal_address_set_username(SalAddress *addr, const char *username){
2067 osip_from_t *uri=(osip_from_t*)addr;
2068 if (uri->url->username!=NULL){
2069 osip_free(uri->url->username);
2070 uri->url->username=NULL;
2073 uri->url->username=osip_strdup(username);
2076 void sal_address_set_domain(SalAddress *addr, const char *host){
2077 osip_from_t *uri=(osip_from_t*)addr;
2078 if (uri->url->host!=NULL){
2079 osip_free(uri->url->host);
2080 uri->url->host=NULL;
2083 uri->url->host=osip_strdup(host);
2086 void sal_address_set_port(SalAddress *addr, const char *port){
2087 osip_from_t *uri=(osip_from_t*)addr;
2088 if (uri->url->port!=NULL){
2089 osip_free(uri->url->port);
2090 uri->url->port=NULL;
2093 uri->url->port=osip_strdup(port);
2096 void sal_address_set_port_int(SalAddress *uri, int port){
2099 /*this is the default, special case to leave the port field blank*/
2100 sal_address_set_port(uri,NULL);
2103 snprintf(tmp,sizeof(tmp),"%i",port);
2104 sal_address_set_port(uri,tmp);
2107 void sal_address_clean(SalAddress *addr){
2108 osip_generic_param_freelist(& ((osip_from_t*)addr)->gen_params);
2109 osip_uri_param_freelist(& ((osip_from_t*)addr)->url->url_params);
2112 char *sal_address_as_string(const SalAddress *u){
2114 osip_from_t *from=(osip_from_t *)u;
2115 char *old_displayname=NULL;
2116 /* hack to force use of quotes around the displayname*/
2117 if (from->displayname!=NULL
2118 && from->displayname[0]!='"'){
2119 old_displayname=from->displayname;
2120 from->displayname=osip_enquote(from->displayname);
2122 osip_from_to_str(from,&tmp);
2123 if (old_displayname!=NULL){
2124 ms_free(from->displayname);
2125 from->displayname=old_displayname;
2132 char *sal_address_as_string_uri_only(const SalAddress *u){
2133 char *tmp=NULL,*ret;
2134 osip_uri_to_str(((osip_from_t*)u)->url,&tmp);
2139 void sal_address_set_param(SalAddress *u,const char* name,const char* value) {
2140 osip_uri_param_t *param=NULL;
2141 osip_uri_uparam_get_byname(((osip_from_t*)u)->url,(char*)name,¶m);
2143 osip_uri_uparam_add (((osip_from_t*)u)->url,ms_strdup(name),ms_strdup(value));
2145 osip_free(param->gvalue);
2146 param->gvalue=osip_strdup(value);
2151 void sal_address_destroy(SalAddress *u){
2152 osip_from_free((osip_from_t*)u);
2155 void sal_set_keepalive_period(Sal *ctx,unsigned int value) {
2156 ctx->keepalive_period=value;
2157 eXosip_set_option (EXOSIP_OPT_UDP_KEEP_ALIVE, &value);
2159 unsigned int sal_get_keepalive_period(Sal *ctx) {
2160 return ctx->keepalive_period;
2163 const char * sal_address_get_port(const SalAddress *addr) {
2164 const osip_from_t *u=(const osip_from_t*)addr;
2165 return null_if_empty(u->url->port);
2168 int sal_address_get_port_int(const SalAddress *uri) {
2169 const char* port = sal_address_get_port(uri);
2176 SalTransport sal_address_get_transport(const SalAddress* addr) {
2177 const osip_from_t *u=(const osip_from_t*)addr;
2178 osip_uri_param_t *transport_param=NULL;
2179 osip_uri_uparam_get_byname(u->url,"transport",&transport_param);
2180 if (transport_param == NULL){
2181 return SalTransportUDP;
2183 return sal_transport_parse(transport_param->gvalue);
2186 void sal_address_set_transport(SalAddress* addr,SalTransport transport) {
2187 sal_address_set_param(addr, "transport", sal_transport_to_string(transport));
2190 /* sends a reinvite. Local media description may have changed by application since call establishment*/
2191 int sal_call_update(SalOp *h, const char *subject){
2193 osip_message_t *reinvite=NULL;
2196 if(eXosip_call_build_request(h->did,"INVITE",&reinvite) != 0 || reinvite==NULL){
2201 osip_message_set_subject(reinvite,subject);
2202 osip_message_set_allow(reinvite, "INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, NOTIFY, MESSAGE, SUBSCRIBE, INFO");
2203 if (h->base.root->session_expires!=0){
2204 osip_message_set_header(reinvite, "Session-expires", "200");
2205 osip_message_set_supported(reinvite, "timer");
2207 if (h->base.local_media){
2208 h->sdp_offering=TRUE;
2209 set_sdp_from_desc(reinvite,h->base.local_media);
2210 }else h->sdp_offering=FALSE;
2212 err = eXosip_call_send_request(h->did, reinvite);
2216 void sal_reuse_authorization(Sal *ctx, bool_t value) {
2217 ctx->reuse_authorization=value;