From: Jehan Monnier Date: Fri, 21 May 2010 13:52:14 +0000 (+0200) Subject: add new gstate REG_PENDING, OUT_RINGING X-Git-Url: http://sjero.net/git/?p=linphone;a=commitdiff_plain;h=78ad76dd750c3711a78c33998d4fd6507023a32f add new gstate REG_PENDING, OUT_RINGING concatenate Reason header with reason phrase in case of state error --- diff --git a/.cproject b/.cproject index 4dc56ec6..869153cf 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 f15404db..018ce534 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 945ea25e..e38f0373 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 59110315..bf4e0613 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 ba573013..068a2aac 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; }