diff options
Diffstat (limited to 'src/mm-broadband-modem.c')
-rw-r--r-- | src/mm-broadband-modem.c | 72 |
1 files changed, 62 insertions, 10 deletions
diff --git a/src/mm-broadband-modem.c b/src/mm-broadband-modem.c index 67996312..7473d231 100644 --- a/src/mm-broadband-modem.c +++ b/src/mm-broadband-modem.c @@ -6066,6 +6066,7 @@ disable (MMBaseModem *self, g_assert_not_reached (); break; + case MM_MODEM_STATE_INITIALIZING: case MM_MODEM_STATE_LOCKED: case MM_MODEM_STATE_DISABLED: /* Just return success, don't relaunch enabling */ @@ -6338,6 +6339,14 @@ enable (MMBaseModem *self, g_assert_not_reached (); break; + case MM_MODEM_STATE_INITIALIZING: + g_simple_async_result_set_error (result, + MM_CORE_ERROR, + MM_CORE_ERROR_WRONG_STATE, + "Cannot enable modem: " + "device not fully initialized yet"); + break; + case MM_MODEM_STATE_LOCKED: g_simple_async_result_set_error (result, MM_CORE_ERROR, @@ -6663,6 +6672,12 @@ initialize_step (InitializeContext *ctx) case INITIALIZE_STEP_LAST: /* All initialized without errors! */ + + /* Set as disabled (a.k.a. initialized) */ + mm_iface_modem_update_state (MM_IFACE_MODEM (ctx->self), + MM_MODEM_STATE_DISABLED, + MM_MODEM_STATE_CHANGE_REASON_UNKNOWN); + g_simple_async_result_set_op_res_gboolean (G_SIMPLE_ASYNC_RESULT (ctx->result), TRUE); initialize_context_complete_and_free (ctx); return; @@ -6677,18 +6692,55 @@ initialize (MMBaseModem *self, GAsyncReadyCallback callback, gpointer user_data) { - InitializeContext *ctx; + GSimpleAsyncResult *result; - ctx = g_new0 (InitializeContext, 1); - ctx->self = g_object_ref (self); - ctx->cancellable = g_object_ref (cancellable); - ctx->result = g_simple_async_result_new (G_OBJECT (self), - callback, - user_data, - initialize); - ctx->step = INITIALIZE_STEP_FIRST; + result = g_simple_async_result_new (G_OBJECT (self), callback, user_data, initialize); + + /* Check state before launching modem initialization */ + switch (MM_BROADBAND_MODEM (self)->priv->modem_state) { + case MM_MODEM_STATE_UNKNOWN: + case MM_MODEM_STATE_LOCKED: { + InitializeContext *ctx; + + ctx = g_new0 (InitializeContext, 1); + ctx->self = g_object_ref (self); + ctx->cancellable = g_object_ref (cancellable); + ctx->result = result; + ctx->step = INITIALIZE_STEP_FIRST; + + /* Set as being initialized, even if we were locked before */ + mm_iface_modem_update_state (MM_IFACE_MODEM (self), + MM_MODEM_STATE_INITIALIZING, + MM_MODEM_STATE_CHANGE_REASON_UNKNOWN); + + initialize_step (ctx); + return; + } + + case MM_MODEM_STATE_INITIALIZING: + g_simple_async_result_set_error (result, + MM_CORE_ERROR, + MM_CORE_ERROR_WRONG_STATE, + "Cannot initialize modem: " + "already being initialized"); + break; + + case MM_MODEM_STATE_DISABLED: + case MM_MODEM_STATE_DISABLING: + case MM_MODEM_STATE_ENABLING: + 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 initialization */ + g_simple_async_result_set_op_res_gboolean (result, TRUE); + break; + } - initialize_step (ctx); + g_simple_async_result_complete_in_idle (result); + g_object_unref (result); } /*****************************************************************************/ |