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 int sal_ping(SalOp *op, const char *from, const char *to){
732 osip_message_t *options=NULL;
734 sal_op_set_from(op,from);
735 sal_op_set_to(op,to);
736 sal_exosip_fix_route(op);
738 eXosip_options_build_request (&options, sal_op_get_to(op),
739 sal_op_get_from(op),sal_op_get_route(op));
741 if (op->base.root->session_expires!=0){
742 osip_message_set_header(options, "Session-expires", "200");
743 osip_message_set_supported(options, "timer");
745 sal_add_other(sal_op_get_sal(op),op,options);
746 return eXosip_options_send_request(options);
751 int sal_call_accept_refer(SalOp *op){
752 osip_message_t *msg=NULL;
755 err = eXosip_call_build_notify(op->did,EXOSIP_SUBCRSTATE_ACTIVE,&msg);
758 osip_message_set_header(msg,(const char *)"event","refer");
759 osip_message_set_content_type(msg,"message/sipfrag");
760 osip_message_set_body(msg,"SIP/2.0 100 Trying",sizeof("SIP/2.0 100 Trying"));
761 eXosip_call_send_request(op->did,msg);
765 ms_error("could not get a notify built\n");
771 int sal_call_refer(SalOp *h, const char *refer_to){
772 osip_message_t *msg=NULL;
775 eXosip_call_build_refer(h->did,refer_to, &msg);
776 if (msg) err=eXosip_call_send_request(h->did, msg);
782 int sal_call_refer_with_replaces(SalOp *h, SalOp *other_call_h){
783 osip_message_t *msg=NULL;
784 char referto[256]={0};
787 if (eXosip_call_get_referto(other_call_h->did,referto,sizeof(referto)-1)!=0){
788 ms_error("eXosip_call_get_referto() failed for did=%i",other_call_h->did);
792 eXosip_call_build_refer(h->did,referto, &msg);
793 osip_message_set_header(msg,"Referred-By",h->base.from);
794 if (msg) err=eXosip_call_send_request(h->did, msg);
800 SalOp *sal_call_get_replaces(SalOp *h){
801 if (h!=NULL && h->replaces!=NULL){
804 cid=eXosip_call_find_by_replaces(h->replaces);
807 SalOp *ret=sal_find_call(h->base.root,cid);
814 int sal_call_send_dtmf(SalOp *h, char dtmf){
815 osip_message_t *msg=NULL;
820 eXosip_call_build_info(h->did,&msg);
822 snprintf(dtmf_body, sizeof(dtmf_body), "Signal=%c\r\nDuration=250\r\n", dtmf);
823 osip_message_set_body(msg,dtmf_body,strlen(dtmf_body));
824 osip_message_set_content_type(msg,"application/dtmf-relay");
825 snprintf(clen,sizeof(clen),"%lu",(unsigned long)strlen(dtmf_body));
826 osip_message_set_content_length(msg,clen);
827 eXosip_call_send_request(h->did,msg);
833 static void push_auth_to_exosip(const SalAuthInfo *info){
835 if (info->userid==NULL || info->userid[0]=='\0') userid=info->username;
836 else userid=info->userid;
837 ms_message("Authentication info for username [%s], id[%s], realm [%s] added to eXosip", info->username,userid, info->realm);
838 eXosip_add_authentication_info (info->username,userid,
839 info->password, NULL,info->realm);
842 * Just for symmetry ;-)
844 static void pop_auth_from_exosip() {
845 eXosip_clear_authentication_info();
848 int sal_call_terminate(SalOp *h){
850 if (h == NULL) return -1;
851 if (h->auth_info) push_auth_to_exosip(h->auth_info);
853 err=eXosip_call_terminate(h->cid,h->did);
855 if (!h->base.root->reuse_authorization) pop_auth_from_exosip();
857 ms_warning("Exosip could not terminate the call: cid=%i did=%i", h->cid,h->did);
863 void sal_op_authenticate(SalOp *h, const SalAuthInfo *info){
864 if (h->pending_auth){
865 push_auth_to_exosip(info);
867 /*FIXME exosip does not take into account this update register message*/
869 if (fix_message_contact(h, h->pending_auth->request,h->pending_auth->response)) {
873 update_contact_from_response(h,h->pending_auth->response);
875 eXosip_default_action(h->pending_auth);
877 ms_message("eXosip_default_action() done");
878 if (!h->base.root->reuse_authorization) pop_auth_from_exosip();
880 if (h->auth_info) sal_auth_info_delete(h->auth_info); /*if already exist*/
881 h->auth_info=sal_auth_info_clone(info); /*store auth info for subsequent request*/
884 void sal_op_cancel_authentication(SalOp *h) {
886 sal_op_get_sal(h)->callbacks.register_failure(h,SalErrorFailure, SalReasonForbidden,_("Authentication failure"));
887 } else if (h->cid >0) {
888 sal_op_get_sal(h)->callbacks.call_failure(h,SalErrorFailure, SalReasonForbidden,_("Authentication failure"),0);
890 ms_warning("Auth failure not handled");
894 static void set_network_origin(SalOp *op, osip_message_t *req){
895 const char *received=NULL;
898 SalTransport transport;
899 if (extract_received_rport(req,&received,&rport,&transport)!=0){
900 osip_via_t *via=NULL;
902 osip_message_get_via(req,0,&via);
903 received=osip_via_get_host(via);
904 tmp=osip_via_get_port(via);
905 if (tmp) rport=atoi(tmp);
907 if (transport != SalTransportUDP) {
908 snprintf(origin,sizeof(origin)-1,"sip:%s:%i",received,rport);
910 snprintf(origin,sizeof(origin)-1,"sip:%s:%i;transport=%s",received,rport,sal_transport_to_string(transport));
912 __sal_op_set_network_origin(op,origin);
915 static void set_remote_ua(SalOp* op, osip_message_t *req){
916 if (op->base.remote_ua==NULL){
917 osip_header_t *h=NULL;
918 osip_message_get_user_agent(req,0,&h);
920 op->base.remote_ua=ms_strdup(h->hvalue);
925 static void set_replaces(SalOp *op, osip_message_t *req){
926 osip_header_t *h=NULL;
929 ms_free(op->replaces);
932 osip_message_header_get_byname(req,"replaces",0,&h);
934 if (h->hvalue && h->hvalue[0]!='\0'){
935 op->replaces=ms_strdup(h->hvalue);
940 static SalOp *find_op(Sal *sal, eXosip_event_t *ev){
942 return sal_find_call(sal,ev->cid);
945 return sal_find_register(sal,ev->rid);
948 return sal_find_out_subscribe(sal,ev->sid);
951 return sal_find_in_subscribe(sal,ev->nid);
953 if (ev->response) return sal_find_other(sal,ev->response);
957 static void inc_new_call(Sal *sal, eXosip_event_t *ev){
958 SalOp *op=sal_op_new(sal);
959 osip_from_t *from,*to;
960 osip_call_info_t *call_info;
962 sdp_message_t *sdp=eXosip_get_sdp_info(ev->request);
964 set_network_origin(op,ev->request);
965 set_remote_ua(op,ev->request);
966 set_replaces(op,ev->request);
969 op->sdp_offering=FALSE;
970 op->base.remote_media=sal_media_description_new();
971 sdp_to_media_description(sdp,op->base.remote_media);
972 sdp_message_free(sdp);
973 }else op->sdp_offering=TRUE;
975 from=osip_message_get_from(ev->request);
976 to=osip_message_get_to(ev->request);
977 osip_from_to_str(from,&tmp);
978 sal_op_set_from(op,tmp);
980 osip_from_to_str(to,&tmp);
981 sal_op_set_to(op,tmp);
984 osip_message_get_call_info(ev->request,0,&call_info);
987 osip_call_info_to_str(call_info,&tmp);
988 if( strstr(tmp,"answer-after=") != NULL)
990 op->auto_answer_asked=TRUE;
991 ms_message("The caller asked to automatically answer the call(Emergency?)\n");
1000 sal_add_call(op->base.root,op);
1001 sal->callbacks.call_received(op);
1004 static void handle_reinvite(Sal *sal, eXosip_event_t *ev){
1005 SalOp *op=find_op(sal,ev);
1009 ms_warning("Reinvite for non-existing operation !");
1014 sdp=eXosip_get_sdp_info(ev->request);
1015 if (op->base.remote_media){
1016 sal_media_description_unref(op->base.remote_media);
1017 op->base.remote_media=NULL;
1020 sal_media_description_unref(op->result);
1024 op->sdp_offering=FALSE;
1025 op->base.remote_media=sal_media_description_new();
1026 sdp_to_media_description(sdp,op->base.remote_media);
1027 sdp_message_free(sdp);
1030 op->sdp_offering=TRUE;
1032 sal->callbacks.call_updating(op);
1035 static void handle_ack(Sal *sal, eXosip_event_t *ev){
1036 SalOp *op=find_op(sal,ev);
1040 ms_warning("ack for non-existing call !");
1044 if (op->sdp_offering){
1045 sdp=eXosip_get_sdp_info(ev->ack);
1047 if (op->base.remote_media)
1048 sal_media_description_unref(op->base.remote_media);
1049 op->base.remote_media=sal_media_description_new();
1050 sdp_to_media_description(sdp,op->base.remote_media);
1052 sdp_message_free(sdp);
1058 sal->callbacks.call_ack(op);
1061 static void update_contact_from_response(SalOp *op, osip_message_t *response){
1062 const char *received;
1064 SalTransport transport;
1065 if (extract_received_rport(response,&received,&rport,&transport)==0){
1066 const char *contact=sal_op_get_contact(op);
1068 /*no contact given yet, use from instead*/
1069 contact=sal_op_get_from(op);
1072 SalAddress *addr=sal_address_new(contact);
1074 sal_address_set_domain(addr,received);
1075 sal_address_set_port_int(addr,rport);
1076 if (transport!=SalTransportUDP)
1077 sal_address_set_transport(addr,transport);
1078 tmp=sal_address_as_string(addr);
1079 ms_message("Contact address updated to %s",tmp);
1080 sal_op_set_contact(op,tmp);
1081 sal_address_destroy(addr);
1087 static int call_proceeding(Sal *sal, eXosip_event_t *ev){
1088 SalOp *op=find_op(sal,ev);
1090 if (op==NULL || op->terminated==TRUE) {
1091 ms_warning("This call has been canceled.");
1093 eXosip_call_terminate(ev->cid,ev->did);
1101 /* update contact if received and rport are set by the server
1102 note: will only be used by remote for next INVITE, if any...*/
1103 update_contact_from_response(op,ev->response);
1107 static void call_ringing(Sal *sal, eXosip_event_t *ev){
1109 SalOp *op=find_op(sal,ev);
1110 if (call_proceeding(sal, ev)==-1) return;
1112 set_remote_ua(op,ev->response);
1113 sdp=eXosip_get_sdp_info(ev->response);
1115 op->base.remote_media=sal_media_description_new();
1116 sdp_to_media_description(sdp,op->base.remote_media);
1117 sdp_message_free(sdp);
1118 if (op->base.local_media) sdp_process(op);
1120 sal->callbacks.call_ringing(op);
1123 static void call_accepted(Sal *sal, eXosip_event_t *ev){
1125 osip_message_t *msg=NULL;
1126 SalOp *op=find_op(sal,ev);
1127 const char *contact;
1129 if (op==NULL || op->terminated==TRUE) {
1130 ms_warning("This call has been already terminated.");
1132 eXosip_call_terminate(ev->cid,ev->did);
1138 set_remote_ua(op,ev->response);
1140 sdp=eXosip_get_sdp_info(ev->response);
1142 op->base.remote_media=sal_media_description_new();
1143 sdp_to_media_description(sdp,op->base.remote_media);
1144 sdp_message_free(sdp);
1145 if (op->base.local_media) sdp_process(op);
1147 eXosip_call_build_ack(ev->did,&msg);
1149 ms_warning("This call has been already terminated.");
1151 eXosip_call_terminate(ev->cid,ev->did);
1155 contact=sal_op_get_contact(op);
1157 _osip_list_set_empty(&msg->contacts,(void (*)(void*))osip_contact_free);
1158 osip_message_set_contact(msg,contact);
1160 if (op->sdp_answer){
1161 set_sdp(msg,op->sdp_answer);
1162 sdp_message_free(op->sdp_answer);
1163 op->sdp_answer=NULL;
1165 eXosip_call_send_ack(ev->did,msg);
1166 sal->callbacks.call_accepted(op);
1169 static void call_terminated(Sal *sal, eXosip_event_t *ev){
1171 SalOp *op=find_op(sal,ev);
1173 ms_warning("Call terminated for already closed call ?");
1177 osip_from_to_str(ev->request->from,&from);
1179 sal->callbacks.call_terminated(op,from!=NULL ? from : sal_op_get_from(op));
1180 if (from) osip_free(from);
1181 op->terminated=TRUE;
1184 static void call_released(Sal *sal, eXosip_event_t *ev){
1185 SalOp *op=find_op(sal,ev);
1187 ms_warning("No op associated to this call_released()");
1190 if (!op->terminated){
1191 /* no response received so far */
1192 call_failure(sal,ev);
1194 sal->callbacks.call_released(op);
1197 static int get_auth_data_from_response(osip_message_t *resp, const char **realm, const char **username){
1198 const char *prx_realm=NULL,*www_realm=NULL;
1199 osip_proxy_authenticate_t *prx_auth;
1200 osip_www_authenticate_t *www_auth;
1202 *username=osip_uri_get_username(resp->from->url);
1203 prx_auth=(osip_proxy_authenticate_t*)osip_list_get(&resp->proxy_authenticates,0);
1204 www_auth=(osip_proxy_authenticate_t*)osip_list_get(&resp->www_authenticates,0);
1206 prx_realm=osip_proxy_authenticate_get_realm(prx_auth);
1208 www_realm=osip_www_authenticate_get_realm(www_auth);
1212 }else if (www_realm){
1220 static int get_auth_data_from_request(osip_message_t *msg, const char **realm, const char **username){
1221 osip_authorization_t *auth=NULL;
1222 osip_proxy_authorization_t *prx_auth=NULL;
1224 *username=osip_uri_get_username(msg->from->url);
1225 osip_message_get_authorization(msg, 0, &auth);
1227 *realm=osip_authorization_get_realm(auth);
1230 osip_message_get_proxy_authorization(msg,0,&prx_auth);
1232 *realm=osip_proxy_authorization_get_realm(prx_auth);
1238 static int get_auth_data(eXosip_event_t *ev, const char **realm, const char **username){
1239 if (ev->response && get_auth_data_from_response(ev->response,realm,username)==0) return 0;
1240 if (ev->request && get_auth_data_from_request(ev->request,realm,username)==0) return 0;
1244 int sal_op_get_auth_requested(SalOp *op, const char **realm, const char **username){
1245 if (op->pending_auth){
1246 return get_auth_data(op->pending_auth,realm,username);
1251 static bool_t process_authentication(Sal *sal, eXosip_event_t *ev){
1253 const char *username,*realm;
1256 ms_warning("No operation associated with this authentication !");
1259 if (get_auth_data(ev,&realm,&username)==0){
1260 if (op->pending_auth!=NULL){
1261 eXosip_event_free(op->pending_auth);
1262 op->pending_auth=ev;
1264 op->pending_auth=ev;
1265 sal_add_pending_auth(sal,op);
1268 sal->callbacks.auth_requested(op,realm,username);
1274 static void authentication_ok(Sal *sal, eXosip_event_t *ev){
1276 const char *username,*realm;
1279 ms_warning("No operation associated with this authentication_ok!");
1282 if (op->pending_auth){
1283 eXosip_event_free(op->pending_auth);
1284 sal_remove_pending_auth(sal,op);
1285 op->pending_auth=NULL;
1287 if (get_auth_data(ev,&realm,&username)==0){
1288 sal->callbacks.auth_success(op,realm,username);
1292 static bool_t call_failure(Sal *sal, eXosip_event_t *ev){
1295 char* computedReason=NULL;
1296 const char *reason=NULL;
1297 SalError error=SalErrorUnknown;
1298 SalReason sr=SalReasonUnknown;
1301 op=(SalOp*)find_op(sal,ev);
1304 ms_warning("Call failure reported for a closed call, ignored.");
1309 code=osip_message_get_status_code(ev->response);
1310 reason=osip_message_get_reason_phrase(ev->response);
1311 osip_header_t *h=NULL;
1312 if (!osip_message_header_get_byname( ev->response
1316 computedReason = ms_strdup_printf("%s %s",reason,osip_header_get_value(h));
1317 reason = computedReason;
1325 return process_authentication(sal,ev);
1328 error=SalErrorUnknown;
1331 error=SalErrorFailure;
1332 sr=SalReasonNotFound;
1335 error=SalErrorFailure;
1339 eXosip_default_action(ev);
1343 error=SalErrorFailure;
1344 sr=SalReasonTemporarilyUnavailable;
1346 error=SalErrorFailure;
1352 error=SalErrorFailure;
1353 sr=SalReasonDoNotDisturb;
1356 error=SalErrorFailure;
1357 sr=SalReasonDeclined;
1361 error=SalErrorFailure;
1362 sr=SalReasonUnknown;
1363 }else error=SalErrorNoResponse;
1365 op->terminated=TRUE;
1366 sal->callbacks.call_failure(op,error,sr,reason,code);
1367 if (computedReason != NULL){
1368 ms_free(computedReason);
1373 /* Request remote side to send us VFU */
1374 void sal_call_send_vfu_request(SalOp *h){
1375 osip_message_t *msg=NULL;
1377 "<?xml version=\"1.0\" encoding=\"utf-8\" ?>"
1381 " <picture_fast_update></picture_fast_update>"
1389 eXosip_call_build_info(h->did,&msg);
1391 osip_message_set_body(msg,info_body,strlen(info_body));
1392 osip_message_set_content_type(msg,"application/media_control+xml");
1393 snprintf(clen,sizeof(clen),"%lu",(unsigned long)strlen(info_body));
1394 osip_message_set_content_length(msg,clen);
1395 eXosip_call_send_request(h->did,msg);
1396 ms_message("Sending VFU request !");
1401 static void process_media_control_xml(Sal *sal, eXosip_event_t *ev){
1402 SalOp *op=find_op(sal,ev);
1403 osip_body_t *body=NULL;
1406 ms_warning("media control xml received without operation context!");
1410 osip_message_get_body(ev->request,0,&body);
1411 if (body && body->body!=NULL &&
1412 strstr(body->body,"picture_fast_update")){
1413 osip_message_t *ans=NULL;
1414 ms_message("Receiving VFU request !");
1415 if (sal->callbacks.vfu_request){
1416 sal->callbacks.vfu_request(op);
1417 eXosip_call_build_answer(ev->tid,200,&ans);
1419 eXosip_call_send_answer(ev->tid,200,ans);
1423 /*in all other cases we must say it is not implemented.*/
1425 osip_message_t *ans=NULL;
1427 eXosip_call_build_answer(ev->tid,501,&ans);
1429 eXosip_call_send_answer(ev->tid,501,ans);
1434 static void process_dtmf_relay(Sal *sal, eXosip_event_t *ev){
1435 SalOp *op=find_op(sal,ev);
1436 osip_body_t *body=NULL;
1439 ms_warning("media dtmf relay received without operation context!");
1443 osip_message_get_body(ev->request,0,&body);
1444 if (body && body->body!=NULL){
1445 osip_message_t *ans=NULL;
1446 const char *name=strstr(body->body,"Signal");
1447 if (name==NULL) name=strstr(body->body,"signal");
1449 ms_warning("Could not extract the dtmf name from the SIP INFO.");
1452 name+=strlen("signal");
1453 if (sscanf(name," = %1s",tmp)==1){
1454 ms_message("Receiving dtmf %s via SIP INFO.",tmp);
1455 if (sal->callbacks.dtmf_received != NULL)
1456 sal->callbacks.dtmf_received(op, tmp[0]);
1460 eXosip_call_build_answer(ev->tid,200,&ans);
1462 eXosip_call_send_answer(ev->tid,200,ans);
1467 static void fill_options_answer(osip_message_t *options){
1468 osip_message_set_allow(options,"INVITE, ACK, BYE, CANCEL, OPTIONS, MESSAGE, SUBSCRIBE, NOTIFY, INFO");
1469 osip_message_set_accept(options,"application/sdp");
1472 static void process_refer(Sal *sal, SalOp *op, eXosip_event_t *ev){
1473 osip_header_t *h=NULL;
1474 osip_message_t *ans=NULL;
1475 ms_message("Receiving REFER request !");
1476 osip_message_header_get_byname(ev->request,"Refer-To",0,&h);
1479 osip_from_t *from=NULL;
1481 osip_from_init(&from);
1483 if (osip_from_parse(from,h->hvalue)==0){
1485 osip_uri_header_t *uh=NULL;
1486 osip_header_t *referred_by=NULL;
1487 osip_uri_header_get_byname(&from->url->url_headers,(char*)"Replaces",&uh);
1488 if (uh!=NULL && uh->gvalue && uh->gvalue[0]!='\0'){
1489 ms_message("Found replaces in Refer-To");
1491 ms_free(op->replaces);
1493 op->replaces=ms_strdup(uh->gvalue);
1495 osip_message_header_get_byname(ev->request,"Referred-By",0,&referred_by);
1496 if (referred_by && referred_by->hvalue && referred_by->hvalue[0]!='\0'){
1497 if (op->referred_by)
1498 ms_free(op->referred_by);
1499 op->referred_by=ms_strdup(referred_by->hvalue);
1502 osip_uri_header_freelist(&from->url->url_headers);
1503 osip_from_to_str(from,&tmp);
1504 sal->callbacks.refer_received(sal,op,tmp);
1506 osip_from_free(from);
1509 eXosip_call_build_answer(ev->tid,202,&ans);
1511 eXosip_call_send_answer(ev->tid,202,ans);
1516 ms_warning("cannot do anything with the refer without destination\n");
1520 static void call_message_new(Sal *sal, eXosip_event_t *ev){
1521 osip_message_t *ans=NULL;
1523 if (MSG_IS_INFO(ev->request)){
1524 osip_content_type_t *ct;
1525 ct=osip_message_get_content_type(ev->request);
1526 if (ct && ct->subtype){
1527 if (strcmp(ct->subtype,"media_control+xml")==0)
1528 process_media_control_xml(sal,ev);
1529 else if (strcmp(ct->subtype,"dtmf-relay")==0)
1530 process_dtmf_relay(sal,ev);
1532 ms_message("Unhandled SIP INFO.");
1533 /*send an "Not implemented" answer*/
1535 eXosip_call_build_answer(ev->tid,501,&ans);
1537 eXosip_call_send_answer(ev->tid,501,ans);
1541 /*empty SIP INFO, probably to test we are alive. Send an empty answer*/
1543 eXosip_call_build_answer(ev->tid,200,&ans);
1545 eXosip_call_send_answer(ev->tid,200,ans);
1548 }else if(MSG_IS_MESSAGE(ev->request)){
1549 /* SIP messages could be received into call */
1550 text_received(sal, ev);
1552 eXosip_call_build_answer(ev->tid,200,&ans);
1554 eXosip_call_send_answer(ev->tid,200,ans);
1556 }else if(MSG_IS_REFER(ev->request)){
1557 SalOp *op=find_op(sal,ev);
1559 ms_message("Receiving REFER request !");
1560 process_refer(sal,op,ev);
1561 }else if(MSG_IS_NOTIFY(ev->request)){
1562 osip_header_t *h=NULL;
1564 SalOp *op=find_op(sal,ev);
1566 ms_message("Receiving NOTIFY request !");
1567 osip_from_to_str(ev->request->from,&from);
1568 osip_message_header_get_byname(ev->request,"Event",0,&h);
1570 sal->callbacks.notify(op,from,h->hvalue);
1571 /*answer that we received the notify*/
1573 eXosip_call_build_answer(ev->tid,200,&ans);
1575 eXosip_call_send_answer(ev->tid,200,ans);
1578 }else if (MSG_IS_OPTIONS(ev->request)){
1580 eXosip_call_build_answer(ev->tid,200,&ans);
1582 fill_options_answer(ans);
1583 eXosip_call_send_answer(ev->tid,200,ans);
1587 }else ms_warning("call_message_new: No request ?");
1590 static void inc_update(Sal *sal, eXosip_event_t *ev){
1591 osip_message_t *msg=NULL;
1592 ms_message("Processing incoming UPDATE");
1594 eXosip_message_build_answer(ev->tid,200,&msg);
1596 eXosip_message_send_answer(ev->tid,200,msg);
1600 static bool_t comes_from_local_if(osip_message_t *msg){
1601 osip_via_t *via=NULL;
1602 osip_message_get_via(msg,0,&via);
1605 host=osip_via_get_host(via);
1606 if (strcmp(host,"127.0.0.1")==0 || strcmp(host,"::1")==0){
1607 osip_generic_param_t *param=NULL;
1608 osip_via_param_get_byname(via,"received",¶m);
1609 if (param==NULL) return TRUE;
1610 if (param->gvalue &&
1611 (strcmp(param->gvalue,"127.0.0.1")==0 || strcmp(param->gvalue,"::1")==0)){
1619 static void text_received(Sal *sal, eXosip_event_t *ev){
1620 osip_body_t *body=NULL;
1621 char *from=NULL,*msg;
1623 osip_message_get_body(ev->request,0,&body);
1625 ms_error("Could not get text message from SIP body");
1629 osip_from_to_str(ev->request->from,&from);
1630 sal->callbacks.text_received(sal,from,msg);
1636 static void other_request(Sal *sal, eXosip_event_t *ev){
1637 ms_message("in other_request");
1638 if (ev->request==NULL) return;
1639 if (strcmp(ev->request->sip_method,"MESSAGE")==0){
1640 text_received(sal,ev);
1641 eXosip_message_send_answer(ev->tid,200,NULL);
1642 }else if (strcmp(ev->request->sip_method,"OPTIONS")==0){
1643 osip_message_t *options=NULL;
1644 eXosip_options_build_answer(ev->tid,200,&options);
1645 fill_options_answer(options);
1646 eXosip_options_send_answer(ev->tid,200,options);
1647 }else if (strncmp(ev->request->sip_method, "REFER", 5) == 0){
1648 ms_message("Receiving REFER request !");
1649 if (comes_from_local_if(ev->request)) {
1650 process_refer(sal,NULL,ev);
1651 }else ms_warning("Ignored REFER not coming from this local loopback interface.");
1652 }else if (strncmp(ev->request->sip_method, "UPDATE", 6) == 0){
1657 osip_message_to_str(ev->request,&tmp,&msglen);
1659 ms_message("Unsupported request received:\n%s",tmp);
1662 /*answer with a 501 Not implemented*/
1663 eXosip_message_send_answer(ev->tid,501,NULL);
1667 static void masquerade_via(osip_message_t *msg, const char *ip, const char *port){
1668 osip_via_t *via=NULL;
1669 osip_message_get_via(msg,0,&via);
1671 osip_free(via->port);
1672 via->port=osip_strdup(port);
1673 osip_free(via->host);
1674 via->host=osip_strdup(ip);
1679 static bool_t fix_message_contact(SalOp *op, osip_message_t *request,osip_message_t *last_answer) {
1680 osip_contact_t *ctt=NULL;
1681 const char *received;
1683 SalTransport transport;
1686 if (extract_received_rport(last_answer,&received,&rport,&transport)==-1) return FALSE;
1687 osip_message_get_contact(request,0,&ctt);
1689 ms_warning("fix_message_contact(): no contact to update");
1692 if (ctt->url->host!=NULL){
1693 osip_free(ctt->url->host);
1695 ctt->url->host=osip_strdup(received);
1696 if (ctt->url->port!=NULL){
1697 osip_free(ctt->url->port);
1699 snprintf(port,sizeof(port),"%i",rport);
1700 ctt->url->port=osip_strdup(port);
1701 if (op->masquerade_via) masquerade_via(request,received,port);
1703 if (transport != SalTransportUDP) {
1704 sal_address_set_param((SalAddress *)ctt, "transport", sal_transport_to_string(transport));
1709 static bool_t register_again_with_updated_contact(SalOp *op, osip_message_t *orig_request, osip_message_t *last_answer){
1710 osip_contact_t *ctt=NULL;
1711 SalAddress* ori_contact_address=NULL;
1712 const char *received;
1714 SalTransport transport;
1716 osip_message_t *msg=NULL;
1717 Sal* sal=op->base.root;
1719 if (sal->double_reg==FALSE ) return FALSE;
1721 if (extract_received_rport(last_answer,&received,&rport,&transport)==-1) return FALSE;
1722 osip_message_get_contact(orig_request,0,&ctt);
1723 osip_contact_to_str(ctt,&tmp);
1724 ori_contact_address = sal_address_new(tmp);
1726 /*check if contact is up to date*/
1727 if (strcmp(sal_address_get_domain(ori_contact_address),received) ==0
1728 && sal_address_get_port_int(ori_contact_address) == rport
1729 && sal_address_get_transport(ori_contact_address) == transport) {
1730 ms_message("Register has up to date contact, doing nothing.");
1732 sal_address_destroy(ori_contact_address);
1734 } else ms_message("contact do not match, need to update the register (%s with %s:%i;transport=%s)"
1738 ,sal_transport_to_string(transport));
1740 sal_address_destroy(ori_contact_address);
1742 if (transport == SalTransportUDP) {
1744 eXosip_register_build_register(op->rid,op->expires,&msg);
1747 ms_warning("Fail to create a contact updated register.");
1750 if (fix_message_contact(op,msg,last_answer)) {
1751 eXosip_register_send_register(op->rid,msg);
1753 ms_message("Resending new register with updated contact");
1756 ms_warning("Fail to send updated register.");
1763 update_contact_from_response(op,last_answer);
1767 static void registration_success(Sal *sal, eXosip_event_t *ev){
1768 SalOp *op=sal_find_register(sal,ev->rid);
1769 osip_header_t *h=NULL;
1772 ms_error("Receiving register response for unknown operation");
1775 osip_message_get_expires(ev->request,0,&h);
1776 if (h!=NULL && atoi(h->hvalue)!=0){
1778 if (!register_again_with_updated_contact(op,ev->request,ev->response)){
1779 sal->callbacks.register_success(op,registered);
1782 sal->callbacks.register_success(op,FALSE);
1786 static bool_t registration_failure(Sal *sal, eXosip_event_t *ev){
1788 const char *reason=NULL;
1789 SalOp *op=sal_find_register(sal,ev->rid);
1790 SalReason sr=SalReasonUnknown;
1791 SalError se=SalErrorUnknown;
1794 ms_error("Receiving register failure for unknown operation");
1798 status_code=osip_message_get_status_code(ev->response);
1799 reason=osip_message_get_reason_phrase(ev->response);
1801 switch(status_code){
1804 return process_authentication(sal,ev);
1806 case 423: /*interval too brief*/
1807 {/*retry with greater interval */
1808 osip_header_t *h=NULL;
1809 osip_message_t *msg=NULL;
1810 osip_message_header_get_byname(ev->response,"min-expires",0,&h);
1811 if (h && h->hvalue && h->hvalue[0]!='\0'){
1812 int val=atoi(h->hvalue);
1813 if (val>op->expires)
1815 }else op->expires*=2;
1817 eXosip_register_build_register(op->rid,op->expires,&msg);
1818 eXosip_register_send_register(op->rid,msg);
1822 case 606: /*Not acceptable, workaround for proxies that don't like private addresses
1823 in vias, such as ekiga.net
1824 On the opposite, freephonie.net bugs when via are masqueraded.
1826 op->masquerade_via=TRUE;
1828 /* if contact is up to date, process the failure, otherwise resend a new register with
1829 updated contact first, just in case the faillure is due to incorrect contact */
1830 if (ev->response && register_again_with_updated_contact(op,ev->request,ev->response))
1831 return TRUE; /*we are retrying with an updated contact*/
1832 if (status_code==403){
1834 sr=SalReasonForbidden;
1835 }else if (status_code==0){
1836 se=SalErrorNoResponse;
1838 sal->callbacks.register_failure(op,se,sr,reason);
1843 static void other_request_reply(Sal *sal,eXosip_event_t *ev){
1844 SalOp *op=find_op(sal,ev);
1847 ms_warning("other_request_reply(): Receiving response to unknown request.");
1851 update_contact_from_response(op,ev->response);
1852 if (ev->request && strcmp(osip_message_get_method(ev->request),"OPTIONS")==0)
1853 sal->callbacks.ping_reply(op);
1857 static bool_t process_event(Sal *sal, eXosip_event_t *ev){
1858 ms_message("linphone process event get a message %d\n",ev->type);
1860 case EXOSIP_CALL_ANSWERED:
1861 ms_message("CALL_ANSWERED\n");
1862 call_accepted(sal,ev);
1863 authentication_ok(sal,ev);
1865 case EXOSIP_CALL_CLOSED:
1866 case EXOSIP_CALL_CANCELLED:
1867 ms_message("CALL_CLOSED or CANCELLED\n");
1868 call_terminated(sal,ev);
1870 case EXOSIP_CALL_TIMEOUT:
1871 case EXOSIP_CALL_NOANSWER:
1872 ms_message("CALL_TIMEOUT or NOANSWER\n");
1873 return call_failure(sal,ev);
1875 case EXOSIP_CALL_REQUESTFAILURE:
1876 case EXOSIP_CALL_GLOBALFAILURE:
1877 case EXOSIP_CALL_SERVERFAILURE:
1878 ms_message("CALL_REQUESTFAILURE or GLOBALFAILURE or SERVERFAILURE\n");
1879 return call_failure(sal,ev);
1881 case EXOSIP_CALL_RELEASED:
1882 ms_message("CALL_RELEASED\n");
1883 call_released(sal, ev);
1885 case EXOSIP_CALL_INVITE:
1886 ms_message("CALL_NEW\n");
1887 inc_new_call(sal,ev);
1889 case EXOSIP_CALL_REINVITE:
1890 handle_reinvite(sal,ev);
1892 case EXOSIP_CALL_ACK:
1893 ms_message("CALL_ACK");
1896 case EXOSIP_CALL_REDIRECTED:
1897 ms_message("CALL_REDIRECTED");
1898 eXosip_default_action(ev);
1900 case EXOSIP_CALL_PROCEEDING:
1901 ms_message("CALL_PROCEEDING");
1902 call_proceeding(sal,ev);
1904 case EXOSIP_CALL_RINGING:
1905 ms_message("CALL_RINGING");
1906 call_ringing(sal,ev);
1908 case EXOSIP_CALL_MESSAGE_NEW:
1909 ms_message("EXOSIP_CALL_MESSAGE_NEW");
1910 call_message_new(sal,ev);
1912 case EXOSIP_CALL_MESSAGE_REQUESTFAILURE:
1914 (ev->response->status_code==407 || ev->response->status_code==401)){
1915 return process_authentication(sal,ev);
1918 case EXOSIP_IN_SUBSCRIPTION_NEW:
1919 ms_message("CALL_IN_SUBSCRIPTION_NEW ");
1920 sal_exosip_subscription_recv(sal,ev);
1922 case EXOSIP_IN_SUBSCRIPTION_RELEASED:
1923 ms_message("CALL_SUBSCRIPTION_NEW ");
1924 sal_exosip_in_subscription_closed(sal,ev);
1926 case EXOSIP_SUBSCRIPTION_UPDATE:
1927 ms_message("CALL_SUBSCRIPTION_UPDATE");
1929 case EXOSIP_SUBSCRIPTION_NOTIFY:
1930 ms_message("CALL_SUBSCRIPTION_NOTIFY");
1931 sal_exosip_notify_recv(sal,ev);
1933 case EXOSIP_SUBSCRIPTION_ANSWERED:
1934 ms_message("EXOSIP_SUBSCRIPTION_ANSWERED, ev->sid=%i, ev->did=%i\n",ev->sid,ev->did);
1935 sal_exosip_subscription_answered(sal,ev);
1937 case EXOSIP_SUBSCRIPTION_CLOSED:
1938 ms_message("EXOSIP_SUBSCRIPTION_CLOSED\n");
1939 sal_exosip_subscription_closed(sal,ev);
1941 case EXOSIP_SUBSCRIPTION_REQUESTFAILURE: /**< announce a request failure */
1942 if (ev->response && (ev->response->status_code == 407 || ev->response->status_code == 401)){
1943 return process_authentication(sal,ev);
1945 case EXOSIP_SUBSCRIPTION_SERVERFAILURE:
1946 case EXOSIP_SUBSCRIPTION_GLOBALFAILURE:
1947 sal_exosip_subscription_closed(sal,ev);
1949 case EXOSIP_REGISTRATION_FAILURE:
1950 ms_message("REGISTRATION_FAILURE\n");
1951 return registration_failure(sal,ev);
1953 case EXOSIP_REGISTRATION_SUCCESS:
1954 authentication_ok(sal,ev);
1955 registration_success(sal,ev);
1957 case EXOSIP_MESSAGE_NEW:
1958 other_request(sal,ev);
1960 case EXOSIP_MESSAGE_PROCEEDING:
1961 case EXOSIP_MESSAGE_ANSWERED:
1962 case EXOSIP_MESSAGE_REDIRECTED:
1963 case EXOSIP_MESSAGE_SERVERFAILURE:
1964 case EXOSIP_MESSAGE_GLOBALFAILURE:
1965 other_request_reply(sal,ev);
1967 case EXOSIP_MESSAGE_REQUESTFAILURE:
1968 case EXOSIP_NOTIFICATION_REQUESTFAILURE:
1970 switch (ev->response->status_code) {
1973 return process_authentication(sal,ev);
1975 eXosip_automatic_action ();
1980 other_request_reply(sal,ev);
1983 ms_message("Unhandled exosip event ! %i",ev->type);
1989 int sal_iterate(Sal *sal){
1991 while((ev=eXosip_event_wait(0,0))!=NULL){
1992 if (process_event(sal,ev))
1993 eXosip_event_free(ev);
1995 #ifdef HAVE_EXOSIP_TRYLOCK
1996 if (eXosip_trylock()==0){
1997 eXosip_automatic_refresh();
2000 ms_warning("eXosip_trylock busy.");
2004 eXosip_automatic_refresh();
2010 static void register_set_contact(osip_message_t *msg, const char *contact){
2011 osip_uri_param_t *param = NULL;
2012 osip_contact_t *ct=NULL;
2014 /*we get the line parameter choosed by exosip, and add it to our own contact*/
2015 osip_message_get_contact(msg,0,&ct);
2017 osip_uri_uparam_get_byname(ct->url, "line", ¶m);
2018 if (param && param->gvalue)
2019 line=osip_strdup(param->gvalue);
2021 _osip_list_set_empty(&msg->contacts,(void (*)(void*))osip_contact_free);
2022 osip_message_set_contact(msg,contact);
2023 osip_message_get_contact(msg,0,&ct);
2024 osip_uri_uparam_add(ct->url,osip_strdup("line"),line);
2027 static void sal_register_add_route(osip_message_t *msg, const char *proxy){
2029 snprintf(tmp,sizeof(tmp)-1,"<%s;lr>",proxy);
2031 osip_list_special_free(&msg->routes,(void (*)(void*))osip_route_free);
2032 osip_message_set_route(msg,tmp);
2035 int sal_register(SalOp *h, const char *proxy, const char *from, int expires){
2036 osip_message_t *msg;
2037 const char *contact=sal_op_get_contact(h);
2039 sal_op_set_route(h,proxy);
2041 SalAddress *from_parsed=sal_address_new(from);
2043 if (from_parsed==NULL) {
2044 ms_warning("sal_register() bad from %s",from);
2047 snprintf(domain,sizeof(domain),"sip:%s",sal_address_get_domain(from_parsed));
2048 sal_address_destroy(from_parsed);
2050 h->rid=eXosip_register_build_initial_register(from,domain,NULL,expires,&msg);
2052 if (contact) register_set_contact(msg,contact);
2053 sal_register_add_route(msg,proxy);
2054 sal_add_register(h->base.root,h);
2056 ms_error("Could not build initial register.");
2062 eXosip_register_build_register(h->rid,expires,&msg);
2063 sal_register_add_route(msg,proxy);
2066 eXosip_register_send_register(h->rid,msg);
2069 return (msg != NULL) ? 0 : -1;
2072 int sal_register_refresh(SalOp *op, int expires){
2073 osip_message_t *msg=NULL;
2074 const char *contact=sal_op_get_contact(op);
2077 ms_error("Unexistant registration context, not possible to refresh.");
2081 eXosip_register_build_register(op->rid,expires,&msg);
2083 if (contact) register_set_contact(msg,contact);
2084 sal_register_add_route(msg,sal_op_get_route(op));
2085 eXosip_register_send_register(op->rid,msg);
2086 }else ms_error("Could not build REGISTER refresh message.");
2088 return (msg != NULL) ? 0 : -1;
2092 int sal_unregister(SalOp *h){
2093 osip_message_t *msg=NULL;
2095 eXosip_register_build_register(h->rid,0,&msg);
2096 if (msg) eXosip_register_send_register(h->rid,msg);
2097 else ms_warning("Could not build unREGISTER !");
2102 SalAddress * sal_address_new(const char *uri){
2104 osip_from_init(&from);
2106 // Remove front spaces
2107 while (uri[0]==' ') {
2111 if (osip_from_parse(from,uri)!=0){
2112 osip_from_free(from);
2115 if (from->displayname!=NULL && from->displayname[0]=='"'){
2116 char *unquoted=osip_strdup_without_quote(from->displayname);
2117 osip_free(from->displayname);
2118 from->displayname=unquoted;
2120 return (SalAddress*)from;
2123 SalAddress * sal_address_clone(const SalAddress *addr){
2124 osip_from_t *ret=NULL;
2125 osip_from_clone((osip_from_t*)addr,&ret);
2126 return (SalAddress*)ret;
2129 #define null_if_empty(s) (((s)!=NULL && (s)[0]!='\0') ? (s) : NULL )
2131 const char *sal_address_get_scheme(const SalAddress *addr){
2132 const osip_from_t *u=(const osip_from_t*)addr;
2133 return null_if_empty(u->url->scheme);
2136 const char *sal_address_get_display_name(const SalAddress* addr){
2137 const osip_from_t *u=(const osip_from_t*)addr;
2138 return null_if_empty(u->displayname);
2141 const char *sal_address_get_username(const SalAddress *addr){
2142 const osip_from_t *u=(const osip_from_t*)addr;
2143 return null_if_empty(u->url->username);
2146 const char *sal_address_get_domain(const SalAddress *addr){
2147 const osip_from_t *u=(const osip_from_t*)addr;
2148 return null_if_empty(u->url->host);
2151 void sal_address_set_display_name(SalAddress *addr, const char *display_name){
2152 osip_from_t *u=(osip_from_t*)addr;
2153 if (u->displayname!=NULL){
2154 osip_free(u->displayname);
2155 u->displayname=NULL;
2157 if (display_name!=NULL && display_name[0]!='\0'){
2158 u->displayname=osip_strdup(display_name);
2162 void sal_address_set_username(SalAddress *addr, const char *username){
2163 osip_from_t *uri=(osip_from_t*)addr;
2164 if (uri->url->username!=NULL){
2165 osip_free(uri->url->username);
2166 uri->url->username=NULL;
2169 uri->url->username=osip_strdup(username);
2172 void sal_address_set_domain(SalAddress *addr, const char *host){
2173 osip_from_t *uri=(osip_from_t*)addr;
2174 if (uri->url->host!=NULL){
2175 osip_free(uri->url->host);
2176 uri->url->host=NULL;
2179 uri->url->host=osip_strdup(host);
2182 void sal_address_set_port(SalAddress *addr, const char *port){
2183 osip_from_t *uri=(osip_from_t*)addr;
2184 if (uri->url->port!=NULL){
2185 osip_free(uri->url->port);
2186 uri->url->port=NULL;
2189 uri->url->port=osip_strdup(port);
2192 void sal_address_set_port_int(SalAddress *uri, int port){
2195 /*this is the default, special case to leave the port field blank*/
2196 sal_address_set_port(uri,NULL);
2199 snprintf(tmp,sizeof(tmp),"%i",port);
2200 sal_address_set_port(uri,tmp);
2203 void sal_address_clean(SalAddress *addr){
2204 osip_generic_param_freelist(& ((osip_from_t*)addr)->gen_params);
2205 osip_uri_param_freelist(& ((osip_from_t*)addr)->url->url_params);
2208 char *sal_address_as_string(const SalAddress *u){
2210 osip_from_t *from=(osip_from_t *)u;
2211 char *old_displayname=NULL;
2212 /* hack to force use of quotes around the displayname*/
2213 if (from->displayname!=NULL
2214 && from->displayname[0]!='"'){
2215 old_displayname=from->displayname;
2216 from->displayname=osip_enquote(from->displayname);
2218 osip_from_to_str(from,&tmp);
2219 if (old_displayname!=NULL){
2220 ms_free(from->displayname);
2221 from->displayname=old_displayname;
2228 char *sal_address_as_string_uri_only(const SalAddress *u){
2229 char *tmp=NULL,*ret;
2230 osip_uri_to_str(((osip_from_t*)u)->url,&tmp);
2235 void sal_address_set_param(SalAddress *u,const char* name,const char* value) {
2236 osip_uri_param_t *param=NULL;
2237 osip_uri_uparam_get_byname(((osip_from_t*)u)->url,(char*)name,¶m);
2239 osip_uri_uparam_add (((osip_from_t*)u)->url,ms_strdup(name),value ? ms_strdup(value) : NULL);
2241 osip_free(param->gvalue);
2242 param->gvalue=value ? osip_strdup(value) : NULL;
2247 void sal_address_destroy(SalAddress *u){
2248 osip_from_free((osip_from_t*)u);
2251 void sal_set_keepalive_period(Sal *ctx,unsigned int value) {
2252 ctx->keepalive_period=value;
2253 eXosip_set_option (EXOSIP_OPT_UDP_KEEP_ALIVE, &value);
2255 unsigned int sal_get_keepalive_period(Sal *ctx) {
2256 return ctx->keepalive_period;
2259 const char * sal_address_get_port(const SalAddress *addr) {
2260 const osip_from_t *u=(const osip_from_t*)addr;
2261 return null_if_empty(u->url->port);
2264 int sal_address_get_port_int(const SalAddress *uri) {
2265 const char* port = sal_address_get_port(uri);
2272 SalTransport sal_address_get_transport(const SalAddress* addr) {
2273 const osip_from_t *u=(const osip_from_t*)addr;
2274 osip_uri_param_t *transport_param=NULL;
2275 osip_uri_uparam_get_byname(u->url,"transport",&transport_param);
2276 if (transport_param == NULL){
2277 return SalTransportUDP;
2279 return sal_transport_parse(transport_param->gvalue);
2282 void sal_address_set_transport(SalAddress* addr,SalTransport transport) {
2283 sal_address_set_param(addr, "transport", sal_transport_to_string(transport));
2286 /* sends a reinvite. Local media description may have changed by application since call establishment*/
2287 int sal_call_update(SalOp *h, const char *subject){
2289 osip_message_t *reinvite=NULL;
2292 if(eXosip_call_build_request(h->did,"INVITE",&reinvite) != 0 || reinvite==NULL){
2297 osip_message_set_subject(reinvite,subject);
2298 osip_message_set_allow(reinvite, "INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, NOTIFY, MESSAGE, SUBSCRIBE, INFO");
2299 if (h->base.root->session_expires!=0){
2300 osip_message_set_header(reinvite, "Session-expires", "200");
2301 osip_message_set_supported(reinvite, "timer");
2303 if (h->base.local_media){
2304 h->sdp_offering=TRUE;
2305 set_sdp_from_desc(reinvite,h->base.local_media);
2306 }else h->sdp_offering=FALSE;
2308 err = eXosip_call_send_request(h->did, reinvite);
2312 void sal_reuse_authorization(Sal *ctx, bool_t value) {
2313 ctx->reuse_authorization=value;