diff --git a/coreapi/callbacks.c b/coreapi/callbacks.c index 100373f68..7c8533759 100644 --- a/coreapi/callbacks.c +++ b/coreapi/callbacks.c @@ -24,6 +24,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #include "private.h" #include "mediastreamer2/mediastream.h" +static void register_failure(SalOp *op, SalError error, SalReason reason, const char *details); static void linphone_connect_incoming(LinphoneCore *lc, LinphoneCall *call){ if (lc->ringstream!=NULL){ @@ -428,6 +429,9 @@ static void auth_requested(SalOp *h, const char *realm, const char *username){ sal_op_authenticate(h,&sai); ai->usecount++; }else{ + if (ai && ai->works==FALSE) { + register_failure(h, SalErrorFailure, SalReasonForbidden, _("Authentication failure")); + } if (lc->vtable.auth_info_requested) lc->vtable.auth_info_requested(lc,realm,username); } @@ -448,6 +452,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_state(cfg, registered ? LinphoneRegistrationOk : LinphoneRegistrationCleared , registered ? "Registration sucessful" : "Unregistration done"); if (lc->vtable.display_status){ @@ -475,6 +480,11 @@ static void register_failure(SalOp *op, SalError error, SalReason reason, const lc->vtable.display_status(lc,msg); ms_free(msg); } + if (error== SalErrorFailure && reason == SalReasonForbidden) { + linphone_proxy_config_set_error(cfg, LinphoneErrorBadCredentials); + } else if (error == SalErrorNoResponse) { + linphone_proxy_config_set_error(cfg, LinphoneErrorNoResponse); + } linphone_proxy_config_set_state(cfg,LinphoneRegistrationFailed,details); } diff --git a/coreapi/private.h b/coreapi/private.h index a53e3d4bf..eb5a26c88 100644 --- a/coreapi/private.h +++ b/coreapi/private.h @@ -196,7 +196,7 @@ void linphone_core_stop_waiting(LinphoneCore *lc); int linphone_core_start_invite(LinphoneCore *lc, LinphoneCall *call, LinphoneProxyConfig *dest_proxy); void linphone_core_start_pending_refered_calls(LinphoneCore *lc); extern SalCallbacks linphone_sal_callbacks; - +void linphone_proxy_config_set_error(LinphoneProxyConfig *cfg,LinphoneError error); struct _LinphoneProxyConfig { @@ -220,6 +220,7 @@ struct _LinphoneProxyConfig bool_t dial_escape_plus; void* user_data; time_t deletion_date; + LinphoneError error; }; struct _LinphoneAuthInfo diff --git a/coreapi/proxy.c b/coreapi/proxy.c index 251bdbb13..07a8e6c81 100644 --- a/coreapi/proxy.c +++ b/coreapi/proxy.c @@ -829,5 +829,11 @@ LinphoneRegistrationState linphone_proxy_config_get_state(const LinphoneProxyCon } return NULL; } +LinphoneError linphone_proxy_config_get_error(const LinphoneProxyConfig *cfg) { + return cfg->error; +} +void linphone_proxy_config_set_error(LinphoneProxyConfig *cfg,LinphoneError error) { + cfg->error = error; +}