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 void _osip_list_set_empty(osip_list_t *l, void (*freefunc)(void*)){
37 while(!osip_list_eol(l,0)) {
38 data=osip_list_get(l,0);
39 osip_list_remove(l,0);
40 if (data) freefunc(data);
44 void sal_get_default_local_ip(Sal *sal, int address_family,char *ip, size_t iplen){
45 if (eXosip_guess_localip(address_family,ip,iplen)<0){
46 /*default to something */
47 strncpy(ip,address_family==AF_INET6 ? "::1" : "127.0.0.1",iplen);
48 ms_error("Could not find default routable ip address !");
53 static SalOp * sal_find_call(Sal *sal, int cid){
56 for(elem=sal->calls;elem!=NULL;elem=elem->next){
57 op=(SalOp*)elem->data;
58 if (op->cid==cid) return op;
63 static void sal_add_call(Sal *sal, SalOp *op){
64 sal->calls=ms_list_append(sal->calls,op);
67 static void sal_remove_call(Sal *sal, SalOp *op){
68 sal->calls=ms_list_remove(sal->calls, op);
71 static SalOp * sal_find_register(Sal *sal, int rid){
74 for(elem=sal->registers;elem!=NULL;elem=elem->next){
75 op=(SalOp*)elem->data;
76 if (op->rid==rid) return op;
81 static void sal_add_register(Sal *sal, SalOp *op){
82 sal->registers=ms_list_append(sal->registers,op);
85 static void sal_remove_register(Sal *sal, int rid){
88 for(elem=sal->registers;elem!=NULL;elem=elem->next){
89 op=(SalOp*)elem->data;
91 sal->registers=ms_list_remove_link(sal->registers,elem);
97 static SalOp * sal_find_other(Sal *sal, osip_message_t *response){
100 osip_call_id_t *callid=osip_message_get_call_id(response);
102 ms_error("There is no call-id in this response !");
105 for(elem=sal->other_transactions;elem!=NULL;elem=elem->next){
106 op=(SalOp*)elem->data;
107 if (osip_call_id_match(callid,op->call_id)==0) return op;
112 void sal_add_other(Sal *sal, SalOp *op, osip_message_t *request){
113 osip_call_id_t *callid=osip_message_get_call_id(request);
115 ms_error("There is no call id in the request !");
118 osip_call_id_clone(callid,&op->call_id);
119 sal->other_transactions=ms_list_append(sal->other_transactions,op);
122 static void sal_remove_other(Sal *sal, SalOp *op){
123 sal->other_transactions=ms_list_remove(sal->other_transactions,op);
127 static void sal_add_pending_auth(Sal *sal, SalOp *op){
128 sal->pending_auths=ms_list_append(sal->pending_auths,op);
132 static void sal_remove_pending_auth(Sal *sal, SalOp *op){
133 sal->pending_auths=ms_list_remove(sal->pending_auths,op);
136 void sal_exosip_fix_route(SalOp *op){
137 if (sal_op_get_route(op)!=NULL){
138 osip_route_t *rt=NULL;
139 osip_uri_param_t *lr_param=NULL;
141 osip_route_init(&rt);
142 if (osip_route_parse(rt,sal_op_get_route(op))<0){
143 ms_warning("Bad route %s!",sal_op_get_route(op));
144 sal_op_set_route(op,NULL);
146 /* check if the lr parameter is set , if not add it */
147 osip_uri_uparam_get_byname(rt->url, "lr", &lr_param);
150 osip_uri_uparam_add(rt->url,osip_strdup("lr"),NULL);
151 osip_route_to_str(rt,&tmproute);
152 sal_op_set_route(op,tmproute);
160 SalOp * sal_op_new(Sal *sal){
161 SalOp *op=ms_new(SalOp,1);
162 __sal_op_init(op,sal);
163 op->cid=op->did=op->tid=op->rid=op->nid=op->sid=-1;
165 op->supports_session_timers=FALSE;
166 op->sdp_offering=TRUE;
167 op->pending_auth=NULL;
172 op->referred_by=NULL;
173 op->masquerade_via=FALSE;
174 op->auto_answer_asked=FALSE;
176 op->terminated=FALSE;
180 bool_t sal_call_autoanswer_asked(SalOp *op)
182 return op->auto_answer_asked;
185 void sal_op_release(SalOp *op){
187 sdp_message_free(op->sdp_answer);
188 if (op->pending_auth)
189 eXosip_event_free(op->pending_auth);
191 sal_remove_register(op->base.root,op->rid);
194 ms_message("Cleaning cid %i",op->cid);
195 sal_remove_call(op->base.root,op);
198 sal_remove_out_subscribe(op->base.root,op);
201 sal_remove_in_subscribe(op->base.root,op);
203 osip_call_id_free(op->call_id);
206 if (op->pending_auth){
207 sal_remove_pending_auth(op->base.root,op);
210 sal_media_description_unref(op->result);
212 sal_remove_other(op->base.root,op);
213 osip_call_id_free(op->call_id);
216 ms_free(op->replaces);
218 if (op->referred_by){
219 ms_free(op->referred_by);
222 sal_auth_info_delete(op->auth_info);
227 static void _osip_trace_func(char *fi, int li, osip_trace_level_t level, char *chfr, va_list ap){
228 int ortp_level=ORTP_DEBUG;
234 ortp_level=ORTP_MESSAGE;
237 ortp_level=ORTP_WARNING;
241 ortp_level=ORTP_ERROR;
244 ortp_level=ORTP_FATAL;
246 case END_TRACE_LEVEL:
249 if (ortp_log_level_enabled(level)){
250 int len=strlen(chfr);
251 char *chfrdup=ortp_strdup(chfr);
252 /*need to remove endline*/
254 if (chfrdup[len-1]=='\n')
256 if (chfrdup[len-2]=='\r')
259 ortp_logv(ortp_level,chfrdup,ap);
266 static bool_t firsttime=TRUE;
269 osip_trace_initialize_func (OSIP_INFO4,&_osip_trace_func);
274 sal->keepalive_period=30;
275 sal->double_reg=TRUE;
276 sal->use_rports=TRUE;
280 void sal_uninit(Sal* sal){
285 void sal_set_user_pointer(Sal *sal, void *user_data){
289 void *sal_get_user_pointer(const Sal *sal){
293 static void unimplemented_stub(){
294 ms_warning("Unimplemented SAL callback");
297 void sal_set_callbacks(Sal *ctx, const SalCallbacks *cbs){
298 memcpy(&ctx->callbacks,cbs,sizeof(*cbs));
299 if (ctx->callbacks.call_received==NULL)
300 ctx->callbacks.call_received=(SalOnCallReceived)unimplemented_stub;
301 if (ctx->callbacks.call_ringing==NULL)
302 ctx->callbacks.call_ringing=(SalOnCallRinging)unimplemented_stub;
303 if (ctx->callbacks.call_accepted==NULL)
304 ctx->callbacks.call_accepted=(SalOnCallAccepted)unimplemented_stub;
305 if (ctx->callbacks.call_failure==NULL)
306 ctx->callbacks.call_failure=(SalOnCallFailure)unimplemented_stub;
307 if (ctx->callbacks.call_terminated==NULL)
308 ctx->callbacks.call_terminated=(SalOnCallTerminated)unimplemented_stub;
309 if (ctx->callbacks.call_released==NULL)
310 ctx->callbacks.call_released=(SalOnCallReleased)unimplemented_stub;
311 if (ctx->callbacks.call_updating==NULL)
312 ctx->callbacks.call_updating=(SalOnCallUpdating)unimplemented_stub;
313 if (ctx->callbacks.auth_requested==NULL)
314 ctx->callbacks.auth_requested=(SalOnAuthRequested)unimplemented_stub;
315 if (ctx->callbacks.auth_success==NULL)
316 ctx->callbacks.auth_success=(SalOnAuthSuccess)unimplemented_stub;
317 if (ctx->callbacks.register_success==NULL)
318 ctx->callbacks.register_success=(SalOnRegisterSuccess)unimplemented_stub;
319 if (ctx->callbacks.register_failure==NULL)
320 ctx->callbacks.register_failure=(SalOnRegisterFailure)unimplemented_stub;
321 if (ctx->callbacks.dtmf_received==NULL)
322 ctx->callbacks.dtmf_received=(SalOnDtmfReceived)unimplemented_stub;
323 if (ctx->callbacks.notify==NULL)
324 ctx->callbacks.notify=(SalOnNotify)unimplemented_stub;
325 if (ctx->callbacks.notify_presence==NULL)
326 ctx->callbacks.notify_presence=(SalOnNotifyPresence)unimplemented_stub;
327 if (ctx->callbacks.subscribe_received==NULL)
328 ctx->callbacks.subscribe_received=(SalOnSubscribeReceived)unimplemented_stub;
329 if (ctx->callbacks.text_received==NULL)
330 ctx->callbacks.text_received=(SalOnTextReceived)unimplemented_stub;
331 if (ctx->callbacks.internal_message==NULL)
332 ctx->callbacks.internal_message=(SalOnInternalMsg)unimplemented_stub;
333 if (ctx->callbacks.ping_reply==NULL)
334 ctx->callbacks.ping_reply=(SalOnPingReply)unimplemented_stub;
337 int sal_unlisten_ports(Sal *ctx){
346 int sal_listen_port(Sal *ctx, const char *addr, int port, SalTransport tr, int is_secure){
349 int proto=IPPROTO_UDP;
350 int keepalive = ctx->keepalive_period;
353 case SalTransportDatagram:
355 eXosip_set_option (EXOSIP_OPT_UDP_KEEP_ALIVE, &keepalive);
357 case SalTransportStream:
360 eXosip_set_option (EXOSIP_OPT_UDP_KEEP_ALIVE,&keepalive);
363 ms_warning("unexpected proto, using datagram");
367 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
368 version of eXosip, which is not the case*/
369 /*see if it looks like an IPv6 address*/
370 int use_rports = ctx->use_rports; // Copy char to int to avoid bad alignment
371 eXosip_set_option(EXOSIP_OPT_USE_RPORT,&use_rports);
372 ipv6=strchr(addr,':')!=NULL;
373 eXosip_enable_ipv6(ipv6);
376 ms_fatal("SIP over TLS or DTLS is not supported yet.");
379 err=eXosip_listen_addr(proto, addr, port, ipv6 ? PF_INET6 : PF_INET, 0);
380 #ifdef HAVE_EXOSIP_GET_SOCKET
381 ms_message("Exosip has socket number %i",eXosip_get_socket(proto));
388 ortp_socket_t sal_get_socket(Sal *ctx){
389 #ifdef HAVE_EXOSIP_GET_SOCKET
390 return eXosip_get_socket(IPPROTO_UDP);
392 ms_warning("Sorry, eXosip does not have eXosip_get_socket() method");
397 void sal_set_user_agent(Sal *ctx, const char *user_agent){
398 eXosip_set_user_agent(user_agent);
401 void sal_use_session_timers(Sal *ctx, int expires){
402 ctx->session_expires=expires;
405 void sal_use_one_matching_codec_policy(Sal *ctx, bool_t one_matching_codec){
406 ctx->one_matching_codec=one_matching_codec;
409 MSList *sal_get_pending_auths(Sal *sal){
410 return ms_list_copy(sal->pending_auths);
413 void sal_use_double_registrations(Sal *ctx, bool_t enabled){
414 ctx->double_reg=enabled;
417 void sal_use_rport(Sal *ctx, bool_t use_rports){
418 ctx->use_rports=use_rports;
421 static int extract_received_rport(osip_message_t *msg, const char **received, int *rportval){
422 osip_via_t *via=NULL;
423 osip_generic_param_t *param=NULL;
424 const char *rport=NULL;
428 osip_message_get_via(msg,0,&via);
431 /* it is useless to do that with tcp since client socket might have a different port
432 than the server socket.
434 if (strcasecmp(via->protocol,"tcp")==0) return -1;
436 if (via->port && via->port[0]!='\0')
437 *rportval=atoi(via->port);
439 osip_via_param_get_byname(via,"rport",¶m);
442 if (rport && rport[0]!='\0') *rportval=atoi(rport);
446 osip_via_param_get_byname(via,"received",¶m);
447 if (param) *received=param->gvalue;
449 if (rport==NULL && *received==NULL) return -1;
453 static void set_sdp(osip_message_t *sip,sdp_message_t *msg){
457 sdp_message_to_str(msg,&sdp);
459 snprintf(clen,sizeof(clen),"%i",sdplen);
460 osip_message_set_body(sip,sdp,sdplen);
461 osip_message_set_content_type(sip,"application/sdp");
462 osip_message_set_content_length(sip,clen);
466 static void set_sdp_from_desc(osip_message_t *sip, const SalMediaDescription *desc){
467 sdp_message_t *msg=media_description_to_sdp(desc);
469 ms_error("Fail to print sdp message !");
473 sdp_message_free(msg);
476 static void sdp_process(SalOp *h){
477 ms_message("Doing SDP offer/answer process");
479 sal_media_description_unref(h->result);
481 h->result=sal_media_description_new();
482 if (h->sdp_offering){
483 offer_answer_initiate_outgoing(h->base.local_media,h->base.remote_media,h->result);
486 offer_answer_initiate_incoming(h->base.local_media,h->base.remote_media,h->result,h->base.root->one_matching_codec);
487 h->sdp_answer=media_description_to_sdp(h->result);
488 /*once we have generated the SDP answer, we modify the result description for processing by the upper layer.
489 It should contains media parameters constraint from the remote offer, not our response*/
490 strcpy(h->result->addr,h->base.remote_media->addr);
491 h->result->bandwidth=h->base.remote_media->bandwidth;
492 for(i=0;i<h->result->nstreams;++i){
493 if (h->result->streams[i].port>0){
494 strcpy(h->result->streams[i].addr,h->base.remote_media->streams[i].addr);
495 h->result->streams[i].ptime=h->base.remote_media->streams[i].ptime;
496 h->result->streams[i].bandwidth=h->base.remote_media->streams[i].bandwidth;
497 h->result->streams[i].port=h->base.remote_media->streams[i].port;
504 int sal_call_set_local_media_description(SalOp *h, SalMediaDescription *desc){
506 sal_media_description_ref(desc);
507 if (h->base.local_media)
508 sal_media_description_unref(h->base.local_media);
509 h->base.local_media=desc;
513 int sal_call(SalOp *h, const char *from, const char *to){
515 osip_message_t *invite=NULL;
516 sal_op_set_from(h,from);
518 sal_exosip_fix_route(h);
519 err=eXosip_call_build_initial_invite(&invite,to,from,sal_op_get_route(h),"Phone call");
521 ms_error("Could not create call.");
524 osip_message_set_allow(invite, "INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, NOTIFY, MESSAGE, SUBSCRIBE, INFO");
525 if (h->base.contact){
526 _osip_list_set_empty(&invite->contacts,(void (*)(void*))osip_contact_free);
527 osip_message_set_contact(invite,h->base.contact);
529 if (h->base.root->session_expires!=0){
530 osip_message_set_header(invite, "Session-expires", "200");
531 osip_message_set_supported(invite, "timer");
533 if (h->base.local_media){
534 h->sdp_offering=TRUE;
535 set_sdp_from_desc(invite,h->base.local_media);
536 }else h->sdp_offering=FALSE;
538 osip_message_set_header(invite,"Replaces",h->replaces);
540 osip_message_set_header(invite,"Referred-By",h->referred_by);
544 err=eXosip_call_send_initial_invite(invite);
548 ms_error("Fail to send invite !");
551 sal_add_call(h->base.root,h);
556 int sal_call_notify_ringing(SalOp *h, bool_t early_media){
560 /*if early media send also 180 and 183 */
561 if (early_media && h->sdp_answer){
564 err=eXosip_call_build_answer(h->tid,180,&msg);
566 set_sdp(msg,h->sdp_answer);
567 eXosip_call_send_answer(h->tid,180,msg);
570 err=eXosip_call_build_answer(h->tid,183,&msg);
572 set_sdp(msg,h->sdp_answer);
573 eXosip_call_send_answer(h->tid,183,msg);
578 eXosip_call_send_answer(h->tid,180,NULL);
584 int sal_call_accept(SalOp * h){
586 const char *contact=sal_op_get_contact(h);
588 int err=eXosip_call_build_answer(h->tid,200,&msg);
589 if (err<0 || msg==NULL){
590 ms_error("Fail to build answer for call: err=%i",err);
593 if (h->base.root->session_expires!=0){
594 if (h->supports_session_timers) osip_message_set_supported(msg, "timer");
598 _osip_list_set_empty(&msg->contacts,(void (*)(void*))osip_contact_free);
599 osip_message_set_contact(msg,contact);
602 if (h->base.local_media){
603 /*this is the case where we received an invite without SDP*/
604 if (h->sdp_offering) {
605 set_sdp_from_desc(msg,h->base.local_media);
608 set_sdp(msg,h->sdp_answer);
609 sdp_message_free(h->sdp_answer);
614 ms_error("You are accepting a call but not defined any media capabilities !");
616 eXosip_call_send_answer(h->tid,200,msg);
620 int sal_call_decline(SalOp *h, SalReason reason, const char *redirect){
621 if (reason==SalReasonBusy){
623 eXosip_call_send_answer(h->tid,486,NULL);
626 else if (reason==SalReasonTemporarilyUnavailable){
628 eXosip_call_send_answer(h->tid,480,NULL);
630 }else if (reason==SalReasonDoNotDisturb){
632 eXosip_call_send_answer(h->tid,600,NULL);
634 }else if (reason==SalReasonMedia){
636 eXosip_call_send_answer(h->tid,415,NULL);
638 }else if (redirect!=NULL && reason==SalReasonRedirect){
641 if (strstr(redirect,"sip:")!=0) code=302;
644 eXosip_call_build_answer(h->tid,code,&msg);
645 osip_message_set_contact(msg,redirect);
646 eXosip_call_send_answer(h->tid,code,msg);
648 }else sal_call_terminate(h);
652 SalMediaDescription * sal_call_get_final_media_description(SalOp *h){
653 if (h->base.local_media && h->base.remote_media && !h->result){
659 int sal_call_set_referer(SalOp *h, SalOp *refered_call){
660 if (refered_call->replaces)
661 h->replaces=ms_strdup(refered_call->replaces);
662 if (refered_call->referred_by)
663 h->referred_by=ms_strdup(refered_call->referred_by);
667 int sal_ping(SalOp *op, const char *from, const char *to){
668 osip_message_t *options=NULL;
670 sal_op_set_from(op,from);
671 sal_op_set_to(op,to);
672 /*bug here: eXosip2 does not honor the route argument*/
673 eXosip_options_build_request (&options, sal_op_get_to(op),
674 sal_op_get_from(op),sal_op_get_route(op));
676 if (op->base.root->session_expires!=0){
677 osip_message_set_header(options, "Session-expires", "200");
678 osip_message_set_supported(options, "timer");
680 sal_add_other(sal_op_get_sal(op),op,options);
681 return eXosip_options_send_request(options);
686 int sal_call_accept_refer(SalOp *op){
687 osip_message_t *msg=NULL;
690 err = eXosip_call_build_notify(op->did,EXOSIP_SUBCRSTATE_ACTIVE,&msg);
693 osip_message_set_header(msg,(const char *)"event","refer");
694 osip_message_set_content_type(msg,"message/sipfrag");
695 osip_message_set_body(msg,"SIP/2.0 100 Trying",sizeof("SIP/2.0 100 Trying"));
696 eXosip_call_send_request(op->did,msg);
700 ms_error("could not get a notify built\n");
706 int sal_call_refer(SalOp *h, const char *refer_to){
707 osip_message_t *msg=NULL;
710 eXosip_call_build_refer(h->did,refer_to, &msg);
711 if (msg) err=eXosip_call_send_request(h->did, msg);
717 int sal_call_refer_with_replaces(SalOp *h, SalOp *other_call_h){
718 osip_message_t *msg=NULL;
719 char referto[256]={0};
722 if (eXosip_call_get_referto(other_call_h->did,referto,sizeof(referto)-1)!=0){
723 ms_error("eXosip_call_get_referto() failed for did=%i",other_call_h->did);
727 eXosip_call_build_refer(h->did,referto, &msg);
728 osip_message_set_header(msg,"Referred-By",h->base.from);
729 if (msg) err=eXosip_call_send_request(h->did, msg);
735 SalOp *sal_call_get_replaces(SalOp *h){
736 if (h->replaces!=NULL){
739 cid=eXosip_call_find_by_replaces(h->replaces);
742 SalOp *ret=sal_find_call(h->base.root,cid);
749 int sal_call_send_dtmf(SalOp *h, char dtmf){
750 osip_message_t *msg=NULL;
755 eXosip_call_build_info(h->did,&msg);
757 snprintf(dtmf_body, sizeof(dtmf_body), "Signal=%c\r\nDuration=250\r\n", dtmf);
758 osip_message_set_body(msg,dtmf_body,strlen(dtmf_body));
759 osip_message_set_content_type(msg,"application/dtmf-relay");
760 snprintf(clen,sizeof(clen),"%lu",(unsigned long)strlen(dtmf_body));
761 osip_message_set_content_length(msg,clen);
762 eXosip_call_send_request(h->did,msg);
768 static void push_auth_to_exosip(const SalAuthInfo *info){
770 if (info->userid==NULL || info->userid[0]=='\0') userid=info->username;
771 else userid=info->userid;
772 ms_message("Authentication info for username [%s], id[%s], realm [%s] added to eXosip", info->username,userid, info->realm);
773 eXosip_add_authentication_info (info->username,userid,
774 info->password, NULL,info->realm);
777 * Just for symmetry ;-)
779 static void pop_auth_from_exosip() {
780 eXosip_clear_authentication_info();
783 int sal_call_terminate(SalOp *h){
785 if (h->auth_info) push_auth_to_exosip(h->auth_info);
787 err=eXosip_call_terminate(h->cid,h->did);
789 pop_auth_from_exosip();
791 ms_warning("Exosip could not terminate the call: cid=%i did=%i", h->cid,h->did);
797 void sal_op_authenticate(SalOp *h, const SalAuthInfo *info){
798 if (h->pending_auth){
799 push_auth_to_exosip(info);
801 eXosip_default_action(h->pending_auth);
803 ms_message("eXosip_default_action() done");
804 pop_auth_from_exosip();
806 if (h->auth_info) sal_auth_info_delete(h->auth_info); /*if already exist*/
807 h->auth_info=sal_auth_info_clone(info); /*store auth info for subsequent request*/
810 void sal_op_cancel_authentication(SalOp *h) {
812 sal_op_get_sal(h)->callbacks.register_failure(h,SalErrorFailure, SalReasonForbidden,_("Authentication failure"));
813 } else if (h->cid >0) {
814 sal_op_get_sal(h)->callbacks.call_failure(h,SalErrorFailure, SalReasonForbidden,_("Authentication failure"),0);
816 ms_warning("Auth failure not handled");
820 static void set_network_origin(SalOp *op, osip_message_t *req){
821 const char *received=NULL;
824 if (extract_received_rport(req,&received,&rport)!=0){
825 osip_via_t *via=NULL;
827 osip_message_get_via(req,0,&via);
828 received=osip_via_get_host(via);
829 tmp=osip_via_get_port(via);
830 if (tmp) rport=atoi(tmp);
832 snprintf(origin,sizeof(origin)-1,"sip:%s:%i",received,rport);
833 __sal_op_set_network_origin(op,origin);
836 static void set_remote_ua(SalOp* op, osip_message_t *req){
837 if (op->base.remote_ua==NULL){
838 osip_header_t *h=NULL;
839 osip_message_get_user_agent(req,0,&h);
841 op->base.remote_ua=ms_strdup(h->hvalue);
846 static void set_replaces(SalOp *op, osip_message_t *req){
847 osip_header_t *h=NULL;
850 ms_free(op->replaces);
853 osip_message_header_get_byname(req,"replaces",0,&h);
855 if (h->hvalue && h->hvalue[0]!='\0'){
856 op->replaces=ms_strdup(h->hvalue);
861 static SalOp *find_op(Sal *sal, eXosip_event_t *ev){
863 return sal_find_call(sal,ev->cid);
866 return sal_find_register(sal,ev->rid);
869 return sal_find_out_subscribe(sal,ev->sid);
872 return sal_find_in_subscribe(sal,ev->nid);
874 if (ev->response) return sal_find_other(sal,ev->response);
878 static void inc_new_call(Sal *sal, eXosip_event_t *ev){
879 SalOp *op=sal_op_new(sal);
880 osip_from_t *from,*to;
881 osip_call_info_t *call_info;
883 sdp_message_t *sdp=eXosip_get_sdp_info(ev->request);
885 set_network_origin(op,ev->request);
886 set_remote_ua(op,ev->request);
887 set_replaces(op,ev->request);
890 op->sdp_offering=FALSE;
891 op->base.remote_media=sal_media_description_new();
892 sdp_to_media_description(sdp,op->base.remote_media);
893 sdp_message_free(sdp);
894 }else op->sdp_offering=TRUE;
896 from=osip_message_get_from(ev->request);
897 to=osip_message_get_to(ev->request);
898 osip_from_to_str(from,&tmp);
899 sal_op_set_from(op,tmp);
901 osip_from_to_str(to,&tmp);
902 sal_op_set_to(op,tmp);
905 osip_message_get_call_info(ev->request,0,&call_info);
908 osip_call_info_to_str(call_info,&tmp);
909 if( strstr(tmp,"answer-after=") != NULL)
911 op->auto_answer_asked=TRUE;
912 ms_message("The caller asked to automatically answer the call(Emergency?)\n");
921 sal_add_call(op->base.root,op);
922 sal->callbacks.call_received(op);
925 static void handle_reinvite(Sal *sal, eXosip_event_t *ev){
926 SalOp *op=find_op(sal,ev);
928 osip_message_t *msg=NULL;
931 ms_warning("Reinvite for non-existing operation !");
936 sdp=eXosip_get_sdp_info(ev->request);
937 if (op->base.remote_media){
938 sal_media_description_unref(op->base.remote_media);
939 op->base.remote_media=NULL;
942 sal_media_description_unref(op->result);
946 op->sdp_offering=FALSE;
947 op->base.remote_media=sal_media_description_new();
948 sdp_to_media_description(sdp,op->base.remote_media);
949 sdp_message_free(sdp);
950 sal->callbacks.call_updating(op);
952 op->sdp_offering=TRUE;
954 eXosip_call_build_answer(ev->tid,200,&msg);
956 set_sdp_from_desc(msg,op->base.local_media);
957 eXosip_call_send_answer(ev->tid,200,msg);
964 static void handle_ack(Sal *sal, eXosip_event_t *ev){
965 SalOp *op=find_op(sal,ev);
969 ms_warning("ack for non-existing call !");
972 sdp=eXosip_get_sdp_info(ev->ack);
974 op->base.remote_media=sal_media_description_new();
975 sdp_to_media_description(sdp,op->base.remote_media);
977 sdp_message_free(sdp);
980 if (sdp) sal->callbacks.call_updating(op);
983 sal->callbacks.call_ack(op);
987 static void update_contact_from_response(SalOp *op, osip_message_t *response){
988 const char *received;
990 if (extract_received_rport(response,&received,&rport)==0){
991 const char *contact=sal_op_get_contact(op);
993 /*no contact given yet, use from instead*/
994 contact=sal_op_get_from(op);
997 SalAddress *addr=sal_address_new(contact);
999 sal_address_set_domain(addr,received);
1000 sal_address_set_port_int(addr,rport);
1001 tmp=sal_address_as_string(addr);
1002 ms_message("Contact address updated to %s for this dialog",tmp);
1003 sal_op_set_contact(op,tmp);
1004 sal_address_destroy(addr);
1010 static int call_proceeding(Sal *sal, eXosip_event_t *ev){
1011 SalOp *op=find_op(sal,ev);
1014 ms_warning("This call has been canceled.");
1016 eXosip_call_terminate(ev->cid,ev->did);
1018 op->terminated=TRUE;
1025 /* update contact if received and rport are set by the server
1026 note: will only be used by remote for next INVITE, if any...*/
1027 update_contact_from_response(op,ev->response);
1031 static void call_ringing(Sal *sal, eXosip_event_t *ev){
1033 SalOp *op=find_op(sal,ev);
1034 if (call_proceeding(sal, ev)==-1) return;
1036 set_remote_ua(op,ev->response);
1037 sdp=eXosip_get_sdp_info(ev->response);
1039 op->base.remote_media=sal_media_description_new();
1040 sdp_to_media_description(sdp,op->base.remote_media);
1041 sdp_message_free(sdp);
1042 if (op->base.local_media) sdp_process(op);
1044 sal->callbacks.call_ringing(op);
1047 static void call_accepted(Sal *sal, eXosip_event_t *ev){
1049 osip_message_t *msg=NULL;
1050 SalOp *op=find_op(sal,ev);
1051 const char *contact;
1054 ms_error("A closed call is accepted ?");
1059 set_remote_ua(op,ev->response);
1061 sdp=eXosip_get_sdp_info(ev->response);
1063 op->base.remote_media=sal_media_description_new();
1064 sdp_to_media_description(sdp,op->base.remote_media);
1065 sdp_message_free(sdp);
1066 if (op->base.local_media) sdp_process(op);
1068 eXosip_call_build_ack(ev->did,&msg);
1069 contact=sal_op_get_contact(op);
1071 _osip_list_set_empty(&msg->contacts,(void (*)(void*))osip_contact_free);
1072 osip_message_set_contact(msg,contact);
1074 if (op->sdp_answer){
1075 set_sdp(msg,op->sdp_answer);
1076 sdp_message_free(op->sdp_answer);
1077 op->sdp_answer=NULL;
1079 eXosip_call_send_ack(ev->did,msg);
1080 sal->callbacks.call_accepted(op);
1083 static void call_terminated(Sal *sal, eXosip_event_t *ev){
1085 SalOp *op=find_op(sal,ev);
1087 ms_warning("Call terminated for already closed call ?");
1091 osip_from_to_str(ev->request->from,&from);
1093 sal->callbacks.call_terminated(op,from!=NULL ? from : sal_op_get_from(op));
1094 if (from) osip_free(from);
1095 op->terminated=TRUE;
1098 static void call_released(Sal *sal, eXosip_event_t *ev){
1099 SalOp *op=find_op(sal,ev);
1101 ms_warning("No op associated to this call_released()");
1104 if (!op->terminated){
1105 /* no response received so far */
1106 call_failure(sal,ev);
1108 sal->callbacks.call_released(op);
1111 static int get_auth_data_from_response(osip_message_t *resp, const char **realm, const char **username){
1112 const char *prx_realm=NULL,*www_realm=NULL;
1113 osip_proxy_authenticate_t *prx_auth;
1114 osip_www_authenticate_t *www_auth;
1116 *username=osip_uri_get_username(resp->from->url);
1117 prx_auth=(osip_proxy_authenticate_t*)osip_list_get(&resp->proxy_authenticates,0);
1118 www_auth=(osip_proxy_authenticate_t*)osip_list_get(&resp->www_authenticates,0);
1120 prx_realm=osip_proxy_authenticate_get_realm(prx_auth);
1122 www_realm=osip_www_authenticate_get_realm(www_auth);
1126 }else if (www_realm){
1134 static int get_auth_data_from_request(osip_message_t *msg, const char **realm, const char **username){
1135 osip_authorization_t *auth=NULL;
1136 osip_proxy_authorization_t *prx_auth=NULL;
1138 *username=osip_uri_get_username(msg->from->url);
1139 osip_message_get_authorization(msg, 0, &auth);
1141 *realm=osip_authorization_get_realm(auth);
1144 osip_message_get_proxy_authorization(msg,0,&prx_auth);
1146 *realm=osip_proxy_authorization_get_realm(prx_auth);
1152 static int get_auth_data(eXosip_event_t *ev, const char **realm, const char **username){
1153 if (ev->response && get_auth_data_from_response(ev->response,realm,username)==0) return 0;
1154 if (ev->request && get_auth_data_from_request(ev->request,realm,username)==0) return 0;
1158 int sal_op_get_auth_requested(SalOp *op, const char **realm, const char **username){
1159 if (op->pending_auth){
1160 return get_auth_data(op->pending_auth,realm,username);
1165 static bool_t process_authentication(Sal *sal, eXosip_event_t *ev){
1167 const char *username,*realm;
1170 ms_warning("No operation associated with this authentication !");
1173 if (get_auth_data(ev,&realm,&username)==0){
1174 if (op->pending_auth!=NULL)
1175 eXosip_event_free(op->pending_auth);
1176 op->pending_auth=ev;
1177 sal_add_pending_auth (sal,op);
1178 sal->callbacks.auth_requested(op,realm,username);
1184 static void authentication_ok(Sal *sal, eXosip_event_t *ev){
1186 const char *username,*realm;
1189 ms_warning("No operation associated with this authentication_ok!");
1192 if (op->pending_auth){
1193 eXosip_event_free(op->pending_auth);
1194 sal_remove_pending_auth(sal,op);
1195 op->pending_auth=NULL;
1197 if (get_auth_data(ev,&realm,&username)==0){
1198 sal->callbacks.auth_success(op,realm,username);
1202 static bool_t call_failure(Sal *sal, eXosip_event_t *ev){
1205 char* computedReason=NULL;
1206 const char *reason=NULL;
1207 SalError error=SalErrorUnknown;
1208 SalReason sr=SalReasonUnknown;
1211 op=(SalOp*)find_op(sal,ev);
1214 ms_warning("Call failure reported for a closed call, ignored.");
1219 code=osip_message_get_status_code(ev->response);
1220 reason=osip_message_get_reason_phrase(ev->response);
1221 osip_header_t *h=NULL;
1222 if (!osip_message_header_get_byname( ev->response
1226 computedReason = ms_strdup_printf("%s %s",reason,osip_header_get_value(h));
1227 reason = computedReason;
1235 return process_authentication(sal,ev);
1238 error=SalErrorUnknown;
1241 error=SalErrorFailure;
1242 sr=SalReasonNotFound;
1245 error=SalErrorFailure;
1249 eXosip_default_action(ev);
1253 error=SalErrorFailure;
1254 sr=SalReasonTemporarilyUnavailable;
1256 error=SalErrorFailure;
1262 error=SalErrorFailure;
1263 sr=SalReasonDoNotDisturb;
1266 error=SalErrorFailure;
1267 sr=SalReasonDeclined;
1271 error=SalErrorFailure;
1272 sr=SalReasonUnknown;
1273 }else error=SalErrorNoResponse;
1275 op->terminated=TRUE;
1276 sal->callbacks.call_failure(op,error,sr,reason,code);
1277 if (computedReason != NULL){
1278 ms_free(computedReason);
1283 /* Request remote side to send us VFU */
1284 void sal_call_send_vfu_request(SalOp *h){
1285 osip_message_t *msg=NULL;
1287 "<?xml version=\"1.0\" encoding=\"utf-8\" ?>"
1291 " <picture_fast_update></picture_fast_update>"
1299 eXosip_call_build_info(h->did,&msg);
1301 osip_message_set_body(msg,info_body,strlen(info_body));
1302 osip_message_set_content_type(msg,"application/media_control+xml");
1303 snprintf(clen,sizeof(clen),"%lu",(unsigned long)strlen(info_body));
1304 osip_message_set_content_length(msg,clen);
1305 eXosip_call_send_request(h->did,msg);
1306 ms_message("Sending VFU request !");
1311 static void process_media_control_xml(Sal *sal, eXosip_event_t *ev){
1312 SalOp *op=find_op(sal,ev);
1313 osip_body_t *body=NULL;
1316 ms_warning("media control xml received without operation context!");
1320 osip_message_get_body(ev->request,0,&body);
1321 if (body && body->body!=NULL &&
1322 strstr(body->body,"picture_fast_update")){
1323 osip_message_t *ans=NULL;
1324 ms_message("Receiving VFU request !");
1325 if (sal->callbacks.vfu_request){
1326 sal->callbacks.vfu_request(op);
1327 eXosip_call_build_answer(ev->tid,200,&ans);
1329 eXosip_call_send_answer(ev->tid,200,ans);
1333 /*in all other cases we must say it is not implemented.*/
1335 osip_message_t *ans=NULL;
1337 eXosip_call_build_answer(ev->tid,501,&ans);
1339 eXosip_call_send_answer(ev->tid,501,ans);
1344 static void process_dtmf_relay(Sal *sal, eXosip_event_t *ev){
1345 SalOp *op=find_op(sal,ev);
1346 osip_body_t *body=NULL;
1349 ms_warning("media dtmf relay received without operation context!");
1353 osip_message_get_body(ev->request,0,&body);
1354 if (body && body->body!=NULL){
1355 osip_message_t *ans=NULL;
1356 const char *name=strstr(body->body,"Signal");
1357 if (name==NULL) name=strstr(body->body,"signal");
1359 ms_warning("Could not extract the dtmf name from the SIP INFO.");
1362 name+=strlen("signal");
1363 if (sscanf(name," = %1s",tmp)==1){
1364 ms_message("Receiving dtmf %s via SIP INFO.",tmp);
1365 if (sal->callbacks.dtmf_received != NULL)
1366 sal->callbacks.dtmf_received(op, tmp[0]);
1370 eXosip_call_build_answer(ev->tid,200,&ans);
1372 eXosip_call_send_answer(ev->tid,200,ans);
1377 static void fill_options_answer(osip_message_t *options){
1378 osip_message_set_allow(options,"INVITE, ACK, BYE, CANCEL, OPTIONS, MESSAGE, SUBSCRIBE, NOTIFY, INFO");
1379 osip_message_set_accept(options,"application/sdp");
1382 static void process_refer(Sal *sal, SalOp *op, eXosip_event_t *ev){
1383 osip_header_t *h=NULL;
1384 osip_message_t *ans=NULL;
1385 ms_message("Receiving REFER request !");
1386 osip_message_header_get_byname(ev->request,"Refer-To",0,&h);
1389 osip_from_t *from=NULL;
1391 osip_from_init(&from);
1393 if (osip_from_parse(from,h->hvalue)==0){
1395 osip_uri_header_t *uh=NULL;
1396 osip_header_t *referred_by=NULL;
1397 osip_uri_header_get_byname(&from->url->url_headers,(char*)"Replaces",&uh);
1398 if (uh!=NULL && uh->gvalue && uh->gvalue[0]!='\0'){
1399 ms_message("Found replaces in Refer-To");
1401 ms_free(op->replaces);
1403 op->replaces=ms_strdup(uh->gvalue);
1405 osip_message_header_get_byname(ev->request,"Referred-By",0,&referred_by);
1406 if (referred_by && referred_by->hvalue && referred_by->hvalue[0]!='\0'){
1407 if (op->referred_by)
1408 ms_free(op->referred_by);
1409 op->referred_by=ms_strdup(referred_by->hvalue);
1412 osip_uri_header_freelist(&from->url->url_headers);
1413 osip_from_to_str(from,&tmp);
1414 sal->callbacks.refer_received(sal,op,tmp);
1416 osip_from_free(from);
1419 eXosip_call_build_answer(ev->tid,202,&ans);
1421 eXosip_call_send_answer(ev->tid,202,ans);
1426 ms_warning("cannot do anything with the refer without destination\n");
1430 static void call_message_new(Sal *sal, eXosip_event_t *ev){
1431 osip_message_t *ans=NULL;
1433 if (MSG_IS_INFO(ev->request)){
1434 osip_content_type_t *ct;
1435 ct=osip_message_get_content_type(ev->request);
1436 if (ct && ct->subtype){
1437 if (strcmp(ct->subtype,"media_control+xml")==0)
1438 process_media_control_xml(sal,ev);
1439 else if (strcmp(ct->subtype,"dtmf-relay")==0)
1440 process_dtmf_relay(sal,ev);
1442 ms_message("Unhandled SIP INFO.");
1443 /*send an "Not implemented" answer*/
1445 eXosip_call_build_answer(ev->tid,501,&ans);
1447 eXosip_call_send_answer(ev->tid,501,ans);
1451 /*empty SIP INFO, probably to test we are alive. Send an empty answer*/
1453 eXosip_call_build_answer(ev->tid,200,&ans);
1455 eXosip_call_send_answer(ev->tid,200,ans);
1458 }else if(MSG_IS_MESSAGE(ev->request)){
1459 /* SIP messages could be received into call */
1460 text_received(sal, ev);
1462 eXosip_call_build_answer(ev->tid,200,&ans);
1464 eXosip_call_send_answer(ev->tid,200,ans);
1466 }else if(MSG_IS_REFER(ev->request)){
1467 SalOp *op=find_op(sal,ev);
1469 ms_message("Receiving REFER request !");
1470 process_refer(sal,op,ev);
1471 }else if(MSG_IS_NOTIFY(ev->request)){
1472 osip_header_t *h=NULL;
1474 SalOp *op=find_op(sal,ev);
1476 ms_message("Receiving NOTIFY request !");
1477 osip_from_to_str(ev->request->from,&from);
1478 osip_message_header_get_byname(ev->request,"Event",0,&h);
1480 sal->callbacks.notify(op,from,h->hvalue);
1481 /*answer that we received the notify*/
1483 eXosip_call_build_answer(ev->tid,200,&ans);
1485 eXosip_call_send_answer(ev->tid,200,ans);
1488 }else if (MSG_IS_OPTIONS(ev->request)){
1490 eXosip_call_build_answer(ev->tid,200,&ans);
1492 fill_options_answer(ans);
1493 eXosip_call_send_answer(ev->tid,200,ans);
1497 }else ms_warning("call_message_new: No request ?");
1500 static void inc_update(Sal *sal, eXosip_event_t *ev){
1501 osip_message_t *msg=NULL;
1502 ms_message("Processing incoming UPDATE");
1504 eXosip_message_build_answer(ev->tid,200,&msg);
1506 eXosip_message_send_answer(ev->tid,200,msg);
1510 static bool_t comes_from_local_if(osip_message_t *msg){
1511 osip_via_t *via=NULL;
1512 osip_message_get_via(msg,0,&via);
1515 host=osip_via_get_host(via);
1516 if (strcmp(host,"127.0.0.1")==0 || strcmp(host,"::1")==0){
1517 osip_generic_param_t *param=NULL;
1518 osip_via_param_get_byname(via,"received",¶m);
1519 if (param==NULL) return TRUE;
1520 if (param->gvalue &&
1521 (strcmp(param->gvalue,"127.0.0.1")==0 || strcmp(param->gvalue,"::1")==0)){
1529 static void text_received(Sal *sal, eXosip_event_t *ev){
1530 osip_body_t *body=NULL;
1531 char *from=NULL,*msg;
1533 osip_message_get_body(ev->request,0,&body);
1535 ms_error("Could not get text message from SIP body");
1539 osip_from_to_str(ev->request->from,&from);
1540 sal->callbacks.text_received(sal,from,msg);
1546 static void other_request(Sal *sal, eXosip_event_t *ev){
1547 ms_message("in other_request");
1548 if (ev->request==NULL) return;
1549 if (strcmp(ev->request->sip_method,"MESSAGE")==0){
1550 text_received(sal,ev);
1551 eXosip_message_send_answer(ev->tid,200,NULL);
1552 }else if (strcmp(ev->request->sip_method,"OPTIONS")==0){
1553 osip_message_t *options=NULL;
1554 eXosip_options_build_answer(ev->tid,200,&options);
1555 fill_options_answer(options);
1556 eXosip_options_send_answer(ev->tid,200,options);
1557 }else if (strcmp(ev->request->sip_method,"WAKEUP")==0
1558 && comes_from_local_if(ev->request)) {
1559 eXosip_message_send_answer(ev->tid,200,NULL);
1560 ms_message("Receiving WAKEUP request !");
1561 sal->callbacks.internal_message(sal,"WAKEUP");
1562 }else if (strncmp(ev->request->sip_method, "REFER", 5) == 0){
1563 ms_message("Receiving REFER request !");
1564 if (comes_from_local_if(ev->request)) {
1565 process_refer(sal,NULL,ev);
1566 }else ms_warning("Ignored REFER not coming from this local loopback interface.");
1567 }else if (strncmp(ev->request->sip_method, "UPDATE", 6) == 0){
1572 osip_message_to_str(ev->request,&tmp,&msglen);
1574 ms_message("Unsupported request received:\n%s",tmp);
1577 /*answer with a 501 Not implemented*/
1578 eXosip_message_send_answer(ev->tid,501,NULL);
1582 static void masquerade_via(osip_message_t *msg, const char *ip, const char *port){
1583 osip_via_t *via=NULL;
1584 osip_message_get_via(msg,0,&via);
1586 osip_free(via->port);
1587 via->port=osip_strdup(port);
1588 osip_free(via->host);
1589 via->host=osip_strdup(ip);
1593 static bool_t register_again_with_updated_contact(SalOp *op, osip_message_t *orig_request, osip_message_t *last_answer){
1594 osip_message_t *msg;
1595 const char *received;
1597 osip_contact_t *ctt=NULL;
1601 Sal *sal=op->base.root;
1603 if (sal->double_reg==FALSE) return FALSE;
1605 if (extract_received_rport(last_answer,&received,&rport)==-1) return FALSE;
1606 osip_message_get_contact(orig_request,0,&ctt);
1607 if (strcmp(ctt->url->host,received)==0){
1608 /*ip address matches, check ports*/
1609 const char *contact_port=ctt->url->port;
1610 if (contact_port==NULL || contact_port[0]=='\0')
1611 contact_port="5060";
1612 if (atoi(contact_port)==rport){
1613 ms_message("Register has up to date contact, doing nothing.");
1615 }else ms_message("ports do not match, need to update the register (%s <> %i)", contact_port,rport);
1619 eXosip_register_build_register(op->rid,op->expires,&msg);
1622 ms_warning("Fail to create a contact updated register.");
1625 osip_message_get_contact(msg,0,&ctt);
1626 if (ctt->url->host!=NULL){
1627 osip_free(ctt->url->host);
1629 ctt->url->host=osip_strdup(received);
1630 if (ctt->url->port!=NULL){
1631 osip_free(ctt->url->port);
1633 snprintf(port,sizeof(port),"%i",rport);
1634 ctt->url->port=osip_strdup(port);
1635 if (op->masquerade_via) masquerade_via(msg,received,port);
1636 eXosip_register_send_register(op->rid,msg);
1638 osip_contact_to_str(ctt,&tmp);
1639 addr=sal_address_new(tmp);
1641 sal_address_clean(addr);
1642 tmp=sal_address_as_string(addr);
1643 sal_op_set_contact(op,tmp);
1644 sal_address_destroy(addr);
1645 ms_message("Resending new register with updated contact %s",tmp);
1650 static void registration_success(Sal *sal, eXosip_event_t *ev){
1651 SalOp *op=sal_find_register(sal,ev->rid);
1652 osip_header_t *h=NULL;
1655 ms_error("Receiving register response for unknown operation");
1658 osip_message_get_expires(ev->request,0,&h);
1659 if (h!=NULL && atoi(h->hvalue)!=0){
1661 if (!register_again_with_updated_contact(op,ev->request,ev->response)){
1662 sal->callbacks.register_success(op,registered);
1665 sal->callbacks.register_success(op,FALSE);
1669 static bool_t registration_failure(Sal *sal, eXosip_event_t *ev){
1671 const char *reason=NULL;
1672 SalOp *op=sal_find_register(sal,ev->rid);
1673 SalReason sr=SalReasonUnknown;
1674 SalError se=SalErrorUnknown;
1677 ms_error("Receiving register failure for unknown operation");
1681 status_code=osip_message_get_status_code(ev->response);
1682 reason=osip_message_get_reason_phrase(ev->response);
1684 switch(status_code){
1687 return process_authentication(sal,ev);
1689 case 606: /*Not acceptable, workaround for proxies that don't like private addresses
1690 in vias, such as ekiga.net
1691 On the opposite, freephonie.net bugs when via are masqueraded.
1693 op->masquerade_via=TRUE;
1695 /* if contact is up to date, process the failure, otherwise resend a new register with
1696 updated contact first, just in case the faillure is due to incorrect contact */
1697 if (ev->response && register_again_with_updated_contact(op,ev->request,ev->response))
1698 return TRUE; /*we are retrying with an updated contact*/
1699 if (status_code==403){
1701 sr=SalReasonForbidden;
1702 }else if (status_code==0){
1703 se=SalErrorNoResponse;
1705 sal->callbacks.register_failure(op,se,sr,reason);
1710 static void other_request_reply(Sal *sal,eXosip_event_t *ev){
1711 SalOp *op=find_op(sal,ev);
1714 ms_warning("other_request_reply(): Receiving response to unknown request.");
1718 update_contact_from_response(op,ev->response);
1719 if (ev->request && strcmp(osip_message_get_method(ev->request),"OPTIONS")==0)
1720 sal->callbacks.ping_reply(op);
1724 static bool_t process_event(Sal *sal, eXosip_event_t *ev){
1725 ms_message("linphone process event get a message %d\n",ev->type);
1727 case EXOSIP_CALL_ANSWERED:
1728 ms_message("CALL_ANSWERED\n");
1729 call_accepted(sal,ev);
1730 authentication_ok(sal,ev);
1732 case EXOSIP_CALL_CLOSED:
1733 case EXOSIP_CALL_CANCELLED:
1734 ms_message("CALL_CLOSED or CANCELLED\n");
1735 call_terminated(sal,ev);
1737 case EXOSIP_CALL_TIMEOUT:
1738 case EXOSIP_CALL_NOANSWER:
1739 ms_message("CALL_TIMEOUT or NOANSWER\n");
1740 return call_failure(sal,ev);
1742 case EXOSIP_CALL_REQUESTFAILURE:
1743 case EXOSIP_CALL_GLOBALFAILURE:
1744 case EXOSIP_CALL_SERVERFAILURE:
1745 ms_message("CALL_REQUESTFAILURE or GLOBALFAILURE or SERVERFAILURE\n");
1746 return call_failure(sal,ev);
1748 case EXOSIP_CALL_RELEASED:
1749 ms_message("CALL_RELEASED\n");
1750 call_released(sal, ev);
1752 case EXOSIP_CALL_INVITE:
1753 ms_message("CALL_NEW\n");
1754 inc_new_call(sal,ev);
1756 case EXOSIP_CALL_REINVITE:
1757 handle_reinvite(sal,ev);
1759 case EXOSIP_CALL_ACK:
1760 ms_message("CALL_ACK");
1763 case EXOSIP_CALL_REDIRECTED:
1764 ms_message("CALL_REDIRECTED");
1765 eXosip_default_action(ev);
1767 case EXOSIP_CALL_PROCEEDING:
1768 ms_message("CALL_PROCEEDING");
1769 call_proceeding(sal,ev);
1771 case EXOSIP_CALL_RINGING:
1772 ms_message("CALL_RINGING");
1773 call_ringing(sal,ev);
1775 case EXOSIP_CALL_MESSAGE_NEW:
1776 ms_message("EXOSIP_CALL_MESSAGE_NEW");
1777 call_message_new(sal,ev);
1779 case EXOSIP_CALL_MESSAGE_REQUESTFAILURE:
1781 (ev->response->status_code==407 || ev->response->status_code==401)){
1782 return process_authentication(sal,ev);
1785 case EXOSIP_IN_SUBSCRIPTION_NEW:
1786 ms_message("CALL_IN_SUBSCRIPTION_NEW ");
1787 sal_exosip_subscription_recv(sal,ev);
1789 case EXOSIP_IN_SUBSCRIPTION_RELEASED:
1790 ms_message("CALL_SUBSCRIPTION_NEW ");
1791 sal_exosip_in_subscription_closed(sal,ev);
1793 case EXOSIP_SUBSCRIPTION_UPDATE:
1794 ms_message("CALL_SUBSCRIPTION_UPDATE");
1796 case EXOSIP_SUBSCRIPTION_NOTIFY:
1797 ms_message("CALL_SUBSCRIPTION_NOTIFY");
1798 sal_exosip_notify_recv(sal,ev);
1800 case EXOSIP_SUBSCRIPTION_ANSWERED:
1801 ms_message("EXOSIP_SUBSCRIPTION_ANSWERED, ev->sid=%i, ev->did=%i\n",ev->sid,ev->did);
1802 sal_exosip_subscription_answered(sal,ev);
1804 case EXOSIP_SUBSCRIPTION_CLOSED:
1805 ms_message("EXOSIP_SUBSCRIPTION_CLOSED\n");
1806 sal_exosip_subscription_closed(sal,ev);
1808 case EXOSIP_SUBSCRIPTION_REQUESTFAILURE: /**< announce a request failure */
1809 if (ev->response && (ev->response->status_code == 407 || ev->response->status_code == 401)){
1810 return process_authentication(sal,ev);
1812 case EXOSIP_SUBSCRIPTION_SERVERFAILURE:
1813 case EXOSIP_SUBSCRIPTION_GLOBALFAILURE:
1814 sal_exosip_subscription_closed(sal,ev);
1816 case EXOSIP_REGISTRATION_FAILURE:
1817 ms_message("REGISTRATION_FAILURE\n");
1818 return registration_failure(sal,ev);
1820 case EXOSIP_REGISTRATION_SUCCESS:
1821 authentication_ok(sal,ev);
1822 registration_success(sal,ev);
1824 case EXOSIP_MESSAGE_NEW:
1825 other_request(sal,ev);
1827 case EXOSIP_MESSAGE_PROCEEDING:
1828 case EXOSIP_MESSAGE_ANSWERED:
1829 case EXOSIP_MESSAGE_REDIRECTED:
1830 case EXOSIP_MESSAGE_SERVERFAILURE:
1831 case EXOSIP_MESSAGE_GLOBALFAILURE:
1832 other_request_reply(sal,ev);
1834 case EXOSIP_MESSAGE_REQUESTFAILURE:
1835 case EXOSIP_NOTIFICATION_REQUESTFAILURE:
1837 switch (ev->response->status_code) {
1840 return process_authentication(sal,ev);
1842 eXosip_automatic_action ();
1847 other_request_reply(sal,ev);
1850 ms_message("Unhandled exosip event ! %i",ev->type);
1856 int sal_iterate(Sal *sal){
1858 while((ev=eXosip_event_wait(0,0))!=NULL){
1859 if (process_event(sal,ev))
1860 eXosip_event_free(ev);
1863 eXosip_automatic_refresh();
1868 static void register_set_contact(osip_message_t *msg, const char *contact){
1869 osip_uri_param_t *param = NULL;
1870 osip_contact_t *ct=NULL;
1872 /*we get the line parameter choosed by exosip, and add it to our own contact*/
1873 osip_message_get_contact(msg,0,&ct);
1875 osip_uri_uparam_get_byname(ct->url, "line", ¶m);
1876 if (param && param->gvalue)
1877 line=osip_strdup(param->gvalue);
1879 _osip_list_set_empty(&msg->contacts,(void (*)(void*))osip_contact_free);
1880 osip_message_set_contact(msg,contact);
1881 osip_message_get_contact(msg,0,&ct);
1882 osip_uri_uparam_add(ct->url,osip_strdup("line"),line);
1885 int sal_register(SalOp *h, const char *proxy, const char *from, int expires){
1886 osip_message_t *msg;
1887 const char *contact=sal_op_get_contact(h);
1889 sal_op_set_route(h,proxy);
1892 h->rid=eXosip_register_build_initial_register(from,proxy,NULL,expires,&msg);
1894 if (contact) register_set_contact(msg,contact);
1895 sal_add_register(h->base.root,h);
1897 ms_error("Could not build initial register.");
1903 eXosip_register_build_register(h->rid,expires,&msg);
1905 eXosip_register_send_register(h->rid,msg);
1911 int sal_register_refresh(SalOp *op, int expires){
1912 osip_message_t *msg=NULL;
1913 const char *contact=sal_op_get_contact(op);
1916 ms_error("Unexistant registration context, not possible to refresh.");
1920 eXosip_register_build_register(op->rid,expires,&msg);
1922 if (contact) register_set_contact(msg,contact);
1923 eXosip_register_send_register(op->rid,msg);
1924 }else ms_error("Could not build REGISTER refresh message.");
1930 int sal_unregister(SalOp *h){
1931 osip_message_t *msg=NULL;
1933 eXosip_register_build_register(h->rid,0,&msg);
1934 if (msg) eXosip_register_send_register(h->rid,msg);
1935 else ms_warning("Could not build unREGISTER !");
1940 SalAddress * sal_address_new(const char *uri){
1942 osip_from_init(&from);
1944 // Remove front spaces
1945 while (uri[0]==' ') {
1949 if (osip_from_parse(from,uri)!=0){
1950 osip_from_free(from);
1953 if (from->displayname!=NULL && from->displayname[0]=='"'){
1954 char *unquoted=osip_strdup_without_quote(from->displayname);
1955 osip_free(from->displayname);
1956 from->displayname=unquoted;
1958 return (SalAddress*)from;
1961 SalAddress * sal_address_clone(const SalAddress *addr){
1962 osip_from_t *ret=NULL;
1963 osip_from_clone((osip_from_t*)addr,&ret);
1964 return (SalAddress*)ret;
1967 #define null_if_empty(s) (((s)!=NULL && (s)[0]!='\0') ? (s) : NULL )
1969 const char *sal_address_get_scheme(const SalAddress *addr){
1970 const osip_from_t *u=(const osip_from_t*)addr;
1971 return null_if_empty(u->url->scheme);
1974 const char *sal_address_get_display_name(const SalAddress* addr){
1975 const osip_from_t *u=(const osip_from_t*)addr;
1976 return null_if_empty(u->displayname);
1979 const char *sal_address_get_username(const SalAddress *addr){
1980 const osip_from_t *u=(const osip_from_t*)addr;
1981 return null_if_empty(u->url->username);
1984 const char *sal_address_get_domain(const SalAddress *addr){
1985 const osip_from_t *u=(const osip_from_t*)addr;
1986 return null_if_empty(u->url->host);
1989 void sal_address_set_display_name(SalAddress *addr, const char *display_name){
1990 osip_from_t *u=(osip_from_t*)addr;
1991 if (u->displayname!=NULL){
1992 osip_free(u->displayname);
1993 u->displayname=NULL;
1995 if (display_name!=NULL && display_name[0]!='\0'){
1996 u->displayname=osip_strdup(display_name);
2000 void sal_address_set_username(SalAddress *addr, const char *username){
2001 osip_from_t *uri=(osip_from_t*)addr;
2002 if (uri->url->username!=NULL){
2003 osip_free(uri->url->username);
2004 uri->url->username=NULL;
2007 uri->url->username=osip_strdup(username);
2010 void sal_address_set_domain(SalAddress *addr, const char *host){
2011 osip_from_t *uri=(osip_from_t*)addr;
2012 if (uri->url->host!=NULL){
2013 osip_free(uri->url->host);
2014 uri->url->host=NULL;
2017 uri->url->host=osip_strdup(host);
2020 void sal_address_set_port(SalAddress *addr, const char *port){
2021 osip_from_t *uri=(osip_from_t*)addr;
2022 if (uri->url->port!=NULL){
2023 osip_free(uri->url->port);
2024 uri->url->port=NULL;
2027 uri->url->port=osip_strdup(port);
2030 void sal_address_set_port_int(SalAddress *uri, int port){
2033 /*this is the default, special case to leave the port field blank*/
2034 sal_address_set_port(uri,NULL);
2037 snprintf(tmp,sizeof(tmp),"%i",port);
2038 sal_address_set_port(uri,tmp);
2041 void sal_address_clean(SalAddress *addr){
2042 osip_generic_param_freelist(& ((osip_from_t*)addr)->gen_params);
2043 osip_uri_param_freelist(& ((osip_from_t*)addr)->url->url_params);
2046 char *sal_address_as_string(const SalAddress *u){
2048 osip_from_t *from=(osip_from_t *)u;
2049 char *old_displayname=NULL;
2050 /* hack to force use of quotes around the displayname*/
2051 if (from->displayname!=NULL
2052 && from->displayname[0]!='"'){
2053 old_displayname=from->displayname;
2054 from->displayname=osip_enquote(from->displayname);
2056 osip_from_to_str(from,&tmp);
2057 if (old_displayname!=NULL){
2058 ms_free(from->displayname);
2059 from->displayname=old_displayname;
2066 char *sal_address_as_string_uri_only(const SalAddress *u){
2067 char *tmp=NULL,*ret;
2068 osip_uri_to_str(((osip_from_t*)u)->url,&tmp);
2073 void sal_address_add_param(SalAddress *u,const char* name,const char* value) {
2074 osip_uri_uparam_add (((osip_from_t*)u)->url,ms_strdup(name),ms_strdup(value));
2077 void sal_address_destroy(SalAddress *u){
2078 osip_from_free((osip_from_t*)u);
2081 void sal_set_keepalive_period(Sal *ctx,unsigned int value) {
2082 ctx->keepalive_period=value;
2083 eXosip_set_option (EXOSIP_OPT_UDP_KEEP_ALIVE, &value);
2085 unsigned int sal_get_keepalive_period(Sal *ctx) {
2086 return ctx->keepalive_period;
2089 const char * sal_address_get_port(const SalAddress *addr) {
2090 const osip_from_t *u=(const osip_from_t*)addr;
2091 return null_if_empty(u->url->port);
2094 int sal_address_get_port_int(const SalAddress *uri) {
2095 const char* port = sal_address_get_port(uri);
2103 /* sends a reinvite. Local media description may have changed by application since call establishment*/
2104 int sal_call_update(SalOp *h, const char *subject){
2106 osip_message_t *reinvite=NULL;
2109 if(eXosip_call_build_request(h->did,"INVITE",&reinvite) != 0 || reinvite==NULL){
2114 osip_message_set_subject(reinvite,subject);
2115 osip_message_set_allow(reinvite, "INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, NOTIFY, MESSAGE, SUBSCRIBE, INFO");
2116 if (h->base.root->session_expires!=0){
2117 osip_message_set_header(reinvite, "Session-expires", "200");
2118 osip_message_set_supported(reinvite, "timer");
2120 if (h->base.local_media){
2121 h->sdp_offering=TRUE;
2122 set_sdp_from_desc(reinvite,h->base.local_media);
2123 }else h->sdp_offering=FALSE;
2125 err = eXosip_call_send_request(h->did, reinvite);