3 Copyright (C) 2010 Simon MORLAT (simon.morlat@free.fr)
5 This program is free software; you can redistribute it and/or
6 modify it under the terms of the GNU General Public License
7 as published by the Free Software Foundation; either version 2
8 of the License, or (at your option) any later version.
10 This program is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 GNU General Public License for more details.
15 You should have received a copy of the GNU General Public License
16 along with this program; if not, write to the Free Software
17 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
23 #include "sal_eXosip2.h"
25 #include "offeranswer.h"
28 // Necessary to make it linked
29 static void for_linker() { eXosip_transport_hook_register(NULL); }
31 static bool_t call_failure(Sal *sal, eXosip_event_t *ev);
33 static void text_received(Sal *sal, eXosip_event_t *ev);
35 static void masquerade_via(osip_message_t *msg, const char *ip, const char *port);
36 static bool_t fix_message_contact(SalOp *op, osip_message_t *request,osip_message_t *last_answer);
37 static void update_contact_from_response(SalOp *op, osip_message_t *response);
39 void _osip_list_set_empty(osip_list_t *l, void (*freefunc)(void*)){
41 while(!osip_list_eol(l,0)) {
42 data=osip_list_get(l,0);
43 osip_list_remove(l,0);
44 if (data) freefunc(data);
48 void sal_get_default_local_ip(Sal *sal, int address_family,char *ip, size_t iplen){
49 if (eXosip_guess_localip(address_family,ip,iplen)<0){
50 /*default to something */
51 strncpy(ip,address_family==AF_INET6 ? "::1" : "127.0.0.1",iplen);
52 ms_error("Could not find default routable ip address !");
57 static SalOp * sal_find_call(Sal *sal, int cid){
60 for(elem=sal->calls;elem!=NULL;elem=elem->next){
61 op=(SalOp*)elem->data;
62 if (op->cid==cid) return op;
67 static void sal_add_call(Sal *sal, SalOp *op){
68 sal->calls=ms_list_append(sal->calls,op);
71 static void sal_remove_call(Sal *sal, SalOp *op){
72 sal->calls=ms_list_remove(sal->calls, op);
75 static SalOp * sal_find_register(Sal *sal, int rid){
78 for(elem=sal->registers;elem!=NULL;elem=elem->next){
79 op=(SalOp*)elem->data;
80 if (op->rid==rid) return op;
85 static void sal_add_register(Sal *sal, SalOp *op){
86 sal->registers=ms_list_append(sal->registers,op);
89 static void sal_remove_register(Sal *sal, int rid){
92 for(elem=sal->registers;elem!=NULL;elem=elem->next){
93 op=(SalOp*)elem->data;
95 sal->registers=ms_list_remove_link(sal->registers,elem);
101 static SalOp * sal_find_other(Sal *sal, osip_message_t *response){
104 osip_call_id_t *callid=osip_message_get_call_id(response);
106 ms_error("There is no call-id in this response !");
109 for(elem=sal->other_transactions;elem!=NULL;elem=elem->next){
110 op=(SalOp*)elem->data;
111 if (osip_call_id_match(callid,op->call_id)==0) return op;
116 void sal_add_other(Sal *sal, SalOp *op, osip_message_t *request){
117 osip_call_id_t *callid=osip_message_get_call_id(request);
119 ms_error("There is no call id in the request !");
122 osip_call_id_clone(callid,&op->call_id);
123 sal->other_transactions=ms_list_append(sal->other_transactions,op);
126 static void sal_remove_other(Sal *sal, SalOp *op){
127 sal->other_transactions=ms_list_remove(sal->other_transactions,op);
131 static void sal_add_pending_auth(Sal *sal, SalOp *op){
132 sal->pending_auths=ms_list_append(sal->pending_auths,op);
136 static void sal_remove_pending_auth(Sal *sal, SalOp *op){
137 sal->pending_auths=ms_list_remove(sal->pending_auths,op);
140 void sal_exosip_fix_route(SalOp *op){
141 if (sal_op_get_route(op)!=NULL){
142 osip_route_t *rt=NULL;
143 osip_uri_param_t *lr_param=NULL;
145 osip_route_init(&rt);
146 if (osip_route_parse(rt,sal_op_get_route(op))<0){
147 ms_warning("Bad route %s!",sal_op_get_route(op));
148 sal_op_set_route(op,NULL);
150 /* check if the lr parameter is set , if not add it */
151 osip_uri_uparam_get_byname(rt->url, "lr", &lr_param);
154 osip_uri_uparam_add(rt->url,osip_strdup("lr"),NULL);
155 osip_route_to_str(rt,&tmproute);
156 sal_op_set_route(op,tmproute);
164 SalOp * sal_op_new(Sal *sal){
165 SalOp *op=ms_new(SalOp,1);
166 __sal_op_init(op,sal);
167 op->cid=op->did=op->tid=op->rid=op->nid=op->sid=-1;
169 op->supports_session_timers=FALSE;
170 op->sdp_offering=TRUE;
171 op->pending_auth=NULL;
176 op->referred_by=NULL;
177 op->masquerade_via=FALSE;
178 op->auto_answer_asked=FALSE;
180 op->terminated=FALSE;
184 bool_t sal_call_autoanswer_asked(SalOp *op)
186 return op->auto_answer_asked;
189 void sal_op_release(SalOp *op){
191 sdp_message_free(op->sdp_answer);
192 if (op->pending_auth)
193 eXosip_event_free(op->pending_auth);
195 sal_remove_register(op->base.root,op->rid);
196 eXosip_register_remove(op->rid);
199 ms_message("Cleaning cid %i",op->cid);
200 sal_remove_call(op->base.root,op);
203 sal_remove_out_subscribe(op->base.root,op);
206 sal_remove_in_subscribe(op->base.root,op);
208 osip_call_id_free(op->call_id);
211 if (op->pending_auth){
212 sal_remove_pending_auth(op->base.root,op);
215 sal_media_description_unref(op->result);
217 sal_remove_other(op->base.root,op);
218 osip_call_id_free(op->call_id);
221 ms_free(op->replaces);
223 if (op->referred_by){
224 ms_free(op->referred_by);
227 sal_auth_info_delete(op->auth_info);
232 static void _osip_trace_func(char *fi, int li, osip_trace_level_t level, char *chfr, va_list ap){
233 int ortp_level=ORTP_DEBUG;
239 ortp_level=ORTP_MESSAGE;
242 ortp_level=ORTP_WARNING;
246 ortp_level=ORTP_ERROR;
249 ortp_level=ORTP_FATAL;
251 case END_TRACE_LEVEL:
254 if (ortp_log_level_enabled(level)){
255 int len=strlen(chfr);
256 char *chfrdup=ortp_strdup(chfr);
257 /*need to remove endline*/
259 if (chfrdup[len-1]=='\n')
261 if (chfrdup[len-2]=='\r')
264 ortp_logv(ortp_level,chfrdup,ap);
271 static bool_t firsttime=TRUE;
274 osip_trace_initialize_func (OSIP_INFO4,&_osip_trace_func);
279 sal->keepalive_period=30;
280 sal->double_reg=TRUE;
281 sal->use_rports=TRUE;
283 sal->reuse_authorization=FALSE;
285 sal->verify_server_certs=TRUE;
289 void sal_uninit(Sal* sal){
292 ms_free(sal->rootCa);
296 void sal_set_user_pointer(Sal *sal, void *user_data){
300 void *sal_get_user_pointer(const Sal *sal){
304 static void unimplemented_stub(){
305 ms_warning("Unimplemented SAL callback");
308 void sal_set_callbacks(Sal *ctx, const SalCallbacks *cbs){
309 memcpy(&ctx->callbacks,cbs,sizeof(*cbs));
310 if (ctx->callbacks.call_received==NULL)
311 ctx->callbacks.call_received=(SalOnCallReceived)unimplemented_stub;
312 if (ctx->callbacks.call_ringing==NULL)
313 ctx->callbacks.call_ringing=(SalOnCallRinging)unimplemented_stub;
314 if (ctx->callbacks.call_accepted==NULL)
315 ctx->callbacks.call_accepted=(SalOnCallAccepted)unimplemented_stub;
316 if (ctx->callbacks.call_failure==NULL)
317 ctx->callbacks.call_failure=(SalOnCallFailure)unimplemented_stub;
318 if (ctx->callbacks.call_terminated==NULL)
319 ctx->callbacks.call_terminated=(SalOnCallTerminated)unimplemented_stub;
320 if (ctx->callbacks.call_released==NULL)
321 ctx->callbacks.call_released=(SalOnCallReleased)unimplemented_stub;
322 if (ctx->callbacks.call_updating==NULL)
323 ctx->callbacks.call_updating=(SalOnCallUpdating)unimplemented_stub;
324 if (ctx->callbacks.auth_requested==NULL)
325 ctx->callbacks.auth_requested=(SalOnAuthRequested)unimplemented_stub;
326 if (ctx->callbacks.auth_success==NULL)
327 ctx->callbacks.auth_success=(SalOnAuthSuccess)unimplemented_stub;
328 if (ctx->callbacks.register_success==NULL)
329 ctx->callbacks.register_success=(SalOnRegisterSuccess)unimplemented_stub;
330 if (ctx->callbacks.register_failure==NULL)
331 ctx->callbacks.register_failure=(SalOnRegisterFailure)unimplemented_stub;
332 if (ctx->callbacks.dtmf_received==NULL)
333 ctx->callbacks.dtmf_received=(SalOnDtmfReceived)unimplemented_stub;
334 if (ctx->callbacks.notify==NULL)
335 ctx->callbacks.notify=(SalOnNotify)unimplemented_stub;
336 if (ctx->callbacks.notify_presence==NULL)
337 ctx->callbacks.notify_presence=(SalOnNotifyPresence)unimplemented_stub;
338 if (ctx->callbacks.subscribe_received==NULL)
339 ctx->callbacks.subscribe_received=(SalOnSubscribeReceived)unimplemented_stub;
340 if (ctx->callbacks.text_received==NULL)
341 ctx->callbacks.text_received=(SalOnTextReceived)unimplemented_stub;
342 if (ctx->callbacks.ping_reply==NULL)
343 ctx->callbacks.ping_reply=(SalOnPingReply)unimplemented_stub;
346 int sal_unlisten_ports(Sal *ctx){
355 int sal_listen_port(Sal *ctx, const char *addr, int port, SalTransport tr, int is_secure){
358 int proto=IPPROTO_UDP;
359 int keepalive = ctx->keepalive_period;
362 case SalTransportUDP:
364 eXosip_set_option (EXOSIP_OPT_UDP_KEEP_ALIVE, &keepalive);
366 case SalTransportTCP:
367 case SalTransportTLS:
370 eXosip_set_option (EXOSIP_OPT_UDP_KEEP_ALIVE,&keepalive);
373 eXosip_tls_ctx_t tlsCtx;
374 memset(&tlsCtx, 0, sizeof(tlsCtx));
375 snprintf(tlsCtx.root_ca_cert, sizeof(tlsCtx.client.cert), "%s", ctx->rootCa);
376 eXosip_set_tls_ctx(&tlsCtx);
378 #ifdef HAVE_EXOSIP_TLS_VERIFY_CERTIFICATE
379 eXosip_tls_verify_certificate(ctx->verify_server_certs);
383 ms_warning("unexpected proto, using datagram");
385 /*see if it looks like an IPv6 address*/
386 int use_rports = ctx->use_rports; // Copy char to int to avoid bad alignment
387 eXosip_set_option(EXOSIP_OPT_USE_RPORT,&use_rports);
388 int dont_use_101 = !ctx->use_101; // Copy char to int to avoid bad alignment
389 eXosip_set_option(EXOSIP_OPT_DONT_SEND_101,&dont_use_101);
391 ipv6=strchr(addr,':')!=NULL;
392 eXosip_enable_ipv6(ipv6);
394 if (is_secure && tr == SalTransportUDP){
395 ms_fatal("SIP over DTLS is not supported yet.");
398 err=eXosip_listen_addr(proto, addr, port, ipv6 ? PF_INET6 : PF_INET, is_secure);
403 ortp_socket_t sal_get_socket(Sal *ctx){
404 #ifdef HAVE_EXOSIP_GET_SOCKET
405 return eXosip_get_socket(IPPROTO_UDP);
407 ms_warning("Sorry, eXosip does not have eXosip_get_socket() method");
412 void sal_set_user_agent(Sal *ctx, const char *user_agent){
413 eXosip_set_user_agent(user_agent);
416 void sal_use_session_timers(Sal *ctx, int expires){
417 ctx->session_expires=expires;
420 void sal_use_one_matching_codec_policy(Sal *ctx, bool_t one_matching_codec){
421 ctx->one_matching_codec=one_matching_codec;
424 MSList *sal_get_pending_auths(Sal *sal){
425 return ms_list_copy(sal->pending_auths);
428 void sal_use_double_registrations(Sal *ctx, bool_t enabled){
429 ctx->double_reg=enabled;
432 void sal_use_rport(Sal *ctx, bool_t use_rports){
433 ctx->use_rports=use_rports;
435 void sal_use_101(Sal *ctx, bool_t use_101){
436 ctx->use_101=use_101;
439 void sal_set_root_ca(Sal* ctx, const char* rootCa) {
441 ms_free(ctx->rootCa);
442 ctx->rootCa = ms_strdup(rootCa);
445 void sal_verify_server_certificates(Sal *ctx, bool_t verify){
446 ctx->verify_server_certs=verify;
447 #ifdef HAVE_EXOSIP_TLS_VERIFY_CERTIFICATE
448 eXosip_tls_verify_certificate(verify);
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);
461 ms_warning("extract_received_rport(): no via.");
465 *transport = sal_transport_parse(via->protocol);
467 if (via->port && via->port[0]!='\0')
468 *rportval=atoi(via->port);
470 osip_via_param_get_byname(via,"rport",¶m);
473 if (rport && rport[0]!='\0') *rportval=atoi(rport);
477 osip_via_param_get_byname(via,"received",¶m);
478 if (param) *received=param->gvalue;
480 if (rport==NULL && *received==NULL){
481 ms_warning("extract_received_rport(): no rport and no received parameters.");
487 static void set_sdp(osip_message_t *sip,sdp_message_t *msg){
491 sdp_message_to_str(msg,&sdp);
493 snprintf(clen,sizeof(clen),"%i",sdplen);
494 osip_message_set_body(sip,sdp,sdplen);
495 osip_message_set_content_type(sip,"application/sdp");
496 osip_message_set_content_length(sip,clen);
500 static void set_sdp_from_desc(osip_message_t *sip, const SalMediaDescription *desc){
501 sdp_message_t *msg=media_description_to_sdp(desc);
503 ms_error("Fail to print sdp message !");
507 sdp_message_free(msg);
510 static void sdp_process(SalOp *h){
511 ms_message("Doing SDP offer/answer process of type %s",h->sdp_offering ? "outgoing" : "incoming");
513 sal_media_description_unref(h->result);
515 h->result=sal_media_description_new();
516 if (h->sdp_offering){
517 offer_answer_initiate_outgoing(h->base.local_media,h->base.remote_media,h->result);
521 sdp_message_free(h->sdp_answer);
523 offer_answer_initiate_incoming(h->base.local_media,h->base.remote_media,h->result,h->base.root->one_matching_codec);
524 h->sdp_answer=media_description_to_sdp(h->result);
525 /*once we have generated the SDP answer, we modify the result description for processing by the upper layer.
526 It should contains media parameters constraint from the remote offer, not our response*/
527 strcpy(h->result->addr,h->base.remote_media->addr);
528 h->result->bandwidth=h->base.remote_media->bandwidth;
530 for(i=0;i<h->result->nstreams;++i){
531 if (h->result->streams[i].port>0){
532 strcpy(h->result->streams[i].addr,h->base.remote_media->streams[i].addr);
533 h->result->streams[i].ptime=h->base.remote_media->streams[i].ptime;
534 h->result->streams[i].bandwidth=h->base.remote_media->streams[i].bandwidth;
535 h->result->streams[i].port=h->base.remote_media->streams[i].port;
537 if (h->result->streams[i].proto == SalProtoRtpSavp) {
538 h->result->streams[i].crypto[0] = h->base.remote_media->streams[i].crypto[0];
546 int sal_call_is_offerer(const SalOp *h){
547 return h->sdp_offering;
550 int sal_call_set_local_media_description(SalOp *h, SalMediaDescription *desc){
552 sal_media_description_ref(desc);
553 if (h->base.local_media)
554 sal_media_description_unref(h->base.local_media);
555 h->base.local_media=desc;
556 if (h->base.remote_media){
557 /*case of an incoming call where we modify the local capabilities between the time
558 * the call is ringing and it is accepted (for example if you want to accept without video*/
559 /*reset the sdp answer so that it is computed again*/
561 sdp_message_free(h->sdp_answer);
568 int sal_call(SalOp *h, const char *from, const char *to){
571 osip_message_t *invite=NULL;
572 sal_op_set_from(h,from);
574 sal_exosip_fix_route(h);
576 h->terminated = FALSE;
578 route = sal_op_get_route(h);
579 err=eXosip_call_build_initial_invite(&invite,to,from,route,"Phone call");
581 ms_error("Could not create call. Error %d (from=%s to=%s route=%s)",
582 err, from, to, route);
585 osip_message_set_allow(invite, "INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, NOTIFY, MESSAGE, SUBSCRIBE, INFO");
586 if (h->base.contact){
587 _osip_list_set_empty(&invite->contacts,(void (*)(void*))osip_contact_free);
588 osip_message_set_contact(invite,h->base.contact);
590 if (h->base.root->session_expires!=0){
591 osip_message_set_header(invite, "Session-expires", "200");
592 osip_message_set_supported(invite, "timer");
594 if (h->base.local_media){
595 h->sdp_offering=TRUE;
596 set_sdp_from_desc(invite,h->base.local_media);
597 }else h->sdp_offering=FALSE;
599 osip_message_set_header(invite,"Replaces",h->replaces);
601 osip_message_set_header(invite,"Referred-By",h->referred_by);
605 err=eXosip_call_send_initial_invite(invite);
609 ms_error("Fail to send invite ! Error code %d", err);
612 sal_add_call(h->base.root,h);
617 int sal_call_notify_ringing(SalOp *h, bool_t early_media){
620 /*if early media send also 180 and 183 */
624 eXosip_call_build_answer(h->tid,183,&msg);
628 set_sdp(msg,h->sdp_answer);
629 sdp_message_free(h->sdp_answer);
632 eXosip_call_send_answer(h->tid,183,msg);
637 eXosip_call_send_answer(h->tid,180,NULL);
643 int sal_call_accept(SalOp * h){
645 const char *contact=sal_op_get_contact(h);
647 int err=eXosip_call_build_answer(h->tid,200,&msg);
648 if (err<0 || msg==NULL){
649 ms_error("Fail to build answer for call: err=%i",err);
652 if (h->base.root->session_expires!=0){
653 if (h->supports_session_timers) osip_message_set_supported(msg, "timer");
657 _osip_list_set_empty(&msg->contacts,(void (*)(void*))osip_contact_free);
658 osip_message_set_contact(msg,contact);
661 if (h->base.local_media){
662 /*this is the case where we received an invite without SDP*/
663 if (h->sdp_offering) {
664 set_sdp_from_desc(msg,h->base.local_media);
666 if (h->sdp_answer==NULL) sdp_process(h);
668 set_sdp(msg,h->sdp_answer);
669 sdp_message_free(h->sdp_answer);
674 ms_error("You are accepting a call but not defined any media capabilities !");
676 eXosip_call_send_answer(h->tid,200,msg);
680 int sal_call_decline(SalOp *h, SalReason reason, const char *redirect){
681 if (reason==SalReasonBusy){
683 eXosip_call_send_answer(h->tid,486,NULL);
686 else if (reason==SalReasonTemporarilyUnavailable){
688 eXosip_call_send_answer(h->tid,480,NULL);
690 }else if (reason==SalReasonDoNotDisturb){
692 eXosip_call_send_answer(h->tid,600,NULL);
694 }else if (reason==SalReasonMedia){
696 eXosip_call_send_answer(h->tid,415,NULL);
698 }else if (redirect!=NULL && reason==SalReasonRedirect){
701 if (strstr(redirect,"sip:")!=0) code=302;
704 eXosip_call_build_answer(h->tid,code,&msg);
705 osip_message_set_contact(msg,redirect);
706 eXosip_call_send_answer(h->tid,code,msg);
708 }else sal_call_terminate(h);
712 SalMediaDescription * sal_call_get_remote_media_description(SalOp *h){
713 return h->base.remote_media;
716 SalMediaDescription * sal_call_get_final_media_description(SalOp *h){
717 if (h->base.local_media && h->base.remote_media && !h->result){
723 int sal_call_set_referer(SalOp *h, SalOp *refered_call){
724 if (refered_call->replaces)
725 h->replaces=ms_strdup(refered_call->replaces);
726 if (refered_call->referred_by)
727 h->referred_by=ms_strdup(refered_call->referred_by);
731 static int send_notify_for_refer(int did, const char *sipfrag){
734 eXosip_call_build_notify(did,EXOSIP_SUBCRSTATE_ACTIVE,&msg);
737 ms_error("Could not build NOTIFY for refer.");
740 osip_message_set_content_type(msg,"message/sipfrag");
741 osip_message_set_header(msg,"Event","refer");
742 osip_message_set_body(msg,sipfrag,strlen(sipfrag));
743 eXosip_call_send_request(did,msg);
748 /* currently only support to notify trying and 200Ok*/
749 int sal_call_notify_refer_state(SalOp *h, SalOp *newcall){
752 send_notify_for_refer(h->did,"SIP/2.0 100 Trying\r\n");
754 else if (newcall->cid!=-1){
755 if (newcall->did==-1){
756 /* not yet established*/
757 if (!newcall->terminated){
759 send_notify_for_refer(h->did,"SIP/2.0 100 Trying\r\n");
762 if (!newcall->terminated){
763 send_notify_for_refer(h->did,"SIP/2.0 200 Ok\r\n");
770 int sal_ping(SalOp *op, const char *from, const char *to){
771 osip_message_t *options=NULL;
773 sal_op_set_from(op,from);
774 sal_op_set_to(op,to);
775 sal_exosip_fix_route(op);
777 eXosip_options_build_request (&options, sal_op_get_to(op),
778 sal_op_get_from(op),sal_op_get_route(op));
780 if (op->base.root->session_expires!=0){
781 osip_message_set_header(options, "Session-expires", "200");
782 osip_message_set_supported(options, "timer");
784 sal_add_other(sal_op_get_sal(op),op,options);
785 return eXosip_options_send_request(options);
790 int sal_call_refer(SalOp *h, const char *refer_to){
791 osip_message_t *msg=NULL;
794 eXosip_call_build_refer(h->did,refer_to, &msg);
795 if (msg) err=eXosip_call_send_request(h->did, msg);
801 int sal_call_refer_with_replaces(SalOp *h, SalOp *other_call_h){
802 osip_message_t *msg=NULL;
803 char referto[256]={0};
806 if (eXosip_call_get_referto(other_call_h->did,referto,sizeof(referto)-1)!=0){
807 ms_error("eXosip_call_get_referto() failed for did=%i",other_call_h->did);
811 eXosip_call_build_refer(h->did,referto, &msg);
812 osip_message_set_header(msg,"Referred-By",h->base.from);
813 if (msg) err=eXosip_call_send_request(h->did, msg);
819 SalOp *sal_call_get_replaces(SalOp *h){
820 if (h!=NULL && h->replaces!=NULL){
823 cid=eXosip_call_find_by_replaces(h->replaces);
826 SalOp *ret=sal_find_call(h->base.root,cid);
833 int sal_call_send_dtmf(SalOp *h, char dtmf){
834 osip_message_t *msg=NULL;
839 eXosip_call_build_info(h->did,&msg);
841 snprintf(dtmf_body, sizeof(dtmf_body), "Signal=%c\r\nDuration=250\r\n", dtmf);
842 osip_message_set_body(msg,dtmf_body,strlen(dtmf_body));
843 osip_message_set_content_type(msg,"application/dtmf-relay");
844 snprintf(clen,sizeof(clen),"%lu",(unsigned long)strlen(dtmf_body));
845 osip_message_set_content_length(msg,clen);
846 eXosip_call_send_request(h->did,msg);
852 static void push_auth_to_exosip(const SalAuthInfo *info){
854 if (info->userid==NULL || info->userid[0]=='\0') userid=info->username;
855 else userid=info->userid;
856 ms_message("Authentication info for username [%s], id[%s], realm [%s] added to eXosip", info->username,userid, info->realm);
857 eXosip_add_authentication_info (info->username,userid,
858 info->password, NULL,info->realm);
861 * Just for symmetry ;-)
863 static void pop_auth_from_exosip() {
864 eXosip_clear_authentication_info();
867 int sal_call_terminate(SalOp *h){
869 if (h == NULL) return -1;
870 if (h->auth_info) push_auth_to_exosip(h->auth_info);
872 err=eXosip_call_terminate(h->cid,h->did);
874 if (!h->base.root->reuse_authorization) pop_auth_from_exosip();
876 ms_warning("Exosip could not terminate the call: cid=%i did=%i", h->cid,h->did);
882 void sal_op_authenticate(SalOp *h, const SalAuthInfo *info){
883 if (h->pending_auth){
884 push_auth_to_exosip(info);
886 /*FIXME exosip does not take into account this update register message*/
888 if (fix_message_contact(h, h->pending_auth->request,h->pending_auth->response)) {
892 update_contact_from_response(h,h->pending_auth->response);
894 eXosip_default_action(h->pending_auth);
896 ms_message("eXosip_default_action() done");
897 if (!h->base.root->reuse_authorization) pop_auth_from_exosip();
899 if (h->auth_info) sal_auth_info_delete(h->auth_info); /*if already exist*/
900 h->auth_info=sal_auth_info_clone(info); /*store auth info for subsequent request*/
903 void sal_op_cancel_authentication(SalOp *h) {
905 sal_op_get_sal(h)->callbacks.register_failure(h,SalErrorFailure, SalReasonForbidden,_("Authentication failure"));
906 } else if (h->cid >0) {
907 sal_op_get_sal(h)->callbacks.call_failure(h,SalErrorFailure, SalReasonForbidden,_("Authentication failure"),0);
909 ms_warning("Auth failure not handled");
913 static void set_network_origin(SalOp *op, osip_message_t *req){
914 const char *received=NULL;
917 SalTransport transport;
918 if (extract_received_rport(req,&received,&rport,&transport)!=0){
919 osip_via_t *via=NULL;
921 osip_message_get_via(req,0,&via);
922 received=osip_via_get_host(via);
923 tmp=osip_via_get_port(via);
924 if (tmp) rport=atoi(tmp);
926 if (transport != SalTransportUDP) {
927 snprintf(origin,sizeof(origin)-1,"sip:%s:%i",received,rport);
929 snprintf(origin,sizeof(origin)-1,"sip:%s:%i;transport=%s",received,rport,sal_transport_to_string(transport));
931 __sal_op_set_network_origin(op,origin);
934 static void set_remote_ua(SalOp* op, osip_message_t *req){
935 if (op->base.remote_ua==NULL){
936 osip_header_t *h=NULL;
937 osip_message_get_user_agent(req,0,&h);
939 op->base.remote_ua=ms_strdup(h->hvalue);
944 static void set_replaces(SalOp *op, osip_message_t *req){
945 osip_header_t *h=NULL;
948 ms_free(op->replaces);
951 osip_message_header_get_byname(req,"replaces",0,&h);
953 if (h->hvalue && h->hvalue[0]!='\0'){
954 op->replaces=ms_strdup(h->hvalue);
959 static SalOp *find_op(Sal *sal, eXosip_event_t *ev){
961 return sal_find_call(sal,ev->cid);
964 return sal_find_register(sal,ev->rid);
967 return sal_find_out_subscribe(sal,ev->sid);
970 return sal_find_in_subscribe(sal,ev->nid);
972 if (ev->response) return sal_find_other(sal,ev->response);
976 static void inc_new_call(Sal *sal, eXosip_event_t *ev){
977 SalOp *op=sal_op_new(sal);
978 osip_from_t *from,*to;
979 osip_call_info_t *call_info;
981 sdp_message_t *sdp=eXosip_get_sdp_info(ev->request);
983 set_network_origin(op,ev->request);
984 set_remote_ua(op,ev->request);
985 set_replaces(op,ev->request);
988 op->sdp_offering=FALSE;
989 op->base.remote_media=sal_media_description_new();
990 sdp_to_media_description(sdp,op->base.remote_media);
991 sdp_message_free(sdp);
992 }else op->sdp_offering=TRUE;
994 from=osip_message_get_from(ev->request);
995 to=osip_message_get_to(ev->request);
996 osip_from_to_str(from,&tmp);
997 sal_op_set_from(op,tmp);
999 osip_from_to_str(to,&tmp);
1000 sal_op_set_to(op,tmp);
1003 osip_message_get_call_info(ev->request,0,&call_info);
1006 osip_call_info_to_str(call_info,&tmp);
1007 if( strstr(tmp,"answer-after=") != NULL)
1009 op->auto_answer_asked=TRUE;
1010 ms_message("The caller asked to automatically answer the call(Emergency?)\n");
1019 sal_add_call(op->base.root,op);
1020 sal->callbacks.call_received(op);
1023 static void handle_reinvite(Sal *sal, eXosip_event_t *ev){
1024 SalOp *op=find_op(sal,ev);
1028 ms_warning("Reinvite for non-existing operation !");
1033 sdp=eXosip_get_sdp_info(ev->request);
1034 if (op->base.remote_media){
1035 sal_media_description_unref(op->base.remote_media);
1036 op->base.remote_media=NULL;
1039 sal_media_description_unref(op->result);
1043 op->sdp_offering=FALSE;
1044 op->base.remote_media=sal_media_description_new();
1045 sdp_to_media_description(sdp,op->base.remote_media);
1046 sdp_message_free(sdp);
1049 op->sdp_offering=TRUE;
1051 sal->callbacks.call_updating(op);
1054 static void handle_ack(Sal *sal, eXosip_event_t *ev){
1055 SalOp *op=find_op(sal,ev);
1059 ms_warning("ack for non-existing call !");
1063 if (op->sdp_offering){
1064 sdp=eXosip_get_sdp_info(ev->ack);
1066 if (op->base.remote_media)
1067 sal_media_description_unref(op->base.remote_media);
1068 op->base.remote_media=sal_media_description_new();
1069 sdp_to_media_description(sdp,op->base.remote_media);
1071 sdp_message_free(sdp);
1077 sal->callbacks.call_ack(op);
1080 static void update_contact_from_response(SalOp *op, osip_message_t *response){
1081 const char *received;
1083 SalTransport transport;
1084 if (extract_received_rport(response,&received,&rport,&transport)==0){
1085 const char *contact=sal_op_get_contact(op);
1087 /*no contact given yet, use from instead*/
1088 contact=sal_op_get_from(op);
1091 SalAddress *addr=sal_address_new(contact);
1093 sal_address_set_domain(addr,received);
1094 sal_address_set_port_int(addr,rport);
1095 if (transport!=SalTransportUDP)
1096 sal_address_set_transport(addr,transport);
1097 tmp=sal_address_as_string(addr);
1098 ms_message("Contact address updated to %s",tmp);
1099 sal_op_set_contact(op,tmp);
1100 sal_address_destroy(addr);
1106 static int call_proceeding(Sal *sal, eXosip_event_t *ev){
1107 SalOp *op=find_op(sal,ev);
1109 if (op==NULL || op->terminated==TRUE) {
1110 ms_warning("This call has been canceled.");
1112 eXosip_call_terminate(ev->cid,ev->did);
1120 /* update contact if received and rport are set by the server
1121 note: will only be used by remote for next INVITE, if any...*/
1122 update_contact_from_response(op,ev->response);
1126 static void call_ringing(Sal *sal, eXosip_event_t *ev){
1128 SalOp *op=find_op(sal,ev);
1129 if (call_proceeding(sal, ev)==-1) return;
1131 set_remote_ua(op,ev->response);
1132 sdp=eXosip_get_sdp_info(ev->response);
1134 op->base.remote_media=sal_media_description_new();
1135 sdp_to_media_description(sdp,op->base.remote_media);
1136 sdp_message_free(sdp);
1137 if (op->base.local_media) sdp_process(op);
1139 sal->callbacks.call_ringing(op);
1142 static void call_accepted(Sal *sal, eXosip_event_t *ev){
1144 osip_message_t *msg=NULL;
1145 SalOp *op=find_op(sal,ev);
1146 const char *contact;
1148 if (op==NULL || op->terminated==TRUE) {
1149 ms_warning("This call has been already terminated.");
1151 eXosip_call_terminate(ev->cid,ev->did);
1157 set_remote_ua(op,ev->response);
1159 sdp=eXosip_get_sdp_info(ev->response);
1161 op->base.remote_media=sal_media_description_new();
1162 sdp_to_media_description(sdp,op->base.remote_media);
1163 sdp_message_free(sdp);
1164 if (op->base.local_media) sdp_process(op);
1166 eXosip_call_build_ack(ev->did,&msg);
1168 ms_warning("This call has been already terminated.");
1170 eXosip_call_terminate(ev->cid,ev->did);
1174 contact=sal_op_get_contact(op);
1176 _osip_list_set_empty(&msg->contacts,(void (*)(void*))osip_contact_free);
1177 osip_message_set_contact(msg,contact);
1179 if (op->sdp_answer){
1180 set_sdp(msg,op->sdp_answer);
1181 sdp_message_free(op->sdp_answer);
1182 op->sdp_answer=NULL;
1184 eXosip_call_send_ack(ev->did,msg);
1185 sal->callbacks.call_accepted(op);
1188 static void call_terminated(Sal *sal, eXosip_event_t *ev){
1190 SalOp *op=find_op(sal,ev);
1192 ms_warning("Call terminated for already closed call ?");
1196 osip_from_to_str(ev->request->from,&from);
1198 sal->callbacks.call_terminated(op,from!=NULL ? from : sal_op_get_from(op));
1199 if (from) osip_free(from);
1200 op->terminated=TRUE;
1203 static void call_released(Sal *sal, eXosip_event_t *ev){
1204 SalOp *op=find_op(sal,ev);
1206 ms_warning("No op associated to this call_released()");
1209 if (!op->terminated){
1210 /* no response received so far */
1211 call_failure(sal,ev);
1213 sal->callbacks.call_released(op);
1216 static int get_auth_data_from_response(osip_message_t *resp, const char **realm, const char **username){
1217 const char *prx_realm=NULL,*www_realm=NULL;
1218 osip_proxy_authenticate_t *prx_auth;
1219 osip_www_authenticate_t *www_auth;
1221 *username=osip_uri_get_username(resp->from->url);
1222 prx_auth=(osip_proxy_authenticate_t*)osip_list_get(&resp->proxy_authenticates,0);
1223 www_auth=(osip_proxy_authenticate_t*)osip_list_get(&resp->www_authenticates,0);
1225 prx_realm=osip_proxy_authenticate_get_realm(prx_auth);
1227 www_realm=osip_www_authenticate_get_realm(www_auth);
1231 }else if (www_realm){
1239 static int get_auth_data_from_request(osip_message_t *msg, const char **realm, const char **username){
1240 osip_authorization_t *auth=NULL;
1241 osip_proxy_authorization_t *prx_auth=NULL;
1243 *username=osip_uri_get_username(msg->from->url);
1244 osip_message_get_authorization(msg, 0, &auth);
1246 *realm=osip_authorization_get_realm(auth);
1249 osip_message_get_proxy_authorization(msg,0,&prx_auth);
1251 *realm=osip_proxy_authorization_get_realm(prx_auth);
1257 static int get_auth_data(eXosip_event_t *ev, const char **realm, const char **username){
1258 if (ev->response && get_auth_data_from_response(ev->response,realm,username)==0) return 0;
1259 if (ev->request && get_auth_data_from_request(ev->request,realm,username)==0) return 0;
1263 int sal_op_get_auth_requested(SalOp *op, const char **realm, const char **username){
1264 if (op->pending_auth){
1265 return get_auth_data(op->pending_auth,realm,username);
1270 static bool_t process_authentication(Sal *sal, eXosip_event_t *ev){
1272 const char *username,*realm;
1275 ms_warning("No operation associated with this authentication !");
1278 if (get_auth_data(ev,&realm,&username)==0){
1279 if (op->pending_auth!=NULL){
1280 eXosip_event_free(op->pending_auth);
1281 op->pending_auth=ev;
1283 op->pending_auth=ev;
1284 sal_add_pending_auth(sal,op);
1287 sal->callbacks.auth_requested(op,realm,username);
1293 static void authentication_ok(Sal *sal, eXosip_event_t *ev){
1295 const char *username,*realm;
1298 ms_warning("No operation associated with this authentication_ok!");
1301 if (op->pending_auth){
1302 eXosip_event_free(op->pending_auth);
1303 sal_remove_pending_auth(sal,op);
1304 op->pending_auth=NULL;
1306 if (get_auth_data(ev,&realm,&username)==0){
1307 sal->callbacks.auth_success(op,realm,username);
1311 static bool_t call_failure(Sal *sal, eXosip_event_t *ev){
1314 char* computedReason=NULL;
1315 const char *reason=NULL;
1316 SalError error=SalErrorUnknown;
1317 SalReason sr=SalReasonUnknown;
1320 op=(SalOp*)find_op(sal,ev);
1323 ms_warning("Call failure reported for a closed call, ignored.");
1328 code=osip_message_get_status_code(ev->response);
1329 reason=osip_message_get_reason_phrase(ev->response);
1330 osip_header_t *h=NULL;
1331 if (!osip_message_header_get_byname( ev->response
1335 computedReason = ms_strdup_printf("%s %s",reason,osip_header_get_value(h));
1336 reason = computedReason;
1344 return process_authentication(sal,ev);
1347 error=SalErrorUnknown;
1350 error=SalErrorFailure;
1351 sr=SalReasonNotFound;
1354 error=SalErrorFailure;
1358 eXosip_default_action(ev);
1362 error=SalErrorFailure;
1363 sr=SalReasonTemporarilyUnavailable;
1365 error=SalErrorFailure;
1371 error=SalErrorFailure;
1372 sr=SalReasonDoNotDisturb;
1375 error=SalErrorFailure;
1376 sr=SalReasonDeclined;
1380 error=SalErrorFailure;
1381 sr=SalReasonUnknown;
1382 }else error=SalErrorNoResponse;
1384 op->terminated=TRUE;
1385 sal->callbacks.call_failure(op,error,sr,reason,code);
1386 if (computedReason != NULL){
1387 ms_free(computedReason);
1392 /* Request remote side to send us VFU */
1393 void sal_call_send_vfu_request(SalOp *h){
1394 osip_message_t *msg=NULL;
1396 "<?xml version=\"1.0\" encoding=\"utf-8\" ?>"
1400 " <picture_fast_update></picture_fast_update>"
1408 eXosip_call_build_info(h->did,&msg);
1410 osip_message_set_body(msg,info_body,strlen(info_body));
1411 osip_message_set_content_type(msg,"application/media_control+xml");
1412 snprintf(clen,sizeof(clen),"%lu",(unsigned long)strlen(info_body));
1413 osip_message_set_content_length(msg,clen);
1414 eXosip_call_send_request(h->did,msg);
1415 ms_message("Sending VFU request !");
1420 static void process_media_control_xml(Sal *sal, eXosip_event_t *ev){
1421 SalOp *op=find_op(sal,ev);
1422 osip_body_t *body=NULL;
1425 ms_warning("media control xml received without operation context!");
1429 osip_message_get_body(ev->request,0,&body);
1430 if (body && body->body!=NULL &&
1431 strstr(body->body,"picture_fast_update")){
1432 osip_message_t *ans=NULL;
1433 ms_message("Receiving VFU request !");
1434 if (sal->callbacks.vfu_request){
1435 sal->callbacks.vfu_request(op);
1436 eXosip_call_build_answer(ev->tid,200,&ans);
1438 eXosip_call_send_answer(ev->tid,200,ans);
1442 /*in all other cases we must say it is not implemented.*/
1444 osip_message_t *ans=NULL;
1446 eXosip_call_build_answer(ev->tid,501,&ans);
1448 eXosip_call_send_answer(ev->tid,501,ans);
1453 static void process_dtmf_relay(Sal *sal, eXosip_event_t *ev){
1454 SalOp *op=find_op(sal,ev);
1455 osip_body_t *body=NULL;
1458 ms_warning("media dtmf relay received without operation context!");
1462 osip_message_get_body(ev->request,0,&body);
1463 if (body && body->body!=NULL){
1464 osip_message_t *ans=NULL;
1465 const char *name=strstr(body->body,"Signal");
1466 if (name==NULL) name=strstr(body->body,"signal");
1468 ms_warning("Could not extract the dtmf name from the SIP INFO.");
1471 name+=strlen("signal");
1472 if (sscanf(name," = %1s",tmp)==1){
1473 ms_message("Receiving dtmf %s via SIP INFO.",tmp);
1474 if (sal->callbacks.dtmf_received != NULL)
1475 sal->callbacks.dtmf_received(op, tmp[0]);
1479 eXosip_call_build_answer(ev->tid,200,&ans);
1481 eXosip_call_send_answer(ev->tid,200,ans);
1486 static void fill_options_answer(osip_message_t *options){
1487 osip_message_set_allow(options,"INVITE, ACK, BYE, CANCEL, OPTIONS, MESSAGE, SUBSCRIBE, NOTIFY, INFO");
1488 osip_message_set_accept(options,"application/sdp");
1491 static void process_refer(Sal *sal, SalOp *op, eXosip_event_t *ev){
1492 osip_header_t *h=NULL;
1493 osip_message_t *ans=NULL;
1494 ms_message("Receiving REFER request !");
1495 osip_message_header_get_byname(ev->request,"Refer-To",0,&h);
1498 osip_from_t *from=NULL;
1500 osip_from_init(&from);
1502 if (osip_from_parse(from,h->hvalue)==0){
1504 osip_uri_header_t *uh=NULL;
1505 osip_header_t *referred_by=NULL;
1506 osip_uri_header_get_byname(&from->url->url_headers,(char*)"Replaces",&uh);
1507 if (uh!=NULL && uh->gvalue && uh->gvalue[0]!='\0'){
1508 ms_message("Found replaces in Refer-To");
1510 ms_free(op->replaces);
1512 op->replaces=ms_strdup(uh->gvalue);
1514 osip_message_header_get_byname(ev->request,"Referred-By",0,&referred_by);
1515 if (referred_by && referred_by->hvalue && referred_by->hvalue[0]!='\0'){
1516 if (op->referred_by)
1517 ms_free(op->referred_by);
1518 op->referred_by=ms_strdup(referred_by->hvalue);
1521 osip_uri_header_freelist(&from->url->url_headers);
1522 osip_from_to_str(from,&tmp);
1523 sal->callbacks.refer_received(sal,op,tmp);
1525 osip_from_free(from);
1528 eXosip_call_build_answer(ev->tid,202,&ans);
1530 eXosip_call_send_answer(ev->tid,202,ans);
1535 ms_warning("cannot do anything with the refer without destination\n");
1539 void process_notify(Sal *sal, eXosip_event_t *ev){
1540 osip_header_t *h=NULL;
1542 SalOp *op=find_op(sal,ev);
1543 osip_message_t *ans=NULL;
1545 ms_message("Receiving NOTIFY request !");
1546 osip_from_to_str(ev->request->from,&from);
1547 osip_message_header_get_byname(ev->request,"Event",0,&h);
1549 osip_body_t *body=NULL;
1550 //osip_content_type_t *ct=NULL;
1551 osip_message_get_body(ev->request,0,&body);
1552 //ct=osip_message_get_content_type(ev->request);
1553 if (h->hvalue && strcasecmp(h->hvalue,"refer")==0){
1554 /*special handling of refer events*/
1555 if (body && body->body){
1556 osip_message_t *msg;
1557 osip_message_init(&msg);
1558 if (osip_message_parse_sipfrag(msg,body->body,strlen(body->body))==0){
1559 int code=osip_message_get_status_code(msg);
1561 sal->callbacks.notify_refer(op,SalReferTrying);
1562 }else if (code==200){
1563 sal->callbacks.notify_refer(op,SalReferSuccess);
1564 }else if (code>=400){
1565 sal->callbacks.notify_refer(op,SalReferFailed);
1568 osip_message_free(msg);
1571 /*generic handling*/
1572 sal->callbacks.notify(op,from,h->hvalue);
1575 /*answer that we received the notify*/
1577 eXosip_call_build_answer(ev->tid,200,&ans);
1579 eXosip_call_send_answer(ev->tid,200,ans);
1584 static void call_message_new(Sal *sal, eXosip_event_t *ev){
1585 osip_message_t *ans=NULL;
1587 if (MSG_IS_INFO(ev->request)){
1588 osip_content_type_t *ct;
1589 ct=osip_message_get_content_type(ev->request);
1590 if (ct && ct->subtype){
1591 if (strcmp(ct->subtype,"media_control+xml")==0)
1592 process_media_control_xml(sal,ev);
1593 else if (strcmp(ct->subtype,"dtmf-relay")==0)
1594 process_dtmf_relay(sal,ev);
1596 ms_message("Unhandled SIP INFO.");
1597 /*send an "Not implemented" answer*/
1599 eXosip_call_build_answer(ev->tid,501,&ans);
1601 eXosip_call_send_answer(ev->tid,501,ans);
1605 /*empty SIP INFO, probably to test we are alive. Send an empty answer*/
1607 eXosip_call_build_answer(ev->tid,200,&ans);
1609 eXosip_call_send_answer(ev->tid,200,ans);
1612 }else if(MSG_IS_MESSAGE(ev->request)){
1613 /* SIP messages could be received into call */
1614 text_received(sal, ev);
1616 eXosip_call_build_answer(ev->tid,200,&ans);
1618 eXosip_call_send_answer(ev->tid,200,ans);
1620 }else if(MSG_IS_REFER(ev->request)){
1621 SalOp *op=find_op(sal,ev);
1623 ms_message("Receiving REFER request !");
1624 process_refer(sal,op,ev);
1625 }else if(MSG_IS_NOTIFY(ev->request)){
1626 process_notify(sal,ev);
1627 }else if (MSG_IS_OPTIONS(ev->request)){
1629 eXosip_call_build_answer(ev->tid,200,&ans);
1631 fill_options_answer(ans);
1632 eXosip_call_send_answer(ev->tid,200,ans);
1636 }else ms_warning("call_message_new: No request ?");
1639 static void inc_update(Sal *sal, eXosip_event_t *ev){
1640 osip_message_t *msg=NULL;
1641 ms_message("Processing incoming UPDATE");
1643 eXosip_message_build_answer(ev->tid,200,&msg);
1645 eXosip_message_send_answer(ev->tid,200,msg);
1649 static bool_t comes_from_local_if(osip_message_t *msg){
1650 osip_via_t *via=NULL;
1651 osip_message_get_via(msg,0,&via);
1654 host=osip_via_get_host(via);
1655 if (strcmp(host,"127.0.0.1")==0 || strcmp(host,"::1")==0){
1656 osip_generic_param_t *param=NULL;
1657 osip_via_param_get_byname(via,"received",¶m);
1658 if (param==NULL) return TRUE;
1659 if (param->gvalue &&
1660 (strcmp(param->gvalue,"127.0.0.1")==0 || strcmp(param->gvalue,"::1")==0)){
1668 static void text_received(Sal *sal, eXosip_event_t *ev){
1669 osip_body_t *body=NULL;
1670 char *from=NULL,*msg;
1672 osip_message_get_body(ev->request,0,&body);
1674 ms_error("Could not get text message from SIP body");
1678 osip_from_to_str(ev->request->from,&from);
1679 sal->callbacks.text_received(sal,from,msg);
1685 static void other_request(Sal *sal, eXosip_event_t *ev){
1686 ms_message("in other_request");
1687 if (ev->request==NULL) return;
1688 if (strcmp(ev->request->sip_method,"MESSAGE")==0){
1689 text_received(sal,ev);
1690 eXosip_message_send_answer(ev->tid,200,NULL);
1691 }else if (strcmp(ev->request->sip_method,"OPTIONS")==0){
1692 osip_message_t *options=NULL;
1693 eXosip_options_build_answer(ev->tid,200,&options);
1694 fill_options_answer(options);
1695 eXosip_options_send_answer(ev->tid,200,options);
1696 }else if (strncmp(ev->request->sip_method, "REFER", 5) == 0){
1697 ms_message("Receiving REFER request !");
1698 if (comes_from_local_if(ev->request)) {
1699 process_refer(sal,NULL,ev);
1700 }else ms_warning("Ignored REFER not coming from this local loopback interface.");
1701 }else if (strncmp(ev->request->sip_method, "UPDATE", 6) == 0){
1706 osip_message_to_str(ev->request,&tmp,&msglen);
1708 ms_message("Unsupported request received:\n%s",tmp);
1711 /*answer with a 501 Not implemented*/
1712 eXosip_message_send_answer(ev->tid,501,NULL);
1716 static void masquerade_via(osip_message_t *msg, const char *ip, const char *port){
1717 osip_via_t *via=NULL;
1718 osip_message_get_via(msg,0,&via);
1720 osip_free(via->port);
1721 via->port=osip_strdup(port);
1722 osip_free(via->host);
1723 via->host=osip_strdup(ip);
1728 static bool_t fix_message_contact(SalOp *op, osip_message_t *request,osip_message_t *last_answer) {
1729 osip_contact_t *ctt=NULL;
1730 const char *received;
1732 SalTransport transport;
1735 if (extract_received_rport(last_answer,&received,&rport,&transport)==-1) return FALSE;
1736 osip_message_get_contact(request,0,&ctt);
1738 ms_warning("fix_message_contact(): no contact to update");
1741 if (ctt->url->host!=NULL){
1742 osip_free(ctt->url->host);
1744 ctt->url->host=osip_strdup(received);
1745 if (ctt->url->port!=NULL){
1746 osip_free(ctt->url->port);
1748 snprintf(port,sizeof(port),"%i",rport);
1749 ctt->url->port=osip_strdup(port);
1750 if (op->masquerade_via) masquerade_via(request,received,port);
1752 if (transport != SalTransportUDP) {
1753 sal_address_set_param((SalAddress *)ctt, "transport", sal_transport_to_string(transport));
1758 static bool_t register_again_with_updated_contact(SalOp *op, osip_message_t *orig_request, osip_message_t *last_answer){
1759 osip_contact_t *ctt=NULL;
1760 SalAddress* ori_contact_address=NULL;
1761 const char *received;
1763 SalTransport transport;
1765 osip_message_t *msg=NULL;
1766 Sal* sal=op->base.root;
1768 if (sal->double_reg==FALSE ) return FALSE;
1770 if (extract_received_rport(last_answer,&received,&rport,&transport)==-1) return FALSE;
1771 osip_message_get_contact(orig_request,0,&ctt);
1772 osip_contact_to_str(ctt,&tmp);
1773 ori_contact_address = sal_address_new(tmp);
1775 /*check if contact is up to date*/
1776 if (strcmp(sal_address_get_domain(ori_contact_address),received) ==0
1777 && sal_address_get_port_int(ori_contact_address) == rport
1778 && sal_address_get_transport(ori_contact_address) == transport) {
1779 ms_message("Register has up to date contact, doing nothing.");
1781 sal_address_destroy(ori_contact_address);
1783 } else ms_message("contact do not match, need to update the register (%s with %s:%i;transport=%s)"
1787 ,sal_transport_to_string(transport));
1789 sal_address_destroy(ori_contact_address);
1792 eXosip_register_build_register(op->rid,op->expires,&msg);
1795 ms_warning("Fail to create a contact updated register.");
1798 if (fix_message_contact(op,msg,last_answer)) {
1799 eXosip_register_send_register(op->rid,msg);
1801 ms_message("Resending new register with updated contact");
1802 update_contact_from_response(op,last_answer);
1805 ms_warning("Fail to send updated register.");
1813 static void registration_success(Sal *sal, eXosip_event_t *ev){
1814 SalOp *op=sal_find_register(sal,ev->rid);
1815 osip_header_t *h=NULL;
1818 ms_error("Receiving register response for unknown operation");
1821 osip_message_get_expires(ev->request,0,&h);
1822 if (h!=NULL && atoi(h->hvalue)!=0){
1824 if (!register_again_with_updated_contact(op,ev->request,ev->response)){
1825 sal->callbacks.register_success(op,registered);
1828 sal->callbacks.register_success(op,FALSE);
1832 static bool_t registration_failure(Sal *sal, eXosip_event_t *ev){
1834 const char *reason=NULL;
1835 SalOp *op=sal_find_register(sal,ev->rid);
1836 SalReason sr=SalReasonUnknown;
1837 SalError se=SalErrorUnknown;
1840 ms_error("Receiving register failure for unknown operation");
1844 status_code=osip_message_get_status_code(ev->response);
1845 reason=osip_message_get_reason_phrase(ev->response);
1847 switch(status_code){
1850 return process_authentication(sal,ev);
1852 case 423: /*interval too brief*/
1853 {/*retry with greater interval */
1854 osip_header_t *h=NULL;
1855 osip_message_t *msg=NULL;
1856 osip_message_header_get_byname(ev->response,"min-expires",0,&h);
1857 if (h && h->hvalue && h->hvalue[0]!='\0'){
1858 int val=atoi(h->hvalue);
1859 if (val>op->expires)
1861 }else op->expires*=2;
1863 eXosip_register_build_register(op->rid,op->expires,&msg);
1864 eXosip_register_send_register(op->rid,msg);
1868 case 606: /*Not acceptable, workaround for proxies that don't like private addresses
1869 in vias, such as ekiga.net
1870 On the opposite, freephonie.net bugs when via are masqueraded.
1872 op->masquerade_via=TRUE;
1874 /* if contact is up to date, process the failure, otherwise resend a new register with
1875 updated contact first, just in case the faillure is due to incorrect contact */
1876 if (ev->response && register_again_with_updated_contact(op,ev->request,ev->response))
1877 return TRUE; /*we are retrying with an updated contact*/
1878 if (status_code==403){
1880 sr=SalReasonForbidden;
1881 }else if (status_code==0){
1882 se=SalErrorNoResponse;
1884 sal->callbacks.register_failure(op,se,sr,reason);
1889 static void other_request_reply(Sal *sal,eXosip_event_t *ev){
1890 SalOp *op=find_op(sal,ev);
1893 ms_warning("other_request_reply(): Receiving response to unknown request.");
1897 update_contact_from_response(op,ev->response);
1898 if (ev->request && strcmp(osip_message_get_method(ev->request),"OPTIONS")==0)
1899 sal->callbacks.ping_reply(op);
1903 static bool_t process_event(Sal *sal, eXosip_event_t *ev){
1904 ms_message("linphone process event get a message %d\n",ev->type);
1906 case EXOSIP_CALL_ANSWERED:
1907 ms_message("CALL_ANSWERED\n");
1908 call_accepted(sal,ev);
1909 authentication_ok(sal,ev);
1911 case EXOSIP_CALL_CLOSED:
1912 case EXOSIP_CALL_CANCELLED:
1913 ms_message("CALL_CLOSED or CANCELLED\n");
1914 call_terminated(sal,ev);
1916 case EXOSIP_CALL_TIMEOUT:
1917 case EXOSIP_CALL_NOANSWER:
1918 ms_message("CALL_TIMEOUT or NOANSWER\n");
1919 return call_failure(sal,ev);
1921 case EXOSIP_CALL_REQUESTFAILURE:
1922 case EXOSIP_CALL_GLOBALFAILURE:
1923 case EXOSIP_CALL_SERVERFAILURE:
1924 ms_message("CALL_REQUESTFAILURE or GLOBALFAILURE or SERVERFAILURE\n");
1925 return call_failure(sal,ev);
1927 case EXOSIP_CALL_RELEASED:
1928 ms_message("CALL_RELEASED\n");
1929 call_released(sal, ev);
1931 case EXOSIP_CALL_INVITE:
1932 ms_message("CALL_NEW\n");
1933 inc_new_call(sal,ev);
1935 case EXOSIP_CALL_REINVITE:
1936 handle_reinvite(sal,ev);
1938 case EXOSIP_CALL_ACK:
1939 ms_message("CALL_ACK");
1942 case EXOSIP_CALL_REDIRECTED:
1943 ms_message("CALL_REDIRECTED");
1944 eXosip_default_action(ev);
1946 case EXOSIP_CALL_PROCEEDING:
1947 ms_message("CALL_PROCEEDING");
1948 call_proceeding(sal,ev);
1950 case EXOSIP_CALL_RINGING:
1951 ms_message("CALL_RINGING");
1952 call_ringing(sal,ev);
1954 case EXOSIP_CALL_MESSAGE_NEW:
1955 ms_message("EXOSIP_CALL_MESSAGE_NEW");
1956 call_message_new(sal,ev);
1958 case EXOSIP_CALL_MESSAGE_REQUESTFAILURE:
1960 (ev->response->status_code==407 || ev->response->status_code==401)){
1961 return process_authentication(sal,ev);
1964 case EXOSIP_IN_SUBSCRIPTION_NEW:
1965 ms_message("CALL_IN_SUBSCRIPTION_NEW ");
1966 sal_exosip_subscription_recv(sal,ev);
1968 case EXOSIP_IN_SUBSCRIPTION_RELEASED:
1969 ms_message("CALL_SUBSCRIPTION_NEW ");
1970 sal_exosip_in_subscription_closed(sal,ev);
1972 case EXOSIP_SUBSCRIPTION_UPDATE:
1973 ms_message("CALL_SUBSCRIPTION_UPDATE");
1975 case EXOSIP_SUBSCRIPTION_NOTIFY:
1976 ms_message("CALL_SUBSCRIPTION_NOTIFY");
1977 sal_exosip_notify_recv(sal,ev);
1979 case EXOSIP_SUBSCRIPTION_ANSWERED:
1980 ms_message("EXOSIP_SUBSCRIPTION_ANSWERED, ev->sid=%i, ev->did=%i\n",ev->sid,ev->did);
1981 sal_exosip_subscription_answered(sal,ev);
1983 case EXOSIP_SUBSCRIPTION_CLOSED:
1984 ms_message("EXOSIP_SUBSCRIPTION_CLOSED\n");
1985 sal_exosip_subscription_closed(sal,ev);
1987 case EXOSIP_SUBSCRIPTION_REQUESTFAILURE: /**< announce a request failure */
1988 if (ev->response && (ev->response->status_code == 407 || ev->response->status_code == 401)){
1989 return process_authentication(sal,ev);
1991 case EXOSIP_SUBSCRIPTION_SERVERFAILURE:
1992 case EXOSIP_SUBSCRIPTION_GLOBALFAILURE:
1993 sal_exosip_subscription_closed(sal,ev);
1995 case EXOSIP_REGISTRATION_FAILURE:
1996 ms_message("REGISTRATION_FAILURE\n");
1997 return registration_failure(sal,ev);
1999 case EXOSIP_REGISTRATION_SUCCESS:
2000 authentication_ok(sal,ev);
2001 registration_success(sal,ev);
2003 case EXOSIP_MESSAGE_NEW:
2004 other_request(sal,ev);
2006 case EXOSIP_MESSAGE_PROCEEDING:
2007 case EXOSIP_MESSAGE_ANSWERED:
2008 case EXOSIP_MESSAGE_REDIRECTED:
2009 case EXOSIP_MESSAGE_SERVERFAILURE:
2010 case EXOSIP_MESSAGE_GLOBALFAILURE:
2011 other_request_reply(sal,ev);
2013 case EXOSIP_MESSAGE_REQUESTFAILURE:
2014 case EXOSIP_NOTIFICATION_REQUESTFAILURE:
2016 switch (ev->response->status_code) {
2019 return process_authentication(sal,ev);
2021 eXosip_automatic_action ();
2026 other_request_reply(sal,ev);
2029 ms_message("Unhandled exosip event ! %i",ev->type);
2035 int sal_iterate(Sal *sal){
2037 while((ev=eXosip_event_wait(0,0))!=NULL){
2038 if (process_event(sal,ev))
2039 eXosip_event_free(ev);
2041 #ifdef HAVE_EXOSIP_TRYLOCK
2042 if (eXosip_trylock()==0){
2043 eXosip_automatic_refresh();
2046 ms_warning("eXosip_trylock busy.");
2050 eXosip_automatic_refresh();
2056 static void register_set_contact(osip_message_t *msg, const char *contact){
2057 osip_uri_param_t *param = NULL;
2058 osip_contact_t *ct=NULL;
2060 /*we get the line parameter choosed by exosip, and add it to our own contact*/
2061 osip_message_get_contact(msg,0,&ct);
2063 osip_uri_uparam_get_byname(ct->url, "line", ¶m);
2064 if (param && param->gvalue)
2065 line=osip_strdup(param->gvalue);
2067 _osip_list_set_empty(&msg->contacts,(void (*)(void*))osip_contact_free);
2068 osip_message_set_contact(msg,contact);
2069 osip_message_get_contact(msg,0,&ct);
2070 osip_uri_uparam_add(ct->url,osip_strdup("line"),line);
2073 static void sal_register_add_route(osip_message_t *msg, const char *proxy){
2075 snprintf(tmp,sizeof(tmp)-1,"<%s;lr>",proxy);
2077 osip_list_special_free(&msg->routes,(void (*)(void*))osip_route_free);
2078 osip_message_set_route(msg,tmp);
2081 int sal_register(SalOp *h, const char *proxy, const char *from, int expires){
2082 osip_message_t *msg;
2083 const char *contact=sal_op_get_contact(h);
2085 sal_op_set_route(h,proxy);
2087 SalAddress *from_parsed=sal_address_new(from);
2089 if (from_parsed==NULL) {
2090 ms_warning("sal_register() bad from %s",from);
2093 snprintf(domain,sizeof(domain),"sip:%s",sal_address_get_domain(from_parsed));
2094 sal_address_destroy(from_parsed);
2096 h->rid=eXosip_register_build_initial_register(from,domain,NULL,expires,&msg);
2098 if (contact) register_set_contact(msg,contact);
2099 sal_register_add_route(msg,proxy);
2100 sal_add_register(h->base.root,h);
2102 ms_error("Could not build initial register.");
2108 eXosip_register_build_register(h->rid,expires,&msg);
2109 sal_register_add_route(msg,proxy);
2112 eXosip_register_send_register(h->rid,msg);
2115 return (msg != NULL) ? 0 : -1;
2118 int sal_register_refresh(SalOp *op, int expires){
2119 osip_message_t *msg=NULL;
2120 const char *contact=sal_op_get_contact(op);
2123 ms_error("Unexistant registration context, not possible to refresh.");
2127 eXosip_register_build_register(op->rid,expires,&msg);
2129 if (contact) register_set_contact(msg,contact);
2130 sal_register_add_route(msg,sal_op_get_route(op));
2131 eXosip_register_send_register(op->rid,msg);
2132 }else ms_error("Could not build REGISTER refresh message.");
2134 return (msg != NULL) ? 0 : -1;
2138 int sal_unregister(SalOp *h){
2139 osip_message_t *msg=NULL;
2141 eXosip_register_build_register(h->rid,0,&msg);
2142 if (msg) eXosip_register_send_register(h->rid,msg);
2143 else ms_warning("Could not build unREGISTER !");
2148 SalAddress * sal_address_new(const char *uri){
2150 osip_from_init(&from);
2152 // Remove front spaces
2153 while (uri[0]==' ') {
2157 if (osip_from_parse(from,uri)!=0){
2158 osip_from_free(from);
2161 if (from->displayname!=NULL && from->displayname[0]=='"'){
2162 char *unquoted=osip_strdup_without_quote(from->displayname);
2163 osip_free(from->displayname);
2164 from->displayname=unquoted;
2166 return (SalAddress*)from;
2169 SalAddress * sal_address_clone(const SalAddress *addr){
2170 osip_from_t *ret=NULL;
2171 osip_from_clone((osip_from_t*)addr,&ret);
2172 return (SalAddress*)ret;
2175 #define null_if_empty(s) (((s)!=NULL && (s)[0]!='\0') ? (s) : NULL )
2177 const char *sal_address_get_scheme(const SalAddress *addr){
2178 const osip_from_t *u=(const osip_from_t*)addr;
2179 return null_if_empty(u->url->scheme);
2182 const char *sal_address_get_display_name(const SalAddress* addr){
2183 const osip_from_t *u=(const osip_from_t*)addr;
2184 return null_if_empty(u->displayname);
2187 const char *sal_address_get_username(const SalAddress *addr){
2188 const osip_from_t *u=(const osip_from_t*)addr;
2189 return null_if_empty(u->url->username);
2192 const char *sal_address_get_domain(const SalAddress *addr){
2193 const osip_from_t *u=(const osip_from_t*)addr;
2194 return null_if_empty(u->url->host);
2197 void sal_address_set_display_name(SalAddress *addr, const char *display_name){
2198 osip_from_t *u=(osip_from_t*)addr;
2199 if (u->displayname!=NULL){
2200 osip_free(u->displayname);
2201 u->displayname=NULL;
2203 if (display_name!=NULL && display_name[0]!='\0'){
2204 u->displayname=osip_strdup(display_name);
2208 void sal_address_set_username(SalAddress *addr, const char *username){
2209 osip_from_t *uri=(osip_from_t*)addr;
2210 if (uri->url->username!=NULL){
2211 osip_free(uri->url->username);
2212 uri->url->username=NULL;
2215 uri->url->username=osip_strdup(username);
2218 void sal_address_set_domain(SalAddress *addr, const char *host){
2219 osip_from_t *uri=(osip_from_t*)addr;
2220 if (uri->url->host!=NULL){
2221 osip_free(uri->url->host);
2222 uri->url->host=NULL;
2225 uri->url->host=osip_strdup(host);
2228 void sal_address_set_port(SalAddress *addr, const char *port){
2229 osip_from_t *uri=(osip_from_t*)addr;
2230 if (uri->url->port!=NULL){
2231 osip_free(uri->url->port);
2232 uri->url->port=NULL;
2235 uri->url->port=osip_strdup(port);
2238 void sal_address_set_port_int(SalAddress *uri, int port){
2241 /*this is the default, special case to leave the port field blank*/
2242 sal_address_set_port(uri,NULL);
2245 snprintf(tmp,sizeof(tmp),"%i",port);
2246 sal_address_set_port(uri,tmp);
2249 void sal_address_clean(SalAddress *addr){
2250 osip_generic_param_freelist(& ((osip_from_t*)addr)->gen_params);
2251 osip_uri_param_freelist(& ((osip_from_t*)addr)->url->url_params);
2254 char *sal_address_as_string(const SalAddress *u){
2256 osip_from_t *from=(osip_from_t *)u;
2257 char *old_displayname=NULL;
2258 /* hack to force use of quotes around the displayname*/
2259 if (from->displayname!=NULL
2260 && from->displayname[0]!='"'){
2261 old_displayname=from->displayname;
2262 from->displayname=osip_enquote(from->displayname);
2264 osip_from_to_str(from,&tmp);
2265 if (old_displayname!=NULL){
2266 ms_free(from->displayname);
2267 from->displayname=old_displayname;
2274 char *sal_address_as_string_uri_only(const SalAddress *u){
2275 char *tmp=NULL,*ret;
2276 osip_uri_to_str(((osip_from_t*)u)->url,&tmp);
2281 void sal_address_set_param(SalAddress *u,const char* name,const char* value) {
2282 osip_uri_param_t *param=NULL;
2283 osip_uri_uparam_get_byname(((osip_from_t*)u)->url,(char*)name,¶m);
2285 osip_uri_uparam_add (((osip_from_t*)u)->url,ms_strdup(name),value ? ms_strdup(value) : NULL);
2287 osip_free(param->gvalue);
2288 param->gvalue=value ? osip_strdup(value) : NULL;
2293 void sal_address_destroy(SalAddress *u){
2294 osip_from_free((osip_from_t*)u);
2297 void sal_set_keepalive_period(Sal *ctx,unsigned int value) {
2298 ctx->keepalive_period=value;
2299 eXosip_set_option (EXOSIP_OPT_UDP_KEEP_ALIVE, &value);
2301 unsigned int sal_get_keepalive_period(Sal *ctx) {
2302 return ctx->keepalive_period;
2305 const char * sal_address_get_port(const SalAddress *addr) {
2306 const osip_from_t *u=(const osip_from_t*)addr;
2307 return null_if_empty(u->url->port);
2310 int sal_address_get_port_int(const SalAddress *uri) {
2311 const char* port = sal_address_get_port(uri);
2318 SalTransport sal_address_get_transport(const SalAddress* addr) {
2319 const osip_from_t *u=(const osip_from_t*)addr;
2320 osip_uri_param_t *transport_param=NULL;
2321 osip_uri_uparam_get_byname(u->url,"transport",&transport_param);
2322 if (transport_param == NULL){
2323 return SalTransportUDP;
2325 return sal_transport_parse(transport_param->gvalue);
2328 void sal_address_set_transport(SalAddress* addr,SalTransport transport) {
2329 sal_address_set_param(addr, "transport", sal_transport_to_string(transport));
2332 /* sends a reinvite. Local media description may have changed by application since call establishment*/
2333 int sal_call_update(SalOp *h, const char *subject){
2335 osip_message_t *reinvite=NULL;
2338 if(eXosip_call_build_request(h->did,"INVITE",&reinvite) != 0 || reinvite==NULL){
2343 osip_message_set_subject(reinvite,subject);
2344 osip_message_set_allow(reinvite, "INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, NOTIFY, MESSAGE, SUBSCRIBE, INFO");
2345 if (h->base.root->session_expires!=0){
2346 osip_message_set_header(reinvite, "Session-expires", "200");
2347 osip_message_set_supported(reinvite, "timer");
2349 if (h->base.local_media){
2350 h->sdp_offering=TRUE;
2351 set_sdp_from_desc(reinvite,h->base.local_media);
2352 }else h->sdp_offering=FALSE;
2354 err = eXosip_call_send_request(h->did, reinvite);
2358 void sal_reuse_authorization(Sal *ctx, bool_t value) {
2359 ctx->reuse_authorization=value;