aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAleksander Morgado <aleksander@lanedo.com>2011-12-21 21:55:44 +0100
committerAleksander Morgado <aleksander@lanedo.com>2012-03-15 14:14:36 +0100
commit8a636f6b16641ca90a5b87be412713cce15af45f (patch)
treecbc8de0a0bcc76bce716570fae8c02678d149c95
parent9a80f5816568b52ee8e159e4b5775a02b3d095cf (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.
-rw-r--r--src/mm-broadband-modem.c126
-rw-r--r--src/mm-iface-modem.c127
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