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;
288 void sal_uninit(Sal* sal){
291 ms_free(sal->rootCa);
295 void sal_set_user_pointer(Sal *sal, void *user_data){
299 void *sal_get_user_pointer(const Sal *sal){
303 static void unimplemented_stub(){
304 ms_warning("Unimplemented SAL callback");
307 void sal_set_callbacks(Sal *ctx, const SalCallbacks *cbs){
308 memcpy(&ctx->callbacks,cbs,sizeof(*cbs));
309 if (ctx->callbacks.call_received==NULL)
310 ctx->callbacks.call_received=(SalOnCallReceived)unimplemented_stub;
311 if (ctx->callbacks.call_ringing==NULL)
312 ctx->callbacks.call_ringing=(SalOnCallRinging)unimplemented_stub;
313 if (ctx->callbacks.call_accepted==NULL)
314 ctx->callbacks.call_accepted=(SalOnCallAccepted)unimplemented_stub;
315 if (ctx->callbacks.call_failure==NULL)
316 ctx->callbacks.call_failure=(SalOnCallFailure)unimplemented_stub;
317 if (ctx->callbacks.call_terminated==NULL)
318 ctx->callbacks.call_terminated=(SalOnCallTerminated)unimplemented_stub;
319 if (ctx->callbacks.call_released==NULL)
320 ctx->callbacks.call_released=(SalOnCallReleased)unimplemented_stub;
321 if (ctx->callbacks.call_updating==NULL)
322 ctx->callbacks.call_updating=(SalOnCallUpdating)unimplemented_stub;
323 if (ctx->callbacks.auth_requested==NULL)
324 ctx->callbacks.auth_requested=(SalOnAuthRequested)unimplemented_stub;
325 if (ctx->callbacks.auth_success==NULL)
326 ctx->callbacks.auth_success=(SalOnAuthSuccess)unimplemented_stub;
327 if (ctx->callbacks.register_success==NULL)
328 ctx->callbacks.register_success=(SalOnRegisterSuccess)unimplemented_stub;
329 if (ctx->callbacks.register_failure==NULL)
330 ctx->callbacks.register_failure=(SalOnRegisterFailure)unimplemented_stub;
331 if (ctx->callbacks.dtmf_received==NULL)
332 ctx->callbacks.dtmf_received=(SalOnDtmfReceived)unimplemented_stub;
333 if (ctx->callbacks.notify==NULL)
334 ctx->callbacks.notify=(SalOnNotify)unimplemented_stub;
335 if (ctx->callbacks.notify_presence==NULL)
336 ctx->callbacks.notify_presence=(SalOnNotifyPresence)unimplemented_stub;
337 if (ctx->callbacks.subscribe_received==NULL)
338 ctx->callbacks.subscribe_received=(SalOnSubscribeReceived)unimplemented_stub;
339 if (ctx->callbacks.text_received==NULL)
340 ctx->callbacks.text_received=(SalOnTextReceived)unimplemented_stub;
341 if (ctx->callbacks.ping_reply==NULL)
342 ctx->callbacks.ping_reply=(SalOnPingReply)unimplemented_stub;
345 int sal_unlisten_ports(Sal *ctx){
354 int sal_listen_port(Sal *ctx, const char *addr, int port, SalTransport tr, int is_secure){
357 int proto=IPPROTO_UDP;
358 int keepalive = ctx->keepalive_period;
361 case SalTransportUDP:
363 eXosip_set_option (EXOSIP_OPT_UDP_KEEP_ALIVE, &keepalive);
365 case SalTransportTCP:
366 case SalTransportTLS:
369 eXosip_set_option (EXOSIP_OPT_UDP_KEEP_ALIVE,&keepalive);
372 eXosip_tls_ctx_t tlsCtx;
373 memset(&tlsCtx, 0, sizeof(tlsCtx));
374 snprintf(tlsCtx.root_ca_cert, sizeof(tlsCtx.client.cert), "%s", ctx->rootCa);
375 eXosip_set_tls_ctx(&tlsCtx);
379 ms_warning("unexpected proto, using datagram");
383 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
384 version of eXosip, which is not the case*/
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);
399 #ifdef HAVE_EXOSIP_GET_SOCKET
400 ms_message("Exosip has socket number %i",eXosip_get_socket(proto));
407 ortp_socket_t sal_get_socket(Sal *ctx){
408 #ifdef HAVE_EXOSIP_GET_SOCKET
409 return eXosip_get_socket(IPPROTO_UDP);
411 ms_warning("Sorry, eXosip does not have eXosip_get_socket() method");
416 void sal_set_user_agent(Sal *ctx, const char *user_agent){
417 eXosip_set_user_agent(user_agent);
420 void sal_use_session_timers(Sal *ctx, int expires){
421 ctx->session_expires=expires;
424 void sal_use_one_matching_codec_policy(Sal *ctx, bool_t one_matching_codec){
425 ctx->one_matching_codec=one_matching_codec;
428 MSList *sal_get_pending_auths(Sal *sal){
429 return ms_list_copy(sal->pending_auths);
432 void sal_use_double_registrations(Sal *ctx, bool_t enabled){
433 ctx->double_reg=enabled;
436 void sal_use_rport(Sal *ctx, bool_t use_rports){
437 ctx->use_rports=use_rports;
439 void sal_use_101(Sal *ctx, bool_t use_101){
440 ctx->use_101=use_101;
443 void sal_root_ca(Sal* ctx, const char* rootCa) {
445 ms_free(ctx->rootCa);
446 ctx->rootCa = ms_strdup(rootCa);
449 static int extract_received_rport(osip_message_t *msg, const char **received, int *rportval,SalTransport* transport){
450 osip_via_t *via=NULL;
451 osip_generic_param_t *param=NULL;
452 const char *rport=NULL;
456 osip_message_get_via(msg,0,&via);
459 *transport = sal_transport_parse(via->protocol);
461 if (via->port && via->port[0]!='\0')
462 *rportval=atoi(via->port);
464 osip_via_param_get_byname(via,"rport",¶m);
467 if (rport && rport[0]!='\0') *rportval=atoi(rport);
471 osip_via_param_get_byname(via,"received",¶m);
472 if (param) *received=param->gvalue;
474 if (rport==NULL && *received==NULL) return -1;
478 static void set_sdp(osip_message_t *sip,sdp_message_t *msg){
482 sdp_message_to_str(msg,&sdp);
484 snprintf(clen,sizeof(clen),"%i",sdplen);
485 osip_message_set_body(sip,sdp,sdplen);
486 osip_message_set_content_type(sip,"application/sdp");
487 osip_message_set_content_length(sip,clen);
491 static void set_sdp_from_desc(osip_message_t *sip, const SalMediaDescription *desc){
492 sdp_message_t *msg=media_description_to_sdp(desc);
494 ms_error("Fail to print sdp message !");
498 sdp_message_free(msg);
501 static void sdp_process(SalOp *h){
502 ms_message("Doing SDP offer/answer process");
504 sal_media_description_unref(h->result);
506 h->result=sal_media_description_new();
507 if (h->sdp_offering){
508 offer_answer_initiate_outgoing(h->base.local_media,h->base.remote_media,h->result);
511 offer_answer_initiate_incoming(h->base.local_media,h->base.remote_media,h->result,h->base.root->one_matching_codec);
512 h->sdp_answer=media_description_to_sdp(h->result);
513 /*once we have generated the SDP answer, we modify the result description for processing by the upper layer.
514 It should contains media parameters constraint from the remote offer, not our response*/
515 strcpy(h->result->addr,h->base.remote_media->addr);
516 h->result->bandwidth=h->base.remote_media->bandwidth;
519 for(i=0;i<h->result->nstreams;++i){
520 if (h->result->streams[i].port>0){
521 strcpy(h->result->streams[i].addr,h->base.remote_media->streams[i].addr);
522 h->result->streams[i].ptime=h->base.remote_media->streams[i].ptime;
523 h->result->streams[i].bandwidth=h->base.remote_media->streams[i].bandwidth;
524 h->result->streams[i].port=h->base.remote_media->streams[i].port;
526 if (h->result->streams[i].proto == SalProtoRtpSavp) {
527 h->result->streams[i].crypto[0] = h->base.remote_media->streams[i].crypto[0];
535 int sal_call_is_offerer(const SalOp *h){
536 return h->sdp_offering;
539 int sal_call_set_local_media_description(SalOp *h, SalMediaDescription *desc){
541 sal_media_description_ref(desc);
542 if (h->base.local_media)
543 sal_media_description_unref(h->base.local_media);
544 h->base.local_media=desc;
548 int sal_call(SalOp *h, const char *from, const char *to){
551 osip_message_t *invite=NULL;
552 sal_op_set_from(h,from);
554 sal_exosip_fix_route(h);
556 h->terminated = FALSE;
558 route = sal_op_get_route(h);
559 err=eXosip_call_build_initial_invite(&invite,to,from,route,"Phone call");
561 ms_error("Could not create call. Error %d (from=%s to=%s route=%s)",
562 err, from, to, route);
565 osip_message_set_allow(invite, "INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, NOTIFY, MESSAGE, SUBSCRIBE, INFO");
566 if (h->base.contact){
567 _osip_list_set_empty(&invite->contacts,(void (*)(void*))osip_contact_free);
568 osip_message_set_contact(invite,h->base.contact);
570 if (h->base.root->session_expires!=0){
571 osip_message_set_header(invite, "Session-expires", "200");
572 osip_message_set_supported(invite, "timer");
574 if (h->base.local_media){
575 h->sdp_offering=TRUE;
576 set_sdp_from_desc(invite,h->base.local_media);
577 }else h->sdp_offering=FALSE;
579 osip_message_set_header(invite,"Replaces",h->replaces);
581 osip_message_set_header(invite,"Referred-By",h->referred_by);
585 err=eXosip_call_send_initial_invite(invite);
589 ms_error("Fail to send invite ! Error code %d", err);
592 sal_add_call(h->base.root,h);
597 int sal_call_notify_ringing(SalOp *h, bool_t early_media){
600 /*if early media send also 180 and 183 */
601 if (early_media && h->sdp_answer){
604 eXosip_call_build_answer(h->tid,180,&msg);
606 set_sdp(msg,h->sdp_answer);
607 eXosip_call_send_answer(h->tid,180,msg);
610 eXosip_call_build_answer(h->tid,183,&msg);
612 set_sdp(msg,h->sdp_answer);
613 eXosip_call_send_answer(h->tid,183,msg);
618 eXosip_call_send_answer(h->tid,180,NULL);
624 int sal_call_accept(SalOp * h){
626 const char *contact=sal_op_get_contact(h);
628 int err=eXosip_call_build_answer(h->tid,200,&msg);
629 if (err<0 || msg==NULL){
630 ms_error("Fail to build answer for call: err=%i",err);
633 if (h->base.root->session_expires!=0){
634 if (h->supports_session_timers) osip_message_set_supported(msg, "timer");
638 _osip_list_set_empty(&msg->contacts,(void (*)(void*))osip_contact_free);
639 osip_message_set_contact(msg,contact);
642 if (h->base.local_media){
643 /*this is the case where we received an invite without SDP*/
644 if (h->sdp_offering) {
645 set_sdp_from_desc(msg,h->base.local_media);
648 set_sdp(msg,h->sdp_answer);
649 sdp_message_free(h->sdp_answer);
654 ms_error("You are accepting a call but not defined any media capabilities !");
656 eXosip_call_send_answer(h->tid,200,msg);
660 int sal_call_decline(SalOp *h, SalReason reason, const char *redirect){
661 if (reason==SalReasonBusy){
663 eXosip_call_send_answer(h->tid,486,NULL);
666 else if (reason==SalReasonTemporarilyUnavailable){
668 eXosip_call_send_answer(h->tid,480,NULL);
670 }else if (reason==SalReasonDoNotDisturb){
672 eXosip_call_send_answer(h->tid,600,NULL);
674 }else if (reason==SalReasonMedia){
676 eXosip_call_send_answer(h->tid,415,NULL);
678 }else if (redirect!=NULL && reason==SalReasonRedirect){
681 if (strstr(redirect,"sip:")!=0) code=302;
684 eXosip_call_build_answer(h->tid,code,&msg);
685 osip_message_set_contact(msg,redirect);
686 eXosip_call_send_answer(h->tid,code,msg);
688 }else sal_call_terminate(h);
692 SalMediaDescription * sal_call_get_final_media_description(SalOp *h){
693 if (h->base.local_media && h->base.remote_media && !h->result){
699 int sal_call_set_referer(SalOp *h, SalOp *refered_call){
700 if (refered_call->replaces)
701 h->replaces=ms_strdup(refered_call->replaces);
702 if (refered_call->referred_by)
703 h->referred_by=ms_strdup(refered_call->referred_by);
707 int sal_ping(SalOp *op, const char *from, const char *to){
708 osip_message_t *options=NULL;
710 sal_op_set_from(op,from);
711 sal_op_set_to(op,to);
712 /*bug here: eXosip2 does not honor the route argument*/
713 eXosip_options_build_request (&options, sal_op_get_to(op),
714 sal_op_get_from(op),sal_op_get_route(op));
716 if (op->base.root->session_expires!=0){
717 osip_message_set_header(options, "Session-expires", "200");
718 osip_message_set_supported(options, "timer");
720 sal_add_other(sal_op_get_sal(op),op,options);
721 return eXosip_options_send_request(options);
726 int sal_call_accept_refer(SalOp *op){
727 osip_message_t *msg=NULL;
730 err = eXosip_call_build_notify(op->did,EXOSIP_SUBCRSTATE_ACTIVE,&msg);
733 osip_message_set_header(msg,(const char *)"event","refer");
734 osip_message_set_content_type(msg,"message/sipfrag");
735 osip_message_set_body(msg,"SIP/2.0 100 Trying",sizeof("SIP/2.0 100 Trying"));
736 eXosip_call_send_request(op->did,msg);
740 ms_error("could not get a notify built\n");
746 int sal_call_refer(SalOp *h, const char *refer_to){
747 osip_message_t *msg=NULL;
750 eXosip_call_build_refer(h->did,refer_to, &msg);
751 if (msg) err=eXosip_call_send_request(h->did, msg);
757 int sal_call_refer_with_replaces(SalOp *h, SalOp *other_call_h){
758 osip_message_t *msg=NULL;
759 char referto[256]={0};
762 if (eXosip_call_get_referto(other_call_h->did,referto,sizeof(referto)-1)!=0){
763 ms_error("eXosip_call_get_referto() failed for did=%i",other_call_h->did);
767 eXosip_call_build_refer(h->did,referto, &msg);
768 osip_message_set_header(msg,"Referred-By",h->base.from);
769 if (msg) err=eXosip_call_send_request(h->did, msg);
775 SalOp *sal_call_get_replaces(SalOp *h){
776 if (h!=NULL && h->replaces!=NULL){
779 cid=eXosip_call_find_by_replaces(h->replaces);
782 SalOp *ret=sal_find_call(h->base.root,cid);
789 int sal_call_send_dtmf(SalOp *h, char dtmf){
790 osip_message_t *msg=NULL;
795 eXosip_call_build_info(h->did,&msg);
797 snprintf(dtmf_body, sizeof(dtmf_body), "Signal=%c\r\nDuration=250\r\n", dtmf);
798 osip_message_set_body(msg,dtmf_body,strlen(dtmf_body));
799 osip_message_set_content_type(msg,"application/dtmf-relay");
800 snprintf(clen,sizeof(clen),"%lu",(unsigned long)strlen(dtmf_body));
801 osip_message_set_content_length(msg,clen);
802 eXosip_call_send_request(h->did,msg);
808 static void push_auth_to_exosip(const SalAuthInfo *info){
810 if (info->userid==NULL || info->userid[0]=='\0') userid=info->username;
811 else userid=info->userid;
812 ms_message("Authentication info for username [%s], id[%s], realm [%s] added to eXosip", info->username,userid, info->realm);
813 eXosip_add_authentication_info (info->username,userid,
814 info->password, NULL,info->realm);
817 * Just for symmetry ;-)
819 static void pop_auth_from_exosip() {
820 eXosip_clear_authentication_info();
823 int sal_call_terminate(SalOp *h){
825 if (h == NULL) return -1;
826 if (h->auth_info) push_auth_to_exosip(h->auth_info);
828 err=eXosip_call_terminate(h->cid,h->did);
830 if (!h->base.root->reuse_authorization) pop_auth_from_exosip();
832 ms_warning("Exosip could not terminate the call: cid=%i did=%i", h->cid,h->did);
838 void sal_op_authenticate(SalOp *h, const SalAuthInfo *info){
839 if (h->pending_auth){
840 push_auth_to_exosip(info);
842 /*FIXME exosip does not take into account this update register message*/
844 if (fix_message_contact(h, h->pending_auth->request,h->pending_auth->response)) {
848 update_contact_from_response(h,h->pending_auth->response);
850 eXosip_default_action(h->pending_auth);
852 ms_message("eXosip_default_action() done");
853 if (!h->base.root->reuse_authorization) pop_auth_from_exosip();
855 if (h->auth_info) sal_auth_info_delete(h->auth_info); /*if already exist*/
856 h->auth_info=sal_auth_info_clone(info); /*store auth info for subsequent request*/
859 void sal_op_cancel_authentication(SalOp *h) {
861 sal_op_get_sal(h)->callbacks.register_failure(h,SalErrorFailure, SalReasonForbidden,_("Authentication failure"));
862 } else if (h->cid >0) {
863 sal_op_get_sal(h)->callbacks.call_failure(h,SalErrorFailure, SalReasonForbidden,_("Authentication failure"),0);
865 ms_warning("Auth failure not handled");
869 static void set_network_origin(SalOp *op, osip_message_t *req){
870 const char *received=NULL;
873 SalTransport transport;
874 if (extract_received_rport(req,&received,&rport,&transport)!=0){
875 osip_via_t *via=NULL;
877 osip_message_get_via(req,0,&via);
878 received=osip_via_get_host(via);
879 tmp=osip_via_get_port(via);
880 if (tmp) rport=atoi(tmp);
882 if (transport != SalTransportUDP) {
883 snprintf(origin,sizeof(origin)-1,"sip:%s:%i",received,rport);
885 snprintf(origin,sizeof(origin)-1,"sip:%s:%i;transport=%s",received,rport,sal_transport_to_string(transport));
887 __sal_op_set_network_origin(op,origin);
890 static void set_remote_ua(SalOp* op, osip_message_t *req){
891 if (op->base.remote_ua==NULL){
892 osip_header_t *h=NULL;
893 osip_message_get_user_agent(req,0,&h);
895 op->base.remote_ua=ms_strdup(h->hvalue);
900 static void set_replaces(SalOp *op, osip_message_t *req){
901 osip_header_t *h=NULL;
904 ms_free(op->replaces);
907 osip_message_header_get_byname(req,"replaces",0,&h);
909 if (h->hvalue && h->hvalue[0]!='\0'){
910 op->replaces=ms_strdup(h->hvalue);
915 static SalOp *find_op(Sal *sal, eXosip_event_t *ev){
917 return sal_find_call(sal,ev->cid);
920 return sal_find_register(sal,ev->rid);
923 return sal_find_out_subscribe(sal,ev->sid);
926 return sal_find_in_subscribe(sal,ev->nid);
928 if (ev->response) return sal_find_other(sal,ev->response);
932 static void inc_new_call(Sal *sal, eXosip_event_t *ev){
933 SalOp *op=sal_op_new(sal);
934 osip_from_t *from,*to;
935 osip_call_info_t *call_info;
937 sdp_message_t *sdp=eXosip_get_sdp_info(ev->request);
939 set_network_origin(op,ev->request);
940 set_remote_ua(op,ev->request);
941 set_replaces(op,ev->request);
944 op->sdp_offering=FALSE;
945 op->base.remote_media=sal_media_description_new();
946 sdp_to_media_description(sdp,op->base.remote_media);
947 sdp_message_free(sdp);
948 }else op->sdp_offering=TRUE;
950 from=osip_message_get_from(ev->request);
951 to=osip_message_get_to(ev->request);
952 osip_from_to_str(from,&tmp);
953 sal_op_set_from(op,tmp);
955 osip_from_to_str(to,&tmp);
956 sal_op_set_to(op,tmp);
959 osip_message_get_call_info(ev->request,0,&call_info);
962 osip_call_info_to_str(call_info,&tmp);
963 if( strstr(tmp,"answer-after=") != NULL)
965 op->auto_answer_asked=TRUE;
966 ms_message("The caller asked to automatically answer the call(Emergency?)\n");
975 sal_add_call(op->base.root,op);
976 sal->callbacks.call_received(op);
979 static void handle_reinvite(Sal *sal, eXosip_event_t *ev){
980 SalOp *op=find_op(sal,ev);
982 osip_message_t *msg=NULL;
985 ms_warning("Reinvite for non-existing operation !");
990 sdp=eXosip_get_sdp_info(ev->request);
991 if (op->base.remote_media){
992 sal_media_description_unref(op->base.remote_media);
993 op->base.remote_media=NULL;
996 sal_media_description_unref(op->result);
1000 op->sdp_offering=FALSE;
1001 op->base.remote_media=sal_media_description_new();
1002 sdp_to_media_description(sdp,op->base.remote_media);
1003 sdp_message_free(sdp);
1004 sal->callbacks.call_updating(op);
1006 op->sdp_offering=TRUE;
1008 eXosip_call_build_answer(ev->tid,200,&msg);
1010 set_sdp_from_desc(msg,op->base.local_media);
1011 eXosip_call_send_answer(ev->tid,200,msg);
1018 static void handle_ack(Sal *sal, eXosip_event_t *ev){
1019 SalOp *op=find_op(sal,ev);
1023 ms_warning("ack for non-existing call !");
1026 sdp=eXosip_get_sdp_info(ev->ack);
1028 op->base.remote_media=sal_media_description_new();
1029 sdp_to_media_description(sdp,op->base.remote_media);
1031 sdp_message_free(sdp);
1034 if (sdp) sal->callbacks.call_updating(op);
1037 sal->callbacks.call_ack(op);
1041 static void update_contact_from_response(SalOp *op, osip_message_t *response){
1042 const char *received;
1044 SalTransport transport;
1045 if (extract_received_rport(response,&received,&rport,&transport)==0){
1046 const char *contact=sal_op_get_contact(op);
1048 /*no contact given yet, use from instead*/
1049 contact=sal_op_get_from(op);
1052 SalAddress *addr=sal_address_new(contact);
1054 sal_address_set_domain(addr,received);
1055 sal_address_set_port_int(addr,rport);
1056 if (transport!=SalTransportUDP)
1057 sal_address_set_transport(addr,transport);
1058 tmp=sal_address_as_string(addr);
1059 ms_message("Contact address updated to %s",tmp);
1060 sal_op_set_contact(op,tmp);
1061 sal_address_destroy(addr);
1067 static int call_proceeding(Sal *sal, eXosip_event_t *ev){
1068 SalOp *op=find_op(sal,ev);
1070 if (op==NULL || op->terminated==TRUE) {
1071 ms_warning("This call has been canceled.");
1073 eXosip_call_terminate(ev->cid,ev->did);
1081 /* update contact if received and rport are set by the server
1082 note: will only be used by remote for next INVITE, if any...*/
1083 update_contact_from_response(op,ev->response);
1087 static void call_ringing(Sal *sal, eXosip_event_t *ev){
1089 SalOp *op=find_op(sal,ev);
1090 if (call_proceeding(sal, ev)==-1) return;
1092 set_remote_ua(op,ev->response);
1093 sdp=eXosip_get_sdp_info(ev->response);
1095 op->base.remote_media=sal_media_description_new();
1096 sdp_to_media_description(sdp,op->base.remote_media);
1097 sdp_message_free(sdp);
1098 if (op->base.local_media) sdp_process(op);
1100 sal->callbacks.call_ringing(op);
1103 static void call_accepted(Sal *sal, eXosip_event_t *ev){
1105 osip_message_t *msg=NULL;
1106 SalOp *op=find_op(sal,ev);
1107 const char *contact;
1109 if (op==NULL || op->terminated==TRUE) {
1110 ms_warning("This call has been already terminated.");
1112 eXosip_call_terminate(ev->cid,ev->did);
1118 set_remote_ua(op,ev->response);
1120 sdp=eXosip_get_sdp_info(ev->response);
1122 op->base.remote_media=sal_media_description_new();
1123 sdp_to_media_description(sdp,op->base.remote_media);
1124 sdp_message_free(sdp);
1125 if (op->base.local_media) sdp_process(op);
1127 eXosip_call_build_ack(ev->did,&msg);
1129 ms_warning("This call has been already terminated.");
1131 eXosip_call_terminate(ev->cid,ev->did);
1135 contact=sal_op_get_contact(op);
1137 _osip_list_set_empty(&msg->contacts,(void (*)(void*))osip_contact_free);
1138 osip_message_set_contact(msg,contact);
1140 if (op->sdp_answer){
1141 set_sdp(msg,op->sdp_answer);
1142 sdp_message_free(op->sdp_answer);
1143 op->sdp_answer=NULL;
1145 eXosip_call_send_ack(ev->did,msg);
1146 sal->callbacks.call_accepted(op);
1149 static void call_terminated(Sal *sal, eXosip_event_t *ev){
1151 SalOp *op=find_op(sal,ev);
1153 ms_warning("Call terminated for already closed call ?");
1157 osip_from_to_str(ev->request->from,&from);
1159 sal->callbacks.call_terminated(op,from!=NULL ? from : sal_op_get_from(op));
1160 if (from) osip_free(from);
1161 op->terminated=TRUE;
1164 static void call_released(Sal *sal, eXosip_event_t *ev){
1165 SalOp *op=find_op(sal,ev);
1167 ms_warning("No op associated to this call_released()");
1170 if (!op->terminated){
1171 /* no response received so far */
1172 call_failure(sal,ev);
1174 sal->callbacks.call_released(op);
1177 static int get_auth_data_from_response(osip_message_t *resp, const char **realm, const char **username){
1178 const char *prx_realm=NULL,*www_realm=NULL;
1179 osip_proxy_authenticate_t *prx_auth;
1180 osip_www_authenticate_t *www_auth;
1182 *username=osip_uri_get_username(resp->from->url);
1183 prx_auth=(osip_proxy_authenticate_t*)osip_list_get(&resp->proxy_authenticates,0);
1184 www_auth=(osip_proxy_authenticate_t*)osip_list_get(&resp->www_authenticates,0);
1186 prx_realm=osip_proxy_authenticate_get_realm(prx_auth);
1188 www_realm=osip_www_authenticate_get_realm(www_auth);
1192 }else if (www_realm){
1200 static int get_auth_data_from_request(osip_message_t *msg, const char **realm, const char **username){
1201 osip_authorization_t *auth=NULL;
1202 osip_proxy_authorization_t *prx_auth=NULL;
1204 *username=osip_uri_get_username(msg->from->url);
1205 osip_message_get_authorization(msg, 0, &auth);
1207 *realm=osip_authorization_get_realm(auth);
1210 osip_message_get_proxy_authorization(msg,0,&prx_auth);
1212 *realm=osip_proxy_authorization_get_realm(prx_auth);
1218 static int get_auth_data(eXosip_event_t *ev, const char **realm, const char **username){
1219 if (ev->response && get_auth_data_from_response(ev->response,realm,username)==0) return 0;
1220 if (ev->request && get_auth_data_from_request(ev->request,realm,username)==0) return 0;
1224 int sal_op_get_auth_requested(SalOp *op, const char **realm, const char **username){
1225 if (op->pending_auth){
1226 return get_auth_data(op->pending_auth,realm,username);
1231 static bool_t process_authentication(Sal *sal, eXosip_event_t *ev){
1233 const char *username,*realm;
1236 ms_warning("No operation associated with this authentication !");
1239 if (get_auth_data(ev,&realm,&username)==0){
1240 if (op->pending_auth!=NULL){
1241 eXosip_event_free(op->pending_auth);
1242 op->pending_auth=ev;
1244 op->pending_auth=ev;
1245 sal_add_pending_auth(sal,op);
1248 sal->callbacks.auth_requested(op,realm,username);
1254 static void authentication_ok(Sal *sal, eXosip_event_t *ev){
1256 const char *username,*realm;
1259 ms_warning("No operation associated with this authentication_ok!");
1262 if (op->pending_auth){
1263 eXosip_event_free(op->pending_auth);
1264 sal_remove_pending_auth(sal,op);
1265 op->pending_auth=NULL;
1267 if (get_auth_data(ev,&realm,&username)==0){
1268 sal->callbacks.auth_success(op,realm,username);
1272 static bool_t call_failure(Sal *sal, eXosip_event_t *ev){
1275 char* computedReason=NULL;
1276 const char *reason=NULL;
1277 SalError error=SalErrorUnknown;
1278 SalReason sr=SalReasonUnknown;
1281 op=(SalOp*)find_op(sal,ev);
1284 ms_warning("Call failure reported for a closed call, ignored.");
1289 code=osip_message_get_status_code(ev->response);
1290 reason=osip_message_get_reason_phrase(ev->response);
1291 osip_header_t *h=NULL;
1292 if (!osip_message_header_get_byname( ev->response
1296 computedReason = ms_strdup_printf("%s %s",reason,osip_header_get_value(h));
1297 reason = computedReason;
1305 return process_authentication(sal,ev);
1308 error=SalErrorUnknown;
1311 error=SalErrorFailure;
1312 sr=SalReasonNotFound;
1315 error=SalErrorFailure;
1319 eXosip_default_action(ev);
1323 error=SalErrorFailure;
1324 sr=SalReasonTemporarilyUnavailable;
1326 error=SalErrorFailure;
1332 error=SalErrorFailure;
1333 sr=SalReasonDoNotDisturb;
1336 error=SalErrorFailure;
1337 sr=SalReasonDeclined;
1341 error=SalErrorFailure;
1342 sr=SalReasonUnknown;
1343 }else error=SalErrorNoResponse;
1345 op->terminated=TRUE;
1346 sal->callbacks.call_failure(op,error,sr,reason,code);
1347 if (computedReason != NULL){
1348 ms_free(computedReason);
1353 /* Request remote side to send us VFU */
1354 void sal_call_send_vfu_request(SalOp *h){
1355 osip_message_t *msg=NULL;
1357 "<?xml version=\"1.0\" encoding=\"utf-8\" ?>"
1361 " <picture_fast_update></picture_fast_update>"
1369 eXosip_call_build_info(h->did,&msg);
1371 osip_message_set_body(msg,info_body,strlen(info_body));
1372 osip_message_set_content_type(msg,"application/media_control+xml");
1373 snprintf(clen,sizeof(clen),"%lu",(unsigned long)strlen(info_body));
1374 osip_message_set_content_length(msg,clen);
1375 eXosip_call_send_request(h->did,msg);
1376 ms_message("Sending VFU request !");
1381 static void process_media_control_xml(Sal *sal, eXosip_event_t *ev){
1382 SalOp *op=find_op(sal,ev);
1383 osip_body_t *body=NULL;
1386 ms_warning("media control xml received without operation context!");
1390 osip_message_get_body(ev->request,0,&body);
1391 if (body && body->body!=NULL &&
1392 strstr(body->body,"picture_fast_update")){
1393 osip_message_t *ans=NULL;
1394 ms_message("Receiving VFU request !");
1395 if (sal->callbacks.vfu_request){
1396 sal->callbacks.vfu_request(op);
1397 eXosip_call_build_answer(ev->tid,200,&ans);
1399 eXosip_call_send_answer(ev->tid,200,ans);
1403 /*in all other cases we must say it is not implemented.*/
1405 osip_message_t *ans=NULL;
1407 eXosip_call_build_answer(ev->tid,501,&ans);
1409 eXosip_call_send_answer(ev->tid,501,ans);
1414 static void process_dtmf_relay(Sal *sal, eXosip_event_t *ev){
1415 SalOp *op=find_op(sal,ev);
1416 osip_body_t *body=NULL;
1419 ms_warning("media dtmf relay received without operation context!");
1423 osip_message_get_body(ev->request,0,&body);
1424 if (body && body->body!=NULL){
1425 osip_message_t *ans=NULL;
1426 const char *name=strstr(body->body,"Signal");
1427 if (name==NULL) name=strstr(body->body,"signal");
1429 ms_warning("Could not extract the dtmf name from the SIP INFO.");
1432 name+=strlen("signal");
1433 if (sscanf(name," = %1s",tmp)==1){
1434 ms_message("Receiving dtmf %s via SIP INFO.",tmp);
1435 if (sal->callbacks.dtmf_received != NULL)
1436 sal->callbacks.dtmf_received(op, tmp[0]);
1440 eXosip_call_build_answer(ev->tid,200,&ans);
1442 eXosip_call_send_answer(ev->tid,200,ans);
1447 static void fill_options_answer(osip_message_t *options){
1448 osip_message_set_allow(options,"INVITE, ACK, BYE, CANCEL, OPTIONS, MESSAGE, SUBSCRIBE, NOTIFY, INFO");
1449 osip_message_set_accept(options,"application/sdp");
1452 static void process_refer(Sal *sal, SalOp *op, eXosip_event_t *ev){
1453 osip_header_t *h=NULL;
1454 osip_message_t *ans=NULL;
1455 ms_message("Receiving REFER request !");
1456 osip_message_header_get_byname(ev->request,"Refer-To",0,&h);
1459 osip_from_t *from=NULL;
1461 osip_from_init(&from);
1463 if (osip_from_parse(from,h->hvalue)==0){
1465 osip_uri_header_t *uh=NULL;
1466 osip_header_t *referred_by=NULL;
1467 osip_uri_header_get_byname(&from->url->url_headers,(char*)"Replaces",&uh);
1468 if (uh!=NULL && uh->gvalue && uh->gvalue[0]!='\0'){
1469 ms_message("Found replaces in Refer-To");
1471 ms_free(op->replaces);
1473 op->replaces=ms_strdup(uh->gvalue);
1475 osip_message_header_get_byname(ev->request,"Referred-By",0,&referred_by);
1476 if (referred_by && referred_by->hvalue && referred_by->hvalue[0]!='\0'){
1477 if (op->referred_by)
1478 ms_free(op->referred_by);
1479 op->referred_by=ms_strdup(referred_by->hvalue);
1482 osip_uri_header_freelist(&from->url->url_headers);
1483 osip_from_to_str(from,&tmp);
1484 sal->callbacks.refer_received(sal,op,tmp);
1486 osip_from_free(from);
1489 eXosip_call_build_answer(ev->tid,202,&ans);
1491 eXosip_call_send_answer(ev->tid,202,ans);
1496 ms_warning("cannot do anything with the refer without destination\n");
1500 static void call_message_new(Sal *sal, eXosip_event_t *ev){
1501 osip_message_t *ans=NULL;
1503 if (MSG_IS_INFO(ev->request)){
1504 osip_content_type_t *ct;
1505 ct=osip_message_get_content_type(ev->request);
1506 if (ct && ct->subtype){
1507 if (strcmp(ct->subtype,"media_control+xml")==0)
1508 process_media_control_xml(sal,ev);
1509 else if (strcmp(ct->subtype,"dtmf-relay")==0)
1510 process_dtmf_relay(sal,ev);
1512 ms_message("Unhandled SIP INFO.");
1513 /*send an "Not implemented" answer*/
1515 eXosip_call_build_answer(ev->tid,501,&ans);
1517 eXosip_call_send_answer(ev->tid,501,ans);
1521 /*empty SIP INFO, probably to test we are alive. Send an empty answer*/
1523 eXosip_call_build_answer(ev->tid,200,&ans);
1525 eXosip_call_send_answer(ev->tid,200,ans);
1528 }else if(MSG_IS_MESSAGE(ev->request)){
1529 /* SIP messages could be received into call */
1530 text_received(sal, ev);
1532 eXosip_call_build_answer(ev->tid,200,&ans);
1534 eXosip_call_send_answer(ev->tid,200,ans);
1536 }else if(MSG_IS_REFER(ev->request)){
1537 SalOp *op=find_op(sal,ev);
1539 ms_message("Receiving REFER request !");
1540 process_refer(sal,op,ev);
1541 }else if(MSG_IS_NOTIFY(ev->request)){
1542 osip_header_t *h=NULL;
1544 SalOp *op=find_op(sal,ev);
1546 ms_message("Receiving NOTIFY request !");
1547 osip_from_to_str(ev->request->from,&from);
1548 osip_message_header_get_byname(ev->request,"Event",0,&h);
1550 sal->callbacks.notify(op,from,h->hvalue);
1551 /*answer that we received the notify*/
1553 eXosip_call_build_answer(ev->tid,200,&ans);
1555 eXosip_call_send_answer(ev->tid,200,ans);
1558 }else if (MSG_IS_OPTIONS(ev->request)){
1560 eXosip_call_build_answer(ev->tid,200,&ans);
1562 fill_options_answer(ans);
1563 eXosip_call_send_answer(ev->tid,200,ans);
1567 }else ms_warning("call_message_new: No request ?");
1570 static void inc_update(Sal *sal, eXosip_event_t *ev){
1571 osip_message_t *msg=NULL;
1572 ms_message("Processing incoming UPDATE");
1574 eXosip_message_build_answer(ev->tid,200,&msg);
1576 eXosip_message_send_answer(ev->tid,200,msg);
1580 static bool_t comes_from_local_if(osip_message_t *msg){
1581 osip_via_t *via=NULL;
1582 osip_message_get_via(msg,0,&via);
1585 host=osip_via_get_host(via);
1586 if (strcmp(host,"127.0.0.1")==0 || strcmp(host,"::1")==0){
1587 osip_generic_param_t *param=NULL;
1588 osip_via_param_get_byname(via,"received",¶m);
1589 if (param==NULL) return TRUE;
1590 if (param->gvalue &&
1591 (strcmp(param->gvalue,"127.0.0.1")==0 || strcmp(param->gvalue,"::1")==0)){
1599 static void text_received(Sal *sal, eXosip_event_t *ev){
1600 osip_body_t *body=NULL;
1601 char *from=NULL,*msg;
1603 osip_message_get_body(ev->request,0,&body);
1605 ms_error("Could not get text message from SIP body");
1609 osip_from_to_str(ev->request->from,&from);
1610 sal->callbacks.text_received(sal,from,msg);
1616 static void other_request(Sal *sal, eXosip_event_t *ev){
1617 ms_message("in other_request");
1618 if (ev->request==NULL) return;
1619 if (strcmp(ev->request->sip_method,"MESSAGE")==0){
1620 text_received(sal,ev);
1621 eXosip_message_send_answer(ev->tid,200,NULL);
1622 }else if (strcmp(ev->request->sip_method,"OPTIONS")==0){
1623 osip_message_t *options=NULL;
1624 eXosip_options_build_answer(ev->tid,200,&options);
1625 fill_options_answer(options);
1626 eXosip_options_send_answer(ev->tid,200,options);
1627 }else if (strncmp(ev->request->sip_method, "REFER", 5) == 0){
1628 ms_message("Receiving REFER request !");
1629 if (comes_from_local_if(ev->request)) {
1630 process_refer(sal,NULL,ev);
1631 }else ms_warning("Ignored REFER not coming from this local loopback interface.");
1632 }else if (strncmp(ev->request->sip_method, "UPDATE", 6) == 0){
1637 osip_message_to_str(ev->request,&tmp,&msglen);
1639 ms_message("Unsupported request received:\n%s",tmp);
1642 /*answer with a 501 Not implemented*/
1643 eXosip_message_send_answer(ev->tid,501,NULL);
1647 static void masquerade_via(osip_message_t *msg, const char *ip, const char *port){
1648 osip_via_t *via=NULL;
1649 osip_message_get_via(msg,0,&via);
1651 osip_free(via->port);
1652 via->port=osip_strdup(port);
1653 osip_free(via->host);
1654 via->host=osip_strdup(ip);
1659 static bool_t fix_message_contact(SalOp *op, osip_message_t *request,osip_message_t *last_answer) {
1660 osip_contact_t *ctt=NULL;
1661 const char *received;
1663 SalTransport transport;
1666 if (extract_received_rport(last_answer,&received,&rport,&transport)==-1) return FALSE;
1667 osip_message_get_contact(request,0,&ctt);
1669 /*nothing to update*/
1672 if (ctt->url->host!=NULL){
1673 osip_free(ctt->url->host);
1675 ctt->url->host=osip_strdup(received);
1676 if (ctt->url->port!=NULL){
1677 osip_free(ctt->url->port);
1679 snprintf(port,sizeof(port),"%i",rport);
1680 ctt->url->port=osip_strdup(port);
1681 if (op->masquerade_via) masquerade_via(request,received,port);
1683 if (transport != SalTransportUDP) {
1684 sal_address_set_param((SalAddress *)ctt, "transport", sal_transport_to_string(transport));
1689 static bool_t register_again_with_updated_contact(SalOp *op, osip_message_t *orig_request, osip_message_t *last_answer){
1690 osip_contact_t *ctt=NULL;
1691 SalAddress* ori_contact_address=NULL;
1692 const char *received;
1694 SalTransport transport;
1696 osip_message_t *msg=NULL;
1697 Sal* sal=op->base.root;
1699 if (sal->double_reg==FALSE ) return FALSE;
1701 if (extract_received_rport(last_answer,&received,&rport,&transport)==-1) return FALSE;
1702 osip_message_get_contact(orig_request,0,&ctt);
1703 osip_contact_to_str(ctt,&tmp);
1704 ori_contact_address = sal_address_new((const char*)tmp);
1706 /*check if contact is up to date*/
1707 if (strcmp(sal_address_get_domain(ori_contact_address),received) ==0
1708 && sal_address_get_port_int(ori_contact_address) == rport
1709 && sal_address_get_transport(ori_contact_address) == transport) {
1710 ms_message("Register has up to date contact, doing nothing.");
1713 } else ms_message("contact do not match, need to update the register (%s with %s:%i;transport=%s)"
1717 ,sal_transport_to_string(transport));
1719 sal_address_destroy(ori_contact_address);
1721 if (transport == SalTransportUDP) {
1723 eXosip_register_build_register(op->rid,op->expires,&msg);
1726 ms_warning("Fail to create a contact updated register.");
1729 if (fix_message_contact(op,msg,last_answer)) {
1730 eXosip_register_send_register(op->rid,msg);
1732 ms_message("Resending new register with updated contact");
1735 ms_warning("Fail to send updated register.");
1742 update_contact_from_response(op,last_answer);
1746 static void registration_success(Sal *sal, eXosip_event_t *ev){
1747 SalOp *op=sal_find_register(sal,ev->rid);
1748 osip_header_t *h=NULL;
1751 ms_error("Receiving register response for unknown operation");
1754 osip_message_get_expires(ev->request,0,&h);
1755 if (h!=NULL && atoi(h->hvalue)!=0){
1757 if (!register_again_with_updated_contact(op,ev->request,ev->response)){
1758 sal->callbacks.register_success(op,registered);
1761 sal->callbacks.register_success(op,FALSE);
1765 static bool_t registration_failure(Sal *sal, eXosip_event_t *ev){
1767 const char *reason=NULL;
1768 SalOp *op=sal_find_register(sal,ev->rid);
1769 SalReason sr=SalReasonUnknown;
1770 SalError se=SalErrorUnknown;
1773 ms_error("Receiving register failure for unknown operation");
1777 status_code=osip_message_get_status_code(ev->response);
1778 reason=osip_message_get_reason_phrase(ev->response);
1780 switch(status_code){
1783 return process_authentication(sal,ev);
1785 case 423: /*interval too brief*/
1786 {/*retry with greater interval */
1787 osip_header_t *h=NULL;
1788 osip_message_t *msg=NULL;
1789 osip_message_header_get_byname(ev->response,"min-expires",0,&h);
1790 if (h && h->hvalue && h->hvalue[0]!='\0'){
1791 int val=atoi(h->hvalue);
1792 if (val>op->expires)
1794 }else op->expires*=2;
1796 eXosip_register_build_register(op->rid,op->expires,&msg);
1797 eXosip_register_send_register(op->rid,msg);
1801 case 606: /*Not acceptable, workaround for proxies that don't like private addresses
1802 in vias, such as ekiga.net
1803 On the opposite, freephonie.net bugs when via are masqueraded.
1805 op->masquerade_via=TRUE;
1807 /* if contact is up to date, process the failure, otherwise resend a new register with
1808 updated contact first, just in case the faillure is due to incorrect contact */
1809 if (ev->response && register_again_with_updated_contact(op,ev->request,ev->response))
1810 return TRUE; /*we are retrying with an updated contact*/
1811 if (status_code==403){
1813 sr=SalReasonForbidden;
1814 }else if (status_code==0){
1815 se=SalErrorNoResponse;
1817 sal->callbacks.register_failure(op,se,sr,reason);
1822 static void other_request_reply(Sal *sal,eXosip_event_t *ev){
1823 SalOp *op=find_op(sal,ev);
1826 ms_warning("other_request_reply(): Receiving response to unknown request.");
1830 update_contact_from_response(op,ev->response);
1831 if (ev->request && strcmp(osip_message_get_method(ev->request),"OPTIONS")==0)
1832 sal->callbacks.ping_reply(op);
1836 static bool_t process_event(Sal *sal, eXosip_event_t *ev){
1837 ms_message("linphone process event get a message %d\n",ev->type);
1839 case EXOSIP_CALL_ANSWERED:
1840 ms_message("CALL_ANSWERED\n");
1841 call_accepted(sal,ev);
1842 authentication_ok(sal,ev);
1844 case EXOSIP_CALL_CLOSED:
1845 case EXOSIP_CALL_CANCELLED:
1846 ms_message("CALL_CLOSED or CANCELLED\n");
1847 call_terminated(sal,ev);
1849 case EXOSIP_CALL_TIMEOUT:
1850 case EXOSIP_CALL_NOANSWER:
1851 ms_message("CALL_TIMEOUT or NOANSWER\n");
1852 return call_failure(sal,ev);
1854 case EXOSIP_CALL_REQUESTFAILURE:
1855 case EXOSIP_CALL_GLOBALFAILURE:
1856 case EXOSIP_CALL_SERVERFAILURE:
1857 ms_message("CALL_REQUESTFAILURE or GLOBALFAILURE or SERVERFAILURE\n");
1858 return call_failure(sal,ev);
1860 case EXOSIP_CALL_RELEASED:
1861 ms_message("CALL_RELEASED\n");
1862 call_released(sal, ev);
1864 case EXOSIP_CALL_INVITE:
1865 ms_message("CALL_NEW\n");
1866 inc_new_call(sal,ev);
1868 case EXOSIP_CALL_REINVITE:
1869 handle_reinvite(sal,ev);
1871 case EXOSIP_CALL_ACK:
1872 ms_message("CALL_ACK");
1875 case EXOSIP_CALL_REDIRECTED:
1876 ms_message("CALL_REDIRECTED");
1877 eXosip_default_action(ev);
1879 case EXOSIP_CALL_PROCEEDING:
1880 ms_message("CALL_PROCEEDING");
1881 call_proceeding(sal,ev);
1883 case EXOSIP_CALL_RINGING:
1884 ms_message("CALL_RINGING");
1885 call_ringing(sal,ev);
1887 case EXOSIP_CALL_MESSAGE_NEW:
1888 ms_message("EXOSIP_CALL_MESSAGE_NEW");
1889 call_message_new(sal,ev);
1891 case EXOSIP_CALL_MESSAGE_REQUESTFAILURE:
1893 (ev->response->status_code==407 || ev->response->status_code==401)){
1894 return process_authentication(sal,ev);
1897 case EXOSIP_IN_SUBSCRIPTION_NEW:
1898 ms_message("CALL_IN_SUBSCRIPTION_NEW ");
1899 sal_exosip_subscription_recv(sal,ev);
1901 case EXOSIP_IN_SUBSCRIPTION_RELEASED:
1902 ms_message("CALL_SUBSCRIPTION_NEW ");
1903 sal_exosip_in_subscription_closed(sal,ev);
1905 case EXOSIP_SUBSCRIPTION_UPDATE:
1906 ms_message("CALL_SUBSCRIPTION_UPDATE");
1908 case EXOSIP_SUBSCRIPTION_NOTIFY:
1909 ms_message("CALL_SUBSCRIPTION_NOTIFY");
1910 sal_exosip_notify_recv(sal,ev);
1912 case EXOSIP_SUBSCRIPTION_ANSWERED:
1913 ms_message("EXOSIP_SUBSCRIPTION_ANSWERED, ev->sid=%i, ev->did=%i\n",ev->sid,ev->did);
1914 sal_exosip_subscription_answered(sal,ev);
1916 case EXOSIP_SUBSCRIPTION_CLOSED:
1917 ms_message("EXOSIP_SUBSCRIPTION_CLOSED\n");
1918 sal_exosip_subscription_closed(sal,ev);
1920 case EXOSIP_SUBSCRIPTION_REQUESTFAILURE: /**< announce a request failure */
1921 if (ev->response && (ev->response->status_code == 407 || ev->response->status_code == 401)){
1922 return process_authentication(sal,ev);
1924 case EXOSIP_SUBSCRIPTION_SERVERFAILURE:
1925 case EXOSIP_SUBSCRIPTION_GLOBALFAILURE:
1926 sal_exosip_subscription_closed(sal,ev);
1928 case EXOSIP_REGISTRATION_FAILURE:
1929 ms_message("REGISTRATION_FAILURE\n");
1930 return registration_failure(sal,ev);
1932 case EXOSIP_REGISTRATION_SUCCESS:
1933 authentication_ok(sal,ev);
1934 registration_success(sal,ev);
1936 case EXOSIP_MESSAGE_NEW:
1937 other_request(sal,ev);
1939 case EXOSIP_MESSAGE_PROCEEDING:
1940 case EXOSIP_MESSAGE_ANSWERED:
1941 case EXOSIP_MESSAGE_REDIRECTED:
1942 case EXOSIP_MESSAGE_SERVERFAILURE:
1943 case EXOSIP_MESSAGE_GLOBALFAILURE:
1944 other_request_reply(sal,ev);
1946 case EXOSIP_MESSAGE_REQUESTFAILURE:
1947 case EXOSIP_NOTIFICATION_REQUESTFAILURE:
1949 switch (ev->response->status_code) {
1952 return process_authentication(sal,ev);
1954 eXosip_automatic_action ();
1959 other_request_reply(sal,ev);
1962 ms_message("Unhandled exosip event ! %i",ev->type);
1968 int sal_iterate(Sal *sal){
1970 while((ev=eXosip_event_wait(0,0))!=NULL){
1971 if (process_event(sal,ev))
1972 eXosip_event_free(ev);
1975 eXosip_automatic_refresh();
1980 static void register_set_contact(osip_message_t *msg, const char *contact){
1981 osip_uri_param_t *param = NULL;
1982 osip_contact_t *ct=NULL;
1984 /*we get the line parameter choosed by exosip, and add it to our own contact*/
1985 osip_message_get_contact(msg,0,&ct);
1987 osip_uri_uparam_get_byname(ct->url, "line", ¶m);
1988 if (param && param->gvalue)
1989 line=osip_strdup(param->gvalue);
1991 _osip_list_set_empty(&msg->contacts,(void (*)(void*))osip_contact_free);
1992 osip_message_set_contact(msg,contact);
1993 osip_message_get_contact(msg,0,&ct);
1994 osip_uri_uparam_add(ct->url,osip_strdup("line"),line);
1997 int sal_register(SalOp *h, const char *proxy, const char *from, int expires){
1998 osip_message_t *msg;
1999 const char *contact=sal_op_get_contact(h);
2001 sal_op_set_route(h,proxy);
2004 h->rid=eXosip_register_build_initial_register(from,proxy,NULL,expires,&msg);
2006 if (contact) register_set_contact(msg,contact);
2007 sal_add_register(h->base.root,h);
2009 ms_error("Could not build initial register.");
2015 eXosip_register_build_register(h->rid,expires,&msg);
2017 eXosip_register_send_register(h->rid,msg);
2023 int sal_register_refresh(SalOp *op, int expires){
2024 osip_message_t *msg=NULL;
2025 const char *contact=sal_op_get_contact(op);
2028 ms_error("Unexistant registration context, not possible to refresh.");
2032 eXosip_register_build_register(op->rid,expires,&msg);
2034 if (contact) register_set_contact(msg,contact);
2035 eXosip_register_send_register(op->rid,msg);
2036 }else ms_error("Could not build REGISTER refresh message.");
2042 int sal_unregister(SalOp *h){
2043 osip_message_t *msg=NULL;
2045 eXosip_register_build_register(h->rid,0,&msg);
2046 if (msg) eXosip_register_send_register(h->rid,msg);
2047 else ms_warning("Could not build unREGISTER !");
2052 SalAddress * sal_address_new(const char *uri){
2054 osip_from_init(&from);
2056 // Remove front spaces
2057 while (uri[0]==' ') {
2061 if (osip_from_parse(from,uri)!=0){
2062 osip_from_free(from);
2065 if (from->displayname!=NULL && from->displayname[0]=='"'){
2066 char *unquoted=osip_strdup_without_quote(from->displayname);
2067 osip_free(from->displayname);
2068 from->displayname=unquoted;
2070 return (SalAddress*)from;
2073 SalAddress * sal_address_clone(const SalAddress *addr){
2074 osip_from_t *ret=NULL;
2075 osip_from_clone((osip_from_t*)addr,&ret);
2076 return (SalAddress*)ret;
2079 #define null_if_empty(s) (((s)!=NULL && (s)[0]!='\0') ? (s) : NULL )
2081 const char *sal_address_get_scheme(const SalAddress *addr){
2082 const osip_from_t *u=(const osip_from_t*)addr;
2083 return null_if_empty(u->url->scheme);
2086 const char *sal_address_get_display_name(const SalAddress* addr){
2087 const osip_from_t *u=(const osip_from_t*)addr;
2088 return null_if_empty(u->displayname);
2091 const char *sal_address_get_username(const SalAddress *addr){
2092 const osip_from_t *u=(const osip_from_t*)addr;
2093 return null_if_empty(u->url->username);
2096 const char *sal_address_get_domain(const SalAddress *addr){
2097 const osip_from_t *u=(const osip_from_t*)addr;
2098 return null_if_empty(u->url->host);
2101 void sal_address_set_display_name(SalAddress *addr, const char *display_name){
2102 osip_from_t *u=(osip_from_t*)addr;
2103 if (u->displayname!=NULL){
2104 osip_free(u->displayname);
2105 u->displayname=NULL;
2107 if (display_name!=NULL && display_name[0]!='\0'){
2108 u->displayname=osip_strdup(display_name);
2112 void sal_address_set_username(SalAddress *addr, const char *username){
2113 osip_from_t *uri=(osip_from_t*)addr;
2114 if (uri->url->username!=NULL){
2115 osip_free(uri->url->username);
2116 uri->url->username=NULL;
2119 uri->url->username=osip_strdup(username);
2122 void sal_address_set_domain(SalAddress *addr, const char *host){
2123 osip_from_t *uri=(osip_from_t*)addr;
2124 if (uri->url->host!=NULL){
2125 osip_free(uri->url->host);
2126 uri->url->host=NULL;
2129 uri->url->host=osip_strdup(host);
2132 void sal_address_set_port(SalAddress *addr, const char *port){
2133 osip_from_t *uri=(osip_from_t*)addr;
2134 if (uri->url->port!=NULL){
2135 osip_free(uri->url->port);
2136 uri->url->port=NULL;
2139 uri->url->port=osip_strdup(port);
2142 void sal_address_set_port_int(SalAddress *uri, int port){
2145 /*this is the default, special case to leave the port field blank*/
2146 sal_address_set_port(uri,NULL);
2149 snprintf(tmp,sizeof(tmp),"%i",port);
2150 sal_address_set_port(uri,tmp);
2153 void sal_address_clean(SalAddress *addr){
2154 osip_generic_param_freelist(& ((osip_from_t*)addr)->gen_params);
2155 osip_uri_param_freelist(& ((osip_from_t*)addr)->url->url_params);
2158 char *sal_address_as_string(const SalAddress *u){
2160 osip_from_t *from=(osip_from_t *)u;
2161 char *old_displayname=NULL;
2162 /* hack to force use of quotes around the displayname*/
2163 if (from->displayname!=NULL
2164 && from->displayname[0]!='"'){
2165 old_displayname=from->displayname;
2166 from->displayname=osip_enquote(from->displayname);
2168 osip_from_to_str(from,&tmp);
2169 if (old_displayname!=NULL){
2170 ms_free(from->displayname);
2171 from->displayname=old_displayname;
2178 char *sal_address_as_string_uri_only(const SalAddress *u){
2179 char *tmp=NULL,*ret;
2180 osip_uri_to_str(((osip_from_t*)u)->url,&tmp);
2185 void sal_address_set_param(SalAddress *u,const char* name,const char* value) {
2186 osip_uri_param_t *param=NULL;
2187 osip_uri_uparam_get_byname(((osip_from_t*)u)->url,(char*)name,¶m);
2189 osip_uri_uparam_add (((osip_from_t*)u)->url,ms_strdup(name),ms_strdup(value));
2191 osip_free(param->gvalue);
2192 param->gvalue=osip_strdup(value);
2197 void sal_address_destroy(SalAddress *u){
2198 osip_from_free((osip_from_t*)u);
2201 void sal_set_keepalive_period(Sal *ctx,unsigned int value) {
2202 ctx->keepalive_period=value;
2203 eXosip_set_option (EXOSIP_OPT_UDP_KEEP_ALIVE, &value);
2205 unsigned int sal_get_keepalive_period(Sal *ctx) {
2206 return ctx->keepalive_period;
2209 const char * sal_address_get_port(const SalAddress *addr) {
2210 const osip_from_t *u=(const osip_from_t*)addr;
2211 return null_if_empty(u->url->port);
2214 int sal_address_get_port_int(const SalAddress *uri) {
2215 const char* port = sal_address_get_port(uri);
2222 SalTransport sal_address_get_transport(const SalAddress* addr) {
2223 const osip_from_t *u=(const osip_from_t*)addr;
2224 osip_uri_param_t *transport_param=NULL;
2225 osip_uri_uparam_get_byname(u->url,"transport",&transport_param);
2226 if (transport_param == NULL){
2227 return SalTransportUDP;
2229 return sal_transport_parse(transport_param->gvalue);
2232 void sal_address_set_transport(SalAddress* addr,SalTransport transport) {
2233 sal_address_set_param(addr, "transport", sal_transport_to_string(transport));
2236 /* sends a reinvite. Local media description may have changed by application since call establishment*/
2237 int sal_call_update(SalOp *h, const char *subject){
2239 osip_message_t *reinvite=NULL;
2242 if(eXosip_call_build_request(h->did,"INVITE",&reinvite) != 0 || reinvite==NULL){
2247 osip_message_set_subject(reinvite,subject);
2248 osip_message_set_allow(reinvite, "INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, NOTIFY, MESSAGE, SUBSCRIBE, INFO");
2249 if (h->base.root->session_expires!=0){
2250 osip_message_set_header(reinvite, "Session-expires", "200");
2251 osip_message_set_supported(reinvite, "timer");
2253 if (h->base.local_media){
2254 h->sdp_offering=TRUE;
2255 set_sdp_from_desc(reinvite,h->base.local_media);
2256 }else h->sdp_offering=FALSE;
2258 err = eXosip_call_send_request(h->did, reinvite);
2262 void sal_reuse_authorization(Sal *ctx, bool_t value) {
2263 ctx->reuse_authorization=value;