From 78ad76dd750c3711a78c33998d4fd6507023a32f Mon Sep 17 00:00:00 2001 From: Jehan Monnier Date: Fri, 21 May 2010 15:52:14 +0200 Subject: [PATCH 1/6] add new gstate REG_PENDING, OUT_RINGING concatenate Reason header with reason phrase in case of state error --- .cproject | 27 +++++++++++++++++++++++++-- coreapi/callbacks.c | 5 +++-- coreapi/linphonecore.h | 4 +++- coreapi/proxy.c | 6 +++++- coreapi/sal_eXosip2.c | 14 ++++++++++++++ 5 files changed, 50 insertions(+), 6 deletions(-) diff --git a/.cproject b/.cproject index 4dc56ec67..869153cf5 100644 --- a/.cproject +++ b/.cproject @@ -1,4 +1,4 @@ - + @@ -7,6 +7,8 @@ + + @@ -18,7 +20,7 @@ - + @@ -201,6 +203,27 @@ + + + + + +make +all +true +true +true + + +make + +install +true +true +true + + + diff --git a/coreapi/callbacks.c b/coreapi/callbacks.c index f15404dbf..018ce5343 100644 --- a/coreapi/callbacks.c +++ b/coreapi/callbacks.c @@ -124,6 +124,7 @@ static void call_ringing(SalOp *h){ if (lc->sound_conf.play_sndcard!=NULL){ ms_message("Remote ringing..."); lc->ringstream=ring_start(lc->sound_conf.remote_ring,2000,lc->sound_conf.play_sndcard); + gstate_new_state(lc, GSTATE_CALL_OUT_RINGING, NULL); } }else{ /*accept early media */ @@ -137,7 +138,7 @@ static void call_ringing(SalOp *h){ if (lc->vtable.show) lc->vtable.show(lc); if (lc->vtable.display_status) lc->vtable.display_status(lc,_("Early media.")); - gstate_new_state(lc, GSTATE_CALL_OUT_CONNECTED, NULL); + gstate_new_state(lc, GSTATE_CALL_OUT_RINGING, NULL); if (lc->ringstream!=NULL){ ring_stop(lc->ringstream); lc->ringstream=NULL; @@ -270,7 +271,7 @@ static void call_failure(SalOp *op, SalError error, SalReason sr, const char *de /*char *retrymsg=_("%s. Retry after %i minute(s).");*/ char *msg600=_("User does not want to be disturbed."); char *msg603=_("Call declined."); - char *msg=NULL; + char *msg=(char*)details; LinphoneCall *call=lc->call; if (sal_op_get_user_pointer(op)!=lc->call){ diff --git a/coreapi/linphonecore.h b/coreapi/linphonecore.h index 945ea25ea..e38f0373f 100644 --- a/coreapi/linphonecore.h +++ b/coreapi/linphonecore.h @@ -345,6 +345,7 @@ typedef enum _gstate { GSTATE_REG_NONE = 10, /* initial state */ GSTATE_REG_OK, GSTATE_REG_FAILED, + GSTATE_REG_PENDING, /* a registration request is ongoing*/ /* states for GSTATE_GROUP_CALL */ GSTATE_CALL_IDLE = 20, /* initial state */ GSTATE_CALL_OUT_INVITE, @@ -353,7 +354,8 @@ typedef enum _gstate { GSTATE_CALL_IN_CONNECTED, GSTATE_CALL_END, GSTATE_CALL_ERROR, - GSTATE_INVALID + GSTATE_INVALID, + GSTATE_CALL_OUT_RINGING /*remote ringing*/ } gstate_t; struct _LinphoneGeneralState { diff --git a/coreapi/proxy.c b/coreapi/proxy.c index 591103154..bf4e0613a 100644 --- a/coreapi/proxy.c +++ b/coreapi/proxy.c @@ -239,7 +239,11 @@ static void linphone_proxy_config_register(LinphoneProxyConfig *obj){ sal_op_release(obj->op); obj->op=sal_op_new(obj->lc->sal); sal_op_set_user_pointer(obj->op,obj); - sal_register(obj->op,obj->reg_proxy,obj->reg_identity,obj->expires); + if (!sal_register(obj->op,obj->reg_proxy,obj->reg_identity,obj->expires)) { + gstate_new_state(obj->lc,GSTATE_REG_PENDING,NULL); + } else { + gstate_new_state(obj->lc,GSTATE_REG_FAILED,NULL); + } } } diff --git a/coreapi/sal_eXosip2.c b/coreapi/sal_eXosip2.c index ba5730139..068a2aac5 100644 --- a/coreapi/sal_eXosip2.c +++ b/coreapi/sal_eXosip2.c @@ -994,10 +994,12 @@ static void authentication_ok(Sal *sal, eXosip_event_t *ev){ static bool_t call_failure(Sal *sal, eXosip_event_t *ev){ SalOp *op; int code=0; + char* computedReason=NULL; const char *reason=NULL; SalError error=SalErrorUnknown; SalReason sr=SalReasonUnknown; + op=(SalOp*)find_op(sal,ev); if (op==NULL) { @@ -1008,6 +1010,15 @@ static bool_t call_failure(Sal *sal, eXosip_event_t *ev){ if (ev->response){ code=osip_message_get_status_code(ev->response); reason=osip_message_get_reason_phrase(ev->response); + osip_header_t *h=NULL; + if (!osip_message_header_get_byname( ev->response + ,"Reason" + ,0 + ,&h)) { + computedReason = ms_strdup_printf("%s %s",reason,osip_header_get_value(h)); + reason = computedReason; + + } } switch(code) { @@ -1054,6 +1065,9 @@ static bool_t call_failure(Sal *sal, eXosip_event_t *ev){ }else error=SalErrorNoResponse; } sal->callbacks.call_failure(op,error,sr,reason); + if (computedReason != NULL){ + ms_free(computedReason); + } return TRUE; } From 7dbef1d1b4596dcdae6e09c89862a5ff9a88ec09 Mon Sep 17 00:00:00 2001 From: Simon Morlat Date: Tue, 25 May 2010 18:08:02 +0200 Subject: [PATCH 2/6] fix bug on reinvite (streams not started) --- coreapi/callbacks.c | 2 +- mediastreamer2 | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/coreapi/callbacks.c b/coreapi/callbacks.c index f15404dbf..0f093da5c 100644 --- a/coreapi/callbacks.c +++ b/coreapi/callbacks.c @@ -229,7 +229,7 @@ static void call_updated(SalOp *op){ call->resultdesc=sal_call_get_final_media_description(op); if (call->resultdesc){ sal_media_description_ref(call->resultdesc); - if (sal_media_description_empty(call->resultdesc)){ + if (!sal_media_description_empty(call->resultdesc)){ linphone_connect_incoming(lc,call); } } diff --git a/mediastreamer2 b/mediastreamer2 index 57896d513..5d984c3ea 160000 --- a/mediastreamer2 +++ b/mediastreamer2 @@ -1 +1 @@ -Subproject commit 57896d513f6fbf41fde3c777931ebc744e53e366 +Subproject commit 5d984c3ea03d4bf40eeac257cfdd86efe2312392 From bda56cf29686a495997646fb9ceaf41e7df8e69e Mon Sep 17 00:00:00 2001 From: Simon Morlat Date: Thu, 27 May 2010 10:11:37 +0200 Subject: [PATCH 3/6] change policy regarding quotes in displaynames --- coreapi/address.c | 8 ------- coreapi/linphonecore.h | 1 - coreapi/sal_eXosip2.c | 46 +++++++++++++++++------------------------ gtk-glade/friendlist.c | 8 +++---- gtk-glade/incall_view.c | 5 ++--- gtk-glade/main.c | 2 +- gtk-glade/propertybox.c | 3 +-- 7 files changed, 26 insertions(+), 47 deletions(-) diff --git a/coreapi/address.c b/coreapi/address.c index f8051318c..1d893aede 100644 --- a/coreapi/address.c +++ b/coreapi/address.c @@ -57,14 +57,6 @@ const char *linphone_address_get_display_name(const LinphoneAddress* u){ return sal_address_get_display_name(u); } -/** - * Returns the display name without quotes. - * @note WARNING: the returned string must be freed by user. -**/ -char *linphone_address_get_display_name_unquoted(const LinphoneAddress *addr){ - return sal_address_get_display_name_unquoted(addr); -} - /** * Returns the username. **/ diff --git a/coreapi/linphonecore.h b/coreapi/linphonecore.h index 1c4b4d6cb..d0f128da8 100644 --- a/coreapi/linphonecore.h +++ b/coreapi/linphonecore.h @@ -64,7 +64,6 @@ LinphoneAddress * linphone_address_new(const char *uri); LinphoneAddress * linphone_address_clone(const LinphoneAddress *uri); const char *linphone_address_get_scheme(const LinphoneAddress *u); const char *linphone_address_get_display_name(const LinphoneAddress* u); -char *linphone_address_get_display_name_unquoted(const LinphoneAddress *u); const char *linphone_address_get_username(const LinphoneAddress *u); const char *linphone_address_get_domain(const LinphoneAddress *u); void linphone_address_set_display_name(LinphoneAddress *u, const char *display_name); diff --git a/coreapi/sal_eXosip2.c b/coreapi/sal_eXosip2.c index 990cae0dc..82af9a0fd 100644 --- a/coreapi/sal_eXosip2.c +++ b/coreapi/sal_eXosip2.c @@ -1589,18 +1589,6 @@ int sal_unregister(SalOp *h){ return 0; } -static void sal_address_quote_displayname(SalAddress *addr){ - osip_from_t *u=(osip_from_t*)addr; - if (u->displayname!=NULL && u->displayname[0]!='\0' - && u->displayname[0]!='"'){ - int len=strlen(u->displayname)+1+2; - char *quoted=osip_malloc(len); - snprintf(quoted,len,"\"%s\"",u->displayname); - osip_free(u->displayname); - u->displayname=quoted; - } -} - SalAddress * sal_address_new(const char *uri){ osip_from_t *from; osip_from_init(&from); @@ -1608,7 +1596,11 @@ SalAddress * sal_address_new(const char *uri){ osip_from_free(from); return NULL; } - sal_address_quote_displayname ((SalAddress*)from); + if (from->displayname!=NULL && from->displayname[0]!='"'){ + char *unquoted=osip_strdup_without_quote(from->displayname); + osip_free(from->displayname); + from->displayname=unquoted; + } return (SalAddress*)from; } @@ -1630,18 +1622,6 @@ const char *sal_address_get_display_name(const SalAddress* addr){ return null_if_empty(u->displayname); } -char *sal_address_get_display_name_unquoted(const SalAddress *addr){ - const osip_from_t *u=(const osip_from_t*)addr; - const char *dn=null_if_empty(u->displayname); - char *ret=NULL; - if (dn!=NULL) { - char *tmp=osip_strdup_without_quote(dn); - ret=ms_strdup(tmp); - osip_free(tmp); - } - return ret; -} - const char *sal_address_get_username(const SalAddress *addr){ const osip_from_t *u=(const osip_from_t*)addr; return null_if_empty(u->url->username); @@ -1660,7 +1640,6 @@ void sal_address_set_display_name(SalAddress *addr, const char *display_name){ } if (display_name!=NULL && display_name[0]!='\0'){ u->displayname=osip_strdup(display_name); - sal_address_quote_displayname(addr); } } @@ -1712,7 +1691,19 @@ void sal_address_clean(SalAddress *addr){ char *sal_address_as_string(const SalAddress *u){ char *tmp,*ret; - osip_from_to_str((osip_from_t*)u,&tmp); + osip_from_t *from=(osip_from_t *)u; + char *old_displayname=NULL; + /* hack to force use of quotes around the displayname*/ + if (from->displayname!=NULL + && from->displayname[0]!='"'){ + old_displayname=from->displayname; + from->displayname=osip_enquote(from->displayname); + } + osip_from_to_str(from,&tmp); + if (old_displayname!=NULL){ + ms_free(from->displayname); + from->displayname=old_displayname; + } ret=ms_strdup(tmp); osip_free(tmp); return ret; @@ -1729,6 +1720,7 @@ char *sal_address_as_string_uri_only(const SalAddress *u){ void sal_address_destroy(SalAddress *u){ osip_from_free((osip_from_t*)u); } + void sal_set_keepalive_period(Sal *ctx,unsigned int value) { eXosip_set_option (EXOSIP_OPT_UDP_KEEP_ALIVE, &value); } diff --git a/gtk-glade/friendlist.c b/gtk-glade/friendlist.c index ecb3ee963..d4fddf871 100644 --- a/gtk-glade/friendlist.c +++ b/gtk-glade/friendlist.c @@ -308,7 +308,7 @@ void linphone_gtk_show_friends(void){ LinphoneFriend *lf=(LinphoneFriend*)itf->data; const LinphoneAddress *f_uri=linphone_friend_get_address(lf); char *uri=linphone_address_as_string(f_uri); - char *name=linphone_address_get_display_name_unquoted (f_uri); + const char *name=linphone_address_get_display_name(f_uri); const char *display=name; char *escaped=NULL; if (lookup){ @@ -341,7 +341,6 @@ void linphone_gtk_show_friends(void){ } } ms_free(uri); - if (name!=NULL) ms_free(name); } } @@ -373,17 +372,16 @@ void linphone_gtk_remove_contact(GtkWidget *button){ void linphone_gtk_show_contact(LinphoneFriend *lf){ GtkWidget *w=linphone_gtk_create_window("contact"); char *uri; - char *name; + const char *name; const LinphoneAddress *f_uri=linphone_friend_get_address(lf); uri=linphone_address_as_string_uri_only(f_uri); - name=linphone_address_get_display_name_unquoted (f_uri); + name=linphone_address_get_display_name(f_uri); if (uri) { gtk_entry_set_text(GTK_ENTRY(linphone_gtk_get_widget(w,"sip_address")),uri); ms_free(uri); } if (name){ gtk_entry_set_text(GTK_ENTRY(linphone_gtk_get_widget(w,"name")),name); - ms_free(name); } gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(linphone_gtk_get_widget(w,"show_presence")), linphone_friend_get_send_subscribe(lf)); diff --git a/gtk-glade/incall_view.c b/gtk-glade/incall_view.c index 4e6baf6a3..c0ddfcbbd 100644 --- a/gtk-glade/incall_view.c +++ b/gtk-glade/incall_view.c @@ -72,7 +72,7 @@ void linphone_gtk_show_idle_view(void){ void display_peer_name_in_label(GtkWidget *label, const char *uri){ LinphoneAddress *from; - char *displayname=NULL; + const char *displayname=NULL; char *id=NULL; char *uri_label; @@ -83,14 +83,13 @@ void display_peer_name_in_label(GtkWidget *label, const char *uri){ from=linphone_address_new(uri); if (from!=NULL){ - displayname=linphone_address_get_display_name_unquoted (from); + displayname=linphone_address_get_display_name(from); id=linphone_address_as_string_uri_only(from); }else id=ms_strdup(uri); if (displayname!=NULL){ uri_label=g_markup_printf_escaped("%s\n%s", displayname,id); - ms_free(displayname); }else uri_label=g_markup_printf_escaped("%s\n",id); gtk_label_set_markup(GTK_LABEL(label),uri_label); diff --git a/gtk-glade/main.c b/gtk-glade/main.c index e59aec0ca..3ce841ad0 100644 --- a/gtk-glade/main.c +++ b/gtk-glade/main.c @@ -395,7 +395,7 @@ static void set_video_window_decorations(GdkWindow *w){ linphone_address_clean(uri); if (linphone_address_get_display_name(uri)!=NULL){ - display_name=linphone_address_get_display_name_unquoted (uri); + display_name=ms_strdup(linphone_address_get_display_name(uri)); }else{ display_name=linphone_address_as_string(uri); } diff --git a/gtk-glade/propertybox.c b/gtk-glade/propertybox.c index 3faf28dab..bab3e3af6 100644 --- a/gtk-glade/propertybox.c +++ b/gtk-glade/propertybox.c @@ -803,9 +803,8 @@ void linphone_gtk_show_parameters(void){ contact=linphone_core_get_primary_contact_parsed(lc); if (contact){ if (linphone_address_get_display_name(contact)) { - char *dn=linphone_address_get_display_name_unquoted (contact); + const char *dn=linphone_address_get_display_name(contact); gtk_entry_set_text(GTK_ENTRY(linphone_gtk_get_widget(pb,"displayname")),dn); - ms_free(dn); } if (linphone_address_get_username(contact)) gtk_entry_set_text(GTK_ENTRY(linphone_gtk_get_widget(pb,"username")),linphone_address_get_username(contact)); From 8693525b3a6f7c7394ee35c04dc33982ac184d58 Mon Sep 17 00:00:00 2001 From: Simon Morlat Date: Thu, 27 May 2010 10:54:35 +0200 Subject: [PATCH 4/6] fix bug when checking for quotes --- coreapi/sal_eXosip2.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/coreapi/sal_eXosip2.c b/coreapi/sal_eXosip2.c index 82af9a0fd..efabe82d3 100644 --- a/coreapi/sal_eXosip2.c +++ b/coreapi/sal_eXosip2.c @@ -1596,7 +1596,7 @@ SalAddress * sal_address_new(const char *uri){ osip_from_free(from); return NULL; } - if (from->displayname!=NULL && from->displayname[0]!='"'){ + if (from->displayname!=NULL && from->displayname[0]=='"'){ char *unquoted=osip_strdup_without_quote(from->displayname); osip_free(from->displayname); from->displayname=unquoted; From 7609ab2a4a4b9c8a7ddf3ac0acf9e43dc23c2046 Mon Sep 17 00:00:00 2001 From: Jehan Monnier Date: Thu, 27 May 2010 12:33:44 +0200 Subject: [PATCH 5/6] update linphone core states --- java/common/org/linphone/core/LinphoneCore.java | 2 ++ java/common/org/linphone/core/LinphoneCoreFactory.java | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/java/common/org/linphone/core/LinphoneCore.java b/java/common/org/linphone/core/LinphoneCore.java index e02b19351..3b34ec7d7 100644 --- a/java/common/org/linphone/core/LinphoneCore.java +++ b/java/common/org/linphone/core/LinphoneCore.java @@ -38,6 +38,7 @@ public interface LinphoneCore { static public GeneralState GSTATE_REG_NONE = new GeneralState(10,"GSTATE_REG_NONE"); /* initial state */ static public GeneralState GSTATE_REG_OK = new GeneralState(11,"GSTATE_REG_OK"); static public GeneralState GSTATE_REG_FAILED = new GeneralState(12,"GSTATE_REG_FAILED"); + static public GeneralState GSTATE_REG_PENDING = new GeneralState(13,"GSTATE_REG_PENDING"); /* states for GSTATE_GROUP_CALL */ static public GeneralState GSTATE_CALL_IDLE = new GeneralState(20,"GSTATE_CALL_IDLE"); /* initial state */ static public GeneralState GSTATE_CALL_OUT_INVITE = new GeneralState(21,"GSTATE_CALL_OUT_INVITE"); @@ -47,6 +48,7 @@ public interface LinphoneCore { static public GeneralState GSTATE_CALL_END = new GeneralState(25,"GSTATE_CALL_END"); static public GeneralState GSTATE_CALL_ERROR = new GeneralState(26,"GSTATE_CALL_ERROR"); static public GeneralState GSTATE_INVALID = new GeneralState(27,"GSTATE_INVALID"); + static public GeneralState GSTATE_CALL_OUT_RINGING = new GeneralState(28,"GSTATE_CALL_OUT_RINGING"); private final int mValue; private final String mStringValue; diff --git a/java/common/org/linphone/core/LinphoneCoreFactory.java b/java/common/org/linphone/core/LinphoneCoreFactory.java index b3e2952fb..cd34cfe36 100644 --- a/java/common/org/linphone/core/LinphoneCoreFactory.java +++ b/java/common/org/linphone/core/LinphoneCoreFactory.java @@ -61,5 +61,5 @@ abstract public class LinphoneCoreFactory { */ abstract public void setDebugMode(boolean enable); - abstract public void setLogHandler(LinphoneLogHandler handler); + //abstract public void setLogHandler(LinphoneLogHandler handler); } From a839adfcbf71ea2d810a2526a183a44f2d34b00b Mon Sep 17 00:00:00 2001 From: Simon Morlat Date: Fri, 28 May 2010 14:44:21 +0200 Subject: [PATCH 6/6] fix bug with sdp_answer not reset as it should. --- coreapi/sal_eXosip2.c | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/coreapi/sal_eXosip2.c b/coreapi/sal_eXosip2.c index efabe82d3..97cde63c2 100644 --- a/coreapi/sal_eXosip2.c +++ b/coreapi/sal_eXosip2.c @@ -510,8 +510,11 @@ int sal_call_accept(SalOp * h){ if (h->sdp_offering) { set_sdp_from_desc(msg,h->base.local_media); }else{ - if (h->sdp_answer) + if (h->sdp_answer){ set_sdp(msg,h->sdp_answer); + sdp_message_free(h->sdp_answer); + h->sdp_answer=NULL; + } } }else{ ms_error("You are accepting a call but not defined any media capabilities !"); @@ -760,7 +763,11 @@ static void handle_reinvite(Sal *sal, eXosip_event_t *ev){ sdp_to_media_description(sdp,op->base.remote_media); sdp_message_free(sdp); sdp_process(op); - set_sdp(msg,op->sdp_answer); + if (op->sdp_answer!=NULL){ + set_sdp(msg,op->sdp_answer); + sdp_message_free(op->sdp_answer); + op->sdp_answer=NULL; + } }else { op->sdp_offering=TRUE; set_sdp_from_desc(msg,op->base.local_media); @@ -872,8 +879,11 @@ static void call_accepted(Sal *sal, eXosip_event_t *ev){ _osip_list_set_empty(&msg->contacts,(void (*)(void*))osip_contact_free); osip_message_set_contact(msg,contact); } - if (op->sdp_answer) - set_sdp(msg,op->sdp_answer); + if (op->sdp_answer){ + set_sdp(msg,op->sdp_answer); + sdp_message_free(op->sdp_answer); + op->sdp_answer=NULL; + } eXosip_call_send_ack(ev->did,msg); sal->callbacks.call_accepted(op); }