iface-modem-3gpp: port mm_iface_modem_3gpp_register_in_network to use GTask
This commit is contained in:
committed by
Aleksander Morgado
parent
48b154f265
commit
7ac30db4b7
+49
-44
@@ -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 {
|
||||
|
||||
Reference in New Issue
Block a user