diff options
author | Ben Chan <benchan@chromium.org> | 2017-06-30 02:21:18 -0700 |
---|---|---|
committer | Aleksander Morgado <aleksander@aleksander.es> | 2017-06-30 11:39:14 +0200 |
commit | 7ac30db4b7e5c492b81a92499355b27c8ac6df5f (patch) | |
tree | 46191d2a146c98c27249fe37d96b9d9a56b99a2a | |
parent | 48b154f2655629d39e9aeabe1c3f2f91bf652e0b (diff) |
iface-modem-3gpp: port mm_iface_modem_3gpp_register_in_network to use GTask
-rw-r--r-- | src/mm-iface-modem-3gpp.c | 93 |
1 files changed, 49 insertions, 44 deletions
diff --git a/src/mm-iface-modem-3gpp.c b/src/mm-iface-modem-3gpp.c index 255e75f4..e1a61ced 100644 --- a/src/mm-iface-modem-3gpp.c +++ b/src/mm-iface-modem-3gpp.c @@ -199,7 +199,6 @@ get_consolidated_reg_state (RegistrationStateContext *ctx) typedef struct { MMIfaceModem3gpp *self; MmGdbusModem3gpp *skeleton; - GSimpleAsyncResult *result; GCancellable *cancellable; gchar *operator_id; GTimer *timer; @@ -207,11 +206,8 @@ typedef struct { } RegisterInNetworkContext; static void -register_in_network_context_complete_and_free (RegisterInNetworkContext *ctx) +register_in_network_context_free (RegisterInNetworkContext *ctx) { - g_simple_async_result_complete_in_idle (ctx->result); - g_object_unref (ctx->result); - if (ctx->timer) g_timer_destroy (ctx->timer); @@ -234,16 +230,21 @@ register_in_network_context_complete_and_free (RegisterInNetworkContext *ctx) } static void -register_in_network_context_failed (RegisterInNetworkContext *ctx, - GError *error) +register_in_network_context_complete_failed (GTask *task, + GError *error) { + RegisterInNetworkContext *ctx; + + ctx = g_task_get_task_data (task); + mm_iface_modem_3gpp_update_cs_registration_state (ctx->self, MM_MODEM_3GPP_REGISTRATION_STATE_IDLE); mm_iface_modem_3gpp_update_ps_registration_state (ctx->self, MM_MODEM_3GPP_REGISTRATION_STATE_IDLE); mm_iface_modem_3gpp_update_eps_registration_state (ctx->self, MM_MODEM_3GPP_REGISTRATION_STATE_IDLE); mm_iface_modem_3gpp_update_access_technologies (ctx->self, MM_MODEM_ACCESS_TECHNOLOGY_UNKNOWN); mm_iface_modem_3gpp_update_location (ctx->self, 0, 0); - g_simple_async_result_take_error (ctx->result, error); + g_task_return_error (task, error); + g_object_unref (task); } gboolean @@ -251,38 +252,44 @@ mm_iface_modem_3gpp_register_in_network_finish (MMIfaceModem3gpp *self, GAsyncResult *res, GError **error) { - return !g_simple_async_result_propagate_error (G_SIMPLE_ASYNC_RESULT (res), error); + return g_task_propagate_boolean (G_TASK (res), error); } static void run_registration_checks_ready (MMIfaceModem3gpp *self, GAsyncResult *res, - RegisterInNetworkContext *ctx); + GTask *task); static gboolean -run_registration_checks_again (RegisterInNetworkContext *ctx) +run_registration_checks_again (GTask *task) { + RegisterInNetworkContext *ctx; + + ctx = g_task_get_task_data (task); + /* Get fresh registration state */ mm_iface_modem_3gpp_run_registration_checks ( ctx->self, (GAsyncReadyCallback)run_registration_checks_ready, - ctx); + task); return G_SOURCE_REMOVE; } static void run_registration_checks_ready (MMIfaceModem3gpp *self, GAsyncResult *res, - RegisterInNetworkContext *ctx) + GTask *task) { + RegisterInNetworkContext *ctx; GError *error = NULL; RegistrationStateContext *registration_state_context; MMModem3gppRegistrationState current_registration_state; + ctx = g_task_get_task_data (task); + mm_iface_modem_3gpp_run_registration_checks_finish (MM_IFACE_MODEM_3GPP (self), res, &error); if (error) { mm_dbg ("3GPP registration check failed: '%s'", error->message); - register_in_network_context_failed (ctx, error); - register_in_network_context_complete_and_free (ctx); + register_in_network_context_complete_failed (task, error); return; } @@ -293,10 +300,9 @@ run_registration_checks_ready (MMIfaceModem3gpp *self, * finished */ if (current_registration_state == MM_MODEM_3GPP_REGISTRATION_STATE_DENIED) { mm_dbg ("Registration denied"); - register_in_network_context_failed ( - ctx, + register_in_network_context_complete_failed ( + task, mm_mobile_equipment_error_for_code (MM_MOBILE_EQUIPMENT_ERROR_NETWORK_NOT_ALLOWED)); - register_in_network_context_complete_and_free (ctx); return; } @@ -313,18 +319,17 @@ run_registration_checks_ready (MMIfaceModem3gpp *self, * the modem never got un-registered during the sequence. */ mm_iface_modem_refresh_signal (MM_IFACE_MODEM (ctx->self)); mm_dbg ("Modem is currently registered in a 3GPP network"); - g_simple_async_result_set_op_res_gboolean (ctx->result, TRUE); - register_in_network_context_complete_and_free (ctx); + g_task_return_boolean (task, TRUE); + g_object_unref (task); return; } /* Don't spend too much time waiting to get registered */ if (g_timer_elapsed (ctx->timer, NULL) > ctx->max_registration_time) { mm_dbg ("3GPP registration check timed out"); - register_in_network_context_failed ( - ctx, + register_in_network_context_complete_failed ( + task, mm_mobile_equipment_error_for_code (MM_MOBILE_EQUIPMENT_ERROR_NETWORK_TIMEOUT)); - register_in_network_context_complete_and_free (ctx); return; } @@ -335,20 +340,19 @@ run_registration_checks_ready (MMIfaceModem3gpp *self, * well. */ mm_dbg ("Modem not yet registered in a 3GPP network... will recheck soon"); - g_timeout_add_seconds (3, (GSourceFunc)run_registration_checks_again, ctx); + g_timeout_add_seconds (3, (GSourceFunc)run_registration_checks_again, task); } static void register_in_network_ready (MMIfaceModem3gpp *self, GAsyncResult *res, - RegisterInNetworkContext *ctx) + GTask *task) { GError *error = NULL; if (!MM_IFACE_MODEM_3GPP_GET_INTERFACE (self)->register_in_network_finish (self, res, &error)) { /* Propagate error when trying to lock to network */ - register_in_network_context_failed (ctx, error); - register_in_network_context_complete_and_free (ctx); + register_in_network_context_complete_failed (task, error); return; } @@ -357,7 +361,7 @@ register_in_network_ready (MMIfaceModem3gpp *self, mm_iface_modem_3gpp_run_registration_checks ( self, (GAsyncReadyCallback)run_registration_checks_ready, - ctx); + task); } void @@ -371,32 +375,33 @@ mm_iface_modem_3gpp_register_in_network (MMIfaceModem3gpp *self, const gchar *current_operator_code; RegistrationStateContext *registration_state_context; GError *error = NULL; + GTask *task; ctx = g_slice_new0 (RegisterInNetworkContext); ctx->self = g_object_ref (self); - ctx->result = g_simple_async_result_new (G_OBJECT (self), - callback, - user_data, - mm_iface_modem_3gpp_register_in_network); ctx->operator_id = (operator_id && operator_id[0]) ? g_strdup (operator_id) : NULL; ctx->max_registration_time = max_registration_time; + + task = g_task_new (self, NULL, callback, user_data); + g_task_set_task_data (task, ctx, (GDestroyNotify)register_in_network_context_free); + g_object_get (self, MM_IFACE_MODEM_3GPP_DBUS_SKELETON, &ctx->skeleton, NULL); if (!ctx->skeleton) { - g_simple_async_result_set_error (ctx->result, - MM_CORE_ERROR, - MM_CORE_ERROR_FAILED, - "Couldn't get interface skeleton"); - register_in_network_context_complete_and_free (ctx); + g_task_return_new_error (task, + MM_CORE_ERROR, + MM_CORE_ERROR_FAILED, + "Couldn't get interface skeleton"); + g_object_unref (task); return; } /* Validate input MCC/MNC */ if (ctx->operator_id && !mm_3gpp_parse_operator_id (ctx->operator_id, NULL, NULL, &error)) { g_assert (error != NULL); - g_simple_async_result_take_error (ctx->result, error); - register_in_network_context_complete_and_free (ctx); + g_task_return_error (task, error); + g_object_unref (task); return; } @@ -419,8 +424,8 @@ mm_iface_modem_3gpp_register_in_network (MMIfaceModem3gpp *self, registration_state_context->manual_registration = TRUE; mm_dbg ("Already registered in selected network '%s'...", current_operator_code); - g_simple_async_result_set_op_res_gboolean (ctx->result, TRUE); - register_in_network_context_complete_and_free (ctx); + g_task_return_boolean (task, TRUE); + g_object_unref (task); return; } @@ -438,8 +443,8 @@ mm_iface_modem_3gpp_register_in_network (MMIfaceModem3gpp *self, mm_dbg ("Already registered in network '%s'," " automatic registration not launched...", current_operator_code); - g_simple_async_result_set_op_res_gboolean (ctx->result, TRUE); - register_in_network_context_complete_and_free (ctx); + g_task_return_boolean (task, TRUE); + g_object_unref (task); return; } @@ -461,7 +466,7 @@ mm_iface_modem_3gpp_register_in_network (MMIfaceModem3gpp *self, ctx->operator_id, ctx->cancellable, (GAsyncReadyCallback)register_in_network_ready, - ctx); + task); } typedef struct { |