aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/mm-broadband-modem.c235
1 files changed, 122 insertions, 113 deletions
diff --git a/src/mm-broadband-modem.c b/src/mm-broadband-modem.c
index d11e1a90..22313663 100644
--- a/src/mm-broadband-modem.c
+++ b/src/mm-broadband-modem.c
@@ -12081,33 +12081,16 @@ typedef enum {
} EnablingStep;
typedef struct {
- MMBroadbandModem *self;
- EnablingStep step;
- MMModemState previous_state;
- gboolean enabled;
- GError *saved_error;
+ EnablingStep step;
+ MMModemState previous_state;
+ GError *saved_error;
} EnablingContext;
-static void enabling_step (GTask *task);
-
static void
enabling_context_free (EnablingContext *ctx)
{
g_assert (!ctx->saved_error);
-
- 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_iface_modem_update_state (MM_IFACE_MODEM (ctx->self),
- ctx->previous_state,
- MM_MODEM_STATE_CHANGE_REASON_UNKNOWN);
- }
-
- g_object_unref (ctx->self);
- g_free (ctx);
+ g_slice_free (EnablingContext, ctx);
}
static gboolean
@@ -12119,22 +12102,52 @@ enable_finish (MMBaseModem *self,
}
static void
+enabling_complete (GTask *task)
+{
+ MMBroadbandModem *self;
+ EnablingContext *ctx;
+
+ self = g_task_get_source_object (task);
+ ctx = g_task_get_task_data (task);
+
+ /* Enable failed? */
+ if (ctx->saved_error) {
+ if (ctx->previous_state != MM_MODEM_STATE_ENABLED) {
+ /* Fallback to previous state */
+ mm_iface_modem_update_state (MM_IFACE_MODEM (self),
+ ctx->previous_state,
+ MM_MODEM_STATE_CHANGE_REASON_UNKNOWN);
+ }
+ g_task_return_error (task, g_steal_pointer (&ctx->saved_error));
+ g_object_unref (task);
+ return;
+ }
+
+ /* Enable succeeded */
+ mm_iface_modem_update_state (MM_IFACE_MODEM (self),
+ MM_MODEM_STATE_ENABLED,
+ MM_MODEM_STATE_CHANGE_REASON_USER_REQUESTED);
+ g_task_return_boolean (task, TRUE);
+ g_object_unref (task);
+}
+
+static void
enable_failed_ready (MMBroadbandModem *self,
GAsyncResult *res,
GTask *task)
{
EnablingContext *ctx;
- ctx = g_task_get_task_data (task);
-
/* The disabling run after a failed enable will never fail */
- g_assert (enable_failed_finish (self, res, NULL));
+ enable_failed_finish (self, res, NULL);
+ ctx = g_task_get_task_data (task);
g_assert (ctx->saved_error);
- g_task_return_error (task, g_steal_pointer (&ctx->saved_error));
- g_object_unref (task);
+ enabling_complete (task);
}
+static void enabling_step (GTask *task);
+
#undef INTERFACE_ENABLE_READY_FN
#define INTERFACE_ENABLE_READY_FN(NAME,TYPE,FATAL_ERRORS) \
static void \
@@ -12179,20 +12192,19 @@ INTERFACE_ENABLE_READY_FN (iface_modem_oma, MM_IFACE_MODEM_OMA,
static void
enabling_started_ready (MMBroadbandModem *self,
- GAsyncResult *result,
- GTask *task)
+ GAsyncResult *result,
+ GTask *task)
{
EnablingContext *ctx;
- GError *error = NULL;
- if (!MM_BROADBAND_MODEM_GET_CLASS (self)->enabling_started_finish (self, result, &error)) {
- g_task_return_error (task, error);
- g_object_unref (task);
+ ctx = g_task_get_task_data (task);
+ g_assert (!ctx->saved_error);
+ if (!MM_BROADBAND_MODEM_GET_CLASS (self)->enabling_started_finish (self, result, &ctx->saved_error)) {
+ enabling_complete (task);
return;
}
/* Go on to next step */
- ctx = g_task_get_task_data (task);
ctx->step++;
enabling_step (task);
}
@@ -12203,27 +12215,24 @@ enabling_wait_for_final_state_ready (MMIfaceModem *self,
GTask *task)
{
EnablingContext *ctx;
- GError *error = NULL;
ctx = g_task_get_task_data (task);
-
- ctx->previous_state = mm_iface_modem_wait_for_final_state_finish (self, res, &error);
- if (error) {
- g_task_return_error (task, error);
- g_object_unref (task);
+ g_assert (!ctx->saved_error);
+ ctx->previous_state = mm_iface_modem_wait_for_final_state_finish (self, res, &ctx->saved_error);
+ if (ctx->saved_error) {
+ enabling_complete (task);
return;
}
if (ctx->previous_state >= MM_MODEM_STATE_ENABLED) {
/* Just return success, don't relaunch enabling */
- g_task_return_boolean (task, TRUE);
- g_object_unref (task);
+ enabling_complete (task);
return;
}
/* We're in a final state now, go on */
- mm_iface_modem_update_state (MM_IFACE_MODEM (ctx->self),
+ mm_iface_modem_update_state (MM_IFACE_MODEM (self),
MM_MODEM_STATE_ENABLING,
MM_MODEM_STATE_CHANGE_REASON_USER_REQUESTED);
@@ -12234,34 +12243,37 @@ enabling_wait_for_final_state_ready (MMIfaceModem *self,
static void
enabling_step (GTask *task)
{
- EnablingContext *ctx;
+ MMBroadbandModem *self;
+ EnablingContext *ctx;
+
+ self = g_task_get_source_object (task);
+ ctx = g_task_get_task_data (task);
+ g_assert (!ctx->saved_error);
/* Don't run new steps if we're cancelled */
- if (g_task_return_error_if_cancelled (task)) {
- g_object_unref (task);
+ if (g_cancellable_set_error_if_cancelled (g_task_get_cancellable (task), &ctx->saved_error)) {
+ enabling_complete (task);
return;
}
- ctx = g_task_get_task_data (task);
-
switch (ctx->step) {
case ENABLING_STEP_FIRST:
ctx->step++;
/* fall through */
case ENABLING_STEP_WAIT_FOR_FINAL_STATE:
- mm_iface_modem_wait_for_final_state (MM_IFACE_MODEM (ctx->self),
+ mm_iface_modem_wait_for_final_state (MM_IFACE_MODEM (self),
MM_MODEM_STATE_UNKNOWN, /* just any */
(GAsyncReadyCallback)enabling_wait_for_final_state_ready,
task);
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) {
- MM_BROADBAND_MODEM_GET_CLASS (ctx->self)->enabling_started (ctx->self,
- (GAsyncReadyCallback)enabling_started_ready,
- task);
+ if (MM_BROADBAND_MODEM_GET_CLASS (self)->enabling_started &&
+ MM_BROADBAND_MODEM_GET_CLASS (self)->enabling_started_finish) {
+ MM_BROADBAND_MODEM_GET_CLASS (self)->enabling_started (self,
+ (GAsyncReadyCallback)enabling_started_ready,
+ task);
return;
}
ctx->step++;
@@ -12271,19 +12283,19 @@ enabling_step (GTask *task)
/* From now on, the failure to enable one of the mandatory interfaces
* will trigger the implicit disabling process */
- g_assert (ctx->self->priv->modem_dbus_skeleton != NULL);
+ g_assert (self->priv->modem_dbus_skeleton != NULL);
/* Enabling the Modem interface */
- mm_iface_modem_enable (MM_IFACE_MODEM (ctx->self),
+ mm_iface_modem_enable (MM_IFACE_MODEM (self),
g_task_get_cancellable (task),
(GAsyncReadyCallback)iface_modem_enable_ready,
task);
return;
case ENABLING_STEP_IFACE_3GPP:
- if (ctx->self->priv->modem_3gpp_dbus_skeleton) {
- mm_obj_dbg (ctx->self, "modem has 3GPP capabilities, enabling the Modem 3GPP interface...");
+ if (self->priv->modem_3gpp_dbus_skeleton) {
+ mm_obj_dbg (self, "modem has 3GPP capabilities, enabling the Modem 3GPP interface...");
/* Enabling the Modem 3GPP interface */
- mm_iface_modem_3gpp_enable (MM_IFACE_MODEM_3GPP (ctx->self),
+ mm_iface_modem_3gpp_enable (MM_IFACE_MODEM_3GPP (self),
g_task_get_cancellable (task),
(GAsyncReadyCallback)iface_modem_3gpp_enable_ready,
task);
@@ -12293,9 +12305,9 @@ enabling_step (GTask *task)
/* fall through */
case ENABLING_STEP_IFACE_3GPP_PROFILE_MANAGER:
- if (ctx->self->priv->modem_3gpp_profile_manager_dbus_skeleton) {
- mm_obj_dbg (ctx->self, "modem has 3GPP profile management capabilities, enabling the Modem 3GPP Profile Manager interface...");
- mm_iface_modem_3gpp_profile_manager_enable (MM_IFACE_MODEM_3GPP_PROFILE_MANAGER (ctx->self),
+ if (self->priv->modem_3gpp_profile_manager_dbus_skeleton) {
+ mm_obj_dbg (self, "modem has 3GPP profile management capabilities, enabling the Modem 3GPP Profile Manager interface...");
+ mm_iface_modem_3gpp_profile_manager_enable (MM_IFACE_MODEM_3GPP_PROFILE_MANAGER (self),
(GAsyncReadyCallback)iface_modem_3gpp_profile_manager_enable_ready,
task);
return;
@@ -12304,9 +12316,9 @@ enabling_step (GTask *task)
/* fall through */
case ENABLING_STEP_IFACE_3GPP_USSD:
- if (ctx->self->priv->modem_3gpp_ussd_dbus_skeleton) {
- mm_obj_dbg (ctx->self, "modem has 3GPP/USSD capabilities, enabling the Modem 3GPP/USSD interface...");
- mm_iface_modem_3gpp_ussd_enable (MM_IFACE_MODEM_3GPP_USSD (ctx->self),
+ if (self->priv->modem_3gpp_ussd_dbus_skeleton) {
+ mm_obj_dbg (self, "modem has 3GPP/USSD capabilities, enabling the Modem 3GPP/USSD interface...");
+ mm_iface_modem_3gpp_ussd_enable (MM_IFACE_MODEM_3GPP_USSD (self),
(GAsyncReadyCallback)iface_modem_3gpp_ussd_enable_ready,
task);
return;
@@ -12315,10 +12327,10 @@ enabling_step (GTask *task)
/* fall through */
case ENABLING_STEP_IFACE_CDMA:
- if (ctx->self->priv->modem_cdma_dbus_skeleton) {
- mm_obj_dbg (ctx->self, "modem has CDMA capabilities, enabling the Modem CDMA interface...");
+ if (self->priv->modem_cdma_dbus_skeleton) {
+ mm_obj_dbg (self, "modem has CDMA capabilities, enabling the Modem CDMA interface...");
/* Enabling the Modem CDMA interface */
- mm_iface_modem_cdma_enable (MM_IFACE_MODEM_CDMA (ctx->self),
+ mm_iface_modem_cdma_enable (MM_IFACE_MODEM_CDMA (self),
g_task_get_cancellable (task),
(GAsyncReadyCallback)iface_modem_cdma_enable_ready,
task);
@@ -12328,10 +12340,10 @@ enabling_step (GTask *task)
/* fall through */
case ENABLING_STEP_IFACE_LOCATION:
- if (ctx->self->priv->modem_location_dbus_skeleton) {
- mm_obj_dbg (ctx->self, "modem has location capabilities, enabling the Location interface...");
+ if (self->priv->modem_location_dbus_skeleton) {
+ mm_obj_dbg (self, "modem has location capabilities, enabling the Location interface...");
/* Enabling the Modem Location interface */
- mm_iface_modem_location_enable (MM_IFACE_MODEM_LOCATION (ctx->self),
+ mm_iface_modem_location_enable (MM_IFACE_MODEM_LOCATION (self),
g_task_get_cancellable (task),
(GAsyncReadyCallback)iface_modem_location_enable_ready,
task);
@@ -12341,10 +12353,10 @@ enabling_step (GTask *task)
/* fall through */
case ENABLING_STEP_IFACE_MESSAGING:
- if (ctx->self->priv->modem_messaging_dbus_skeleton) {
- mm_obj_dbg (ctx->self, "modem has messaging capabilities, enabling the Messaging interface...");
+ if (self->priv->modem_messaging_dbus_skeleton) {
+ mm_obj_dbg (self, "modem has messaging capabilities, enabling the Messaging interface...");
/* Enabling the Modem Messaging interface */
- mm_iface_modem_messaging_enable (MM_IFACE_MODEM_MESSAGING (ctx->self),
+ mm_iface_modem_messaging_enable (MM_IFACE_MODEM_MESSAGING (self),
g_task_get_cancellable (task),
(GAsyncReadyCallback)iface_modem_messaging_enable_ready,
task);
@@ -12354,10 +12366,10 @@ enabling_step (GTask *task)
/* fall through */
case ENABLING_STEP_IFACE_TIME:
- if (ctx->self->priv->modem_time_dbus_skeleton) {
- mm_obj_dbg (ctx->self, "modem has time capabilities, enabling the Time interface...");
+ if (self->priv->modem_time_dbus_skeleton) {
+ mm_obj_dbg (self, "modem has time capabilities, enabling the Time interface...");
/* Enabling the Modem Time interface */
- mm_iface_modem_time_enable (MM_IFACE_MODEM_TIME (ctx->self),
+ mm_iface_modem_time_enable (MM_IFACE_MODEM_TIME (self),
g_task_get_cancellable (task),
(GAsyncReadyCallback)iface_modem_time_enable_ready,
task);
@@ -12367,10 +12379,10 @@ enabling_step (GTask *task)
/* fall through */
case ENABLING_STEP_IFACE_SIGNAL:
- if (ctx->self->priv->modem_signal_dbus_skeleton) {
- mm_obj_dbg (ctx->self, "modem has extended signal reporting capabilities, enabling the Signal interface...");
+ if (self->priv->modem_signal_dbus_skeleton) {
+ mm_obj_dbg (self, "modem has extended signal reporting capabilities, enabling the Signal interface...");
/* Enabling the Modem Signal interface */
- mm_iface_modem_signal_enable (MM_IFACE_MODEM_SIGNAL (ctx->self),
+ mm_iface_modem_signal_enable (MM_IFACE_MODEM_SIGNAL (self),
g_task_get_cancellable (task),
(GAsyncReadyCallback)iface_modem_signal_enable_ready,
task);
@@ -12380,10 +12392,10 @@ enabling_step (GTask *task)
/* fall through */
case ENABLING_STEP_IFACE_OMA:
- if (ctx->self->priv->modem_oma_dbus_skeleton) {
- mm_obj_dbg (ctx->self, "modem has OMA capabilities, enabling the OMA interface...");
+ if (self->priv->modem_oma_dbus_skeleton) {
+ mm_obj_dbg (self, "modem has OMA capabilities, enabling the OMA interface...");
/* Enabling the Modem Oma interface */
- mm_iface_modem_oma_enable (MM_IFACE_MODEM_OMA (ctx->self),
+ mm_iface_modem_oma_enable (MM_IFACE_MODEM_OMA (self),
g_task_get_cancellable (task),
(GAsyncReadyCallback)iface_modem_oma_enable_ready,
task);
@@ -12393,10 +12405,10 @@ enabling_step (GTask *task)
/* fall through */
case ENABLING_STEP_IFACE_VOICE:
- if (ctx->self->priv->modem_voice_dbus_skeleton) {
- mm_obj_dbg (ctx->self, "modem has voice capabilities, enabling the Voice interface...");
+ if (self->priv->modem_voice_dbus_skeleton) {
+ mm_obj_dbg (self, "modem has voice capabilities, enabling the Voice interface...");
/* Enabling the Modem Voice interface */
- mm_iface_modem_voice_enable (MM_IFACE_MODEM_VOICE (ctx->self),
+ mm_iface_modem_voice_enable (MM_IFACE_MODEM_VOICE (self),
g_task_get_cancellable (task),
(GAsyncReadyCallback)iface_modem_voice_enable_ready,
task);
@@ -12414,8 +12426,6 @@ enabling_step (GTask *task)
/* fall through */
case ENABLING_STEP_LAST:
- ctx->enabled = TRUE;
-
/* Once all interfaces have been enabled, trigger registration checks in
* 3GPP and CDMA modems. We have to do this at this point so that e.g.
* location interface gets proper registration related info reported.
@@ -12423,11 +12433,10 @@ enabling_step (GTask *task)
* We do this in an idle so that we don't mess up the logs at this point
* with the new requests being triggered.
*/
- schedule_initial_registration_checks (ctx->self);
+ schedule_initial_registration_checks (self);
/* All enabled without errors! */
- g_task_return_boolean (task, TRUE);
- g_object_unref (task);
+ enabling_complete (task);
return;
default:
@@ -12438,10 +12447,22 @@ enabling_step (GTask *task)
}
static void
-enable (MMBaseModem *self,
- GCancellable *cancellable,
- GAsyncReadyCallback callback,
- gpointer user_data)
+enabling_start (GTask *task)
+{
+ EnablingContext *ctx;
+
+ ctx = g_slice_new0 (EnablingContext);
+ ctx->step = ENABLING_STEP_FIRST;
+ g_task_set_task_data (task, ctx, (GDestroyNotify)enabling_context_free);
+
+ enabling_step (task);
+}
+
+static void
+enable (MMBaseModem *self,
+ GCancellable *cancellable,
+ GAsyncReadyCallback callback,
+ gpointer user_data)
{
GTask *task;
@@ -12455,33 +12476,22 @@ enable (MMBaseModem *self,
break;
case MM_MODEM_STATE_FAILED:
- g_task_return_new_error (task,
- MM_CORE_ERROR,
- MM_CORE_ERROR_WRONG_STATE,
+ g_task_return_new_error (task, MM_CORE_ERROR, MM_CORE_ERROR_WRONG_STATE,
"Cannot enable modem: initialization failed");
+ g_object_unref (task);
break;
case MM_MODEM_STATE_LOCKED:
- g_task_return_new_error (task,
- MM_CORE_ERROR,
- MM_CORE_ERROR_WRONG_STATE,
+ g_task_return_new_error (task, MM_CORE_ERROR, MM_CORE_ERROR_WRONG_STATE,
"Cannot enable modem: device locked");
+ g_object_unref (task);
break;
case MM_MODEM_STATE_INITIALIZING:
case MM_MODEM_STATE_DISABLED:
- case MM_MODEM_STATE_DISABLING: {
- EnablingContext *ctx;
-
- ctx = g_new0 (EnablingContext, 1);
- ctx->self = MM_BROADBAND_MODEM (g_object_ref (self));
- ctx->step = ENABLING_STEP_FIRST;
-
- g_task_set_task_data (task, ctx, (GDestroyNotify)enabling_context_free);
-
- enabling_step (task);
+ case MM_MODEM_STATE_DISABLING:
+ enabling_start (task);
return;
- }
case MM_MODEM_STATE_ENABLING:
g_assert_not_reached ();
@@ -12495,13 +12505,12 @@ enable (MMBaseModem *self,
case MM_MODEM_STATE_CONNECTED:
/* Just return success, don't relaunch enabling */
g_task_return_boolean (task, TRUE);
+ g_object_unref (task);
break;
default:
g_assert_not_reached ();
}
-
- g_object_unref (task);
}
/*****************************************************************************/