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_warning("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 if (send_notify_for_refer(h->did,"SIP/2.0 200 Ok\r\n")==-1){
764 /* we need previous notify transaction to complete, so buffer the request for later*/
765 h->sipfrag_pending="SIP/2.0 200 Ok\r\n";
773 int sal_ping(SalOp *op, const char *from, const char *to){
774 osip_message_t *options=NULL;
776 sal_op_set_from(op,from);
777 sal_op_set_to(op,to);
778 sal_exosip_fix_route(op);
780 eXosip_options_build_request (&options, sal_op_get_to(op),
781 sal_op_get_from(op),sal_op_get_route(op));
783 if (op->base.root->session_expires!=0){
784 osip_message_set_header(options, "Session-expires", "200");
785 osip_message_set_supported(options, "timer");
787 sal_add_other(sal_op_get_sal(op),op,options);
788 return eXosip_options_send_request(options);
793 int sal_call_refer(SalOp *h, const char *refer_to){
794 osip_message_t *msg=NULL;
797 eXosip_call_build_refer(h->did,refer_to, &msg);
798 if (msg) err=eXosip_call_send_request(h->did, msg);
804 int sal_call_refer_with_replaces(SalOp *h, SalOp *other_call_h){
805 osip_message_t *msg=NULL;
806 char referto[256]={0};
809 if (eXosip_call_get_referto(other_call_h->did,referto,sizeof(referto)-1)!=0){
810 ms_error("eXosip_call_get_referto() failed for did=%i",other_call_h->did);
814 eXosip_call_build_refer(h->did,referto, &msg);
815 osip_message_set_header(msg,"Referred-By",h->base.from);
816 if (msg) err=eXosip_call_send_request(h->did, msg);
822 SalOp *sal_call_get_replaces(SalOp *h){
823 if (h!=NULL && h->replaces!=NULL){
826 cid=eXosip_call_find_by_replaces(h->replaces);
829 SalOp *ret=sal_find_call(h->base.root,cid);
836 int sal_call_send_dtmf(SalOp *h, char dtmf){
837 osip_message_t *msg=NULL;
842 eXosip_call_build_info(h->did,&msg);
844 snprintf(dtmf_body, sizeof(dtmf_body), "Signal=%c\r\nDuration=250\r\n", dtmf);
845 osip_message_set_body(msg,dtmf_body,strlen(dtmf_body));
846 osip_message_set_content_type(msg,"application/dtmf-relay");
847 snprintf(clen,sizeof(clen),"%lu",(unsigned long)strlen(dtmf_body));
848 osip_message_set_content_length(msg,clen);
849 eXosip_call_send_request(h->did,msg);
855 static void push_auth_to_exosip(const SalAuthInfo *info){
857 if (info->userid==NULL || info->userid[0]=='\0') userid=info->username;
858 else userid=info->userid;
859 ms_message("Authentication info for username [%s], id[%s], realm [%s] added to eXosip", info->username,userid, info->realm);
860 eXosip_add_authentication_info (info->username,userid,
861 info->password, NULL,info->realm);
864 * Just for symmetry ;-)
866 static void pop_auth_from_exosip() {
867 eXosip_clear_authentication_info();
870 int sal_call_terminate(SalOp *h){
872 if (h == NULL) return -1;
873 if (h->auth_info) push_auth_to_exosip(h->auth_info);
875 err=eXosip_call_terminate(h->cid,h->did);
877 if (!h->base.root->reuse_authorization) pop_auth_from_exosip();
879 ms_warning("Exosip could not terminate the call: cid=%i did=%i", h->cid,h->did);
885 void sal_op_authenticate(SalOp *h, const SalAuthInfo *info){
886 if (h->pending_auth){
887 push_auth_to_exosip(info);
889 /*FIXME exosip does not take into account this update register message*/
891 if (fix_message_contact(h, h->pending_auth->request,h->pending_auth->response)) {
895 update_contact_from_response(h,h->pending_auth->response);
897 eXosip_default_action(h->pending_auth);
899 ms_message("eXosip_default_action() done");
900 if (!h->base.root->reuse_authorization) pop_auth_from_exosip();
902 if (h->auth_info) sal_auth_info_delete(h->auth_info); /*if already exist*/
903 h->auth_info=sal_auth_info_clone(info); /*store auth info for subsequent request*/
906 void sal_op_cancel_authentication(SalOp *h) {
908 sal_op_get_sal(h)->callbacks.register_failure(h,SalErrorFailure, SalReasonForbidden,_("Authentication failure"));
909 } else if (h->cid >0) {
910 sal_op_get_sal(h)->callbacks.call_failure(h,SalErrorFailure, SalReasonForbidden,_("Authentication failure"),0);
912 ms_warning("Auth failure not handled");
916 static void set_network_origin(SalOp *op, osip_message_t *req){
917 const char *received=NULL;
920 SalTransport transport;
921 if (extract_received_rport(req,&received,&rport,&transport)!=0){
922 osip_via_t *via=NULL;
924 osip_message_get_via(req,0,&via);
925 received=osip_via_get_host(via);
926 tmp=osip_via_get_port(via);
927 if (tmp) rport=atoi(tmp);
929 if (transport != SalTransportUDP) {
930 snprintf(origin,sizeof(origin)-1,"sip:%s:%i",received,rport);
932 snprintf(origin,sizeof(origin)-1,"sip:%s:%i;transport=%s",received,rport,sal_transport_to_string(transport));
934 __sal_op_set_network_origin(op,origin);
937 static void set_remote_ua(SalOp* op, osip_message_t *req){
938 if (op->base.remote_ua==NULL){
939 osip_header_t *h=NULL;
940 osip_message_get_user_agent(req,0,&h);
942 op->base.remote_ua=ms_strdup(h->hvalue);
947 static void set_replaces(SalOp *op, osip_message_t *req){
948 osip_header_t *h=NULL;
951 ms_free(op->replaces);
954 osip_message_header_get_byname(req,"replaces",0,&h);
956 if (h->hvalue && h->hvalue[0]!='\0'){
957 op->replaces=ms_strdup(h->hvalue);
962 static SalOp *find_op(Sal *sal, eXosip_event_t *ev){
964 return sal_find_call(sal,ev->cid);
967 return sal_find_register(sal,ev->rid);
970 return sal_find_out_subscribe(sal,ev->sid);
973 return sal_find_in_subscribe(sal,ev->nid);
975 if (ev->response) return sal_find_other(sal,ev->response);
979 static void inc_new_call(Sal *sal, eXosip_event_t *ev){
980 SalOp *op=sal_op_new(sal);
981 osip_from_t *from,*to;
982 osip_call_info_t *call_info;
984 sdp_message_t *sdp=eXosip_get_sdp_info(ev->request);
986 set_network_origin(op,ev->request);
987 set_remote_ua(op,ev->request);
988 set_replaces(op,ev->request);
991 op->sdp_offering=FALSE;
992 op->base.remote_media=sal_media_description_new();
993 sdp_to_media_description(sdp,op->base.remote_media);
994 sdp_message_free(sdp);
995 }else op->sdp_offering=TRUE;
997 from=osip_message_get_from(ev->request);
998 to=osip_message_get_to(ev->request);
999 osip_from_to_str(from,&tmp);
1000 sal_op_set_from(op,tmp);
1002 osip_from_to_str(to,&tmp);
1003 sal_op_set_to(op,tmp);
1006 osip_message_get_call_info(ev->request,0,&call_info);
1009 osip_call_info_to_str(call_info,&tmp);
1010 if( strstr(tmp,"answer-after=") != NULL)
1012 op->auto_answer_asked=TRUE;
1013 ms_message("The caller asked to automatically answer the call(Emergency?)\n");
1022 sal_add_call(op->base.root,op);
1023 sal->callbacks.call_received(op);
1026 static void handle_reinvite(Sal *sal, eXosip_event_t *ev){
1027 SalOp *op=find_op(sal,ev);
1031 ms_warning("Reinvite for non-existing operation !");
1036 sdp=eXosip_get_sdp_info(ev->request);
1037 if (op->base.remote_media){
1038 sal_media_description_unref(op->base.remote_media);
1039 op->base.remote_media=NULL;
1042 sal_media_description_unref(op->result);
1046 op->sdp_offering=FALSE;
1047 op->base.remote_media=sal_media_description_new();
1048 sdp_to_media_description(sdp,op->base.remote_media);
1049 sdp_message_free(sdp);
1052 op->sdp_offering=TRUE;
1054 sal->callbacks.call_updating(op);
1057 static void handle_ack(Sal *sal, eXosip_event_t *ev){
1058 SalOp *op=find_op(sal,ev);
1062 ms_warning("ack for non-existing call !");
1065 if (op->terminated) {
1066 ms_warning("ack for terminated call, ignoring");
1070 if (op->sdp_offering){
1071 sdp=eXosip_get_sdp_info(ev->ack);
1073 if (op->base.remote_media)
1074 sal_media_description_unref(op->base.remote_media);
1075 op->base.remote_media=sal_media_description_new();
1076 sdp_to_media_description(sdp,op->base.remote_media);
1078 sdp_message_free(sdp);
1084 sal->callbacks.call_ack(op);
1087 static void update_contact_from_response(SalOp *op, osip_message_t *response){
1088 const char *received;
1090 SalTransport transport;
1091 if (extract_received_rport(response,&received,&rport,&transport)==0){
1092 const char *contact=sal_op_get_contact(op);
1094 /*no contact given yet, use from instead*/
1095 contact=sal_op_get_from(op);
1098 SalAddress *addr=sal_address_new(contact);
1100 sal_address_set_domain(addr,received);
1101 sal_address_set_port_int(addr,rport);
1102 if (transport!=SalTransportUDP)
1103 sal_address_set_transport(addr,transport);
1104 tmp=sal_address_as_string(addr);
1105 ms_message("Contact address updated to %s",tmp);
1106 sal_op_set_contact(op,tmp);
1107 sal_address_destroy(addr);
1113 static int call_proceeding(Sal *sal, eXosip_event_t *ev){
1114 SalOp *op=find_op(sal,ev);
1116 if (op==NULL || op->terminated==TRUE) {
1117 ms_warning("This call has been canceled.");
1119 eXosip_call_terminate(ev->cid,ev->did);
1127 /* update contact if received and rport are set by the server
1128 note: will only be used by remote for next INVITE, if any...*/
1129 update_contact_from_response(op,ev->response);
1133 static void call_ringing(Sal *sal, eXosip_event_t *ev){
1135 SalOp *op=find_op(sal,ev);
1136 if (call_proceeding(sal, ev)==-1) return;
1138 set_remote_ua(op,ev->response);
1139 sdp=eXosip_get_sdp_info(ev->response);
1141 op->base.remote_media=sal_media_description_new();
1142 sdp_to_media_description(sdp,op->base.remote_media);
1143 sdp_message_free(sdp);
1144 if (op->base.local_media) sdp_process(op);
1146 sal->callbacks.call_ringing(op);
1149 static void call_accepted(Sal *sal, eXosip_event_t *ev){
1151 osip_message_t *msg=NULL;
1152 SalOp *op=find_op(sal,ev);
1153 const char *contact;
1155 if (op==NULL || op->terminated==TRUE) {
1156 ms_warning("This call has been already terminated.");
1158 eXosip_call_terminate(ev->cid,ev->did);
1164 set_remote_ua(op,ev->response);
1166 sdp=eXosip_get_sdp_info(ev->response);
1168 op->base.remote_media=sal_media_description_new();
1169 sdp_to_media_description(sdp,op->base.remote_media);
1170 sdp_message_free(sdp);
1171 if (op->base.local_media) sdp_process(op);
1173 eXosip_call_build_ack(ev->did,&msg);
1175 ms_warning("This call has been already terminated.");
1177 eXosip_call_terminate(ev->cid,ev->did);
1181 contact=sal_op_get_contact(op);
1183 _osip_list_set_empty(&msg->contacts,(void (*)(void*))osip_contact_free);
1184 osip_message_set_contact(msg,contact);
1186 if (op->sdp_answer){
1187 set_sdp(msg,op->sdp_answer);
1188 sdp_message_free(op->sdp_answer);
1189 op->sdp_answer=NULL;
1191 eXosip_call_send_ack(ev->did,msg);
1192 sal->callbacks.call_accepted(op);
1195 static void call_terminated(Sal *sal, eXosip_event_t *ev){
1197 SalOp *op=find_op(sal,ev);
1199 ms_warning("Call terminated for already closed call ?");
1203 osip_from_to_str(ev->request->from,&from);
1205 sal->callbacks.call_terminated(op,from!=NULL ? from : sal_op_get_from(op));
1206 if (from) osip_free(from);
1207 op->terminated=TRUE;
1210 static void call_released(Sal *sal, eXosip_event_t *ev){
1211 SalOp *op=find_op(sal,ev);
1213 ms_warning("No op associated to this call_released()");
1216 if (!op->terminated){
1217 /* no response received so far */
1218 call_failure(sal,ev);
1220 sal->callbacks.call_released(op);
1223 static int get_auth_data_from_response(osip_message_t *resp, const char **realm, const char **username){
1224 const char *prx_realm=NULL,*www_realm=NULL;
1225 osip_proxy_authenticate_t *prx_auth;
1226 osip_www_authenticate_t *www_auth;
1228 *username=osip_uri_get_username(resp->from->url);
1229 prx_auth=(osip_proxy_authenticate_t*)osip_list_get(&resp->proxy_authenticates,0);
1230 www_auth=(osip_proxy_authenticate_t*)osip_list_get(&resp->www_authenticates,0);
1232 prx_realm=osip_proxy_authenticate_get_realm(prx_auth);
1234 www_realm=osip_www_authenticate_get_realm(www_auth);
1238 }else if (www_realm){
1246 static int get_auth_data_from_request(osip_message_t *msg, const char **realm, const char **username){
1247 osip_authorization_t *auth=NULL;
1248 osip_proxy_authorization_t *prx_auth=NULL;
1250 *username=osip_uri_get_username(msg->from->url);
1251 osip_message_get_authorization(msg, 0, &auth);
1253 *realm=osip_authorization_get_realm(auth);
1256 osip_message_get_proxy_authorization(msg,0,&prx_auth);
1258 *realm=osip_proxy_authorization_get_realm(prx_auth);
1264 static int get_auth_data(eXosip_event_t *ev, const char **realm, const char **username){
1265 if (ev->response && get_auth_data_from_response(ev->response,realm,username)==0) return 0;
1266 if (ev->request && get_auth_data_from_request(ev->request,realm,username)==0) return 0;
1270 int sal_op_get_auth_requested(SalOp *op, const char **realm, const char **username){
1271 if (op->pending_auth){
1272 return get_auth_data(op->pending_auth,realm,username);
1277 static bool_t process_authentication(Sal *sal, eXosip_event_t *ev){
1279 const char *username,*realm;
1282 ms_warning("No operation associated with this authentication !");
1285 if (get_auth_data(ev,&realm,&username)==0){
1286 if (op->pending_auth!=NULL){
1287 eXosip_event_free(op->pending_auth);
1288 op->pending_auth=ev;
1290 op->pending_auth=ev;
1291 sal_add_pending_auth(sal,op);
1294 sal->callbacks.auth_requested(op,realm,username);
1300 static void authentication_ok(Sal *sal, eXosip_event_t *ev){
1302 const char *username,*realm;
1305 ms_warning("No operation associated with this authentication_ok!");
1308 if (op->pending_auth){
1309 eXosip_event_free(op->pending_auth);
1310 sal_remove_pending_auth(sal,op);
1311 op->pending_auth=NULL;
1313 if (get_auth_data(ev,&realm,&username)==0){
1314 sal->callbacks.auth_success(op,realm,username);
1318 static bool_t call_failure(Sal *sal, eXosip_event_t *ev){
1321 char* computedReason=NULL;
1322 const char *reason=NULL;
1323 SalError error=SalErrorUnknown;
1324 SalReason sr=SalReasonUnknown;
1327 op=(SalOp*)find_op(sal,ev);
1330 ms_warning("Call failure reported for a closed call, ignored.");
1335 code=osip_message_get_status_code(ev->response);
1336 reason=osip_message_get_reason_phrase(ev->response);
1337 osip_header_t *h=NULL;
1338 if (!osip_message_header_get_byname( ev->response
1342 computedReason = ms_strdup_printf("%s %s",reason,osip_header_get_value(h));
1343 reason = computedReason;
1351 return process_authentication(sal,ev);
1354 error=SalErrorUnknown;
1357 error=SalErrorFailure;
1358 sr=SalReasonNotFound;
1361 error=SalErrorFailure;
1365 eXosip_default_action(ev);
1369 error=SalErrorFailure;
1370 sr=SalReasonTemporarilyUnavailable;
1372 error=SalErrorFailure;
1378 error=SalErrorFailure;
1379 sr=SalReasonDoNotDisturb;
1382 error=SalErrorFailure;
1383 sr=SalReasonDeclined;
1387 error=SalErrorFailure;
1388 sr=SalReasonUnknown;
1389 }else error=SalErrorNoResponse;
1391 op->terminated=TRUE;
1392 sal->callbacks.call_failure(op,error,sr,reason,code);
1393 if (computedReason != NULL){
1394 ms_free(computedReason);
1399 /* Request remote side to send us VFU */
1400 void sal_call_send_vfu_request(SalOp *h){
1401 osip_message_t *msg=NULL;
1403 "<?xml version=\"1.0\" encoding=\"utf-8\" ?>"
1407 " <picture_fast_update></picture_fast_update>"
1415 eXosip_call_build_info(h->did,&msg);
1417 osip_message_set_body(msg,info_body,strlen(info_body));
1418 osip_message_set_content_type(msg,"application/media_control+xml");
1419 snprintf(clen,sizeof(clen),"%lu",(unsigned long)strlen(info_body));
1420 osip_message_set_content_length(msg,clen);
1421 eXosip_call_send_request(h->did,msg);
1422 ms_message("Sending VFU request !");
1427 static void process_media_control_xml(Sal *sal, eXosip_event_t *ev){
1428 SalOp *op=find_op(sal,ev);
1429 osip_body_t *body=NULL;
1432 ms_warning("media control xml received without operation context!");
1436 osip_message_get_body(ev->request,0,&body);
1437 if (body && body->body!=NULL &&
1438 strstr(body->body,"picture_fast_update")){
1439 osip_message_t *ans=NULL;
1440 ms_message("Receiving VFU request !");
1441 if (sal->callbacks.vfu_request){
1442 sal->callbacks.vfu_request(op);
1443 eXosip_call_build_answer(ev->tid,200,&ans);
1445 eXosip_call_send_answer(ev->tid,200,ans);
1449 /*in all other cases we must say it is not implemented.*/
1451 osip_message_t *ans=NULL;
1453 eXosip_call_build_answer(ev->tid,501,&ans);
1455 eXosip_call_send_answer(ev->tid,501,ans);
1460 static void process_dtmf_relay(Sal *sal, eXosip_event_t *ev){
1461 SalOp *op=find_op(sal,ev);
1462 osip_body_t *body=NULL;
1465 ms_warning("media dtmf relay received without operation context!");
1469 osip_message_get_body(ev->request,0,&body);
1470 if (body && body->body!=NULL){
1471 osip_message_t *ans=NULL;
1472 const char *name=strstr(body->body,"Signal");
1473 if (name==NULL) name=strstr(body->body,"signal");
1475 ms_warning("Could not extract the dtmf name from the SIP INFO.");
1478 name+=strlen("signal");
1479 if (sscanf(name," = %1s",tmp)==1){
1480 ms_message("Receiving dtmf %s via SIP INFO.",tmp);
1481 if (sal->callbacks.dtmf_received != NULL)
1482 sal->callbacks.dtmf_received(op, tmp[0]);
1486 eXosip_call_build_answer(ev->tid,200,&ans);
1488 eXosip_call_send_answer(ev->tid,200,ans);
1493 static void fill_options_answer(osip_message_t *options){
1494 osip_message_set_allow(options,"INVITE, ACK, BYE, CANCEL, OPTIONS, MESSAGE, SUBSCRIBE, NOTIFY, INFO");
1495 osip_message_set_accept(options,"application/sdp");
1498 static void process_refer(Sal *sal, SalOp *op, eXosip_event_t *ev){
1499 osip_header_t *h=NULL;
1500 osip_message_t *ans=NULL;
1501 ms_message("Receiving REFER request !");
1502 osip_message_header_get_byname(ev->request,"Refer-To",0,&h);
1505 osip_from_t *from=NULL;
1507 osip_from_init(&from);
1509 if (osip_from_parse(from,h->hvalue)==0){
1511 osip_uri_header_t *uh=NULL;
1512 osip_header_t *referred_by=NULL;
1513 osip_uri_header_get_byname(&from->url->url_headers,(char*)"Replaces",&uh);
1514 if (uh!=NULL && uh->gvalue && uh->gvalue[0]!='\0'){
1515 ms_message("Found replaces in Refer-To");
1517 ms_free(op->replaces);
1519 op->replaces=ms_strdup(uh->gvalue);
1521 osip_message_header_get_byname(ev->request,"Referred-By",0,&referred_by);
1522 if (referred_by && referred_by->hvalue && referred_by->hvalue[0]!='\0'){
1523 if (op->referred_by)
1524 ms_free(op->referred_by);
1525 op->referred_by=ms_strdup(referred_by->hvalue);
1528 osip_uri_header_freelist(&from->url->url_headers);
1529 osip_from_to_str(from,&tmp);
1530 sal->callbacks.refer_received(sal,op,tmp);
1532 osip_from_free(from);
1535 eXosip_call_build_answer(ev->tid,202,&ans);
1537 eXosip_call_send_answer(ev->tid,202,ans);
1542 ms_warning("cannot do anything with the refer without destination\n");
1546 static void process_notify(Sal *sal, eXosip_event_t *ev){
1547 osip_header_t *h=NULL;
1549 SalOp *op=find_op(sal,ev);
1550 osip_message_t *ans=NULL;
1552 ms_message("Receiving NOTIFY request !");
1553 osip_from_to_str(ev->request->from,&from);
1554 osip_message_header_get_byname(ev->request,"Event",0,&h);
1556 osip_body_t *body=NULL;
1557 //osip_content_type_t *ct=NULL;
1558 osip_message_get_body(ev->request,0,&body);
1559 //ct=osip_message_get_content_type(ev->request);
1560 if (h->hvalue && strcasecmp(h->hvalue,"refer")==0){
1561 /*special handling of refer events*/
1562 if (body && body->body){
1563 osip_message_t *msg;
1564 osip_message_init(&msg);
1565 if (osip_message_parse_sipfrag(msg,body->body,strlen(body->body))==0){
1566 int code=osip_message_get_status_code(msg);
1568 sal->callbacks.notify_refer(op,SalReferTrying);
1569 }else if (code==200){
1570 sal->callbacks.notify_refer(op,SalReferSuccess);
1571 }else if (code>=400){
1572 sal->callbacks.notify_refer(op,SalReferFailed);
1575 osip_message_free(msg);
1578 /*generic handling*/
1579 sal->callbacks.notify(op,from,h->hvalue);
1582 /*answer that we received the notify*/
1584 eXosip_call_build_answer(ev->tid,200,&ans);
1586 eXosip_call_send_answer(ev->tid,200,ans);
1591 static void call_message_new(Sal *sal, eXosip_event_t *ev){
1592 osip_message_t *ans=NULL;
1594 if (MSG_IS_INFO(ev->request)){
1595 osip_content_type_t *ct;
1596 ct=osip_message_get_content_type(ev->request);
1597 if (ct && ct->subtype){
1598 if (strcmp(ct->subtype,"media_control+xml")==0)
1599 process_media_control_xml(sal,ev);
1600 else if (strcmp(ct->subtype,"dtmf-relay")==0)
1601 process_dtmf_relay(sal,ev);
1603 ms_message("Unhandled SIP INFO.");
1604 /*send an "Not implemented" answer*/
1606 eXosip_call_build_answer(ev->tid,501,&ans);
1608 eXosip_call_send_answer(ev->tid,501,ans);
1612 /*empty SIP INFO, probably to test we are alive. Send an empty answer*/
1614 eXosip_call_build_answer(ev->tid,200,&ans);
1616 eXosip_call_send_answer(ev->tid,200,ans);
1619 }else if(MSG_IS_MESSAGE(ev->request)){
1620 /* SIP messages could be received into call */
1621 text_received(sal, ev);
1623 eXosip_call_build_answer(ev->tid,200,&ans);
1625 eXosip_call_send_answer(ev->tid,200,ans);
1627 }else if(MSG_IS_REFER(ev->request)){
1628 SalOp *op=find_op(sal,ev);
1630 ms_message("Receiving REFER request !");
1631 process_refer(sal,op,ev);
1632 }else if(MSG_IS_NOTIFY(ev->request)){
1633 process_notify(sal,ev);
1634 }else if (MSG_IS_OPTIONS(ev->request)){
1636 eXosip_call_build_answer(ev->tid,200,&ans);
1638 fill_options_answer(ans);
1639 eXosip_call_send_answer(ev->tid,200,ans);
1643 }else ms_warning("call_message_new: No request ?");
1646 static void inc_update(Sal *sal, eXosip_event_t *ev){
1647 osip_message_t *msg=NULL;
1648 ms_message("Processing incoming UPDATE");
1650 eXosip_message_build_answer(ev->tid,200,&msg);
1652 eXosip_message_send_answer(ev->tid,200,msg);
1656 static bool_t comes_from_local_if(osip_message_t *msg){
1657 osip_via_t *via=NULL;
1658 osip_message_get_via(msg,0,&via);
1661 host=osip_via_get_host(via);
1662 if (strcmp(host,"127.0.0.1")==0 || strcmp(host,"::1")==0){
1663 osip_generic_param_t *param=NULL;
1664 osip_via_param_get_byname(via,"received",¶m);
1665 if (param==NULL) return TRUE;
1666 if (param->gvalue &&
1667 (strcmp(param->gvalue,"127.0.0.1")==0 || strcmp(param->gvalue,"::1")==0)){
1675 static void text_received(Sal *sal, eXosip_event_t *ev){
1676 osip_body_t *body=NULL;
1677 char *from=NULL,*msg;
1679 osip_message_get_body(ev->request,0,&body);
1681 ms_error("Could not get text message from SIP body");
1685 osip_from_to_str(ev->request->from,&from);
1686 sal->callbacks.text_received(sal,from,msg);
1692 static void other_request(Sal *sal, eXosip_event_t *ev){
1693 ms_message("in other_request");
1694 if (ev->request==NULL) return;
1695 if (strcmp(ev->request->sip_method,"MESSAGE")==0){
1696 text_received(sal,ev);
1697 eXosip_message_send_answer(ev->tid,200,NULL);
1698 }else if (strcmp(ev->request->sip_method,"OPTIONS")==0){
1699 osip_message_t *options=NULL;
1700 eXosip_options_build_answer(ev->tid,200,&options);
1701 fill_options_answer(options);
1702 eXosip_options_send_answer(ev->tid,200,options);
1703 }else if (strncmp(ev->request->sip_method, "REFER", 5) == 0){
1704 ms_message("Receiving REFER request !");
1705 if (comes_from_local_if(ev->request)) {
1706 process_refer(sal,NULL,ev);
1707 }else ms_warning("Ignored REFER not coming from this local loopback interface.");
1708 }else if (strncmp(ev->request->sip_method, "UPDATE", 6) == 0){
1713 osip_message_to_str(ev->request,&tmp,&msglen);
1715 ms_message("Unsupported request received:\n%s",tmp);
1718 /*answer with a 501 Not implemented*/
1719 eXosip_message_send_answer(ev->tid,501,NULL);
1723 static void masquerade_via(osip_message_t *msg, const char *ip, const char *port){
1724 osip_via_t *via=NULL;
1725 osip_message_get_via(msg,0,&via);
1727 osip_free(via->port);
1728 via->port=osip_strdup(port);
1729 osip_free(via->host);
1730 via->host=osip_strdup(ip);
1735 static bool_t fix_message_contact(SalOp *op, osip_message_t *request,osip_message_t *last_answer) {
1736 osip_contact_t *ctt=NULL;
1737 const char *received;
1739 SalTransport transport;
1742 if (extract_received_rport(last_answer,&received,&rport,&transport)==-1) return FALSE;
1743 osip_message_get_contact(request,0,&ctt);
1745 ms_warning("fix_message_contact(): no contact to update");
1748 if (ctt->url->host!=NULL){
1749 osip_free(ctt->url->host);
1751 ctt->url->host=osip_strdup(received);
1752 if (ctt->url->port!=NULL){
1753 osip_free(ctt->url->port);
1755 snprintf(port,sizeof(port),"%i",rport);
1756 ctt->url->port=osip_strdup(port);
1757 if (op->masquerade_via) masquerade_via(request,received,port);
1759 if (transport != SalTransportUDP) {
1760 sal_address_set_param((SalAddress *)ctt, "transport", sal_transport_to_string(transport));
1765 static bool_t register_again_with_updated_contact(SalOp *op, osip_message_t *orig_request, osip_message_t *last_answer){
1766 osip_contact_t *ctt=NULL;
1767 SalAddress* ori_contact_address=NULL;
1768 const char *received;
1770 SalTransport transport;
1772 osip_message_t *msg=NULL;
1773 Sal* sal=op->base.root;
1775 if (sal->double_reg==FALSE ) return FALSE;
1777 if (extract_received_rport(last_answer,&received,&rport,&transport)==-1) return FALSE;
1778 osip_message_get_contact(orig_request,0,&ctt);
1779 osip_contact_to_str(ctt,&tmp);
1780 ori_contact_address = sal_address_new(tmp);
1782 /*check if contact is up to date*/
1783 if (strcmp(sal_address_get_domain(ori_contact_address),received) ==0
1784 && sal_address_get_port_int(ori_contact_address) == rport
1785 && sal_address_get_transport(ori_contact_address) == transport) {
1786 ms_message("Register has up to date contact, doing nothing.");
1788 sal_address_destroy(ori_contact_address);
1790 } else ms_message("contact do not match, need to update the register (%s with %s:%i;transport=%s)"
1794 ,sal_transport_to_string(transport));
1796 sal_address_destroy(ori_contact_address);
1799 eXosip_register_build_register(op->rid,op->expires,&msg);
1802 ms_warning("Fail to create a contact updated register.");
1805 if (fix_message_contact(op,msg,last_answer)) {
1806 eXosip_register_send_register(op->rid,msg);
1808 ms_message("Resending new register with updated contact");
1809 update_contact_from_response(op,last_answer);
1812 ms_warning("Fail to send updated register.");
1820 static void registration_success(Sal *sal, eXosip_event_t *ev){
1821 SalOp *op=sal_find_register(sal,ev->rid);
1822 osip_header_t *h=NULL;
1825 ms_error("Receiving register response for unknown operation");
1828 osip_message_get_expires(ev->request,0,&h);
1829 if (h!=NULL && atoi(h->hvalue)!=0){
1831 if (!register_again_with_updated_contact(op,ev->request,ev->response)){
1832 sal->callbacks.register_success(op,registered);
1835 sal->callbacks.register_success(op,FALSE);
1839 static bool_t registration_failure(Sal *sal, eXosip_event_t *ev){
1841 const char *reason=NULL;
1842 SalOp *op=sal_find_register(sal,ev->rid);
1843 SalReason sr=SalReasonUnknown;
1844 SalError se=SalErrorUnknown;
1847 ms_error("Receiving register failure for unknown operation");
1851 status_code=osip_message_get_status_code(ev->response);
1852 reason=osip_message_get_reason_phrase(ev->response);
1854 switch(status_code){
1857 return process_authentication(sal,ev);
1859 case 423: /*interval too brief*/
1860 {/*retry with greater interval */
1861 osip_header_t *h=NULL;
1862 osip_message_t *msg=NULL;
1863 osip_message_header_get_byname(ev->response,"min-expires",0,&h);
1864 if (h && h->hvalue && h->hvalue[0]!='\0'){
1865 int val=atoi(h->hvalue);
1866 if (val>op->expires)
1868 }else op->expires*=2;
1870 eXosip_register_build_register(op->rid,op->expires,&msg);
1871 eXosip_register_send_register(op->rid,msg);
1875 case 606: /*Not acceptable, workaround for proxies that don't like private addresses
1876 in vias, such as ekiga.net
1877 On the opposite, freephonie.net bugs when via are masqueraded.
1879 op->masquerade_via=TRUE;
1881 /* if contact is up to date, process the failure, otherwise resend a new register with
1882 updated contact first, just in case the faillure is due to incorrect contact */
1883 if (ev->response && register_again_with_updated_contact(op,ev->request,ev->response))
1884 return TRUE; /*we are retrying with an updated contact*/
1885 if (status_code==403){
1887 sr=SalReasonForbidden;
1888 }else if (status_code==0){
1889 se=SalErrorNoResponse;
1891 sal->callbacks.register_failure(op,se,sr,reason);
1896 static void other_request_reply(Sal *sal,eXosip_event_t *ev){
1897 SalOp *op=find_op(sal,ev);
1900 ms_warning("other_request_reply(): Receiving response to unknown request.");
1904 update_contact_from_response(op,ev->response);
1905 if (ev->request && strcmp(osip_message_get_method(ev->request),"OPTIONS")==0)
1906 sal->callbacks.ping_reply(op);
1910 static void process_in_call_reply(Sal *sal, eXosip_event_t *ev){
1911 SalOp *op=find_op(sal,ev);
1913 if (ev->request && strcmp(osip_message_get_method(ev->request),"NOTIFY")==0){
1914 if (op->sipfrag_pending){
1915 send_notify_for_refer(op->did,op->sipfrag_pending);
1916 op->sipfrag_pending=NULL;
1922 static bool_t process_event(Sal *sal, eXosip_event_t *ev){
1923 ms_message("linphone process event get a message %d\n",ev->type);
1925 case EXOSIP_CALL_ANSWERED:
1926 ms_message("CALL_ANSWERED\n");
1927 call_accepted(sal,ev);
1928 authentication_ok(sal,ev);
1930 case EXOSIP_CALL_CLOSED:
1931 case EXOSIP_CALL_CANCELLED:
1932 ms_message("CALL_CLOSED or CANCELLED\n");
1933 call_terminated(sal,ev);
1935 case EXOSIP_CALL_TIMEOUT:
1936 case EXOSIP_CALL_NOANSWER:
1937 ms_message("CALL_TIMEOUT or NOANSWER\n");
1938 return call_failure(sal,ev);
1940 case EXOSIP_CALL_REQUESTFAILURE:
1941 case EXOSIP_CALL_GLOBALFAILURE:
1942 case EXOSIP_CALL_SERVERFAILURE:
1943 ms_message("CALL_REQUESTFAILURE or GLOBALFAILURE or SERVERFAILURE\n");
1944 return call_failure(sal,ev);
1946 case EXOSIP_CALL_RELEASED:
1947 ms_message("CALL_RELEASED\n");
1948 call_released(sal, ev);
1950 case EXOSIP_CALL_INVITE:
1951 ms_message("CALL_NEW\n");
1952 inc_new_call(sal,ev);
1954 case EXOSIP_CALL_REINVITE:
1955 handle_reinvite(sal,ev);
1957 case EXOSIP_CALL_ACK:
1958 ms_message("CALL_ACK");
1961 case EXOSIP_CALL_REDIRECTED:
1962 ms_message("CALL_REDIRECTED");
1963 eXosip_default_action(ev);
1965 case EXOSIP_CALL_PROCEEDING:
1966 ms_message("CALL_PROCEEDING");
1967 call_proceeding(sal,ev);
1969 case EXOSIP_CALL_RINGING:
1970 ms_message("CALL_RINGING");
1971 call_ringing(sal,ev);
1973 case EXOSIP_CALL_MESSAGE_NEW:
1974 ms_message("EXOSIP_CALL_MESSAGE_NEW");
1975 call_message_new(sal,ev);
1977 case EXOSIP_CALL_MESSAGE_REQUESTFAILURE:
1979 (ev->response->status_code==407 || ev->response->status_code==401)){
1980 return process_authentication(sal,ev);
1983 case EXOSIP_CALL_MESSAGE_ANSWERED:
1984 ms_message("EXOSIP_CALL_MESSAGE_ANSWERED ");
1985 process_in_call_reply(sal,ev);
1987 case EXOSIP_IN_SUBSCRIPTION_NEW:
1988 ms_message("CALL_IN_SUBSCRIPTION_NEW ");
1989 sal_exosip_subscription_recv(sal,ev);
1991 case EXOSIP_IN_SUBSCRIPTION_RELEASED:
1992 ms_message("CALL_SUBSCRIPTION_NEW ");
1993 sal_exosip_in_subscription_closed(sal,ev);
1995 case EXOSIP_SUBSCRIPTION_UPDATE:
1996 ms_message("CALL_SUBSCRIPTION_UPDATE");
1998 case EXOSIP_SUBSCRIPTION_NOTIFY:
1999 ms_message("CALL_SUBSCRIPTION_NOTIFY");
2000 sal_exosip_notify_recv(sal,ev);
2002 case EXOSIP_SUBSCRIPTION_ANSWERED:
2003 ms_message("EXOSIP_SUBSCRIPTION_ANSWERED, ev->sid=%i, ev->did=%i\n",ev->sid,ev->did);
2004 sal_exosip_subscription_answered(sal,ev);
2006 case EXOSIP_SUBSCRIPTION_CLOSED:
2007 ms_message("EXOSIP_SUBSCRIPTION_CLOSED\n");
2008 sal_exosip_subscription_closed(sal,ev);
2010 case EXOSIP_SUBSCRIPTION_REQUESTFAILURE: /**< announce a request failure */
2011 if (ev->response && (ev->response->status_code == 407 || ev->response->status_code == 401)){
2012 return process_authentication(sal,ev);
2014 case EXOSIP_SUBSCRIPTION_SERVERFAILURE:
2015 case EXOSIP_SUBSCRIPTION_GLOBALFAILURE:
2016 sal_exosip_subscription_closed(sal,ev);
2018 case EXOSIP_REGISTRATION_FAILURE:
2019 ms_message("REGISTRATION_FAILURE\n");
2020 return registration_failure(sal,ev);
2022 case EXOSIP_REGISTRATION_SUCCESS:
2023 authentication_ok(sal,ev);
2024 registration_success(sal,ev);
2026 case EXOSIP_MESSAGE_NEW:
2027 other_request(sal,ev);
2029 case EXOSIP_MESSAGE_PROCEEDING:
2030 case EXOSIP_MESSAGE_ANSWERED:
2031 case EXOSIP_MESSAGE_REDIRECTED:
2032 case EXOSIP_MESSAGE_SERVERFAILURE:
2033 case EXOSIP_MESSAGE_GLOBALFAILURE:
2034 other_request_reply(sal,ev);
2036 case EXOSIP_MESSAGE_REQUESTFAILURE:
2037 case EXOSIP_NOTIFICATION_REQUESTFAILURE:
2039 switch (ev->response->status_code) {
2042 return process_authentication(sal,ev);
2044 eXosip_automatic_action ();
2049 other_request_reply(sal,ev);
2052 ms_message("Unhandled exosip event ! %i",ev->type);
2058 int sal_iterate(Sal *sal){
2060 while((ev=eXosip_event_wait(0,0))!=NULL){
2061 if (process_event(sal,ev))
2062 eXosip_event_free(ev);
2064 #ifdef HAVE_EXOSIP_TRYLOCK
2065 if (eXosip_trylock()==0){
2066 eXosip_automatic_refresh();
2069 ms_warning("eXosip_trylock busy.");
2073 eXosip_automatic_refresh();
2079 static void register_set_contact(osip_message_t *msg, const char *contact){
2080 osip_uri_param_t *param = NULL;
2081 osip_contact_t *ct=NULL;
2083 /*we get the line parameter choosed by exosip, and add it to our own contact*/
2084 osip_message_get_contact(msg,0,&ct);
2086 osip_uri_uparam_get_byname(ct->url, "line", ¶m);
2087 if (param && param->gvalue)
2088 line=osip_strdup(param->gvalue);
2090 _osip_list_set_empty(&msg->contacts,(void (*)(void*))osip_contact_free);
2091 osip_message_set_contact(msg,contact);
2092 osip_message_get_contact(msg,0,&ct);
2093 osip_uri_uparam_add(ct->url,osip_strdup("line"),line);
2096 static void sal_register_add_route(osip_message_t *msg, const char *proxy){
2098 snprintf(tmp,sizeof(tmp)-1,"<%s;lr>",proxy);
2100 osip_list_special_free(&msg->routes,(void (*)(void*))osip_route_free);
2101 osip_message_set_route(msg,tmp);
2104 int sal_register(SalOp *h, const char *proxy, const char *from, int expires){
2105 osip_message_t *msg;
2106 const char *contact=sal_op_get_contact(h);
2108 sal_op_set_route(h,proxy);
2110 SalAddress *from_parsed=sal_address_new(from);
2112 if (from_parsed==NULL) {
2113 ms_warning("sal_register() bad from %s",from);
2116 snprintf(domain,sizeof(domain),"sip:%s",sal_address_get_domain(from_parsed));
2117 sal_address_destroy(from_parsed);
2119 h->rid=eXosip_register_build_initial_register(from,domain,NULL,expires,&msg);
2121 if (contact) register_set_contact(msg,contact);
2122 sal_register_add_route(msg,proxy);
2123 sal_add_register(h->base.root,h);
2125 ms_error("Could not build initial register.");
2131 eXosip_register_build_register(h->rid,expires,&msg);
2132 sal_register_add_route(msg,proxy);
2135 eXosip_register_send_register(h->rid,msg);
2138 return (msg != NULL) ? 0 : -1;
2141 int sal_register_refresh(SalOp *op, int expires){
2142 osip_message_t *msg=NULL;
2143 const char *contact=sal_op_get_contact(op);
2146 ms_error("Unexistant registration context, not possible to refresh.");
2150 eXosip_register_build_register(op->rid,expires,&msg);
2152 if (contact) register_set_contact(msg,contact);
2153 sal_register_add_route(msg,sal_op_get_route(op));
2154 eXosip_register_send_register(op->rid,msg);
2155 }else ms_error("Could not build REGISTER refresh message.");
2157 return (msg != NULL) ? 0 : -1;
2161 int sal_unregister(SalOp *h){
2162 osip_message_t *msg=NULL;
2164 eXosip_register_build_register(h->rid,0,&msg);
2165 if (msg) eXosip_register_send_register(h->rid,msg);
2166 else ms_warning("Could not build unREGISTER !");
2171 SalAddress * sal_address_new(const char *uri){
2173 osip_from_init(&from);
2175 // Remove front spaces
2176 while (uri[0]==' ') {
2180 if (osip_from_parse(from,uri)!=0){
2181 osip_from_free(from);
2184 if (from->displayname!=NULL && from->displayname[0]=='"'){
2185 char *unquoted=osip_strdup_without_quote(from->displayname);
2186 osip_free(from->displayname);
2187 from->displayname=unquoted;
2189 return (SalAddress*)from;
2192 SalAddress * sal_address_clone(const SalAddress *addr){
2193 osip_from_t *ret=NULL;
2194 osip_from_clone((osip_from_t*)addr,&ret);
2195 return (SalAddress*)ret;
2198 #define null_if_empty(s) (((s)!=NULL && (s)[0]!='\0') ? (s) : NULL )
2200 const char *sal_address_get_scheme(const SalAddress *addr){
2201 const osip_from_t *u=(const osip_from_t*)addr;
2202 return null_if_empty(u->url->scheme);
2205 const char *sal_address_get_display_name(const SalAddress* addr){
2206 const osip_from_t *u=(const osip_from_t*)addr;
2207 return null_if_empty(u->displayname);
2210 const char *sal_address_get_username(const SalAddress *addr){
2211 const osip_from_t *u=(const osip_from_t*)addr;
2212 return null_if_empty(u->url->username);
2215 const char *sal_address_get_domain(const SalAddress *addr){
2216 const osip_from_t *u=(const osip_from_t*)addr;
2217 return null_if_empty(u->url->host);
2220 void sal_address_set_display_name(SalAddress *addr, const char *display_name){
2221 osip_from_t *u=(osip_from_t*)addr;
2222 if (u->displayname!=NULL){
2223 osip_free(u->displayname);
2224 u->displayname=NULL;
2226 if (display_name!=NULL && display_name[0]!='\0'){
2227 u->displayname=osip_strdup(display_name);
2231 void sal_address_set_username(SalAddress *addr, const char *username){
2232 osip_from_t *uri=(osip_from_t*)addr;
2233 if (uri->url->username!=NULL){
2234 osip_free(uri->url->username);
2235 uri->url->username=NULL;
2238 uri->url->username=osip_strdup(username);
2241 void sal_address_set_domain(SalAddress *addr, const char *host){
2242 osip_from_t *uri=(osip_from_t*)addr;
2243 if (uri->url->host!=NULL){
2244 osip_free(uri->url->host);
2245 uri->url->host=NULL;
2248 uri->url->host=osip_strdup(host);
2251 void sal_address_set_port(SalAddress *addr, const char *port){
2252 osip_from_t *uri=(osip_from_t*)addr;
2253 if (uri->url->port!=NULL){
2254 osip_free(uri->url->port);
2255 uri->url->port=NULL;
2258 uri->url->port=osip_strdup(port);
2261 void sal_address_set_port_int(SalAddress *uri, int port){
2264 /*this is the default, special case to leave the port field blank*/
2265 sal_address_set_port(uri,NULL);
2268 snprintf(tmp,sizeof(tmp),"%i",port);
2269 sal_address_set_port(uri,tmp);
2272 void sal_address_clean(SalAddress *addr){
2273 osip_generic_param_freelist(& ((osip_from_t*)addr)->gen_params);
2274 osip_uri_param_freelist(& ((osip_from_t*)addr)->url->url_params);
2277 char *sal_address_as_string(const SalAddress *u){
2279 osip_from_t *from=(osip_from_t *)u;
2280 char *old_displayname=NULL;
2281 /* hack to force use of quotes around the displayname*/
2282 if (from->displayname!=NULL
2283 && from->displayname[0]!='"'){
2284 old_displayname=from->displayname;
2285 from->displayname=osip_enquote(from->displayname);
2287 osip_from_to_str(from,&tmp);
2288 if (old_displayname!=NULL){
2289 ms_free(from->displayname);
2290 from->displayname=old_displayname;
2297 char *sal_address_as_string_uri_only(const SalAddress *u){
2298 char *tmp=NULL,*ret;
2299 osip_uri_to_str(((osip_from_t*)u)->url,&tmp);
2304 void sal_address_set_param(SalAddress *u,const char* name,const char* value) {
2305 osip_uri_param_t *param=NULL;
2306 osip_uri_uparam_get_byname(((osip_from_t*)u)->url,(char*)name,¶m);
2308 osip_uri_uparam_add (((osip_from_t*)u)->url,ms_strdup(name),value ? ms_strdup(value) : NULL);
2310 osip_free(param->gvalue);
2311 param->gvalue=value ? osip_strdup(value) : NULL;
2316 void sal_address_destroy(SalAddress *u){
2317 osip_from_free((osip_from_t*)u);
2320 void sal_set_keepalive_period(Sal *ctx,unsigned int value) {
2321 ctx->keepalive_period=value;
2322 eXosip_set_option (EXOSIP_OPT_UDP_KEEP_ALIVE, &value);
2324 unsigned int sal_get_keepalive_period(Sal *ctx) {
2325 return ctx->keepalive_period;
2328 const char * sal_address_get_port(const SalAddress *addr) {
2329 const osip_from_t *u=(const osip_from_t*)addr;
2330 return null_if_empty(u->url->port);
2333 int sal_address_get_port_int(const SalAddress *uri) {
2334 const char* port = sal_address_get_port(uri);
2341 SalTransport sal_address_get_transport(const SalAddress* addr) {
2342 const osip_from_t *u=(const osip_from_t*)addr;
2343 osip_uri_param_t *transport_param=NULL;
2344 osip_uri_uparam_get_byname(u->url,"transport",&transport_param);
2345 if (transport_param == NULL){
2346 return SalTransportUDP;
2348 return sal_transport_parse(transport_param->gvalue);
2351 void sal_address_set_transport(SalAddress* addr,SalTransport transport) {
2352 sal_address_set_param(addr, "transport", sal_transport_to_string(transport));
2355 /* sends a reinvite. Local media description may have changed by application since call establishment*/
2356 int sal_call_update(SalOp *h, const char *subject){
2358 osip_message_t *reinvite=NULL;
2361 if(eXosip_call_build_request(h->did,"INVITE",&reinvite) != 0 || reinvite==NULL){
2366 osip_message_set_subject(reinvite,subject);
2367 osip_message_set_allow(reinvite, "INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, NOTIFY, MESSAGE, SUBSCRIBE, INFO");
2368 if (h->base.root->session_expires!=0){
2369 osip_message_set_header(reinvite, "Session-expires", "200");
2370 osip_message_set_supported(reinvite, "timer");
2372 if (h->base.local_media){
2373 h->sdp_offering=TRUE;
2374 set_sdp_from_desc(reinvite,h->base.local_media);
2375 }else h->sdp_offering=FALSE;
2377 err = eXosip_call_send_request(h->did, reinvite);
2381 void sal_reuse_authorization(Sal *ctx, bool_t value) {
2382 ctx->reuse_authorization=value;