From 46ff807f6b274666691b62671adf9e776b8f9343 Mon Sep 17 00:00:00 2001 From: Evangelos Ribeiro Tzaras Date: Thu, 19 May 2022 20:10:46 +0200 Subject: [PATCH] sip: origin: Always notify state changes when relevant to the UI by adding functions to the public API which determine if state changes should be shown to the user and use them (instead of duplicating similar logic). --- plugins/sip/calls-sip-origin.c | 4 +- src/calls-account.c | 116 +++++++++++++++++++-------------- src/calls-account.h | 2 + 3 files changed, 72 insertions(+), 50 deletions(-) diff --git a/plugins/sip/calls-sip-origin.c b/plugins/sip/calls-sip-origin.c index b818fa5..48c7f2a 100644 --- a/plugins/sip/calls-sip-origin.c +++ b/plugins/sip/calls-sip-origin.c @@ -145,7 +145,9 @@ change_state (CallsSipOrigin *self, g_assert (CALLS_SIP_ORIGIN (self)); - if (self->state == new_state) + if (self->state == new_state && + new_state != CALLS_ACCOUNT_STATE_ERROR && + !calls_account_state_reason_is_for_ui (reason)) return; old_state = self->state; diff --git a/src/calls-account.c b/src/calls-account.c index 2dd6407..d015a81 100644 --- a/src/calls-account.c +++ b/src/calls-account.c @@ -47,48 +47,6 @@ enum { static guint signals[SIGNAL_LAST_SIGNAL]; -static gboolean -calls_account_state_change_is_important (CallsAccountState new_state) -{ - if (calls_log_get_verbosity () >= 3) - return TRUE; - - switch (new_state) { - case CALLS_ACCOUNT_STATE_UNKNOWN: - case CALLS_ACCOUNT_STATE_INITIALIZING: - case CALLS_ACCOUNT_STATE_DEINITIALIZING: - case CALLS_ACCOUNT_STATE_CONNECTING: - case CALLS_ACCOUNT_STATE_DISCONNECTING: - return FALSE; - - case CALLS_ACCOUNT_STATE_ERROR: - case CALLS_ACCOUNT_STATE_OFFLINE: - case CALLS_ACCOUNT_STATE_ONLINE: - return TRUE; - - default: - return FALSE; - } -} - - -static gboolean -calls_account_state_reason_is_error (CallsAccountStateReason reason) -{ - switch (reason) { - case CALLS_ACCOUNT_STATE_REASON_NO_CREDENTIALS: - case CALLS_ACCOUNT_STATE_REASON_CONNECTION_TIMEOUT: - case CALLS_ACCOUNT_STATE_REASON_CONNECTION_DNS_ERROR: - case CALLS_ACCOUNT_STATE_REASON_AUTHENTICATION_FAILURE: - case CALLS_ACCOUNT_STATE_REASON_INTERNAL_ERROR: - return TRUE; - - default: - return FALSE; - } -} - - static void calls_account_default_init (CallsAccountInterface *iface) { @@ -301,18 +259,18 @@ calls_account_emit_message_for_state_change (CallsAccount *account, CallsAccountStateReason reason) { g_autofree char *message = NULL; - gboolean state_is_important = FALSE; - gboolean reason_is_error = FALSE; + gboolean state_is_for_ui = FALSE; + gboolean reason_is_for_ui = FALSE; g_return_if_fail (CALLS_IS_ACCOUNT (account)); - state_is_important = calls_account_state_change_is_important (new_state); - reason_is_error = calls_account_state_reason_is_error (reason); + state_is_for_ui = calls_account_state_is_for_ui (new_state); + reason_is_for_ui = calls_account_state_reason_is_for_ui (reason); - if (!state_is_important && !reason_is_error) + if (!state_is_for_ui && !reason_is_for_ui) return; - if (reason_is_error || calls_log_get_verbosity () >= 3) + if (reason_is_for_ui || calls_log_get_verbosity () >= 3) message = g_strdup_printf ("%s: %s", calls_account_state_to_string (new_state), calls_account_state_reason_to_string (reason)); @@ -321,5 +279,65 @@ calls_account_emit_message_for_state_change (CallsAccount *account, calls_message_source_emit_message (CALLS_MESSAGE_SOURCE (account), message, - reason_is_error ? GTK_MESSAGE_ERROR : GTK_MESSAGE_INFO); + reason_is_for_ui ? GTK_MESSAGE_ERROR : GTK_MESSAGE_INFO); +} + + +/** + * calls_account_state_is_for_ui: + * @state: a #CallsAccountState + * + * Helper function to decide which account states are important. + * Is used f.e. to decide if message should be shown to the user. + * + * Returns: %TRUE if account state is considered important, %FALSE otherwise + */ +gboolean +calls_account_state_is_for_ui (CallsAccountState state) +{ + if (calls_log_get_verbosity () >= 3) + return TRUE; + + switch (state) { + case CALLS_ACCOUNT_STATE_UNKNOWN: + case CALLS_ACCOUNT_STATE_INITIALIZING: + case CALLS_ACCOUNT_STATE_DEINITIALIZING: + case CALLS_ACCOUNT_STATE_CONNECTING: + case CALLS_ACCOUNT_STATE_DISCONNECTING: + return FALSE; + + case CALLS_ACCOUNT_STATE_ERROR: + case CALLS_ACCOUNT_STATE_OFFLINE: + case CALLS_ACCOUNT_STATE_ONLINE: + return TRUE; + + default: + return FALSE; + } +} + + +/** + * calls_account_state_reason_is_for_ui: + * @reason: a #CallsAccountStateReason + * + * Helper function to decide which account states reasons are important. + * Is used f.e. to decide if message should be shown to the user. + * + * Returns: %TRUE if account state reason is considered important, %FALSE otherwise + */ +gboolean +calls_account_state_reason_is_for_ui (CallsAccountStateReason reason) +{ + switch (reason) { + case CALLS_ACCOUNT_STATE_REASON_NO_CREDENTIALS: + case CALLS_ACCOUNT_STATE_REASON_CONNECTION_TIMEOUT: + case CALLS_ACCOUNT_STATE_REASON_CONNECTION_DNS_ERROR: + case CALLS_ACCOUNT_STATE_REASON_AUTHENTICATION_FAILURE: + case CALLS_ACCOUNT_STATE_REASON_INTERNAL_ERROR: + return TRUE; + + default: + return FALSE; + } } diff --git a/src/calls-account.h b/src/calls-account.h index 90e5803..cd6f3ba 100644 --- a/src/calls-account.h +++ b/src/calls-account.h @@ -109,5 +109,7 @@ const char *calls_account_state_reason_to_string (CallsAccountState void calls_account_emit_message_for_state_change (CallsAccount *account, CallsAccountState new_state, CallsAccountStateReason reason); +gboolean calls_account_state_is_for_ui (CallsAccountState state); +gboolean calls_account_state_reason_is_for_ui (CallsAccountStateReason reason); G_END_DECLS