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"
26 /*this function is not declared in some versions of eXosip*/
27 extern void *eXosip_call_get_reference(int cid);
29 static void _osip_list_set_empty(osip_list_t *l, void (*freefunc)(void*)){
31 while((data=osip_list_get(l,0))!=NULL){
32 osip_list_remove(l,0);
37 void sal_get_default_local_ip(Sal *sal, int address_family,char *ip, size_t iplen){
38 if (eXosip_guess_localip(address_family,ip,iplen)<0){
39 /*default to something */
40 strncpy(ip,address_family==AF_INET6 ? "::1" : "127.0.0.1",iplen);
41 ms_error("Could not find default routable ip address !");
45 static SalOp * sal_find_register(Sal *sal, int rid){
48 for(elem=sal->registers;elem!=NULL;elem=elem->next){
49 op=(SalOp*)elem->data;
50 if (op->rid==rid) return op;
55 static void sal_add_register(Sal *sal, SalOp *op){
56 sal->registers=ms_list_append(sal->registers,op);
59 static void sal_remove_register(Sal *sal, int rid){
62 for(elem=sal->registers;elem!=NULL;elem=elem->next){
63 op=(SalOp*)elem->data;
65 sal->registers=ms_list_remove_link(sal->registers,elem);
71 static SalOp * sal_find_other(Sal *sal, osip_message_t *response){
74 osip_call_id_t *callid=osip_message_get_call_id(response);
76 ms_error("There is no call-id in this response !");
79 for(elem=sal->other_transactions;elem!=NULL;elem=elem->next){
80 op=(SalOp*)elem->data;
81 if (osip_call_id_match(callid,op->call_id)==0) return op;
86 static void sal_add_other(Sal *sal, SalOp *op, osip_message_t *request){
87 osip_call_id_t *callid=osip_message_get_call_id(request);
89 ms_error("There is no call id in the request !");
92 osip_call_id_clone(callid,&op->call_id);
93 sal->other_transactions=ms_list_append(sal->other_transactions,op);
96 static void sal_remove_other(Sal *sal, SalOp *op){
97 sal->other_transactions=ms_list_remove(sal->other_transactions,op);
101 static void sal_add_pending_auth(Sal *sal, SalOp *op){
102 sal->pending_auths=ms_list_append(sal->pending_auths,op);
106 static void sal_remove_pending_auth(Sal *sal, SalOp *op){
107 sal->pending_auths=ms_list_remove(sal->pending_auths,op);
110 void sal_exosip_fix_route(SalOp *op){
111 if (sal_op_get_route(op)!=NULL){
112 osip_route_t *rt=NULL;
113 osip_uri_param_t *lr_param=NULL;
115 osip_route_init(&rt);
116 if (osip_route_parse(rt,sal_op_get_route(op))<0){
117 ms_warning("Bad route %s!",sal_op_get_route(op));
118 sal_op_set_route(op,NULL);
120 /* check if the lr parameter is set , if not add it */
121 osip_uri_uparam_get_byname(rt->url, "lr", &lr_param);
124 osip_uri_uparam_add(rt->url,osip_strdup("lr"),NULL);
125 osip_route_to_str(rt,&tmproute);
126 sal_op_set_route(op,tmproute);
134 SalOp * sal_op_new(Sal *sal){
135 SalOp *op=ms_new(SalOp,1);
136 __sal_op_init(op,sal);
137 op->cid=op->did=op->tid=op->rid=op->nid=op->sid=-1;
139 op->supports_session_timers=FALSE;
140 op->sdp_offering=TRUE;
141 op->pending_auth=NULL;
145 op->masquerade_via=FALSE;
149 void sal_op_release(SalOp *op){
151 sdp_message_free(op->sdp_answer);
152 if (op->pending_auth)
153 eXosip_event_free(op->pending_auth);
155 sal_remove_register(op->base.root,op->rid);
158 ms_message("Cleaning cid %i",op->cid);
159 eXosip_call_set_reference(op->cid,NULL);
162 sal_remove_out_subscribe(op->base.root,op);
165 sal_remove_in_subscribe(op->base.root,op);
167 osip_call_id_free(op->call_id);
170 if (op->pending_auth){
171 sal_remove_pending_auth(op->base.root,op);
174 sal_media_description_unref(op->result);
176 sal_remove_other(op->base.root,op);
177 osip_call_id_free(op->call_id);
182 static void _osip_trace_func(char *fi, int li, osip_trace_level_t level, char *chfr, va_list ap){
183 int ortp_level=ORTP_DEBUG;
189 ortp_level=ORTP_MESSAGE;
192 ortp_level=ORTP_WARNING;
196 ortp_level=ORTP_ERROR;
199 ortp_level=ORTP_FATAL;
201 case END_TRACE_LEVEL:
204 if (ortp_log_level_enabled(level)){
205 int len=strlen(chfr);
206 char *chfrdup=ortp_strdup(chfr);
207 /*need to remove endline*/
209 if (chfrdup[len-1]=='\n')
211 if (chfrdup[len-2]=='\r')
214 ortp_logv(ortp_level,chfrdup,ap);
221 static bool_t firsttime=TRUE;
223 osip_trace_initialize_func (OSIP_INFO4,&_osip_trace_func);
227 return ms_new0(Sal,1);
230 void sal_uninit(Sal* sal){
235 void sal_set_user_pointer(Sal *sal, void *user_data){
239 void *sal_get_user_pointer(const Sal *sal){
243 static void unimplemented_stub(){
244 ms_warning("Unimplemented SAL callback");
247 void sal_set_callbacks(Sal *ctx, const SalCallbacks *cbs){
248 memcpy(&ctx->callbacks,cbs,sizeof(*cbs));
249 if (ctx->callbacks.call_received==NULL)
250 ctx->callbacks.call_received=(SalOnCallReceived)unimplemented_stub;
251 if (ctx->callbacks.call_ringing==NULL)
252 ctx->callbacks.call_ringing=(SalOnCallRinging)unimplemented_stub;
253 if (ctx->callbacks.call_accepted==NULL)
254 ctx->callbacks.call_accepted=(SalOnCallAccepted)unimplemented_stub;
255 if (ctx->callbacks.call_failure==NULL)
256 ctx->callbacks.call_failure=(SalOnCallFailure)unimplemented_stub;
257 if (ctx->callbacks.call_terminated==NULL)
258 ctx->callbacks.call_terminated=(SalOnCallTerminated)unimplemented_stub;
259 if (ctx->callbacks.call_updated==NULL)
260 ctx->callbacks.call_updated=(SalOnCallUpdated)unimplemented_stub;
261 if (ctx->callbacks.auth_requested==NULL)
262 ctx->callbacks.auth_requested=(SalOnAuthRequested)unimplemented_stub;
263 if (ctx->callbacks.auth_success==NULL)
264 ctx->callbacks.auth_success=(SalOnAuthSuccess)unimplemented_stub;
265 if (ctx->callbacks.register_success==NULL)
266 ctx->callbacks.register_success=(SalOnRegisterSuccess)unimplemented_stub;
267 if (ctx->callbacks.register_failure==NULL)
268 ctx->callbacks.register_failure=(SalOnRegisterFailure)unimplemented_stub;
269 if (ctx->callbacks.dtmf_received==NULL)
270 ctx->callbacks.dtmf_received=(SalOnDtmfReceived)unimplemented_stub;
271 if (ctx->callbacks.notify==NULL)
272 ctx->callbacks.notify=(SalOnNotify)unimplemented_stub;
273 if (ctx->callbacks.subscribe_received==NULL)
274 ctx->callbacks.subscribe_received=(SalOnSubscribeReceived)unimplemented_stub;
275 if (ctx->callbacks.text_received==NULL)
276 ctx->callbacks.text_received=(SalOnTextReceived)unimplemented_stub;
277 if (ctx->callbacks.internal_message==NULL)
278 ctx->callbacks.internal_message=(SalOnInternalMsg)unimplemented_stub;
279 if (ctx->callbacks.ping_reply==NULL)
280 ctx->callbacks.ping_reply=(SalOnPingReply)unimplemented_stub;
283 int sal_listen_port(Sal *ctx, const char *addr, int port, SalTransport tr, int is_secure){
286 int proto=IPPROTO_UDP;
288 if (ctx->running) eXosip_quit();
291 eXosip_set_option(13,&err); /*13=EXOSIP_OPT_SRV_WITH_NAPTR, as it is an enum value, we can't use it unless we are sure of the
292 version of eXosip, which is not the case*/
293 /*see if it looks like an IPv6 address*/
294 ipv6=strchr(addr,':')!=NULL;
295 eXosip_enable_ipv6(ipv6);
297 if (tr!=SalTransportDatagram || is_secure){
298 ms_fatal("SIP over TCP or TLS or DTLS is not supported yet.");
302 err=eXosip_listen_addr(proto, addr, port, ipv6 ? PF_INET6 : PF_INET, 0);
306 void sal_set_user_agent(Sal *ctx, const char *user_agent){
307 eXosip_set_user_agent(user_agent);
310 void sal_use_session_timers(Sal *ctx, int expires){
311 ctx->session_expires=expires;
314 MSList *sal_get_pending_auths(Sal *sal){
315 return ms_list_copy(sal->pending_auths);
318 static int extract_received_rport(osip_message_t *msg, const char **received, int *rportval){
319 osip_via_t *via=NULL;
320 osip_generic_param_t *param=NULL;
323 osip_message_get_via(msg,0,&via);
325 osip_via_param_get_byname(via,"rport",¶m);
328 if (rport && rport[0]!='\0') *rportval=atoi(rport);
332 osip_via_param_get_byname(via,"received",¶m);
333 if (param) *received=param->gvalue;
338 static void set_sdp(osip_message_t *sip,sdp_message_t *msg){
342 sdp_message_to_str(msg,&sdp);
344 snprintf(clen,sizeof(clen),"%i",sdplen);
345 osip_message_set_body(sip,sdp,sdplen);
346 osip_message_set_content_type(sip,"application/sdp");
347 osip_message_set_content_length(sip,clen);
351 static void set_sdp_from_desc(osip_message_t *sip, const SalMediaDescription *desc){
352 sdp_message_t *msg=media_description_to_sdp(desc);
354 ms_error("Fail to print sdp message !");
358 sdp_message_free(msg);
361 static void sdp_process(SalOp *h){
362 ms_message("Doing SDP offer/answer process");
364 sal_media_description_unref(h->result);
366 h->result=sal_media_description_new();
367 if (h->sdp_offering){
368 offer_answer_initiate_outgoing(h->base.local_media,h->base.remote_media,h->result);
371 offer_answer_initiate_incoming(h->base.local_media,h->base.remote_media,h->result);
372 h->sdp_answer=media_description_to_sdp(h->result);
373 strcpy(h->result->addr,h->base.remote_media->addr);
374 for(i=0;i<h->result->nstreams;++i){
375 if (h->result->streams[i].port>0){
376 strcpy(h->result->streams[i].addr,h->base.remote_media->streams[i].addr);
377 h->result->streams[i].ptime=h->base.remote_media->streams[i].ptime;
378 h->result->streams[i].bandwidth=h->base.remote_media->streams[i].bandwidth;
379 h->result->streams[i].port=h->base.remote_media->streams[i].port;
386 int sal_call_set_local_media_description(SalOp *h, SalMediaDescription *desc){
388 sal_media_description_ref(desc);
389 if (h->base.local_media)
390 sal_media_description_unref(h->base.local_media);
391 h->base.local_media=desc;
395 int sal_call(SalOp *h, const char *from, const char *to){
397 osip_message_t *invite=NULL;
398 sal_op_set_from(h,from);
400 sal_exosip_fix_route(h);
401 err=eXosip_call_build_initial_invite(&invite,to,from,sal_op_get_route(h),"Phone call");
403 ms_error("Could not create call.");
406 if (h->base.contact){
407 _osip_list_set_empty(&invite->contacts,(void (*)(void*))osip_contact_free);
408 osip_message_set_contact(invite,h->base.contact);
410 if (h->base.root->session_expires!=0){
411 osip_message_set_header(invite, "Session-expires", "200");
412 osip_message_set_supported(invite, "timer");
414 if (h->base.local_media){
415 h->sdp_offering=TRUE;
416 set_sdp_from_desc(invite,h->base.local_media);
417 }else h->sdp_offering=FALSE;
419 err=eXosip_call_send_initial_invite(invite);
423 ms_error("Fail to send invite !");
426 eXosip_call_set_reference(h->cid,h);
431 int sal_call_notify_ringing(SalOp *h){
433 eXosip_call_send_answer(h->tid,180,NULL);
438 int sal_call_accept(SalOp * h){
440 const char *contact=sal_op_get_contact(h);
442 int err=eXosip_call_build_answer(h->tid,200,&msg);
443 if (err<0 || msg==NULL){
444 ms_error("Fail to build answer for call: err=%i",err);
447 if (h->base.root->session_expires!=0){
448 if (h->supports_session_timers) osip_message_set_supported(msg, "timer");
452 _osip_list_set_empty(&msg->contacts,(void (*)(void*))osip_contact_free);
453 osip_message_set_contact(msg,contact);
456 if (h->base.local_media){
457 /*this is the case where we received an invite without SDP*/
458 if (h->sdp_offering) {
459 set_sdp_from_desc(msg,h->base.local_media);
462 set_sdp(msg,h->sdp_answer);
465 ms_error("You are accepting a call but not defined any media capabilities !");
467 eXosip_call_send_answer(h->tid,200,msg);
471 int sal_call_decline(SalOp *h, SalReason reason, const char *redirect){
472 if (reason==SalReasonBusy){
474 eXosip_call_send_answer(h->tid,486,NULL);
477 else if (reason==SalReasonTemporarilyUnavailable){
479 eXosip_call_send_answer(h->tid,480,NULL);
481 }else if (reason==SalReasonDoNotDisturb){
483 eXosip_call_send_answer(h->tid,600,NULL);
485 }else if (reason==SalReasonMedia){
487 eXosip_call_send_answer(h->tid,415,NULL);
489 }else if (redirect!=NULL && reason==SalReasonRedirect){
492 if (strstr(redirect,"sip:")!=0) code=302;
495 eXosip_call_build_answer(h->tid,code,&msg);
496 osip_message_set_contact(msg,redirect);
497 eXosip_call_send_answer(h->tid,code,msg);
499 }else sal_call_terminate(h);
503 SalMediaDescription * sal_call_get_final_media_description(SalOp *h){
504 if (h->base.local_media && h->base.remote_media && !h->result){
510 int sal_ping(SalOp *op, const char *from, const char *to){
511 osip_message_t *options=NULL;
513 sal_op_set_from(op,from);
514 sal_op_set_to(op,to);
515 eXosip_options_build_request (&options, sal_op_get_to(op),
516 sal_op_get_from(op),sal_op_get_route(op));
518 if (op->base.root->session_expires!=0){
519 osip_message_set_header(options, "Session-expires", "200");
520 osip_message_set_supported(options, "timer");
522 sal_add_other(sal_op_get_sal(op),op,options);
523 return eXosip_options_send_request(options);
528 int sal_refer(SalOp *h, const char *refer_to){
529 osip_message_t *msg=NULL;
532 eXosip_call_build_refer(h->did,refer_to, &msg);
533 if (msg) err=eXosip_call_send_request(h->did, msg);
539 int sal_call_send_dtmf(SalOp *h, char dtmf){
540 osip_message_t *msg=NULL;
545 eXosip_call_build_info(h->did,&msg);
547 snprintf(dtmf_body, sizeof(dtmf_body), "Signal=%c\r\nDuration=250\r\n", dtmf);
548 osip_message_set_body(msg,dtmf_body,strlen(dtmf_body));
549 osip_message_set_content_type(msg,"application/dtmf-relay");
550 snprintf(clen,sizeof(clen),"%lu",(unsigned long)strlen(dtmf_body));
551 osip_message_set_content_length(msg,clen);
552 eXosip_call_send_request(h->did,msg);
558 int sal_call_terminate(SalOp *h){
560 eXosip_call_terminate(h->cid,h->did);
561 eXosip_call_set_reference(h->cid,NULL);
566 void sal_op_authenticate(SalOp *h, const SalAuthInfo *info){
567 if (h->pending_auth){
569 if (info->userid==NULL || info->userid[0]=='\0') userid=info->username;
570 else userid=info->userid;
571 ms_message("Authentication info for %s %s added to eXosip", info->username,info->realm);
572 eXosip_add_authentication_info (info->username,userid,
573 info->password, NULL,info->realm);
575 eXosip_default_action(h->pending_auth);
577 ms_message("eXosip_default_action() done");
578 eXosip_clear_authentication_info();
579 eXosip_event_free(h->pending_auth);
580 sal_remove_pending_auth(sal_op_get_sal(h),h);
581 h->pending_auth=NULL;
585 static void set_network_origin(SalOp *op, osip_message_t *req){
586 const char *received=NULL;
589 if (extract_received_rport(req,&received,&rport)!=0){
590 osip_via_t *via=NULL;
592 osip_message_get_via(req,0,&via);
593 received=osip_via_get_host(via);
594 tmp=osip_via_get_port(via);
595 if (tmp) rport=atoi(tmp);
597 snprintf(origin,sizeof(origin)-1,"sip:%s:%i",received,rport);
598 __sal_op_set_network_origin(op,origin);
601 static SalOp *find_op(Sal *sal, eXosip_event_t *ev){
603 #ifdef HAVE_EXOSIP_GET_REF
604 return (SalOp*)eXosip_call_get_ref(ev->cid);
606 return (SalOp*)eXosip_call_get_reference(ev->cid);
610 return sal_find_register(sal,ev->rid);
612 if (ev->response) return sal_find_other(sal,ev->response);
616 static void inc_new_call(Sal *sal, eXosip_event_t *ev){
617 SalOp *op=sal_op_new(sal);
618 osip_from_t *from,*to;
620 sdp_message_t *sdp=eXosip_get_sdp_info(ev->request);
622 set_network_origin(op,ev->request);
625 op->sdp_offering=FALSE;
626 op->base.remote_media=sal_media_description_new();
627 sdp_to_media_description(sdp,op->base.remote_media);
628 sdp_message_free(sdp);
629 }else op->sdp_offering=TRUE;
631 from=osip_message_get_from(ev->request);
632 to=osip_message_get_to(ev->request);
633 osip_from_to_str(from,&tmp);
634 sal_op_set_from(op,tmp);
636 osip_from_to_str(to,&tmp);
637 sal_op_set_to(op,tmp);
644 eXosip_call_set_reference(op->cid,op);
645 sal->callbacks.call_received(op);
648 static void handle_reinvite(Sal *sal, eXosip_event_t *ev){
649 SalOp *op=find_op(sal,ev);
651 osip_message_t *msg=NULL;
654 ms_warning("Reinvite for non-existing operation !");
659 sdp=eXosip_get_sdp_info(ev->request);
660 if (op->base.remote_media){
661 sal_media_description_unref(op->base.remote_media);
662 op->base.remote_media=NULL;
665 eXosip_call_build_answer(ev->tid,200,&msg);
667 if (msg==NULL) return;
668 if (op->base.root->session_expires!=0){
669 if (op->supports_session_timers) osip_message_set_supported(msg, "timer");
671 if (op->base.contact){
672 _osip_list_set_empty(&msg->contacts,(void (*)(void*))osip_contact_free);
673 osip_message_set_contact(msg,op->base.contact);
676 op->sdp_offering=FALSE;
677 op->base.remote_media=sal_media_description_new();
678 sdp_to_media_description(sdp,op->base.remote_media);
679 sdp_message_free(sdp);
681 set_sdp(msg,op->sdp_answer);
683 op->sdp_offering=TRUE;
684 set_sdp_from_desc(msg,op->base.local_media);
687 eXosip_call_send_answer(ev->tid,200,msg);
691 static void handle_ack(Sal *sal, eXosip_event_t *ev){
692 SalOp *op=find_op(sal,ev);
696 ms_warning("ack for non-existing call !");
699 sdp=eXosip_get_sdp_info(ev->ack);
701 op->base.remote_media=sal_media_description_new();
702 sdp_to_media_description(sdp,op->base.remote_media);
704 sdp_message_free(sdp);
707 sal->callbacks.call_updated(op);
710 sal->callbacks.call_ack(op);
714 static void update_contact_from_response(SalOp *op, osip_message_t *response){
715 const char *received;
717 if (extract_received_rport(response,&received,&rport)==0){
718 const char *contact=sal_op_get_contact(op);
720 /*no contact given yet, use from instead*/
721 contact=sal_op_get_from(op);
724 SalAddress *addr=sal_address_new(contact);
726 sal_address_set_domain(addr,received);
727 sal_address_set_port_int(addr,rport);
728 tmp=sal_address_as_string(addr);
729 ms_message("Contact address updated to %s for this dialog",tmp);
730 sal_op_set_contact(op,tmp);
736 static int call_proceeding(Sal *sal, eXosip_event_t *ev){
737 SalOp *op=find_op(sal,ev);
740 ms_warning("This call has been canceled.");
742 eXosip_call_terminate(ev->cid,ev->did);
749 /* update contact if received and rport are set by the server
750 note: will only be used by remote for next INVITE, if any...*/
751 update_contact_from_response(op,ev->response);
755 static void call_ringing(Sal *sal, eXosip_event_t *ev){
758 if (call_proceeding(sal, ev)==-1) return;
759 op=(SalOp*)ev->external_reference;
760 sdp=eXosip_get_sdp_info(ev->response);
762 op->base.remote_media=sal_media_description_new();
763 sdp_to_media_description(sdp,op->base.remote_media);
764 sdp_message_free(sdp);
765 if (op->base.local_media) sdp_process(op);
767 sal->callbacks.call_ringing(op);
770 static void call_accepted(Sal *sal, eXosip_event_t *ev){
772 osip_message_t *msg=NULL;
773 SalOp *op=find_op(sal,ev);
777 ms_error("A closed call is accepted ?");
780 sdp=eXosip_get_sdp_info(ev->response);
782 op->base.remote_media=sal_media_description_new();
783 sdp_to_media_description(sdp,op->base.remote_media);
784 sdp_message_free(sdp);
785 if (op->base.local_media) sdp_process(op);
787 eXosip_call_build_ack(ev->did,&msg);
788 contact=sal_op_get_contact(op);
790 _osip_list_set_empty(&msg->contacts,(void (*)(void*))osip_contact_free);
791 osip_message_set_contact(msg,contact);
794 set_sdp(msg,op->sdp_answer);
795 eXosip_call_send_ack(ev->did,msg);
796 sal->callbacks.call_accepted(op);
799 static void call_terminated(Sal *sal, eXosip_event_t *ev){
801 SalOp *op=find_op(sal,ev);
803 ms_warning("Call terminated for already closed call ?");
806 osip_from_to_str(ev->request->from,&from);
807 eXosip_call_set_reference(ev->cid,NULL);
809 sal->callbacks.call_terminated(op,from);
813 static void call_released(Sal *sal, eXosip_event_t *ev){
814 SalOp *op=find_op(sal,ev);
820 sal->callbacks.call_failure(op,SalErrorNoResponse,SalReasonUnknown,NULL);
823 static int get_auth_data_from_response(osip_message_t *resp, const char **realm, const char **username){
824 const char *prx_realm=NULL,*www_realm=NULL;
825 osip_proxy_authenticate_t *prx_auth;
826 osip_www_authenticate_t *www_auth;
828 *username=osip_uri_get_username(resp->from->url);
829 prx_auth=(osip_proxy_authenticate_t*)osip_list_get(&resp->proxy_authenticates,0);
830 www_auth=(osip_proxy_authenticate_t*)osip_list_get(&resp->www_authenticates,0);
832 prx_realm=osip_proxy_authenticate_get_realm(prx_auth);
834 www_realm=osip_www_authenticate_get_realm(www_auth);
838 }else if (www_realm){
846 static int get_auth_data_from_request(osip_message_t *msg, const char **realm, const char **username){
847 osip_authorization_t *auth=NULL;
848 osip_proxy_authorization_t *prx_auth=NULL;
850 *username=osip_uri_get_username(msg->from->url);
851 osip_message_get_authorization(msg, 0, &auth);
853 *realm=osip_authorization_get_realm(auth);
856 osip_message_get_proxy_authorization(msg,0,&prx_auth);
858 *realm=osip_proxy_authorization_get_realm(prx_auth);
864 static int get_auth_data(eXosip_event_t *ev, const char **realm, const char **username){
865 if (ev->response && get_auth_data_from_response(ev->response,realm,username)==0) return 0;
866 if (ev->request && get_auth_data_from_request(ev->request,realm,username)==0) return 0;
870 int sal_op_get_auth_requested(SalOp *op, const char **realm, const char **username){
871 if (op->pending_auth){
872 return get_auth_data(op->pending_auth,realm,username);
877 static bool_t process_authentication(Sal *sal, eXosip_event_t *ev){
879 const char *username,*realm;
882 ms_warning("No operation associated with this authentication !");
885 if (get_auth_data(ev,&realm,&username)==0){
886 if (op->pending_auth!=NULL)
887 eXosip_event_free(op->pending_auth);
889 sal_add_pending_auth (sal,op);
890 sal->callbacks.auth_requested(op,realm,username);
896 static void authentication_ok(Sal *sal, eXosip_event_t *ev){
898 const char *username,*realm;
901 ms_warning("No operation associated with this authentication_ok!");
904 if (get_auth_data(ev,&realm,&username)==0){
905 sal->callbacks.auth_success(op,realm,username);
909 static bool_t call_failure(Sal *sal, eXosip_event_t *ev){
912 const char *reason=NULL;
913 SalError error=SalErrorUnknown;
914 SalReason sr=SalReasonUnknown;
916 op=(SalOp*)ev->external_reference;
919 ms_warning("Call failure reported for a closed call, ignored.");
924 code=osip_message_get_status_code(ev->response);
925 reason=osip_message_get_reason_phrase(ev->response);
931 return process_authentication(sal,ev);
934 error=SalErrorUnknown;
937 error=SalErrorFailure;
938 sr=SalReasonNotFound;
941 error=SalErrorFailure;
945 eXosip_default_action(ev);
949 error=SalErrorFailure;
950 sr=SalReasonTemporarilyUnavailable;
952 error=SalErrorFailure;
958 error=SalErrorFailure;
959 sr=SalReasonDoNotDisturb;
962 error=SalErrorFailure;
963 sr=SalReasonDeclined;
967 error=SalErrorFailure;
969 }else error=SalErrorNoResponse;
971 sal->callbacks.call_failure(op,error,sr,reason);
976 static void process_media_control_xml(Sal *sal, eXosip_event_t *ev){
977 SalOp *op=(SalOp*)ev->external_reference;
978 osip_body_t *body=NULL;
981 ms_warning("media control xml received without operation context!");
985 osip_message_get_body(ev->request,0,&body);
986 if (body && body->body!=NULL &&
987 strstr(body->body,"picture_fast_update")){
988 osip_message_t *ans=NULL;
989 ms_message("Receiving VFU request !");
990 if (sal->callbacks.vfu_request){
991 sal->callbacks.vfu_request(op);
992 eXosip_call_build_answer(ev->tid,200,&ans);
994 eXosip_call_send_answer(ev->tid,200,ans);
999 static void process_dtmf_relay(Sal *sal, eXosip_event_t *ev){
1000 SalOp *op=(SalOp*)ev->external_reference;
1001 osip_body_t *body=NULL;
1004 ms_warning("media dtmf relay received without operation context!");
1008 osip_message_get_body(ev->request,0,&body);
1009 if (body && body->body!=NULL){
1010 osip_message_t *ans=NULL;
1011 const char *name=strstr(body->body,"Signal");
1012 if (name==NULL) name=strstr(body->body,"signal");
1014 ms_warning("Could not extract the dtmf name from the SIP INFO.");
1017 name+=strlen("signal");
1018 if (sscanf(name," = %1s",tmp)==1){
1019 ms_message("Receiving dtmf %s via SIP INFO.",tmp);
1020 if (sal->callbacks.dtmf_received != NULL)
1021 sal->callbacks.dtmf_received(op, tmp[0]);
1024 eXosip_call_build_answer(ev->tid,200,&ans);
1026 eXosip_call_send_answer(ev->tid,200,ans);
1030 static void call_message_new(Sal *sal, eXosip_event_t *ev){
1031 osip_message_t *ans=NULL;
1033 if (MSG_IS_INFO(ev->request)){
1034 osip_content_type_t *ct;
1035 ct=osip_message_get_content_type(ev->request);
1036 if (ct && ct->subtype){
1037 if (strcmp(ct->subtype,"media_control+xml")==0)
1038 process_media_control_xml(sal,ev);
1039 else if (strcmp(ct->subtype,"dtmf-relay")==0)
1040 process_dtmf_relay(sal,ev);
1042 ms_message("Unhandled SIP INFO.");
1043 /*send an "Not implemented" answer*/
1045 eXosip_call_build_answer(ev->tid,501,&ans);
1047 eXosip_call_send_answer(ev->tid,501,ans);
1051 /*empty SIP INFO, probably to test we are alive. Send an empty answer*/
1053 eXosip_call_build_answer(ev->tid,200,&ans);
1055 eXosip_call_send_answer(ev->tid,200,ans);
1059 }else ms_warning("call_message_new: No request ?");
1062 static void inc_update(Sal *sal, eXosip_event_t *ev){
1063 osip_message_t *msg=NULL;
1064 ms_message("Processing incoming UPDATE");
1066 eXosip_message_build_answer(ev->tid,200,&msg);
1068 eXosip_message_send_answer(ev->tid,200,msg);
1072 static bool_t comes_from_local_if(osip_message_t *msg){
1073 osip_via_t *via=NULL;
1074 osip_message_get_via(msg,0,&via);
1077 host=osip_via_get_host(via);
1078 if (strcmp(host,"127.0.0.1")==0 || strcmp(host,"::1")==0){
1079 osip_generic_param_t *param=NULL;
1080 osip_via_param_get_byname(via,"received",¶m);
1081 if (param==NULL) return TRUE;
1082 if (param->gvalue &&
1083 (strcmp(param->gvalue,"127.0.0.1")==0 || strcmp(param->gvalue,"::1")==0)){
1091 static void text_received(Sal *sal, eXosip_event_t *ev){
1092 osip_body_t *body=NULL;
1093 char *from=NULL,*msg;
1095 osip_message_get_body(ev->request,0,&body);
1097 ms_error("Could not get text message from SIP body");
1101 osip_from_to_str(ev->request->from,&from);
1102 sal->callbacks.text_received(sal,from,msg);
1106 static void other_request(Sal *sal, eXosip_event_t *ev){
1107 ms_message("in other_request");
1108 if (ev->request==NULL) return;
1109 if (strcmp(ev->request->sip_method,"MESSAGE")==0){
1110 text_received(sal,ev);
1111 eXosip_message_send_answer(ev->tid,200,NULL);
1112 }else if (strcmp(ev->request->sip_method,"OPTIONS")==0){
1113 osip_message_t *options=NULL;
1114 eXosip_options_build_answer(ev->tid,200,&options);
1115 osip_message_set_allow(options,"INVITE, ACK, BYE, CANCEL, OPTIONS, MESSAGE, SUBSCRIBE, NOTIFY, INFO");
1116 osip_message_set_accept(options,"application/sdp");
1117 eXosip_options_send_answer(ev->tid,200,options);
1118 }else if (strcmp(ev->request->sip_method,"WAKEUP")==0
1119 && comes_from_local_if(ev->request)) {
1120 eXosip_message_send_answer(ev->tid,200,NULL);
1121 ms_message("Receiving WAKEUP request !");
1122 sal->callbacks.internal_message(sal,"WAKEUP");
1123 }else if (strncmp(ev->request->sip_method, "REFER", 5) == 0){
1124 ms_message("Receiving REFER request !");
1125 if (comes_from_local_if(ev->request)) {
1126 osip_header_t *h=NULL;
1127 osip_message_header_get_byname(ev->request,"Refer-To",0,&h);
1128 eXosip_message_send_answer(ev->tid,200,NULL);
1130 sal->callbacks.refer_received(sal,NULL,h->hvalue);
1132 }else ms_warning("Ignored REFER not coming from this local loopback interface.");
1133 }else if (strncmp(ev->request->sip_method, "UPDATE", 6) == 0){
1138 osip_message_to_str(ev->request,&tmp,&msglen);
1140 ms_message("Unsupported request received:\n%s",tmp);
1143 /*answer with a 501 Not implemented*/
1144 eXosip_message_send_answer(ev->tid,501,NULL);
1148 static void masquerade_via(osip_message_t *msg, const char *ip, const char *port){
1149 osip_via_t *via=NULL;
1150 osip_message_get_via(msg,0,&via);
1152 osip_free(via->port);
1153 via->port=osip_strdup(port);
1154 osip_free(via->host);
1155 via->host=osip_strdup(ip);
1159 static bool_t register_again_with_updated_contact(SalOp *op, osip_message_t *orig_request, osip_message_t *last_answer){
1160 osip_message_t *msg;
1161 const char *received;
1163 osip_contact_t *ctt=NULL;
1168 if (extract_received_rport(last_answer,&received,&rport)==-1) return FALSE;
1169 osip_message_get_contact(orig_request,0,&ctt);
1170 if (strcmp(ctt->url->host,received)==0){
1171 /*ip address matches, check ports*/
1172 const char *contact_port=ctt->url->port;
1173 if (contact_port==NULL || contact_port[0]=='\0')
1174 contact_port="5060";
1175 if (atoi(contact_port)==rport){
1176 ms_message("Register has up to date contact, doing nothing.");
1178 }else ms_message("ports do not match, need to update the register (%s <> %i)", contact_port,rport);
1182 eXosip_register_build_register(op->rid,op->expires,&msg);
1185 ms_warning("Fail to create a contact updated register.");
1188 osip_message_get_contact(msg,0,&ctt);
1189 if (ctt->url->host!=NULL){
1190 osip_free(ctt->url->host);
1192 ctt->url->host=osip_strdup(received);
1193 if (ctt->url->port!=NULL){
1194 osip_free(ctt->url->port);
1196 snprintf(port,sizeof(port),"%i",rport);
1197 ctt->url->port=osip_strdup(port);
1198 if (op->masquerade_via) masquerade_via(msg,received,port);
1199 eXosip_register_send_register(op->rid,msg);
1201 osip_contact_to_str(ctt,&tmp);
1202 addr=sal_address_new(tmp);
1204 sal_address_clean(addr);
1205 tmp=sal_address_as_string(addr);
1206 sal_op_set_contact(op,tmp);
1207 ms_message("Resending new register with updated contact %s",tmp);
1212 static void registration_success(Sal *sal, eXosip_event_t *ev){
1213 SalOp *op=sal_find_register(sal,ev->rid);
1214 osip_header_t *h=NULL;
1217 ms_error("Receiving register response for unknown operation");
1220 osip_message_get_expires(ev->request,0,&h);
1221 if (h!=NULL && atoi(h->hvalue)!=0){
1223 if (!register_again_with_updated_contact(op,ev->request,ev->response)){
1224 sal->callbacks.register_success(op,registered);
1226 }else registered=FALSE;
1229 static bool_t registration_failure(Sal *sal, eXosip_event_t *ev){
1231 const char *reason=NULL;
1232 SalOp *op=sal_find_register(sal,ev->rid);
1233 SalReason sr=SalReasonUnknown;
1234 SalError se=SalErrorUnknown;
1237 ms_error("Receiving register failure for unknown operation");
1241 status_code=osip_message_get_status_code(ev->response);
1242 reason=osip_message_get_reason_phrase(ev->response);
1244 switch(status_code){
1247 return process_authentication(sal,ev);
1249 case 606: /*Not acceptable, workaround for proxies that don't like private addresses
1250 in vias, such as ekiga.net
1251 On the opposite, freephonie.net bugs when via are masqueraded.
1253 op->masquerade_via=TRUE;
1255 /* if contact is up to date, process the failure, otherwise resend a new register with
1256 updated contact first, just in case the faillure is due to incorrect contact */
1257 if (register_again_with_updated_contact(op,ev->request,ev->response))
1258 return TRUE; /*we are retrying with an updated contact*/
1259 if (status_code==403){
1261 sr=SalReasonForbidden;
1262 }else if (status_code==0){
1263 se=SalErrorNoResponse;
1265 sal->callbacks.register_failure(op,se,sr,reason);
1270 static void other_request_reply(Sal *sal,eXosip_event_t *ev){
1271 SalOp *op=find_op(sal,ev);
1274 ms_warning("other_request_reply(): Receiving response to unknown request.");
1278 update_contact_from_response(op,ev->response);
1279 sal->callbacks.ping_reply(op);
1283 static bool_t process_event(Sal *sal, eXosip_event_t *ev){
1285 case EXOSIP_CALL_ANSWERED:
1286 ms_message("CALL_ANSWERED\n");
1287 call_accepted(sal,ev);
1288 authentication_ok(sal,ev);
1290 case EXOSIP_CALL_CLOSED:
1291 case EXOSIP_CALL_CANCELLED:
1292 ms_message("CALL_CLOSED or CANCELLED\n");
1293 call_terminated(sal,ev);
1295 case EXOSIP_CALL_TIMEOUT:
1296 case EXOSIP_CALL_NOANSWER:
1297 ms_message("CALL_TIMEOUT or NOANSWER\n");
1298 return call_failure(sal,ev);
1300 case EXOSIP_CALL_REQUESTFAILURE:
1301 case EXOSIP_CALL_GLOBALFAILURE:
1302 case EXOSIP_CALL_SERVERFAILURE:
1303 ms_message("CALL_REQUESTFAILURE or GLOBALFAILURE or SERVERFAILURE\n");
1304 return call_failure(sal,ev);
1306 case EXOSIP_CALL_INVITE:
1307 ms_message("CALL_NEW\n");
1308 inc_new_call(sal,ev);
1310 case EXOSIP_CALL_REINVITE:
1311 handle_reinvite(sal,ev);
1313 case EXOSIP_CALL_ACK:
1314 ms_message("CALL_ACK");
1317 case EXOSIP_CALL_REDIRECTED:
1318 ms_message("CALL_REDIRECTED");
1319 eXosip_default_action(ev);
1321 case EXOSIP_CALL_PROCEEDING:
1322 ms_message("CALL_PROCEEDING");
1323 call_proceeding(sal,ev);
1325 case EXOSIP_CALL_RINGING:
1326 ms_message("CALL_RINGING");
1327 call_ringing(sal,ev);
1329 case EXOSIP_CALL_MESSAGE_NEW:
1330 ms_message("EXOSIP_CALL_MESSAGE_NEW");
1331 call_message_new(sal,ev);
1333 case EXOSIP_CALL_MESSAGE_REQUESTFAILURE:
1334 if (ev->did<0 && ev->response &&
1335 (ev->response->status_code==407 || ev->response->status_code==401)){
1336 return process_authentication(sal,ev);
1339 case EXOSIP_IN_SUBSCRIPTION_NEW:
1340 ms_message("CALL_IN_SUBSCRIPTION_NEW ");
1341 sal_exosip_subscription_recv(sal,ev);
1343 case EXOSIP_IN_SUBSCRIPTION_RELEASED:
1344 ms_message("CALL_SUBSCRIPTION_NEW ");
1345 sal_exosip_in_subscription_closed(sal,ev);
1347 case EXOSIP_SUBSCRIPTION_UPDATE:
1348 ms_message("CALL_SUBSCRIPTION_UPDATE");
1350 case EXOSIP_SUBSCRIPTION_NOTIFY:
1351 ms_message("CALL_SUBSCRIPTION_NOTIFY");
1352 sal_exosip_notify_recv(sal,ev);
1354 case EXOSIP_SUBSCRIPTION_ANSWERED:
1355 ms_message("EXOSIP_SUBSCRIPTION_ANSWERED, ev->sid=%i, ev->did=%i\n",ev->sid,ev->did);
1356 sal_exosip_subscription_answered(sal,ev);
1358 case EXOSIP_SUBSCRIPTION_CLOSED:
1359 ms_message("EXOSIP_SUBSCRIPTION_CLOSED\n");
1360 sal_exosip_subscription_closed(sal,ev);
1362 case EXOSIP_SUBSCRIPTION_REQUESTFAILURE: /**< announce a request failure */
1363 if (ev->response && (ev->response->status_code == 407 || ev->response->status_code == 401)){
1364 return process_authentication(sal,ev);
1366 case EXOSIP_SUBSCRIPTION_SERVERFAILURE:
1367 case EXOSIP_SUBSCRIPTION_GLOBALFAILURE:
1368 sal_exosip_subscription_closed(sal,ev);
1370 case EXOSIP_CALL_RELEASED:
1371 ms_message("CALL_RELEASED\n");
1372 call_released(sal, ev);
1374 case EXOSIP_REGISTRATION_FAILURE:
1375 ms_message("REGISTRATION_FAILURE\n");
1376 return registration_failure(sal,ev);
1378 case EXOSIP_REGISTRATION_SUCCESS:
1379 authentication_ok(sal,ev);
1380 registration_success(sal,ev);
1382 case EXOSIP_MESSAGE_NEW:
1383 other_request(sal,ev);
1385 case EXOSIP_MESSAGE_PROCEEDING:
1386 case EXOSIP_MESSAGE_ANSWERED:
1387 case EXOSIP_MESSAGE_REDIRECTED:
1388 case EXOSIP_MESSAGE_SERVERFAILURE:
1389 case EXOSIP_MESSAGE_GLOBALFAILURE:
1390 other_request_reply(sal,ev);
1392 case EXOSIP_MESSAGE_REQUESTFAILURE:
1393 if (ev->response && (ev->response->status_code == 407 || ev->response->status_code == 401)){
1394 return process_authentication(sal,ev);
1398 ms_message("Unhandled exosip event ! %i",ev->type);
1404 int sal_iterate(Sal *sal){
1406 while((ev=eXosip_event_wait(0,0))!=NULL){
1407 if (process_event(sal,ev))
1408 eXosip_event_free(ev);
1411 eXosip_automatic_refresh();
1416 int sal_register(SalOp *h, const char *proxy, const char *from, int expires){
1417 osip_message_t *msg;
1418 sal_op_set_route(h,proxy);
1421 h->rid=eXosip_register_build_initial_register(from,proxy,sal_op_get_contact(h),expires,&msg);
1422 sal_add_register(h->base.root,h);
1425 eXosip_register_build_register(h->rid,expires,&msg);
1427 eXosip_register_send_register(h->rid,msg);
1433 int sal_unregister(SalOp *h){
1434 osip_message_t *msg=NULL;
1436 eXosip_register_build_register(h->rid,0,&msg);
1437 if (msg) eXosip_register_send_register(h->rid,msg);
1438 else ms_warning("Could not build unREGISTER !");
1445 SalAddress * sal_address_new(const char *uri){
1447 osip_from_init(&from);
1448 if (osip_from_parse(from,uri)!=0){
1449 osip_from_free(from);
1452 return (SalAddress*)from;
1455 SalAddress * sal_address_clone(const SalAddress *addr){
1456 osip_from_t *ret=NULL;
1457 osip_from_clone((osip_from_t*)addr,&ret);
1458 return (SalAddress*)ret;
1461 #define null_if_empty(s) (((s)!=NULL && (s)[0]!='\0') ? (s) : NULL )
1463 const char *sal_address_get_scheme(const SalAddress *addr){
1464 const osip_from_t *u=(const osip_from_t*)addr;
1465 return null_if_empty(u->url->scheme);
1468 const char *sal_address_get_display_name(const SalAddress* addr){
1469 const osip_from_t *u=(const osip_from_t*)addr;
1470 return null_if_empty(u->displayname);
1473 const char *sal_address_get_username(const SalAddress *addr){
1474 const osip_from_t *u=(const osip_from_t*)addr;
1475 return null_if_empty(u->url->username);
1478 const char *sal_address_get_domain(const SalAddress *addr){
1479 const osip_from_t *u=(const osip_from_t*)addr;
1480 return null_if_empty(u->url->host);
1483 void sal_address_set_display_name(SalAddress *addr, const char *display_name){
1484 osip_from_t *u=(osip_from_t*)addr;
1485 if (u->displayname!=NULL){
1486 osip_free(u->displayname);
1487 u->displayname=NULL;
1489 if (display_name!=NULL)
1490 u->displayname=osip_strdup(display_name);
1493 void sal_address_set_username(SalAddress *addr, const char *username){
1494 osip_from_t *uri=(osip_from_t*)addr;
1495 if (uri->url->username!=NULL){
1496 osip_free(uri->url->username);
1497 uri->url->username=NULL;
1500 uri->url->username=osip_strdup(username);
1503 void sal_address_set_domain(SalAddress *addr, const char *host){
1504 osip_from_t *uri=(osip_from_t*)addr;
1505 if (uri->url->host!=NULL){
1506 osip_free(uri->url->host);
1507 uri->url->host=NULL;
1510 uri->url->host=osip_strdup(host);
1513 void sal_address_set_port(SalAddress *addr, const char *port){
1514 osip_from_t *uri=(osip_from_t*)addr;
1515 if (uri->url->port!=NULL){
1516 osip_free(uri->url->port);
1517 uri->url->port=NULL;
1520 uri->url->port=osip_strdup(port);
1523 void sal_address_set_port_int(SalAddress *uri, int port){
1526 /*this is the default, special case to leave the port field blank*/
1527 sal_address_set_port(uri,NULL);
1530 snprintf(tmp,sizeof(tmp),"%i",port);
1531 sal_address_set_port(uri,tmp);
1534 void sal_address_clean(SalAddress *addr){
1535 osip_generic_param_freelist(& ((osip_from_t*)addr)->gen_params);
1536 osip_uri_param_freelist(& ((osip_from_t*)addr)->url->url_params);
1539 char *sal_address_as_string(const SalAddress *u){
1541 osip_from_to_str((osip_from_t*)u,&tmp);
1547 char *sal_address_as_string_uri_only(const SalAddress *u){
1548 char *tmp=NULL,*ret;
1549 osip_uri_to_str(((osip_from_t*)u)->url,&tmp);
1555 void sal_address_destroy(SalAddress *u){
1556 osip_from_free((osip_from_t*)u);