diff options
author | Aleksander Morgado <aleksander@lanedo.com> | 2012-07-22 12:59:47 +0200 |
---|---|---|
committer | Aleksander Morgado <aleksander@lanedo.com> | 2012-07-22 13:33:15 +0200 |
commit | 89cdb8819a1427c371b6f307608bcac6c12b5a12 (patch) | |
tree | de71306c53d66aff7809592a1cda8c2764ac3eac /src | |
parent | dd8dcbb899c27041f856ecdb633ed0aa0db6442b (diff) |
iface-modem-3gpp-ussd: don't allow USSD actions if the modem is not enabled
Diffstat (limited to 'src')
-rw-r--r-- | src/mm-iface-modem-3gpp-ussd.c | 61 |
1 files changed, 58 insertions, 3 deletions
diff --git a/src/mm-iface-modem-3gpp-ussd.c b/src/mm-iface-modem-3gpp-ussd.c index fd902142..bcb5b8ce 100644 --- a/src/mm-iface-modem-3gpp-ussd.c +++ b/src/mm-iface-modem-3gpp-ussd.c @@ -20,6 +20,7 @@ #include <ModemManager.h> #include <libmm-common.h> +#include "mm-iface-modem.h" #include "mm-iface-modem-3gpp.h" #include "mm-iface-modem-3gpp-ussd.h" #include "mm-base-modem.h" @@ -43,6 +44,57 @@ mm_iface_modem_3gpp_ussd_bind_simple_status (MMIfaceModem3gppUssd *self, /*****************************************************************************/ +static gboolean +ensure_enabled (MMBaseModem *self, + GError **error) +{ + MMModemState modem_state; + + modem_state = MM_MODEM_STATE_UNKNOWN; + g_object_get (self, + MM_IFACE_MODEM_STATE, &modem_state, + NULL); + + switch (modem_state) { + case MM_MODEM_STATE_FAILED: + case MM_MODEM_STATE_UNKNOWN: + case MM_MODEM_STATE_LOCKED: + /* We should never have such request (interface wasn't exported yet) */ + g_assert_not_reached (); + return FALSE; + + case MM_MODEM_STATE_INITIALIZING: + case MM_MODEM_STATE_ENABLING: + case MM_MODEM_STATE_DISABLED: + g_set_error (error, + MM_CORE_ERROR, + MM_CORE_ERROR_WRONG_STATE, + "Cannot perform USSD action: " + "device not enabled yet"); + return FALSE; + + case MM_MODEM_STATE_DISABLING: + g_set_error (error, + MM_CORE_ERROR, + MM_CORE_ERROR_WRONG_STATE, + "Cannot perform USSD action: " + "currently being disabled"); + return FALSE; + + case MM_MODEM_STATE_ENABLED: + case MM_MODEM_STATE_SEARCHING: + case MM_MODEM_STATE_REGISTERED: + case MM_MODEM_STATE_DISCONNECTING: + case MM_MODEM_STATE_CONNECTING: + case MM_MODEM_STATE_CONNECTED: + break; + } + + return TRUE; +} + +/*****************************************************************************/ + typedef struct { MmGdbusModem3gppUssd *skeleton; GDBusMethodInvocation *invocation; @@ -80,7 +132,8 @@ handle_cancel_auth_ready (MMBaseModem *self, { GError *error = NULL; - if (!mm_base_modem_authorize_finish (self, res, &error)) { + if (!mm_base_modem_authorize_finish (self, res, &error) || + !ensure_enabled (self, &error)) { g_dbus_method_invocation_take_error (ctx->invocation, error); handle_cancel_context_free (ctx); return; @@ -159,7 +212,8 @@ handle_respond_auth_ready (MMBaseModem *self, { GError *error = NULL; - if (!mm_base_modem_authorize_finish (self, res, &error)) { + if (!mm_base_modem_authorize_finish (self, res, &error) || + !ensure_enabled (self, &error)) { g_dbus_method_invocation_take_error (ctx->invocation, error); handle_respond_context_free (ctx); return; @@ -262,7 +316,8 @@ handle_initiate_auth_ready (MMBaseModem *self, { GError *error = NULL; - if (!mm_base_modem_authorize_finish (self, res, &error)) { + if (!mm_base_modem_authorize_finish (self, res, &error) || + !ensure_enabled (self, &error)) { g_dbus_method_invocation_take_error (ctx->invocation, error); handle_initiate_context_free (ctx); return; |