From 740dbb9041bea18490fcd9c7abb9dac670413a34 Mon Sep 17 00:00:00 2001 From: Simon Morlat Date: Tue, 26 Oct 2010 11:11:02 +0200 Subject: [PATCH] implements reporting of declined calls --- coreapi/callbacks.c | 12 +++++----- coreapi/linphonecall.c | 12 +++++++++- coreapi/linphonecore.c | 22 ++++++++++++++----- coreapi/linphonecore.h | 50 ++++++++++++++++++++++-------------------- coreapi/misc.c | 16 ++++++++++++++ coreapi/private.h | 6 +++-- coreapi/proxy.c | 6 +++-- 7 files changed, 85 insertions(+), 39 deletions(-) diff --git a/coreapi/callbacks.c b/coreapi/callbacks.c index cc49391d9..655a5547d 100644 --- a/coreapi/callbacks.c +++ b/coreapi/callbacks.c @@ -444,8 +444,10 @@ static void call_failure(SalOp *op, SalError error, SalReason sr, const char *de } linphone_call_stop_media_streams (call); if (sr!=SalReasonDeclined) linphone_call_set_state(call,LinphoneCallError,msg); - else linphone_call_set_state(call,LinphoneCallEnd,"Call declined."); - + else{ + call->reason=LinphoneReasonDeclined; + linphone_call_set_state(call,LinphoneCallEnd,"Call declined."); + } } static void auth_requested(SalOp *h, const char *realm, const char *username){ @@ -485,7 +487,7 @@ static void register_success(SalOp *op, bool_t registered){ char *msg; cfg->registered=registered; - linphone_proxy_config_set_error(cfg,LinphoneErrorNone); + linphone_proxy_config_set_error(cfg,LinphoneReasonNone); linphone_proxy_config_set_state(cfg, registered ? LinphoneRegistrationOk : LinphoneRegistrationCleared , registered ? "Registration sucessful" : "Unregistration done"); if (lc->vtable.display_status){ @@ -514,9 +516,9 @@ static void register_failure(SalOp *op, SalError error, SalReason reason, const ms_free(msg); } if (error== SalErrorFailure && reason == SalReasonForbidden) { - linphone_proxy_config_set_error(cfg, LinphoneErrorBadCredentials); + linphone_proxy_config_set_error(cfg, LinphoneReasonBadCredentials); } else if (error == SalErrorNoResponse) { - linphone_proxy_config_set_error(cfg, LinphoneErrorNoResponse); + linphone_proxy_config_set_error(cfg, LinphoneReasonNoResponse); } linphone_proxy_config_set_state(cfg,LinphoneRegistrationFailed,details); } diff --git a/coreapi/linphonecall.c b/coreapi/linphonecall.c index 2cd8236f7..ee2910e35 100644 --- a/coreapi/linphonecall.c +++ b/coreapi/linphonecall.c @@ -216,7 +216,10 @@ static void linphone_call_set_terminated(LinphoneCall *call){ linphone_core_update_allocated_audio_bandwidth(lc); if (call->state==LinphoneCallEnd){ - status=LinphoneCallSuccess; + if (call->reason==LinphoneReasonDeclined){ + status=LinphoneCallDeclined; + } + else status=LinphoneCallSuccess; } linphone_call_log_completed(call->log,call, status); @@ -384,6 +387,13 @@ LinphoneCallState linphone_call_get_state(const LinphoneCall *call){ return call->state; } +/** + * Returns the reason for a call termination (either error or normal termination) +**/ +LinphoneReason linphone_call_get_reason(const LinphoneCall *call){ + return call->reason; +} + /** * Get the user_pointer in the LinphoneCall * diff --git a/coreapi/linphonecore.c b/coreapi/linphonecore.c index 438fdaa26..e6e8d99f2 100644 --- a/coreapi/linphonecore.c +++ b/coreapi/linphonecore.c @@ -946,6 +946,14 @@ static void linphone_core_init (LinphoneCore * lc, const LinphoneCoreVTable *vta linphone_core_assign_payload_type(&payload_type_ilbc,113,"mode=30"); linphone_core_assign_payload_type(&payload_type_amr,114,"octet-align=1"); +#if defined(ANDROID) || defined (__IPHONE_OS_VERSION_MIN_REQUIRED) + /*shorten the DNS lookup time and send more retransmissions on mobiles: + - to workaround potential packet losses + - to avoid hanging for 30 seconds when the network doesn't work despite the phone thinks it does. + */ + _linphone_core_configure_resolver(); +#endif + #ifdef ENABLE_NONSTANDARD_GSM { PayloadType *pt; @@ -2332,7 +2340,9 @@ int linphone_core_terminate_call(LinphoneCore *lc, LinphoneCall *the_call) call = the_call; } sal_call_terminate(call->op); - + if (call->state==LinphoneCallIncomingReceived){ + call->reason=LinphoneReasonDeclined; + } /*stop ringing*/ if (lc->ringstream!=NULL) { ring_stop(lc->ringstream); @@ -4011,14 +4021,16 @@ LinphoneCallParams *linphone_core_create_default_call_parameters(LinphoneCore *l return p; } -const char *linphone_error_to_string(LinphoneError err){ +const char *linphone_error_to_string(LinphoneReason err){ switch(err){ - case LinphoneErrorNone: + case LinphoneReasonNone: return "No error"; - case LinphoneErrorNoResponse: + case LinphoneReasonNoResponse: return "No response"; - case LinphoneErrorBadCredentials: + case LinphoneReasonBadCredentials: return "Bad credentials"; + case LinphoneReasonDeclined: + return "Call declined"; } return "unknown error"; } diff --git a/coreapi/linphonecore.h b/coreapi/linphonecore.h index 313907ad9..012437f62 100644 --- a/coreapi/linphonecore.h +++ b/coreapi/linphonecore.h @@ -131,7 +131,8 @@ typedef enum _LinphoneCallDir LinphoneCallDir; typedef enum _LinphoneCallStatus { LinphoneCallSuccess, /**< The call was sucessful*/ LinphoneCallAborted, /**< The call was aborted */ - LinphoneCallMissed /**< The call was missed (unanswered)*/ + LinphoneCallMissed, /**< The call was missed (unanswered)*/ + LinphoneCallDeclined /**< The call was declined, either locally or by remote end*/ } LinphoneCallStatus; /** @@ -182,15 +183,16 @@ void linphone_call_params_destroy(LinphoneCallParams *cp); /** * Enum describing failure reasons. **/ -enum _LinphoneError{ - LinphoneErrorNone, - LinphoneErrorNoResponse, /** + +void _linphone_core_configure_resolver(){ + res_init(); + _res.retrans=1; /*retransmit every second*/ + _res.retry=2; /*only two times per DNS server*/ +} + +#else + +void _linphone_core_configure_resolver(){ +} + +#endif diff --git a/coreapi/private.h b/coreapi/private.h index 029405edd..969c337e9 100644 --- a/coreapi/private.h +++ b/coreapi/private.h @@ -77,6 +77,7 @@ struct _LinphoneCall time_t start_time; /*time at which the call was initiated*/ time_t media_start_time; /*time at which it was accepted, media streams established*/ LinphoneCallState state; + LinphoneReason reason; int refcnt; void * user_pointer; int audio_port; @@ -199,7 +200,7 @@ void linphone_core_stop_waiting(LinphoneCore *lc); int linphone_core_start_invite(LinphoneCore *lc, LinphoneCall *call, LinphoneProxyConfig *dest_proxy); void linphone_core_start_refered_call(LinphoneCore *lc, LinphoneCall *call); extern SalCallbacks linphone_sal_callbacks; -void linphone_proxy_config_set_error(LinphoneProxyConfig *cfg,LinphoneError error); +void linphone_proxy_config_set_error(LinphoneProxyConfig *cfg, LinphoneReason error); struct _LinphoneProxyConfig { @@ -224,7 +225,7 @@ struct _LinphoneProxyConfig bool_t dial_escape_plus; void* user_data; time_t deletion_date; - LinphoneError error; + LinphoneReason error; }; struct _LinphoneAuthInfo @@ -439,6 +440,7 @@ SalMediaDescription *create_local_media_description(LinphoneCore *lc, LinphoneCall *call, bool_t with_video, bool_t only_one_codec); #define linphone_core_ready(lc) ((lc)->state!=LinphoneGlobalStartup) +void _linphone_core_configure_resolver(); #define HOLD_OFF (0) #define HOLD_ON (1) diff --git a/coreapi/proxy.c b/coreapi/proxy.c index aa901cb8d..b77ad9422 100644 --- a/coreapi/proxy.c +++ b/coreapi/proxy.c @@ -841,10 +841,12 @@ LinphoneRegistrationState linphone_proxy_config_get_state(const LinphoneProxyCon } return NULL; } -LinphoneError linphone_proxy_config_get_error(const LinphoneProxyConfig *cfg) { + +LinphoneReason linphone_proxy_config_get_error(const LinphoneProxyConfig *cfg) { return cfg->error; } -void linphone_proxy_config_set_error(LinphoneProxyConfig *cfg,LinphoneError error) { + +void linphone_proxy_config_set_error(LinphoneProxyConfig *cfg,LinphoneReason error) { cfg->error = error; }