3 Copyright (C) 2010 Simon MORLAT (simon.morlat@free.fr)
5 This program is free software; you can redistribute it and/or
6 modify it under the terms of the GNU General Public License
7 as published by the Free Software Foundation; either version 2
8 of the License, or (at your option) any later version.
10 This program is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 GNU General Public License for more details.
15 You should have received a copy of the GNU General Public License
16 along with this program; if not, write to the Free Software
17 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
23 #include "sal_eXosip2.h"
25 #include "offeranswer.h"
28 // Necessary to make it linked
29 static void for_linker() { eXosip_transport_hook_register(NULL); }
31 static bool_t call_failure(Sal *sal, eXosip_event_t *ev);
33 static void text_received(Sal *sal, eXosip_event_t *ev);
35 static void masquerade_via(osip_message_t *msg, const char *ip, const char *port);
36 static bool_t fix_message_contact(SalOp *op, osip_message_t *request,osip_message_t *last_answer);
37 static void update_contact_from_response(SalOp *op, osip_message_t *response);
39 void _osip_list_set_empty(osip_list_t *l, void (*freefunc)(void*)){
41 while(!osip_list_eol(l,0)) {
42 data=osip_list_get(l,0);
43 osip_list_remove(l,0);
44 if (data) freefunc(data);
48 void sal_get_default_local_ip(Sal *sal, int address_family,char *ip, size_t iplen){
49 if (eXosip_guess_localip(address_family,ip,iplen)<0){
50 /*default to something */
51 strncpy(ip,address_family==AF_INET6 ? "::1" : "127.0.0.1",iplen);
52 ms_error("Could not find default routable ip address !");
57 static SalOp * sal_find_call(Sal *sal, int cid){
60 for(elem=sal->calls;elem!=NULL;elem=elem->next){
61 op=(SalOp*)elem->data;
62 if (op->cid==cid) return op;
67 static void sal_add_call(Sal *sal, SalOp *op){
68 sal->calls=ms_list_append(sal->calls,op);
71 static void sal_remove_call(Sal *sal, SalOp *op){
72 sal->calls=ms_list_remove(sal->calls, op);
75 static SalOp * sal_find_register(Sal *sal, int rid){
78 for(elem=sal->registers;elem!=NULL;elem=elem->next){
79 op=(SalOp*)elem->data;
80 if (op->rid==rid) return op;
85 static void sal_add_register(Sal *sal, SalOp *op){
86 sal->registers=ms_list_append(sal->registers,op);
89 static void sal_remove_register(Sal *sal, int rid){
92 for(elem=sal->registers;elem!=NULL;elem=elem->next){
93 op=(SalOp*)elem->data;
95 sal->registers=ms_list_remove_link(sal->registers,elem);
101 static SalOp * sal_find_other(Sal *sal, osip_message_t *response){
104 osip_call_id_t *callid=osip_message_get_call_id(response);
106 ms_error("There is no call-id in this response !");
109 for(elem=sal->other_transactions;elem!=NULL;elem=elem->next){
110 op=(SalOp*)elem->data;
111 if (osip_call_id_match(callid,op->call_id)==0) return op;
116 void sal_add_other(Sal *sal, SalOp *op, osip_message_t *request){
117 osip_call_id_t *callid=osip_message_get_call_id(request);
119 ms_error("There is no call id in the request !");
122 osip_call_id_clone(callid,&op->call_id);
123 sal->other_transactions=ms_list_append(sal->other_transactions,op);
126 static void sal_remove_other(Sal *sal, SalOp *op){
127 sal->other_transactions=ms_list_remove(sal->other_transactions,op);
131 static void sal_add_pending_auth(Sal *sal, SalOp *op){
132 sal->pending_auths=ms_list_append(sal->pending_auths,op);
136 static void sal_remove_pending_auth(Sal *sal, SalOp *op){
137 sal->pending_auths=ms_list_remove(sal->pending_auths,op);
140 void sal_exosip_fix_route(SalOp *op){
141 if (sal_op_get_route(op)!=NULL){
142 osip_route_t *rt=NULL;
143 osip_uri_param_t *lr_param=NULL;
145 osip_route_init(&rt);
146 if (osip_route_parse(rt,sal_op_get_route(op))<0){
147 ms_warning("Bad route %s!",sal_op_get_route(op));
148 sal_op_set_route(op,NULL);
150 /* check if the lr parameter is set , if not add it */
151 osip_uri_uparam_get_byname(rt->url, "lr", &lr_param);
154 osip_uri_uparam_add(rt->url,osip_strdup("lr"),NULL);
155 osip_route_to_str(rt,&tmproute);
156 sal_op_set_route(op,tmproute);
164 SalOp * sal_op_new(Sal *sal){
165 SalOp *op=ms_new(SalOp,1);
166 __sal_op_init(op,sal);
167 op->cid=op->did=op->tid=op->rid=op->nid=op->sid=-1;
169 op->supports_session_timers=FALSE;
170 op->sdp_offering=TRUE;
171 op->pending_auth=NULL;
176 op->referred_by=NULL;
177 op->masquerade_via=FALSE;
178 op->auto_answer_asked=FALSE;
180 op->terminated=FALSE;
184 bool_t sal_call_autoanswer_asked(SalOp *op)
186 return op->auto_answer_asked;
189 void sal_op_release(SalOp *op){
191 sdp_message_free(op->sdp_answer);
192 if (op->pending_auth)
193 eXosip_event_free(op->pending_auth);
195 sal_remove_register(op->base.root,op->rid);
196 eXosip_register_remove(op->rid);
199 ms_message("Cleaning cid %i",op->cid);
200 sal_remove_call(op->base.root,op);
203 sal_remove_out_subscribe(op->base.root,op);
206 sal_remove_in_subscribe(op->base.root,op);
208 osip_call_id_free(op->call_id);
211 if (op->pending_auth){
212 sal_remove_pending_auth(op->base.root,op);
215 sal_media_description_unref(op->result);
217 sal_remove_other(op->base.root,op);
218 osip_call_id_free(op->call_id);
221 ms_free(op->replaces);
223 if (op->referred_by){
224 ms_free(op->referred_by);
227 sal_auth_info_delete(op->auth_info);
232 static void _osip_trace_func(char *fi, int li, osip_trace_level_t level, char *chfr, va_list ap){
233 int ortp_level=ORTP_DEBUG;
239 ortp_level=ORTP_MESSAGE;
242 ortp_level=ORTP_WARNING;
246 ortp_level=ORTP_ERROR;
249 ortp_level=ORTP_FATAL;
251 case END_TRACE_LEVEL:
254 if (ortp_log_level_enabled(level)){
255 int len=strlen(chfr);
256 char *chfrdup=ortp_strdup(chfr);
257 /*need to remove endline*/
259 if (chfrdup[len-1]=='\n')
261 if (chfrdup[len-2]=='\r')
264 ortp_logv(ortp_level,chfrdup,ap);
271 static bool_t firsttime=TRUE;
274 osip_trace_initialize_func (OSIP_INFO4,&_osip_trace_func);
279 sal->keepalive_period=30;
280 sal->double_reg=TRUE;
281 sal->use_rports=TRUE;
283 sal->reuse_authorization=FALSE;
285 sal->verify_server_certs=TRUE;
289 void sal_uninit(Sal* sal){
292 ms_free(sal->rootCa);
296 void sal_set_user_pointer(Sal *sal, void *user_data){
300 void *sal_get_user_pointer(const Sal *sal){
304 static void unimplemented_stub(){
305 ms_warning("Unimplemented SAL callback");
308 void sal_set_callbacks(Sal *ctx, const SalCallbacks *cbs){
309 memcpy(&ctx->callbacks,cbs,sizeof(*cbs));
310 if (ctx->callbacks.call_received==NULL)
311 ctx->callbacks.call_received=(SalOnCallReceived)unimplemented_stub;
312 if (ctx->callbacks.call_ringing==NULL)
313 ctx->callbacks.call_ringing=(SalOnCallRinging)unimplemented_stub;
314 if (ctx->callbacks.call_accepted==NULL)
315 ctx->callbacks.call_accepted=(SalOnCallAccepted)unimplemented_stub;
316 if (ctx->callbacks.call_failure==NULL)
317 ctx->callbacks.call_failure=(SalOnCallFailure)unimplemented_stub;
318 if (ctx->callbacks.call_terminated==NULL)
319 ctx->callbacks.call_terminated=(SalOnCallTerminated)unimplemented_stub;
320 if (ctx->callbacks.call_released==NULL)
321 ctx->callbacks.call_released=(SalOnCallReleased)unimplemented_stub;
322 if (ctx->callbacks.call_updating==NULL)
323 ctx->callbacks.call_updating=(SalOnCallUpdating)unimplemented_stub;
324 if (ctx->callbacks.auth_requested==NULL)
325 ctx->callbacks.auth_requested=(SalOnAuthRequested)unimplemented_stub;
326 if (ctx->callbacks.auth_success==NULL)
327 ctx->callbacks.auth_success=(SalOnAuthSuccess)unimplemented_stub;
328 if (ctx->callbacks.register_success==NULL)
329 ctx->callbacks.register_success=(SalOnRegisterSuccess)unimplemented_stub;
330 if (ctx->callbacks.register_failure==NULL)
331 ctx->callbacks.register_failure=(SalOnRegisterFailure)unimplemented_stub;
332 if (ctx->callbacks.dtmf_received==NULL)
333 ctx->callbacks.dtmf_received=(SalOnDtmfReceived)unimplemented_stub;
334 if (ctx->callbacks.notify==NULL)
335 ctx->callbacks.notify=(SalOnNotify)unimplemented_stub;
336 if (ctx->callbacks.notify_presence==NULL)
337 ctx->callbacks.notify_presence=(SalOnNotifyPresence)unimplemented_stub;
338 if (ctx->callbacks.subscribe_received==NULL)
339 ctx->callbacks.subscribe_received=(SalOnSubscribeReceived)unimplemented_stub;
340 if (ctx->callbacks.text_received==NULL)
341 ctx->callbacks.text_received=(SalOnTextReceived)unimplemented_stub;
342 if (ctx->callbacks.ping_reply==NULL)
343 ctx->callbacks.ping_reply=(SalOnPingReply)unimplemented_stub;
346 int sal_unlisten_ports(Sal *ctx){
355 int sal_listen_port(Sal *ctx, const char *addr, int port, SalTransport tr, int is_secure){
358 int proto=IPPROTO_UDP;
359 int keepalive = ctx->keepalive_period;
362 case SalTransportUDP:
364 eXosip_set_option (EXOSIP_OPT_UDP_KEEP_ALIVE, &keepalive);
366 case SalTransportTCP:
367 case SalTransportTLS:
370 eXosip_set_option (EXOSIP_OPT_UDP_KEEP_ALIVE,&keepalive);
373 eXosip_tls_ctx_t tlsCtx;
374 memset(&tlsCtx, 0, sizeof(tlsCtx));
375 snprintf(tlsCtx.root_ca_cert, sizeof(tlsCtx.client.cert), "%s", ctx->rootCa);
376 eXosip_set_tls_ctx(&tlsCtx);
378 #ifdef HAVE_EXOSIP_TLS_VERIFY_CERTIFICATE
379 eXosip_tls_verify_certificate(ctx->verify_server_certs);
383 ms_warning("unexpected proto, using datagram");
385 /*see if it looks like an IPv6 address*/
386 int use_rports = ctx->use_rports; // Copy char to int to avoid bad alignment
387 eXosip_set_option(EXOSIP_OPT_USE_RPORT,&use_rports);
388 int dont_use_101 = !ctx->use_101; // Copy char to int to avoid bad alignment
389 eXosip_set_option(EXOSIP_OPT_DONT_SEND_101,&dont_use_101);
391 ipv6=strchr(addr,':')!=NULL;
392 eXosip_enable_ipv6(ipv6);
394 if (is_secure && tr == SalTransportUDP){
395 ms_fatal("SIP over DTLS is not supported yet.");
398 err=eXosip_listen_addr(proto, addr, port, ipv6 ? PF_INET6 : PF_INET, is_secure);
403 ortp_socket_t sal_get_socket(Sal *ctx){
404 #ifdef HAVE_EXOSIP_GET_SOCKET
405 return eXosip_get_socket(IPPROTO_UDP);
407 ms_warning("Sorry, eXosip does not have eXosip_get_socket() method");
412 void sal_set_user_agent(Sal *ctx, const char *user_agent){
413 eXosip_set_user_agent(user_agent);
416 void sal_use_session_timers(Sal *ctx, int expires){
417 ctx->session_expires=expires;
420 void sal_use_one_matching_codec_policy(Sal *ctx, bool_t one_matching_codec){
421 ctx->one_matching_codec=one_matching_codec;
424 MSList *sal_get_pending_auths(Sal *sal){
425 return ms_list_copy(sal->pending_auths);
428 void sal_use_double_registrations(Sal *ctx, bool_t enabled){
429 ctx->double_reg=enabled;
432 void sal_use_rport(Sal *ctx, bool_t use_rports){
433 ctx->use_rports=use_rports;
435 void sal_use_101(Sal *ctx, bool_t use_101){
436 ctx->use_101=use_101;
439 void sal_set_root_ca(Sal* ctx, const char* rootCa) {
441 ms_free(ctx->rootCa);
442 ctx->rootCa = ms_strdup(rootCa);
445 void sal_verify_server_certificates(Sal *ctx, bool_t verify){
446 ctx->verify_server_certs=verify;
447 #ifdef HAVE_EXOSIP_TLS_VERIFY_CERTIFICATE
448 eXosip_tls_verify_certificate(verify);
452 static int extract_received_rport(osip_message_t *msg, const char **received, int *rportval,SalTransport* transport){
453 osip_via_t *via=NULL;
454 osip_generic_param_t *param=NULL;
455 const char *rport=NULL;
459 osip_message_get_via(msg,0,&via);
461 ms_warning("extract_received_rport(): no via.");
465 *transport = sal_transport_parse(via->protocol);
467 if (via->port && via->port[0]!='\0')
468 *rportval=atoi(via->port);
470 osip_via_param_get_byname(via,"rport",¶m);
473 if (rport && rport[0]!='\0') *rportval=atoi(rport);
477 osip_via_param_get_byname(via,"received",¶m);
478 if (param) *received=param->gvalue;
480 if (rport==NULL && *received==NULL){
481 ms_warning("extract_received_rport(): no rport and no received parameters.");
487 static void set_sdp(osip_message_t *sip,sdp_message_t *msg){
491 sdp_message_to_str(msg,&sdp);
493 snprintf(clen,sizeof(clen),"%i",sdplen);
494 osip_message_set_body(sip,sdp,sdplen);
495 osip_message_set_content_type(sip,"application/sdp");
496 osip_message_set_content_length(sip,clen);
500 static void set_sdp_from_desc(osip_message_t *sip, const SalMediaDescription *desc){
501 sdp_message_t *msg=media_description_to_sdp(desc);
503 ms_error("Fail to print sdp message !");
507 sdp_message_free(msg);
510 static void sdp_process(SalOp *h){
511 ms_message("Doing SDP offer/answer process");
513 sal_media_description_unref(h->result);
515 h->result=sal_media_description_new();
516 if (h->sdp_offering){
517 offer_answer_initiate_outgoing(h->base.local_media,h->base.remote_media,h->result);
520 offer_answer_initiate_incoming(h->base.local_media,h->base.remote_media,h->result,h->base.root->one_matching_codec);
521 h->sdp_answer=media_description_to_sdp(h->result);
522 /*once we have generated the SDP answer, we modify the result description for processing by the upper layer.
523 It should contains media parameters constraint from the remote offer, not our response*/
524 strcpy(h->result->addr,h->base.remote_media->addr);
525 h->result->bandwidth=h->base.remote_media->bandwidth;
527 for(i=0;i<h->result->nstreams;++i){
528 if (h->result->streams[i].port>0){
529 strcpy(h->result->streams[i].addr,h->base.remote_media->streams[i].addr);
530 h->result->streams[i].ptime=h->base.remote_media->streams[i].ptime;
531 h->result->streams[i].bandwidth=h->base.remote_media->streams[i].bandwidth;
532 h->result->streams[i].port=h->base.remote_media->streams[i].port;
534 if (h->result->streams[i].proto == SalProtoRtpSavp) {
535 h->result->streams[i].crypto[0] = h->base.remote_media->streams[i].crypto[0];
543 int sal_call_is_offerer(const SalOp *h){
544 return h->sdp_offering;
547 int sal_call_set_local_media_description(SalOp *h, SalMediaDescription *desc){
549 sal_media_description_ref(desc);
550 if (h->base.local_media)
551 sal_media_description_unref(h->base.local_media);
552 h->base.local_media=desc;
556 int sal_call(SalOp *h, const char *from, const char *to){
559 osip_message_t *invite=NULL;
560 sal_op_set_from(h,from);
562 sal_exosip_fix_route(h);
564 h->terminated = FALSE;
566 route = sal_op_get_route(h);
567 err=eXosip_call_build_initial_invite(&invite,to,from,route,"Phone call");
569 ms_error("Could not create call. Error %d (from=%s to=%s route=%s)",
570 err, from, to, route);
573 osip_message_set_allow(invite, "INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, NOTIFY, MESSAGE, SUBSCRIBE, INFO");
574 if (h->base.contact){
575 _osip_list_set_empty(&invite->contacts,(void (*)(void*))osip_contact_free);
576 osip_message_set_contact(invite,h->base.contact);
578 if (h->base.root->session_expires!=0){
579 osip_message_set_header(invite, "Session-expires", "200");
580 osip_message_set_supported(invite, "timer");
582 if (h->base.local_media){
583 h->sdp_offering=TRUE;
584 set_sdp_from_desc(invite,h->base.local_media);
585 }else h->sdp_offering=FALSE;
587 osip_message_set_header(invite,"Replaces",h->replaces);
589 osip_message_set_header(invite,"Referred-By",h->referred_by);
593 err=eXosip_call_send_initial_invite(invite);
597 ms_error("Fail to send invite ! Error code %d", err);
600 sal_add_call(h->base.root,h);
605 int sal_call_notify_ringing(SalOp *h, bool_t early_media){
608 /*if early media send also 180 and 183 */
609 if (early_media && h->sdp_answer){
612 eXosip_call_build_answer(h->tid,180,&msg);
614 set_sdp(msg,h->sdp_answer);
615 eXosip_call_send_answer(h->tid,180,msg);
618 eXosip_call_build_answer(h->tid,183,&msg);
620 set_sdp(msg,h->sdp_answer);
621 eXosip_call_send_answer(h->tid,183,msg);
626 eXosip_call_send_answer(h->tid,180,NULL);
632 int sal_call_accept(SalOp * h){
634 const char *contact=sal_op_get_contact(h);
636 int err=eXosip_call_build_answer(h->tid,200,&msg);
637 if (err<0 || msg==NULL){
638 ms_error("Fail to build answer for call: err=%i",err);
641 if (h->base.root->session_expires!=0){
642 if (h->supports_session_timers) osip_message_set_supported(msg, "timer");
646 _osip_list_set_empty(&msg->contacts,(void (*)(void*))osip_contact_free);
647 osip_message_set_contact(msg,contact);
650 if (h->base.local_media){
651 /*this is the case where we received an invite without SDP*/
652 if (h->sdp_offering) {
653 set_sdp_from_desc(msg,h->base.local_media);
656 set_sdp(msg,h->sdp_answer);
657 sdp_message_free(h->sdp_answer);
662 ms_error("You are accepting a call but not defined any media capabilities !");
664 eXosip_call_send_answer(h->tid,200,msg);
668 int sal_call_decline(SalOp *h, SalReason reason, const char *redirect){
669 if (reason==SalReasonBusy){
671 eXosip_call_send_answer(h->tid,486,NULL);
674 else if (reason==SalReasonTemporarilyUnavailable){
676 eXosip_call_send_answer(h->tid,480,NULL);
678 }else if (reason==SalReasonDoNotDisturb){
680 eXosip_call_send_answer(h->tid,600,NULL);
682 }else if (reason==SalReasonMedia){
684 eXosip_call_send_answer(h->tid,415,NULL);
686 }else if (redirect!=NULL && reason==SalReasonRedirect){
689 if (strstr(redirect,"sip:")!=0) code=302;
692 eXosip_call_build_answer(h->tid,code,&msg);
693 osip_message_set_contact(msg,redirect);
694 eXosip_call_send_answer(h->tid,code,msg);
696 }else sal_call_terminate(h);
700 SalMediaDescription * sal_call_get_final_media_description(SalOp *h){
701 if (h->base.local_media && h->base.remote_media && !h->result){
707 int sal_call_set_referer(SalOp *h, SalOp *refered_call){
708 if (refered_call->replaces)
709 h->replaces=ms_strdup(refered_call->replaces);
710 if (refered_call->referred_by)
711 h->referred_by=ms_strdup(refered_call->referred_by);
715 int sal_ping(SalOp *op, const char *from, const char *to){
716 osip_message_t *options=NULL;
718 sal_op_set_from(op,from);
719 sal_op_set_to(op,to);
721 /*bug here: eXosip2 does not honor the route argument*/
722 eXosip_options_build_request (&options, sal_op_get_to(op),
723 sal_op_get_from(op),sal_op_get_route(op));
725 if (op->base.root->session_expires!=0){
726 osip_message_set_header(options, "Session-expires", "200");
727 osip_message_set_supported(options, "timer");
729 sal_add_other(sal_op_get_sal(op),op,options);
730 return eXosip_options_send_request(options);
735 int sal_call_accept_refer(SalOp *op){
736 osip_message_t *msg=NULL;
739 err = eXosip_call_build_notify(op->did,EXOSIP_SUBCRSTATE_ACTIVE,&msg);
742 osip_message_set_header(msg,(const char *)"event","refer");
743 osip_message_set_content_type(msg,"message/sipfrag");
744 osip_message_set_body(msg,"SIP/2.0 100 Trying",sizeof("SIP/2.0 100 Trying"));
745 eXosip_call_send_request(op->did,msg);
749 ms_error("could not get a notify built\n");
755 int sal_call_refer(SalOp *h, const char *refer_to){
756 osip_message_t *msg=NULL;
759 eXosip_call_build_refer(h->did,refer_to, &msg);
760 if (msg) err=eXosip_call_send_request(h->did, msg);
766 int sal_call_refer_with_replaces(SalOp *h, SalOp *other_call_h){
767 osip_message_t *msg=NULL;
768 char referto[256]={0};
771 if (eXosip_call_get_referto(other_call_h->did,referto,sizeof(referto)-1)!=0){
772 ms_error("eXosip_call_get_referto() failed for did=%i",other_call_h->did);
776 eXosip_call_build_refer(h->did,referto, &msg);
777 osip_message_set_header(msg,"Referred-By",h->base.from);
778 if (msg) err=eXosip_call_send_request(h->did, msg);
784 SalOp *sal_call_get_replaces(SalOp *h){
785 if (h!=NULL && h->replaces!=NULL){
788 cid=eXosip_call_find_by_replaces(h->replaces);
791 SalOp *ret=sal_find_call(h->base.root,cid);
798 int sal_call_send_dtmf(SalOp *h, char dtmf){
799 osip_message_t *msg=NULL;
804 eXosip_call_build_info(h->did,&msg);
806 snprintf(dtmf_body, sizeof(dtmf_body), "Signal=%c\r\nDuration=250\r\n", dtmf);
807 osip_message_set_body(msg,dtmf_body,strlen(dtmf_body));
808 osip_message_set_content_type(msg,"application/dtmf-relay");
809 snprintf(clen,sizeof(clen),"%lu",(unsigned long)strlen(dtmf_body));
810 osip_message_set_content_length(msg,clen);
811 eXosip_call_send_request(h->did,msg);
817 static void push_auth_to_exosip(const SalAuthInfo *info){
819 if (info->userid==NULL || info->userid[0]=='\0') userid=info->username;
820 else userid=info->userid;
821 ms_message("Authentication info for username [%s], id[%s], realm [%s] added to eXosip", info->username,userid, info->realm);
822 eXosip_add_authentication_info (info->username,userid,
823 info->password, NULL,info->realm);
826 * Just for symmetry ;-)
828 static void pop_auth_from_exosip() {
829 eXosip_clear_authentication_info();
832 int sal_call_terminate(SalOp *h){
834 if (h == NULL) return -1;
835 if (h->auth_info) push_auth_to_exosip(h->auth_info);
837 err=eXosip_call_terminate(h->cid,h->did);
839 if (!h->base.root->reuse_authorization) pop_auth_from_exosip();
841 ms_warning("Exosip could not terminate the call: cid=%i did=%i", h->cid,h->did);
847 void sal_op_authenticate(SalOp *h, const SalAuthInfo *info){
848 if (h->pending_auth){
849 push_auth_to_exosip(info);
851 /*FIXME exosip does not take into account this update register message*/
853 if (fix_message_contact(h, h->pending_auth->request,h->pending_auth->response)) {
857 update_contact_from_response(h,h->pending_auth->response);
859 eXosip_default_action(h->pending_auth);
861 ms_message("eXosip_default_action() done");
862 if (!h->base.root->reuse_authorization) pop_auth_from_exosip();
864 if (h->auth_info) sal_auth_info_delete(h->auth_info); /*if already exist*/
865 h->auth_info=sal_auth_info_clone(info); /*store auth info for subsequent request*/
868 void sal_op_cancel_authentication(SalOp *h) {
870 sal_op_get_sal(h)->callbacks.register_failure(h,SalErrorFailure, SalReasonForbidden,_("Authentication failure"));
871 } else if (h->cid >0) {
872 sal_op_get_sal(h)->callbacks.call_failure(h,SalErrorFailure, SalReasonForbidden,_("Authentication failure"),0);
874 ms_warning("Auth failure not handled");
878 static void set_network_origin(SalOp *op, osip_message_t *req){
879 const char *received=NULL;
882 SalTransport transport;
883 if (extract_received_rport(req,&received,&rport,&transport)!=0){
884 osip_via_t *via=NULL;
886 osip_message_get_via(req,0,&via);
887 received=osip_via_get_host(via);
888 tmp=osip_via_get_port(via);
889 if (tmp) rport=atoi(tmp);
891 if (transport != SalTransportUDP) {
892 snprintf(origin,sizeof(origin)-1,"sip:%s:%i",received,rport);
894 snprintf(origin,sizeof(origin)-1,"sip:%s:%i;transport=%s",received,rport,sal_transport_to_string(transport));
896 __sal_op_set_network_origin(op,origin);
899 static void set_remote_ua(SalOp* op, osip_message_t *req){
900 if (op->base.remote_ua==NULL){
901 osip_header_t *h=NULL;
902 osip_message_get_user_agent(req,0,&h);
904 op->base.remote_ua=ms_strdup(h->hvalue);
909 static void set_replaces(SalOp *op, osip_message_t *req){
910 osip_header_t *h=NULL;
913 ms_free(op->replaces);
916 osip_message_header_get_byname(req,"replaces",0,&h);
918 if (h->hvalue && h->hvalue[0]!='\0'){
919 op->replaces=ms_strdup(h->hvalue);
924 static SalOp *find_op(Sal *sal, eXosip_event_t *ev){
926 return sal_find_call(sal,ev->cid);
929 return sal_find_register(sal,ev->rid);
932 return sal_find_out_subscribe(sal,ev->sid);
935 return sal_find_in_subscribe(sal,ev->nid);
937 if (ev->response) return sal_find_other(sal,ev->response);
941 static void inc_new_call(Sal *sal, eXosip_event_t *ev){
942 SalOp *op=sal_op_new(sal);
943 osip_from_t *from,*to;
944 osip_call_info_t *call_info;
946 sdp_message_t *sdp=eXosip_get_sdp_info(ev->request);
948 set_network_origin(op,ev->request);
949 set_remote_ua(op,ev->request);
950 set_replaces(op,ev->request);
953 op->sdp_offering=FALSE;
954 op->base.remote_media=sal_media_description_new();
955 sdp_to_media_description(sdp,op->base.remote_media);
956 sdp_message_free(sdp);
957 }else op->sdp_offering=TRUE;
959 from=osip_message_get_from(ev->request);
960 to=osip_message_get_to(ev->request);
961 osip_from_to_str(from,&tmp);
962 sal_op_set_from(op,tmp);
964 osip_from_to_str(to,&tmp);
965 sal_op_set_to(op,tmp);
968 osip_message_get_call_info(ev->request,0,&call_info);
971 osip_call_info_to_str(call_info,&tmp);
972 if( strstr(tmp,"answer-after=") != NULL)
974 op->auto_answer_asked=TRUE;
975 ms_message("The caller asked to automatically answer the call(Emergency?)\n");
984 sal_add_call(op->base.root,op);
985 sal->callbacks.call_received(op);
988 static void handle_reinvite(Sal *sal, eXosip_event_t *ev){
989 SalOp *op=find_op(sal,ev);
991 osip_message_t *msg=NULL;
994 ms_warning("Reinvite for non-existing operation !");
999 sdp=eXosip_get_sdp_info(ev->request);
1000 if (op->base.remote_media){
1001 sal_media_description_unref(op->base.remote_media);
1002 op->base.remote_media=NULL;
1005 sal_media_description_unref(op->result);
1009 op->sdp_offering=FALSE;
1010 op->base.remote_media=sal_media_description_new();
1011 sdp_to_media_description(sdp,op->base.remote_media);
1012 sdp_message_free(sdp);
1013 sal->callbacks.call_updating(op);
1015 op->sdp_offering=TRUE;
1017 eXosip_call_build_answer(ev->tid,200,&msg);
1019 set_sdp_from_desc(msg,op->base.local_media);
1020 eXosip_call_send_answer(ev->tid,200,msg);
1027 static void handle_ack(Sal *sal, eXosip_event_t *ev){
1028 SalOp *op=find_op(sal,ev);
1032 ms_warning("ack for non-existing call !");
1035 sdp=eXosip_get_sdp_info(ev->ack);
1037 op->base.remote_media=sal_media_description_new();
1038 sdp_to_media_description(sdp,op->base.remote_media);
1040 sdp_message_free(sdp);
1043 if (sdp) sal->callbacks.call_updating(op);
1046 sal->callbacks.call_ack(op);
1050 static void update_contact_from_response(SalOp *op, osip_message_t *response){
1051 const char *received;
1053 SalTransport transport;
1054 if (extract_received_rport(response,&received,&rport,&transport)==0){
1055 const char *contact=sal_op_get_contact(op);
1057 /*no contact given yet, use from instead*/
1058 contact=sal_op_get_from(op);
1061 SalAddress *addr=sal_address_new(contact);
1063 sal_address_set_domain(addr,received);
1064 sal_address_set_port_int(addr,rport);
1065 if (transport!=SalTransportUDP)
1066 sal_address_set_transport(addr,transport);
1067 tmp=sal_address_as_string(addr);
1068 ms_message("Contact address updated to %s",tmp);
1069 sal_op_set_contact(op,tmp);
1070 sal_address_destroy(addr);
1076 static int call_proceeding(Sal *sal, eXosip_event_t *ev){
1077 SalOp *op=find_op(sal,ev);
1079 if (op==NULL || op->terminated==TRUE) {
1080 ms_warning("This call has been canceled.");
1082 eXosip_call_terminate(ev->cid,ev->did);
1090 /* update contact if received and rport are set by the server
1091 note: will only be used by remote for next INVITE, if any...*/
1092 update_contact_from_response(op,ev->response);
1096 static void call_ringing(Sal *sal, eXosip_event_t *ev){
1098 SalOp *op=find_op(sal,ev);
1099 if (call_proceeding(sal, ev)==-1) return;
1101 set_remote_ua(op,ev->response);
1102 sdp=eXosip_get_sdp_info(ev->response);
1104 op->base.remote_media=sal_media_description_new();
1105 sdp_to_media_description(sdp,op->base.remote_media);
1106 sdp_message_free(sdp);
1107 if (op->base.local_media) sdp_process(op);
1109 sal->callbacks.call_ringing(op);
1112 static void call_accepted(Sal *sal, eXosip_event_t *ev){
1114 osip_message_t *msg=NULL;
1115 SalOp *op=find_op(sal,ev);
1116 const char *contact;
1118 if (op==NULL || op->terminated==TRUE) {
1119 ms_warning("This call has been already terminated.");
1121 eXosip_call_terminate(ev->cid,ev->did);
1127 set_remote_ua(op,ev->response);
1129 sdp=eXosip_get_sdp_info(ev->response);
1131 op->base.remote_media=sal_media_description_new();
1132 sdp_to_media_description(sdp,op->base.remote_media);
1133 sdp_message_free(sdp);
1134 if (op->base.local_media) sdp_process(op);
1136 eXosip_call_build_ack(ev->did,&msg);
1138 ms_warning("This call has been already terminated.");
1140 eXosip_call_terminate(ev->cid,ev->did);
1144 contact=sal_op_get_contact(op);
1146 _osip_list_set_empty(&msg->contacts,(void (*)(void*))osip_contact_free);
1147 osip_message_set_contact(msg,contact);
1149 if (op->sdp_answer){
1150 set_sdp(msg,op->sdp_answer);
1151 sdp_message_free(op->sdp_answer);
1152 op->sdp_answer=NULL;
1154 eXosip_call_send_ack(ev->did,msg);
1155 sal->callbacks.call_accepted(op);
1158 static void call_terminated(Sal *sal, eXosip_event_t *ev){
1160 SalOp *op=find_op(sal,ev);
1162 ms_warning("Call terminated for already closed call ?");
1166 osip_from_to_str(ev->request->from,&from);
1168 sal->callbacks.call_terminated(op,from!=NULL ? from : sal_op_get_from(op));
1169 if (from) osip_free(from);
1170 op->terminated=TRUE;
1173 static void call_released(Sal *sal, eXosip_event_t *ev){
1174 SalOp *op=find_op(sal,ev);
1176 ms_warning("No op associated to this call_released()");
1179 if (!op->terminated){
1180 /* no response received so far */
1181 call_failure(sal,ev);
1183 sal->callbacks.call_released(op);
1186 static int get_auth_data_from_response(osip_message_t *resp, const char **realm, const char **username){
1187 const char *prx_realm=NULL,*www_realm=NULL;
1188 osip_proxy_authenticate_t *prx_auth;
1189 osip_www_authenticate_t *www_auth;
1191 *username=osip_uri_get_username(resp->from->url);
1192 prx_auth=(osip_proxy_authenticate_t*)osip_list_get(&resp->proxy_authenticates,0);
1193 www_auth=(osip_proxy_authenticate_t*)osip_list_get(&resp->www_authenticates,0);
1195 prx_realm=osip_proxy_authenticate_get_realm(prx_auth);
1197 www_realm=osip_www_authenticate_get_realm(www_auth);
1201 }else if (www_realm){
1209 static int get_auth_data_from_request(osip_message_t *msg, const char **realm, const char **username){
1210 osip_authorization_t *auth=NULL;
1211 osip_proxy_authorization_t *prx_auth=NULL;
1213 *username=osip_uri_get_username(msg->from->url);
1214 osip_message_get_authorization(msg, 0, &auth);
1216 *realm=osip_authorization_get_realm(auth);
1219 osip_message_get_proxy_authorization(msg,0,&prx_auth);
1221 *realm=osip_proxy_authorization_get_realm(prx_auth);
1227 static int get_auth_data(eXosip_event_t *ev, const char **realm, const char **username){
1228 if (ev->response && get_auth_data_from_response(ev->response,realm,username)==0) return 0;
1229 if (ev->request && get_auth_data_from_request(ev->request,realm,username)==0) return 0;
1233 int sal_op_get_auth_requested(SalOp *op, const char **realm, const char **username){
1234 if (op->pending_auth){
1235 return get_auth_data(op->pending_auth,realm,username);
1240 static bool_t process_authentication(Sal *sal, eXosip_event_t *ev){
1242 const char *username,*realm;
1245 ms_warning("No operation associated with this authentication !");
1248 if (get_auth_data(ev,&realm,&username)==0){
1249 if (op->pending_auth!=NULL){
1250 eXosip_event_free(op->pending_auth);
1251 op->pending_auth=ev;
1253 op->pending_auth=ev;
1254 sal_add_pending_auth(sal,op);
1257 sal->callbacks.auth_requested(op,realm,username);
1263 static void authentication_ok(Sal *sal, eXosip_event_t *ev){
1265 const char *username,*realm;
1268 ms_warning("No operation associated with this authentication_ok!");
1271 if (op->pending_auth){
1272 eXosip_event_free(op->pending_auth);
1273 sal_remove_pending_auth(sal,op);
1274 op->pending_auth=NULL;
1276 if (get_auth_data(ev,&realm,&username)==0){
1277 sal->callbacks.auth_success(op,realm,username);
1281 static bool_t call_failure(Sal *sal, eXosip_event_t *ev){
1284 char* computedReason=NULL;
1285 const char *reason=NULL;
1286 SalError error=SalErrorUnknown;
1287 SalReason sr=SalReasonUnknown;
1290 op=(SalOp*)find_op(sal,ev);
1293 ms_warning("Call failure reported for a closed call, ignored.");
1298 code=osip_message_get_status_code(ev->response);
1299 reason=osip_message_get_reason_phrase(ev->response);
1300 osip_header_t *h=NULL;
1301 if (!osip_message_header_get_byname( ev->response
1305 computedReason = ms_strdup_printf("%s %s",reason,osip_header_get_value(h));
1306 reason = computedReason;
1314 return process_authentication(sal,ev);
1317 error=SalErrorUnknown;
1320 error=SalErrorFailure;
1321 sr=SalReasonNotFound;
1324 error=SalErrorFailure;
1328 eXosip_default_action(ev);
1332 error=SalErrorFailure;
1333 sr=SalReasonTemporarilyUnavailable;
1335 error=SalErrorFailure;
1341 error=SalErrorFailure;
1342 sr=SalReasonDoNotDisturb;
1345 error=SalErrorFailure;
1346 sr=SalReasonDeclined;
1350 error=SalErrorFailure;
1351 sr=SalReasonUnknown;
1352 }else error=SalErrorNoResponse;
1354 op->terminated=TRUE;
1355 sal->callbacks.call_failure(op,error,sr,reason,code);
1356 if (computedReason != NULL){
1357 ms_free(computedReason);
1362 /* Request remote side to send us VFU */
1363 void sal_call_send_vfu_request(SalOp *h){
1364 osip_message_t *msg=NULL;
1366 "<?xml version=\"1.0\" encoding=\"utf-8\" ?>"
1370 " <picture_fast_update></picture_fast_update>"
1378 eXosip_call_build_info(h->did,&msg);
1380 osip_message_set_body(msg,info_body,strlen(info_body));
1381 osip_message_set_content_type(msg,"application/media_control+xml");
1382 snprintf(clen,sizeof(clen),"%lu",(unsigned long)strlen(info_body));
1383 osip_message_set_content_length(msg,clen);
1384 eXosip_call_send_request(h->did,msg);
1385 ms_message("Sending VFU request !");
1390 static void process_media_control_xml(Sal *sal, eXosip_event_t *ev){
1391 SalOp *op=find_op(sal,ev);
1392 osip_body_t *body=NULL;
1395 ms_warning("media control xml received without operation context!");
1399 osip_message_get_body(ev->request,0,&body);
1400 if (body && body->body!=NULL &&
1401 strstr(body->body,"picture_fast_update")){
1402 osip_message_t *ans=NULL;
1403 ms_message("Receiving VFU request !");
1404 if (sal->callbacks.vfu_request){
1405 sal->callbacks.vfu_request(op);
1406 eXosip_call_build_answer(ev->tid,200,&ans);
1408 eXosip_call_send_answer(ev->tid,200,ans);
1412 /*in all other cases we must say it is not implemented.*/
1414 osip_message_t *ans=NULL;
1416 eXosip_call_build_answer(ev->tid,501,&ans);
1418 eXosip_call_send_answer(ev->tid,501,ans);
1423 static void process_dtmf_relay(Sal *sal, eXosip_event_t *ev){
1424 SalOp *op=find_op(sal,ev);
1425 osip_body_t *body=NULL;
1428 ms_warning("media dtmf relay received without operation context!");
1432 osip_message_get_body(ev->request,0,&body);
1433 if (body && body->body!=NULL){
1434 osip_message_t *ans=NULL;
1435 const char *name=strstr(body->body,"Signal");
1436 if (name==NULL) name=strstr(body->body,"signal");
1438 ms_warning("Could not extract the dtmf name from the SIP INFO.");
1441 name+=strlen("signal");
1442 if (sscanf(name," = %1s",tmp)==1){
1443 ms_message("Receiving dtmf %s via SIP INFO.",tmp);
1444 if (sal->callbacks.dtmf_received != NULL)
1445 sal->callbacks.dtmf_received(op, tmp[0]);
1449 eXosip_call_build_answer(ev->tid,200,&ans);
1451 eXosip_call_send_answer(ev->tid,200,ans);
1456 static void fill_options_answer(osip_message_t *options){
1457 osip_message_set_allow(options,"INVITE, ACK, BYE, CANCEL, OPTIONS, MESSAGE, SUBSCRIBE, NOTIFY, INFO");
1458 osip_message_set_accept(options,"application/sdp");
1461 static void process_refer(Sal *sal, SalOp *op, eXosip_event_t *ev){
1462 osip_header_t *h=NULL;
1463 osip_message_t *ans=NULL;
1464 ms_message("Receiving REFER request !");
1465 osip_message_header_get_byname(ev->request,"Refer-To",0,&h);
1468 osip_from_t *from=NULL;
1470 osip_from_init(&from);
1472 if (osip_from_parse(from,h->hvalue)==0){
1474 osip_uri_header_t *uh=NULL;
1475 osip_header_t *referred_by=NULL;
1476 osip_uri_header_get_byname(&from->url->url_headers,(char*)"Replaces",&uh);
1477 if (uh!=NULL && uh->gvalue && uh->gvalue[0]!='\0'){
1478 ms_message("Found replaces in Refer-To");
1480 ms_free(op->replaces);
1482 op->replaces=ms_strdup(uh->gvalue);
1484 osip_message_header_get_byname(ev->request,"Referred-By",0,&referred_by);
1485 if (referred_by && referred_by->hvalue && referred_by->hvalue[0]!='\0'){
1486 if (op->referred_by)
1487 ms_free(op->referred_by);
1488 op->referred_by=ms_strdup(referred_by->hvalue);
1491 osip_uri_header_freelist(&from->url->url_headers);
1492 osip_from_to_str(from,&tmp);
1493 sal->callbacks.refer_received(sal,op,tmp);
1495 osip_from_free(from);
1498 eXosip_call_build_answer(ev->tid,202,&ans);
1500 eXosip_call_send_answer(ev->tid,202,ans);
1505 ms_warning("cannot do anything with the refer without destination\n");
1509 static void call_message_new(Sal *sal, eXosip_event_t *ev){
1510 osip_message_t *ans=NULL;
1512 if (MSG_IS_INFO(ev->request)){
1513 osip_content_type_t *ct;
1514 ct=osip_message_get_content_type(ev->request);
1515 if (ct && ct->subtype){
1516 if (strcmp(ct->subtype,"media_control+xml")==0)
1517 process_media_control_xml(sal,ev);
1518 else if (strcmp(ct->subtype,"dtmf-relay")==0)
1519 process_dtmf_relay(sal,ev);
1521 ms_message("Unhandled SIP INFO.");
1522 /*send an "Not implemented" answer*/
1524 eXosip_call_build_answer(ev->tid,501,&ans);
1526 eXosip_call_send_answer(ev->tid,501,ans);
1530 /*empty SIP INFO, probably to test we are alive. Send an empty answer*/
1532 eXosip_call_build_answer(ev->tid,200,&ans);
1534 eXosip_call_send_answer(ev->tid,200,ans);
1537 }else if(MSG_IS_MESSAGE(ev->request)){
1538 /* SIP messages could be received into call */
1539 text_received(sal, ev);
1541 eXosip_call_build_answer(ev->tid,200,&ans);
1543 eXosip_call_send_answer(ev->tid,200,ans);
1545 }else if(MSG_IS_REFER(ev->request)){
1546 SalOp *op=find_op(sal,ev);
1548 ms_message("Receiving REFER request !");
1549 process_refer(sal,op,ev);
1550 }else if(MSG_IS_NOTIFY(ev->request)){
1551 osip_header_t *h=NULL;
1553 SalOp *op=find_op(sal,ev);
1555 ms_message("Receiving NOTIFY request !");
1556 osip_from_to_str(ev->request->from,&from);
1557 osip_message_header_get_byname(ev->request,"Event",0,&h);
1559 sal->callbacks.notify(op,from,h->hvalue);
1560 /*answer that we received the notify*/
1562 eXosip_call_build_answer(ev->tid,200,&ans);
1564 eXosip_call_send_answer(ev->tid,200,ans);
1567 }else if (MSG_IS_OPTIONS(ev->request)){
1569 eXosip_call_build_answer(ev->tid,200,&ans);
1571 fill_options_answer(ans);
1572 eXosip_call_send_answer(ev->tid,200,ans);
1576 }else ms_warning("call_message_new: No request ?");
1579 static void inc_update(Sal *sal, eXosip_event_t *ev){
1580 osip_message_t *msg=NULL;
1581 ms_message("Processing incoming UPDATE");
1583 eXosip_message_build_answer(ev->tid,200,&msg);
1585 eXosip_message_send_answer(ev->tid,200,msg);
1589 static bool_t comes_from_local_if(osip_message_t *msg){
1590 osip_via_t *via=NULL;
1591 osip_message_get_via(msg,0,&via);
1594 host=osip_via_get_host(via);
1595 if (strcmp(host,"127.0.0.1")==0 || strcmp(host,"::1")==0){
1596 osip_generic_param_t *param=NULL;
1597 osip_via_param_get_byname(via,"received",¶m);
1598 if (param==NULL) return TRUE;
1599 if (param->gvalue &&
1600 (strcmp(param->gvalue,"127.0.0.1")==0 || strcmp(param->gvalue,"::1")==0)){
1608 static void text_received(Sal *sal, eXosip_event_t *ev){
1609 osip_body_t *body=NULL;
1610 char *from=NULL,*msg;
1612 osip_message_get_body(ev->request,0,&body);
1614 ms_error("Could not get text message from SIP body");
1618 osip_from_to_str(ev->request->from,&from);
1619 sal->callbacks.text_received(sal,from,msg);
1625 static void other_request(Sal *sal, eXosip_event_t *ev){
1626 ms_message("in other_request");
1627 if (ev->request==NULL) return;
1628 if (strcmp(ev->request->sip_method,"MESSAGE")==0){
1629 text_received(sal,ev);
1630 eXosip_message_send_answer(ev->tid,200,NULL);
1631 }else if (strcmp(ev->request->sip_method,"OPTIONS")==0){
1632 osip_message_t *options=NULL;
1633 eXosip_options_build_answer(ev->tid,200,&options);
1634 fill_options_answer(options);
1635 eXosip_options_send_answer(ev->tid,200,options);
1636 }else if (strncmp(ev->request->sip_method, "REFER", 5) == 0){
1637 ms_message("Receiving REFER request !");
1638 if (comes_from_local_if(ev->request)) {
1639 process_refer(sal,NULL,ev);
1640 }else ms_warning("Ignored REFER not coming from this local loopback interface.");
1641 }else if (strncmp(ev->request->sip_method, "UPDATE", 6) == 0){
1646 osip_message_to_str(ev->request,&tmp,&msglen);
1648 ms_message("Unsupported request received:\n%s",tmp);
1651 /*answer with a 501 Not implemented*/
1652 eXosip_message_send_answer(ev->tid,501,NULL);
1656 static void masquerade_via(osip_message_t *msg, const char *ip, const char *port){
1657 osip_via_t *via=NULL;
1658 osip_message_get_via(msg,0,&via);
1660 osip_free(via->port);
1661 via->port=osip_strdup(port);
1662 osip_free(via->host);
1663 via->host=osip_strdup(ip);
1668 static bool_t fix_message_contact(SalOp *op, osip_message_t *request,osip_message_t *last_answer) {
1669 osip_contact_t *ctt=NULL;
1670 const char *received;
1672 SalTransport transport;
1675 if (extract_received_rport(last_answer,&received,&rport,&transport)==-1) return FALSE;
1676 osip_message_get_contact(request,0,&ctt);
1678 ms_warning("fix_message_contact(): no contact to update");
1681 if (ctt->url->host!=NULL){
1682 osip_free(ctt->url->host);
1684 ctt->url->host=osip_strdup(received);
1685 if (ctt->url->port!=NULL){
1686 osip_free(ctt->url->port);
1688 snprintf(port,sizeof(port),"%i",rport);
1689 ctt->url->port=osip_strdup(port);
1690 if (op->masquerade_via) masquerade_via(request,received,port);
1692 if (transport != SalTransportUDP) {
1693 sal_address_set_param((SalAddress *)ctt, "transport", sal_transport_to_string(transport));
1698 static bool_t register_again_with_updated_contact(SalOp *op, osip_message_t *orig_request, osip_message_t *last_answer){
1699 osip_contact_t *ctt=NULL;
1700 SalAddress* ori_contact_address=NULL;
1701 const char *received;
1703 SalTransport transport;
1705 osip_message_t *msg=NULL;
1706 Sal* sal=op->base.root;
1708 if (sal->double_reg==FALSE ) return FALSE;
1710 if (extract_received_rport(last_answer,&received,&rport,&transport)==-1) return FALSE;
1711 osip_message_get_contact(orig_request,0,&ctt);
1712 osip_contact_to_str(ctt,&tmp);
1713 ori_contact_address = sal_address_new(tmp);
1715 /*check if contact is up to date*/
1716 if (strcmp(sal_address_get_domain(ori_contact_address),received) ==0
1717 && sal_address_get_port_int(ori_contact_address) == rport
1718 && sal_address_get_transport(ori_contact_address) == transport) {
1719 ms_message("Register has up to date contact, doing nothing.");
1721 sal_address_destroy(ori_contact_address);
1723 } else ms_message("contact do not match, need to update the register (%s with %s:%i;transport=%s)"
1727 ,sal_transport_to_string(transport));
1729 sal_address_destroy(ori_contact_address);
1731 if (transport == SalTransportUDP) {
1733 eXosip_register_build_register(op->rid,op->expires,&msg);
1736 ms_warning("Fail to create a contact updated register.");
1739 if (fix_message_contact(op,msg,last_answer)) {
1740 eXosip_register_send_register(op->rid,msg);
1742 ms_message("Resending new register with updated contact");
1745 ms_warning("Fail to send updated register.");
1752 update_contact_from_response(op,last_answer);
1756 static void registration_success(Sal *sal, eXosip_event_t *ev){
1757 SalOp *op=sal_find_register(sal,ev->rid);
1758 osip_header_t *h=NULL;
1761 ms_error("Receiving register response for unknown operation");
1764 osip_message_get_expires(ev->request,0,&h);
1765 if (h!=NULL && atoi(h->hvalue)!=0){
1767 if (!register_again_with_updated_contact(op,ev->request,ev->response)){
1768 sal->callbacks.register_success(op,registered);
1771 sal->callbacks.register_success(op,FALSE);
1775 static bool_t registration_failure(Sal *sal, eXosip_event_t *ev){
1777 const char *reason=NULL;
1778 SalOp *op=sal_find_register(sal,ev->rid);
1779 SalReason sr=SalReasonUnknown;
1780 SalError se=SalErrorUnknown;
1783 ms_error("Receiving register failure for unknown operation");
1787 status_code=osip_message_get_status_code(ev->response);
1788 reason=osip_message_get_reason_phrase(ev->response);
1790 switch(status_code){
1793 return process_authentication(sal,ev);
1795 case 423: /*interval too brief*/
1796 {/*retry with greater interval */
1797 osip_header_t *h=NULL;
1798 osip_message_t *msg=NULL;
1799 osip_message_header_get_byname(ev->response,"min-expires",0,&h);
1800 if (h && h->hvalue && h->hvalue[0]!='\0'){
1801 int val=atoi(h->hvalue);
1802 if (val>op->expires)
1804 }else op->expires*=2;
1806 eXosip_register_build_register(op->rid,op->expires,&msg);
1807 eXosip_register_send_register(op->rid,msg);
1811 case 606: /*Not acceptable, workaround for proxies that don't like private addresses
1812 in vias, such as ekiga.net
1813 On the opposite, freephonie.net bugs when via are masqueraded.
1815 op->masquerade_via=TRUE;
1817 /* if contact is up to date, process the failure, otherwise resend a new register with
1818 updated contact first, just in case the faillure is due to incorrect contact */
1819 if (ev->response && register_again_with_updated_contact(op,ev->request,ev->response))
1820 return TRUE; /*we are retrying with an updated contact*/
1821 if (status_code==403){
1823 sr=SalReasonForbidden;
1824 }else if (status_code==0){
1825 se=SalErrorNoResponse;
1827 sal->callbacks.register_failure(op,se,sr,reason);
1832 static void other_request_reply(Sal *sal,eXosip_event_t *ev){
1833 SalOp *op=find_op(sal,ev);
1836 ms_warning("other_request_reply(): Receiving response to unknown request.");
1840 update_contact_from_response(op,ev->response);
1841 if (ev->request && strcmp(osip_message_get_method(ev->request),"OPTIONS")==0)
1842 sal->callbacks.ping_reply(op);
1846 static bool_t process_event(Sal *sal, eXosip_event_t *ev){
1847 ms_message("linphone process event get a message %d\n",ev->type);
1849 case EXOSIP_CALL_ANSWERED:
1850 ms_message("CALL_ANSWERED\n");
1851 call_accepted(sal,ev);
1852 authentication_ok(sal,ev);
1854 case EXOSIP_CALL_CLOSED:
1855 case EXOSIP_CALL_CANCELLED:
1856 ms_message("CALL_CLOSED or CANCELLED\n");
1857 call_terminated(sal,ev);
1859 case EXOSIP_CALL_TIMEOUT:
1860 case EXOSIP_CALL_NOANSWER:
1861 ms_message("CALL_TIMEOUT or NOANSWER\n");
1862 return call_failure(sal,ev);
1864 case EXOSIP_CALL_REQUESTFAILURE:
1865 case EXOSIP_CALL_GLOBALFAILURE:
1866 case EXOSIP_CALL_SERVERFAILURE:
1867 ms_message("CALL_REQUESTFAILURE or GLOBALFAILURE or SERVERFAILURE\n");
1868 return call_failure(sal,ev);
1870 case EXOSIP_CALL_RELEASED:
1871 ms_message("CALL_RELEASED\n");
1872 call_released(sal, ev);
1874 case EXOSIP_CALL_INVITE:
1875 ms_message("CALL_NEW\n");
1876 inc_new_call(sal,ev);
1878 case EXOSIP_CALL_REINVITE:
1879 handle_reinvite(sal,ev);
1881 case EXOSIP_CALL_ACK:
1882 ms_message("CALL_ACK");
1885 case EXOSIP_CALL_REDIRECTED:
1886 ms_message("CALL_REDIRECTED");
1887 eXosip_default_action(ev);
1889 case EXOSIP_CALL_PROCEEDING:
1890 ms_message("CALL_PROCEEDING");
1891 call_proceeding(sal,ev);
1893 case EXOSIP_CALL_RINGING:
1894 ms_message("CALL_RINGING");
1895 call_ringing(sal,ev);
1897 case EXOSIP_CALL_MESSAGE_NEW:
1898 ms_message("EXOSIP_CALL_MESSAGE_NEW");
1899 call_message_new(sal,ev);
1901 case EXOSIP_CALL_MESSAGE_REQUESTFAILURE:
1903 (ev->response->status_code==407 || ev->response->status_code==401)){
1904 return process_authentication(sal,ev);
1907 case EXOSIP_IN_SUBSCRIPTION_NEW:
1908 ms_message("CALL_IN_SUBSCRIPTION_NEW ");
1909 sal_exosip_subscription_recv(sal,ev);
1911 case EXOSIP_IN_SUBSCRIPTION_RELEASED:
1912 ms_message("CALL_SUBSCRIPTION_NEW ");
1913 sal_exosip_in_subscription_closed(sal,ev);
1915 case EXOSIP_SUBSCRIPTION_UPDATE:
1916 ms_message("CALL_SUBSCRIPTION_UPDATE");
1918 case EXOSIP_SUBSCRIPTION_NOTIFY:
1919 ms_message("CALL_SUBSCRIPTION_NOTIFY");
1920 sal_exosip_notify_recv(sal,ev);
1922 case EXOSIP_SUBSCRIPTION_ANSWERED:
1923 ms_message("EXOSIP_SUBSCRIPTION_ANSWERED, ev->sid=%i, ev->did=%i\n",ev->sid,ev->did);
1924 sal_exosip_subscription_answered(sal,ev);
1926 case EXOSIP_SUBSCRIPTION_CLOSED:
1927 ms_message("EXOSIP_SUBSCRIPTION_CLOSED\n");
1928 sal_exosip_subscription_closed(sal,ev);
1930 case EXOSIP_SUBSCRIPTION_REQUESTFAILURE: /**< announce a request failure */
1931 if (ev->response && (ev->response->status_code == 407 || ev->response->status_code == 401)){
1932 return process_authentication(sal,ev);
1934 case EXOSIP_SUBSCRIPTION_SERVERFAILURE:
1935 case EXOSIP_SUBSCRIPTION_GLOBALFAILURE:
1936 sal_exosip_subscription_closed(sal,ev);
1938 case EXOSIP_REGISTRATION_FAILURE:
1939 ms_message("REGISTRATION_FAILURE\n");
1940 return registration_failure(sal,ev);
1942 case EXOSIP_REGISTRATION_SUCCESS:
1943 authentication_ok(sal,ev);
1944 registration_success(sal,ev);
1946 case EXOSIP_MESSAGE_NEW:
1947 other_request(sal,ev);
1949 case EXOSIP_MESSAGE_PROCEEDING:
1950 case EXOSIP_MESSAGE_ANSWERED:
1951 case EXOSIP_MESSAGE_REDIRECTED:
1952 case EXOSIP_MESSAGE_SERVERFAILURE:
1953 case EXOSIP_MESSAGE_GLOBALFAILURE:
1954 other_request_reply(sal,ev);
1956 case EXOSIP_MESSAGE_REQUESTFAILURE:
1957 case EXOSIP_NOTIFICATION_REQUESTFAILURE:
1959 switch (ev->response->status_code) {
1962 return process_authentication(sal,ev);
1964 eXosip_automatic_action ();
1969 other_request_reply(sal,ev);
1972 ms_message("Unhandled exosip event ! %i",ev->type);
1978 int sal_iterate(Sal *sal){
1980 while((ev=eXosip_event_wait(0,0))!=NULL){
1981 if (process_event(sal,ev))
1982 eXosip_event_free(ev);
1985 eXosip_automatic_refresh();
1990 static void register_set_contact(osip_message_t *msg, const char *contact){
1991 osip_uri_param_t *param = NULL;
1992 osip_contact_t *ct=NULL;
1994 /*we get the line parameter choosed by exosip, and add it to our own contact*/
1995 osip_message_get_contact(msg,0,&ct);
1997 osip_uri_uparam_get_byname(ct->url, "line", ¶m);
1998 if (param && param->gvalue)
1999 line=osip_strdup(param->gvalue);
2001 _osip_list_set_empty(&msg->contacts,(void (*)(void*))osip_contact_free);
2002 osip_message_set_contact(msg,contact);
2003 osip_message_get_contact(msg,0,&ct);
2004 osip_uri_uparam_add(ct->url,osip_strdup("line"),line);
2007 static void sal_register_add_route(osip_message_t *msg, const char *proxy){
2009 snprintf(tmp,sizeof(tmp)-1,"<%s;lr>",proxy);
2011 osip_list_special_free(&msg->routes,(void (*)(void*))osip_route_free);
2012 osip_message_set_route(msg,tmp);
2015 int sal_register(SalOp *h, const char *proxy, const char *from, int expires){
2016 osip_message_t *msg;
2017 const char *contact=sal_op_get_contact(h);
2019 sal_op_set_route(h,proxy);
2021 SalAddress *from_parsed=sal_address_new(from);
2023 if (from_parsed==NULL) {
2024 ms_warning("sal_register() bad from %s",from);
2027 snprintf(domain,sizeof(domain),"sip:%s",sal_address_get_domain(from_parsed));
2028 sal_address_destroy(from_parsed);
2030 h->rid=eXosip_register_build_initial_register(from,domain,NULL,expires,&msg);
2032 if (contact) register_set_contact(msg,contact);
2033 sal_register_add_route(msg,proxy);
2034 sal_add_register(h->base.root,h);
2036 ms_error("Could not build initial register.");
2042 eXosip_register_build_register(h->rid,expires,&msg);
2043 sal_register_add_route(msg,proxy);
2045 eXosip_register_send_register(h->rid,msg);
2051 int sal_register_refresh(SalOp *op, int expires){
2052 osip_message_t *msg=NULL;
2053 const char *contact=sal_op_get_contact(op);
2056 ms_error("Unexistant registration context, not possible to refresh.");
2060 eXosip_register_build_register(op->rid,expires,&msg);
2062 if (contact) register_set_contact(msg,contact);
2063 sal_register_add_route(msg,sal_op_get_route(op));
2064 eXosip_register_send_register(op->rid,msg);
2065 }else ms_error("Could not build REGISTER refresh message.");
2071 int sal_unregister(SalOp *h){
2072 osip_message_t *msg=NULL;
2074 eXosip_register_build_register(h->rid,0,&msg);
2075 if (msg) eXosip_register_send_register(h->rid,msg);
2076 else ms_warning("Could not build unREGISTER !");
2081 SalAddress * sal_address_new(const char *uri){
2083 osip_from_init(&from);
2085 // Remove front spaces
2086 while (uri[0]==' ') {
2090 if (osip_from_parse(from,uri)!=0){
2091 osip_from_free(from);
2094 if (from->displayname!=NULL && from->displayname[0]=='"'){
2095 char *unquoted=osip_strdup_without_quote(from->displayname);
2096 osip_free(from->displayname);
2097 from->displayname=unquoted;
2099 return (SalAddress*)from;
2102 SalAddress * sal_address_clone(const SalAddress *addr){
2103 osip_from_t *ret=NULL;
2104 osip_from_clone((osip_from_t*)addr,&ret);
2105 return (SalAddress*)ret;
2108 #define null_if_empty(s) (((s)!=NULL && (s)[0]!='\0') ? (s) : NULL )
2110 const char *sal_address_get_scheme(const SalAddress *addr){
2111 const osip_from_t *u=(const osip_from_t*)addr;
2112 return null_if_empty(u->url->scheme);
2115 const char *sal_address_get_display_name(const SalAddress* addr){
2116 const osip_from_t *u=(const osip_from_t*)addr;
2117 return null_if_empty(u->displayname);
2120 const char *sal_address_get_username(const SalAddress *addr){
2121 const osip_from_t *u=(const osip_from_t*)addr;
2122 return null_if_empty(u->url->username);
2125 const char *sal_address_get_domain(const SalAddress *addr){
2126 const osip_from_t *u=(const osip_from_t*)addr;
2127 return null_if_empty(u->url->host);
2130 void sal_address_set_display_name(SalAddress *addr, const char *display_name){
2131 osip_from_t *u=(osip_from_t*)addr;
2132 if (u->displayname!=NULL){
2133 osip_free(u->displayname);
2134 u->displayname=NULL;
2136 if (display_name!=NULL && display_name[0]!='\0'){
2137 u->displayname=osip_strdup(display_name);
2141 void sal_address_set_username(SalAddress *addr, const char *username){
2142 osip_from_t *uri=(osip_from_t*)addr;
2143 if (uri->url->username!=NULL){
2144 osip_free(uri->url->username);
2145 uri->url->username=NULL;
2148 uri->url->username=osip_strdup(username);
2151 void sal_address_set_domain(SalAddress *addr, const char *host){
2152 osip_from_t *uri=(osip_from_t*)addr;
2153 if (uri->url->host!=NULL){
2154 osip_free(uri->url->host);
2155 uri->url->host=NULL;
2158 uri->url->host=osip_strdup(host);
2161 void sal_address_set_port(SalAddress *addr, const char *port){
2162 osip_from_t *uri=(osip_from_t*)addr;
2163 if (uri->url->port!=NULL){
2164 osip_free(uri->url->port);
2165 uri->url->port=NULL;
2168 uri->url->port=osip_strdup(port);
2171 void sal_address_set_port_int(SalAddress *uri, int port){
2174 /*this is the default, special case to leave the port field blank*/
2175 sal_address_set_port(uri,NULL);
2178 snprintf(tmp,sizeof(tmp),"%i",port);
2179 sal_address_set_port(uri,tmp);
2182 void sal_address_clean(SalAddress *addr){
2183 osip_generic_param_freelist(& ((osip_from_t*)addr)->gen_params);
2184 osip_uri_param_freelist(& ((osip_from_t*)addr)->url->url_params);
2187 char *sal_address_as_string(const SalAddress *u){
2189 osip_from_t *from=(osip_from_t *)u;
2190 char *old_displayname=NULL;
2191 /* hack to force use of quotes around the displayname*/
2192 if (from->displayname!=NULL
2193 && from->displayname[0]!='"'){
2194 old_displayname=from->displayname;
2195 from->displayname=osip_enquote(from->displayname);
2197 osip_from_to_str(from,&tmp);
2198 if (old_displayname!=NULL){
2199 ms_free(from->displayname);
2200 from->displayname=old_displayname;
2207 char *sal_address_as_string_uri_only(const SalAddress *u){
2208 char *tmp=NULL,*ret;
2209 osip_uri_to_str(((osip_from_t*)u)->url,&tmp);
2214 void sal_address_set_param(SalAddress *u,const char* name,const char* value) {
2215 osip_uri_param_t *param=NULL;
2216 osip_uri_uparam_get_byname(((osip_from_t*)u)->url,(char*)name,¶m);
2218 osip_uri_uparam_add (((osip_from_t*)u)->url,ms_strdup(name),ms_strdup(value));
2220 osip_free(param->gvalue);
2221 param->gvalue=osip_strdup(value);
2226 void sal_address_destroy(SalAddress *u){
2227 osip_from_free((osip_from_t*)u);
2230 void sal_set_keepalive_period(Sal *ctx,unsigned int value) {
2231 ctx->keepalive_period=value;
2232 eXosip_set_option (EXOSIP_OPT_UDP_KEEP_ALIVE, &value);
2234 unsigned int sal_get_keepalive_period(Sal *ctx) {
2235 return ctx->keepalive_period;
2238 const char * sal_address_get_port(const SalAddress *addr) {
2239 const osip_from_t *u=(const osip_from_t*)addr;
2240 return null_if_empty(u->url->port);
2243 int sal_address_get_port_int(const SalAddress *uri) {
2244 const char* port = sal_address_get_port(uri);
2251 SalTransport sal_address_get_transport(const SalAddress* addr) {
2252 const osip_from_t *u=(const osip_from_t*)addr;
2253 osip_uri_param_t *transport_param=NULL;
2254 osip_uri_uparam_get_byname(u->url,"transport",&transport_param);
2255 if (transport_param == NULL){
2256 return SalTransportUDP;
2258 return sal_transport_parse(transport_param->gvalue);
2261 void sal_address_set_transport(SalAddress* addr,SalTransport transport) {
2262 sal_address_set_param(addr, "transport", sal_transport_to_string(transport));
2265 /* sends a reinvite. Local media description may have changed by application since call establishment*/
2266 int sal_call_update(SalOp *h, const char *subject){
2268 osip_message_t *reinvite=NULL;
2271 if(eXosip_call_build_request(h->did,"INVITE",&reinvite) != 0 || reinvite==NULL){
2276 osip_message_set_subject(reinvite,subject);
2277 osip_message_set_allow(reinvite, "INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, NOTIFY, MESSAGE, SUBSCRIBE, INFO");
2278 if (h->base.root->session_expires!=0){
2279 osip_message_set_header(reinvite, "Session-expires", "200");
2280 osip_message_set_supported(reinvite, "timer");
2282 if (h->base.local_media){
2283 h->sdp_offering=TRUE;
2284 set_sdp_from_desc(reinvite,h->base.local_media);
2285 }else h->sdp_offering=FALSE;
2287 err = eXosip_call_send_request(h->did, reinvite);
2291 void sal_reuse_authorization(Sal *ctx, bool_t value) {
2292 ctx->reuse_authorization=value;