aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAleksander Morgado <aleksander@lanedo.com>2012-10-24 16:25:38 +0200
committerAleksander Morgado <aleksander@lanedo.com>2012-10-30 15:35:34 +0100
commit28114f66d53a5f232904f2609778b9cd8f84ffa0 (patch)
tree1139eabde7b589d3b9f6775504444a65ce24c36b /src
parentd09d02442ff19f7b0b47b6a5505d49ed3154c30a (diff)
iface-modem,broadband-modem: update 'enabling->enabled transition logic
It is not the Modem interface the one notifying about the 'enabling->enabled' transition, it's the BroadbandModem directly doing it, covering all the enabling sequences of all the interfaces.
Diffstat (limited to 'src')
-rw-r--r--src/mm-broadband-modem.c93
-rw-r--r--src/mm-iface-modem.c26
2 files changed, 75 insertions, 44 deletions
diff --git a/src/mm-broadband-modem.c b/src/mm-broadband-modem.c
index 3fe8d8b9..11725989 100644
--- a/src/mm-broadband-modem.c
+++ b/src/mm-broadband-modem.c
@@ -7162,6 +7162,7 @@ disable (MMBaseModem *self,
typedef enum {
ENABLING_STEP_FIRST,
+ ENABLING_STEP_WAIT_FOR_FINAL_STATE,
ENABLING_STEP_STARTED,
ENABLING_STEP_IFACE_MODEM,
ENABLING_STEP_IFACE_3GPP,
@@ -7181,6 +7182,8 @@ typedef struct {
GCancellable *cancellable;
GSimpleAsyncResult *result;
EnablingStep step;
+ MMModemState previous_state;
+ gboolean enabled;
} EnablingContext;
static void enabling_step (EnablingContext *ctx);
@@ -7190,6 +7193,20 @@ enabling_context_complete_and_free (EnablingContext *ctx)
{
g_simple_async_result_complete_in_idle (ctx->result);
g_object_unref (ctx->result);
+
+ if (ctx->enabled)
+ mm_iface_modem_update_state (MM_IFACE_MODEM (ctx->self),
+ MM_MODEM_STATE_ENABLED,
+ MM_MODEM_STATE_CHANGE_REASON_USER_REQUESTED);
+ else if (ctx->previous_state != MM_MODEM_STATE_ENABLED) {
+ /* Fallback to previous state */
+ mm_info ("Falling back to previous state '%s'",
+ mm_modem_state_get_string (ctx->previous_state));
+ mm_iface_modem_update_state (MM_IFACE_MODEM (ctx->self),
+ ctx->previous_state,
+ MM_MODEM_STATE_CHANGE_REASON_UNKNOWN);
+ }
+
g_object_unref (ctx->cancellable);
g_object_unref (ctx->self);
g_free (ctx);
@@ -7220,24 +7237,6 @@ enable_finish (MMBaseModem *self,
return TRUE;
}
-static void
-enabling_started_ready (MMBroadbandModem *self,
- GAsyncResult *result,
- EnablingContext *ctx)
-{
- GError *error = NULL;
-
- if (!MM_BROADBAND_MODEM_GET_CLASS (self)->enabling_started_finish (self, result, &error)) {
- g_simple_async_result_take_error (G_SIMPLE_ASYNC_RESULT (ctx->result), error);
- enabling_context_complete_and_free (ctx);
- return;
- }
-
- /* Go on to next step */
- ctx->step++;
- enabling_step (ctx);
-}
-
#undef INTERFACE_ENABLE_READY_FN
#define INTERFACE_ENABLE_READY_FN(NAME,TYPE,FATAL_ERRORS) \
static void \
@@ -7275,6 +7274,56 @@ INTERFACE_ENABLE_READY_FN (iface_modem_messaging, MM_IFACE_MODEM_MESSAGING, FALS
INTERFACE_ENABLE_READY_FN (iface_modem_time, MM_IFACE_MODEM_TIME, FALSE)
static void
+enabling_started_ready (MMBroadbandModem *self,
+ GAsyncResult *result,
+ EnablingContext *ctx)
+{
+ GError *error = NULL;
+
+ if (!MM_BROADBAND_MODEM_GET_CLASS (self)->enabling_started_finish (self, result, &error)) {
+ g_simple_async_result_take_error (G_SIMPLE_ASYNC_RESULT (ctx->result), error);
+ enabling_context_complete_and_free (ctx);
+ return;
+ }
+
+ /* Go on to next step */
+ ctx->step++;
+ enabling_step (ctx);
+}
+
+static void
+enabling_wait_for_final_state_ready (MMIfaceModem *self,
+ GAsyncResult *res,
+ EnablingContext *ctx)
+{
+ GError *error = NULL;
+
+ ctx->previous_state = mm_iface_modem_wait_for_final_state_finish (self, res, &error);
+ if (error) {
+ g_simple_async_result_take_error (G_SIMPLE_ASYNC_RESULT (ctx->result), error);
+ enabling_context_complete_and_free (ctx);
+ return;
+ }
+
+ if (ctx->previous_state >= MM_MODEM_STATE_ENABLED) {
+ /* Just return success, don't relaunch enabling */
+ mm_info ("Modem is already fully enabled...");
+ g_simple_async_result_set_op_res_gboolean (ctx->result, TRUE);
+ enabling_context_complete_and_free (ctx);
+ return;
+ }
+
+ /* We're in a final state now, go on */
+
+ mm_iface_modem_update_state (MM_IFACE_MODEM (ctx->self),
+ MM_MODEM_STATE_ENABLING,
+ MM_MODEM_STATE_CHANGE_REASON_USER_REQUESTED);
+
+ ctx->step++;
+ enabling_step (ctx);
+}
+
+static void
enabling_step (EnablingContext *ctx)
{
/* Don't run new steps if we're cancelled */
@@ -7287,6 +7336,13 @@ enabling_step (EnablingContext *ctx)
/* Fall down to next step */
ctx->step++;
+ case ENABLING_STEP_WAIT_FOR_FINAL_STATE:
+ mm_iface_modem_wait_for_final_state (MM_IFACE_MODEM (ctx->self),
+ MM_MODEM_STATE_UNKNOWN, /* just any */
+ (GAsyncReadyCallback)enabling_wait_for_final_state_ready,
+ ctx);
+ return;
+
case ENABLING_STEP_STARTED:
if (MM_BROADBAND_MODEM_GET_CLASS (ctx->self)->enabling_started &&
MM_BROADBAND_MODEM_GET_CLASS (ctx->self)->enabling_started_finish) {
@@ -7397,6 +7453,7 @@ enabling_step (EnablingContext *ctx)
case ENABLING_STEP_LAST:
mm_info ("Modem fully enabled...");
+ ctx->enabled = TRUE;
/* All enabled without errors! */
g_simple_async_result_set_op_res_gboolean (G_SIMPLE_ASYNC_RESULT (ctx->result), TRUE);
enabling_context_complete_and_free (ctx);
diff --git a/src/mm-iface-modem.c b/src/mm-iface-modem.c
index 55bad312..082846e9 100644
--- a/src/mm-iface-modem.c
+++ b/src/mm-iface-modem.c
@@ -2742,7 +2742,6 @@ struct _EnablingContext {
EnablingStep step;
MMModemCharset supported_charsets;
const MMModemCharset *current_charset;
- gboolean enabled;
GSimpleAsyncResult *result;
GCancellable *cancellable;
MmGdbusModem *skeleton;
@@ -2752,26 +2751,6 @@ static void
enabling_context_complete_and_free (EnablingContext *ctx)
{
g_simple_async_result_complete_in_idle (ctx->result);
-
- if (ctx->enabled)
- mm_iface_modem_update_state (ctx->self,
- MM_MODEM_STATE_ENABLED,
- MM_MODEM_STATE_CHANGE_REASON_USER_REQUESTED);
- else if (ctx->skeleton) {
- MMModemLock lock;
-
- /* Fallback to DISABLED/LOCKED */
- lock = mm_gdbus_modem_get_unlock_required (ctx->skeleton);
- mm_iface_modem_update_state (
- ctx->self,
- ((lock == MM_MODEM_LOCK_NONE ||
- lock == MM_MODEM_LOCK_SIM_PIN2 ||
- lock == MM_MODEM_LOCK_SIM_PUK2) ?
- MM_MODEM_STATE_DISABLED :
- MM_MODEM_STATE_LOCKED),
- MM_MODEM_STATE_CHANGE_REASON_UNKNOWN);
- }
-
g_object_unref (ctx->self);
g_object_unref (ctx->result);
g_object_unref (ctx->cancellable);
@@ -3094,7 +3073,6 @@ interface_enabling_step (EnablingContext *ctx)
case ENABLING_STEP_LAST:
/* We are done without errors! */
g_simple_async_result_set_op_res_gboolean (ctx->result, TRUE);
- ctx->enabled = TRUE;
enabling_context_complete_and_free (ctx);
return;
}
@@ -3130,10 +3108,6 @@ mm_iface_modem_enable (MMIfaceModem *self,
return;
}
- mm_iface_modem_update_state (ctx->self,
- MM_MODEM_STATE_ENABLING,
- MM_MODEM_STATE_CHANGE_REASON_USER_REQUESTED);
-
interface_enabling_step (ctx);
}