diff options
author | Aleksander Morgado <aleksander@lanedo.com> | 2011-12-21 21:55:44 +0100 |
---|---|---|
committer | Aleksander Morgado <aleksander@lanedo.com> | 2012-03-15 14:14:36 +0100 |
commit | 8a636f6b16641ca90a5b87be412713cce15af45f (patch) | |
tree | cbc8de0a0bcc76bce716570fae8c02678d149c95 /src | |
parent | 9a80f5816568b52ee8e159e4b5775a02b3d095cf (diff) |
broadband-modem: handle state checks during Enable() and Disable()
Before it was done in the interface; but we should really be doing it in the
implementation; so that mm_base_modem_enable()/disable() also has the state
checks.
Diffstat (limited to 'src')
-rw-r--r-- | src/mm-broadband-modem.c | 126 | ||||
-rw-r--r-- | src/mm-iface-modem.c | 127 |
2 files changed, 122 insertions, 131 deletions
diff --git a/src/mm-broadband-modem.c b/src/mm-broadband-modem.c index 7785f8f9..977b2980 100644 --- a/src/mm-broadband-modem.c +++ b/src/mm-broadband-modem.c @@ -2092,17 +2092,60 @@ disable (MMBaseModem *self, GAsyncReadyCallback callback, gpointer user_data) { - DisablingContext *ctx; + GSimpleAsyncResult *result; - ctx = g_new0 (DisablingContext, 1); - ctx->self = g_object_ref (self); - ctx->result = g_simple_async_result_new (G_OBJECT (self), - callback, - user_data, - disable); - ctx->step = DISABLING_STEP_FIRST; + result = g_simple_async_result_new (G_OBJECT (self), callback, user_data, disable); + + /* Check state before launching modem disabling */ + switch (MM_BROADBAND_MODEM (self)->priv->modem_state) { + case MM_MODEM_STATE_UNKNOWN: + /* We should never have a UNKNOWN->DISABLED transition requested by + * the user. */ + g_assert_not_reached (); + break; + + case MM_MODEM_STATE_LOCKED: + case MM_MODEM_STATE_DISABLED: + /* Just return success, don't relaunch enabling */ + g_simple_async_result_set_op_res_gboolean (result, TRUE); + break; + + case MM_MODEM_STATE_DISABLING: + g_simple_async_result_set_error (result, + MM_CORE_ERROR, + MM_CORE_ERROR_WRONG_STATE, + "Cannot disable modem: " + "already being disabled"); + break; - disabling_step (ctx); + case MM_MODEM_STATE_ENABLING: + g_simple_async_result_set_error (result, + MM_CORE_ERROR, + MM_CORE_ERROR_WRONG_STATE, + "Cannot disable modem: " + "currently being enabled"); + break; + + 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: { + DisablingContext *ctx; + + ctx = g_new0 (DisablingContext, 1); + ctx->self = g_object_ref (self); + ctx->result = result; + ctx->step = DISABLING_STEP_FIRST; + + disabling_step (ctx); + return; + } + } + + g_simple_async_result_complete_in_idle (result); + g_object_unref (result); } /*****************************************************************************/ @@ -2249,17 +2292,64 @@ enable (MMBaseModem *self, GAsyncReadyCallback callback, gpointer user_data) { - EnablingContext *ctx; + GSimpleAsyncResult *result; - ctx = g_new0 (EnablingContext, 1); - ctx->self = g_object_ref (self); - ctx->result = g_simple_async_result_new (G_OBJECT (self), - callback, - user_data, - enable); - ctx->step = ENABLING_STEP_FIRST; + result = g_simple_async_result_new (G_OBJECT (self), callback, user_data, enable); + + /* Check state before launching modem enabling */ + switch (MM_BROADBAND_MODEM (self)->priv->modem_state) { + case MM_MODEM_STATE_UNKNOWN: + /* We should never have a UNKNOWN->ENABLED transition */ + g_assert_not_reached (); + break; + + case MM_MODEM_STATE_LOCKED: + g_simple_async_result_set_error (result, + MM_CORE_ERROR, + MM_CORE_ERROR_WRONG_STATE, + "Cannot enable modem: device locked"); + break; + + case MM_MODEM_STATE_DISABLED: { + EnablingContext *ctx; + + ctx = g_new0 (EnablingContext, 1); + ctx->self = g_object_ref (self); + ctx->result = result; + ctx->step = ENABLING_STEP_FIRST; + enabling_step (ctx); + return; + } + + case MM_MODEM_STATE_DISABLING: + g_simple_async_result_set_error (result, + MM_CORE_ERROR, + MM_CORE_ERROR_WRONG_STATE, + "Cannot enable modem: " + "currently being disabled"); + break; - enabling_step (ctx); + case MM_MODEM_STATE_ENABLING: + g_simple_async_result_set_error (result, + MM_CORE_ERROR, + MM_CORE_ERROR_WRONG_STATE, + "Cannot enable modem: " + "already being enabled"); + break; + + 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: + /* Just return success, don't relaunch enabling */ + g_simple_async_result_set_op_res_gboolean (result, TRUE); + break; + } + + g_simple_async_result_complete_in_idle (result); + g_object_unref (result); } /*****************************************************************************/ diff --git a/src/mm-iface-modem.c b/src/mm-iface-modem.c index 6a69fc30..2f29313a 100644 --- a/src/mm-iface-modem.c +++ b/src/mm-iface-modem.c @@ -383,137 +383,38 @@ enable_disable_ready (MMIfaceModem *self, } static gboolean -run_enable (MMIfaceModem *self, - MmGdbusModem *skeleton, - MMModemState modem_state, - GDBusMethodInvocation *invocation) +handle_enable (MmGdbusModem *skeleton, + GDBusMethodInvocation *invocation, + gboolean arg_enable, + MMIfaceModem *self) { - switch (modem_state) { - case MM_MODEM_STATE_UNKNOWN: - /* We should never have a UNKNOWN->ENABLED transition */ - g_assert_not_reached (); - break; + MMModemState modem_state; - case MM_MODEM_STATE_LOCKED: - g_dbus_method_invocation_return_error (invocation, - MM_CORE_ERROR, - MM_CORE_ERROR_WRONG_STATE, - "Cannot enable modem: device locked"); - break; + g_assert (MM_BASE_MODEM_GET_CLASS (self)->enable != NULL); + g_assert (MM_BASE_MODEM_GET_CLASS (self)->enable_finish != NULL); - case MM_MODEM_STATE_DISABLED: + modem_state = MM_MODEM_STATE_UNKNOWN; + g_object_get (self, + MM_IFACE_MODEM_STATE, &modem_state, + NULL); + + if (arg_enable) MM_BASE_MODEM_GET_CLASS (self)->enable (MM_BASE_MODEM (self), NULL, /* cancellable */ (GAsyncReadyCallback)enable_disable_ready, dbus_call_context_new (skeleton, invocation, self)); - break; - - case MM_MODEM_STATE_DISABLING: - g_dbus_method_invocation_return_error (invocation, - MM_CORE_ERROR, - MM_CORE_ERROR_WRONG_STATE, - "Cannot enable modem: " - "currently being disabled"); - break; - - case MM_MODEM_STATE_ENABLING: - g_dbus_method_invocation_return_error (invocation, - MM_CORE_ERROR, - MM_CORE_ERROR_WRONG_STATE, - "Cannot enable modem: " - "already being enabled"); - break; - - 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: - /* Just return success, don't relaunch enabling */ - mm_gdbus_modem_complete_enable (skeleton, invocation); - break; - } - - return TRUE; -} - -static gboolean -run_disable (MMIfaceModem *self, - MmGdbusModem *skeleton, - MMModemState modem_state, - GDBusMethodInvocation *invocation) -{ - switch (modem_state) { - case MM_MODEM_STATE_UNKNOWN: - /* We should never have a UNKNOWN->DISABLED transition requested by - * the user. */ - g_assert_not_reached (); - break; - - case MM_MODEM_STATE_LOCKED: - case MM_MODEM_STATE_DISABLED: - /* Just return success, don't relaunch enabling */ - mm_gdbus_modem_complete_enable (skeleton, invocation); - break; - - case MM_MODEM_STATE_DISABLING: - g_dbus_method_invocation_return_error (invocation, - MM_CORE_ERROR, - MM_CORE_ERROR_WRONG_STATE, - "Cannot disable modem: " - "already being disabled"); - break; - - case MM_MODEM_STATE_ENABLING: - g_dbus_method_invocation_return_error (invocation, - MM_CORE_ERROR, - MM_CORE_ERROR_WRONG_STATE, - "Cannot disable modem: " - "currently being enabled"); - break; - - 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: + else MM_BASE_MODEM_GET_CLASS (self)->disable (MM_BASE_MODEM (self), NULL, /* cancellable */ (GAsyncReadyCallback)enable_disable_ready, dbus_call_context_new (skeleton, invocation, self)); - break; - } - return TRUE; } -static gboolean -handle_enable (MmGdbusModem *skeleton, - GDBusMethodInvocation *invocation, - gboolean arg_enable, - MMIfaceModem *self) -{ - MMModemState modem_state; - - g_assert (MM_BASE_MODEM_GET_CLASS (self)->enable != NULL); - g_assert (MM_BASE_MODEM_GET_CLASS (self)->enable_finish != NULL); - - modem_state = MM_MODEM_STATE_UNKNOWN; - g_object_get (self, - MM_IFACE_MODEM_STATE, &modem_state, - NULL); - - return (arg_enable ? - run_enable (self, skeleton, modem_state, invocation) : - run_disable (self, skeleton, modem_state, invocation)); -} - /*****************************************************************************/ static void |