aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--plugins/huawei/mm-broadband-bearer-huawei.c119
1 files changed, 63 insertions, 56 deletions
diff --git a/plugins/huawei/mm-broadband-bearer-huawei.c b/plugins/huawei/mm-broadband-bearer-huawei.c
index 2230e74a..a1f189f8 100644
--- a/plugins/huawei/mm-broadband-bearer-huawei.c
+++ b/plugins/huawei/mm-broadband-bearer-huawei.c
@@ -551,22 +551,17 @@ typedef enum {
} Disconnect3gppContextStep;
typedef struct {
- MMBroadbandBearerHuawei *self;
MMBaseModem *modem;
MMPortSerialAt *primary;
- GSimpleAsyncResult *result;
Disconnect3gppContextStep step;
guint check_count;
guint failed_ndisstatqry_count;
} Disconnect3gppContext;
static void
-disconnect_3gpp_context_complete_and_free (Disconnect3gppContext *ctx)
+disconnect_3gpp_context_free (Disconnect3gppContext *ctx)
{
- g_simple_async_result_complete (ctx->result);
- g_object_unref (ctx->result);
g_object_unref (ctx->primary);
- g_object_unref (ctx->self);
g_object_unref (ctx->modem);
g_slice_free (Disconnect3gppContext, ctx);
}
@@ -576,25 +571,25 @@ disconnect_3gpp_finish (MMBroadbandBearer *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 disconnect_3gpp_context_step (Disconnect3gppContext *ctx);
+static void disconnect_3gpp_context_step (GTask *task);
static gboolean
disconnect_retry_ndisstatqry_check_cb (MMBroadbandBearerHuawei *self)
{
- Disconnect3gppContext *ctx;
+ GTask *task;
/* Recover context */
- ctx = self->priv->disconnect_pending;
- g_assert (ctx != NULL);
+ task = self->priv->disconnect_pending;
+ g_assert (task != NULL);
/* Balance refcount */
g_object_unref (self);
/* Retry same step */
- disconnect_3gpp_context_step (ctx);
+ disconnect_3gpp_context_step (task);
return G_SOURCE_REMOVE;
}
@@ -603,6 +598,7 @@ disconnect_ndisstatqry_check_ready (MMBaseModem *modem,
GAsyncResult *res,
MMBroadbandBearerHuawei *self)
{
+ GTask *task;
Disconnect3gppContext *ctx;
const gchar *response;
GError *error = NULL;
@@ -611,8 +607,10 @@ disconnect_ndisstatqry_check_ready (MMBaseModem *modem,
gboolean ipv6_available = FALSE;
gboolean ipv6_connected = FALSE;
- ctx = self->priv->disconnect_pending;
- g_assert (ctx != NULL);
+ task = self->priv->disconnect_pending;
+ g_assert (task != NULL);
+
+ ctx = g_task_get_task_data (task);
/* Balance refcount */
g_object_unref (self);
@@ -635,7 +633,7 @@ disconnect_ndisstatqry_check_ready (MMBaseModem *modem,
if (ipv4_available && !ipv4_connected) {
/* Success! */
ctx->step++;
- disconnect_3gpp_context_step (ctx);
+ disconnect_3gpp_context_step (task);
return;
}
@@ -650,42 +648,51 @@ disconnect_ndisdup_ready (MMBaseModem *modem,
GAsyncResult *res,
MMBroadbandBearerHuawei *self)
{
+ GTask *task;
Disconnect3gppContext *ctx;
GError *error = NULL;
- ctx = self->priv->disconnect_pending;
- g_assert (ctx != NULL);
+ task = self->priv->disconnect_pending;
+ g_assert (task != NULL);
+
+ ctx = g_task_get_task_data (task);
/* Balance refcount */
g_object_unref (self);
if (!mm_base_modem_at_command_full_finish (modem, res, &error)) {
- /* Clear context */
+ /* Clear task */
self->priv->disconnect_pending = NULL;
- g_simple_async_result_take_error (ctx->result, error);
- disconnect_3gpp_context_complete_and_free (ctx);
+ g_task_return_error (task, error);
+ g_object_unref (task);
return;
}
/* Go to next step */
ctx->step++;
- disconnect_3gpp_context_step (ctx);
+ disconnect_3gpp_context_step (task);
}
static void
-disconnect_3gpp_context_step (Disconnect3gppContext *ctx)
+disconnect_3gpp_context_step (GTask *task)
{
+ MMBroadbandBearerHuawei *self;
+ Disconnect3gppContext *ctx;
+
+ self = g_task_get_source_object (task);
+ ctx = g_task_get_task_data (task);
+
switch (ctx->step) {
case DISCONNECT_3GPP_CONTEXT_STEP_FIRST:
- /* Store the context */
- ctx->self->priv->disconnect_pending = ctx;
+ /* Store the task */
+ self->priv->disconnect_pending = task;
/* We ignore any pending network-initiated disconnection in order to prevent it
* from interfering with the client-initiated disconnection, as we would like to
* proceed with the latter anyway. */
- if (ctx->self->priv->network_disconnect_pending_id != 0) {
- g_source_remove (ctx->self->priv->network_disconnect_pending_id);
- ctx->self->priv->network_disconnect_pending_id = 0;
+ if (self->priv->network_disconnect_pending_id != 0) {
+ g_source_remove (self->priv->network_disconnect_pending_id);
+ self->priv->network_disconnect_pending_id = 0;
}
ctx->step++;
@@ -700,31 +707,31 @@ disconnect_3gpp_context_step (Disconnect3gppContext *ctx)
FALSE,
NULL,
(GAsyncReadyCallback)disconnect_ndisdup_ready,
- g_object_ref (ctx->self));
+ g_object_ref (self));
return;
case DISCONNECT_3GPP_CONTEXT_STEP_NDISSTATQRY:
/* If too many retries (1s of wait between the retries), failed */
if (ctx->check_count > 60) {
- /* Clear context */
- ctx->self->priv->disconnect_pending = NULL;
- g_simple_async_result_set_error (ctx->result,
- MM_MOBILE_EQUIPMENT_ERROR,
- MM_MOBILE_EQUIPMENT_ERROR_NETWORK_TIMEOUT,
- "Disconnection attempt timed out");
- disconnect_3gpp_context_complete_and_free (ctx);
+ /* Clear task */
+ self->priv->disconnect_pending = NULL;
+ g_task_return_new_error (task,
+ MM_MOBILE_EQUIPMENT_ERROR,
+ MM_MOBILE_EQUIPMENT_ERROR_NETWORK_TIMEOUT,
+ "Disconnection attempt timed out");
+ g_object_unref (task);
return;
}
/* Give up if too many unexpected responses to NIDSSTATQRY are encountered. */
if (ctx->failed_ndisstatqry_count > 10) {
- /* Clear context */
- ctx->self->priv->disconnect_pending = NULL;
- g_simple_async_result_set_error (ctx->result,
- MM_MOBILE_EQUIPMENT_ERROR,
- MM_MOBILE_EQUIPMENT_ERROR_NOT_SUPPORTED,
- "Disconnection attempt not supported.");
- disconnect_3gpp_context_complete_and_free (ctx);
+ /* Clear task */
+ self->priv->disconnect_pending = NULL;
+ g_task_return_new_error (task,
+ MM_MOBILE_EQUIPMENT_ERROR,
+ MM_MOBILE_EQUIPMENT_ERROR_NOT_SUPPORTED,
+ "Disconnection attempt not supported.");
+ g_object_unref (task);
return;
}
@@ -738,21 +745,21 @@ disconnect_3gpp_context_step (Disconnect3gppContext *ctx)
FALSE,
NULL,
(GAsyncReadyCallback)disconnect_ndisstatqry_check_ready,
- g_object_ref (ctx->self));
+ g_object_ref (self));
return;
case DISCONNECT_3GPP_CONTEXT_STEP_LAST:
- /* Clear context */
- ctx->self->priv->disconnect_pending = NULL;
+ /* Clear task */
+ self->priv->disconnect_pending = NULL;
/* Set data port as result */
- g_simple_async_result_set_op_res_gboolean (ctx->result, TRUE);
- disconnect_3gpp_context_complete_and_free (ctx);
+ g_task_return_boolean (task, TRUE);
+ g_object_unref (task);
return;
}
}
static void
-disconnect_3gpp (MMBroadbandBearer *self,
+disconnect_3gpp (MMBroadbandBearer *_self,
MMBroadbandModem *modem,
MMPortSerialAt *primary,
MMPortSerialAt *secondary,
@@ -761,27 +768,27 @@ disconnect_3gpp (MMBroadbandBearer *self,
GAsyncReadyCallback callback,
gpointer user_data)
{
+ MMBroadbandBearerHuawei *self = MM_BROADBAND_BEARER_HUAWEI (_self);
Disconnect3gppContext *ctx;
+ GTask *task;
g_assert (primary != NULL);
ctx = g_slice_new0 (Disconnect3gppContext);
- ctx->self = g_object_ref (self);
ctx->modem = MM_BASE_MODEM (g_object_ref (modem));
- ctx->result = g_simple_async_result_new (G_OBJECT (self),
- callback,
- user_data,
- disconnect_3gpp);
ctx->step = DISCONNECT_3GPP_CONTEXT_STEP_FIRST;
- g_assert (ctx->self->priv->connect_pending == NULL);
- g_assert (ctx->self->priv->disconnect_pending == NULL);
+ g_assert (self->priv->connect_pending == NULL);
+ g_assert (self->priv->disconnect_pending == NULL);
/* Get correct dial port to use */
ctx->primary = get_dial_port (MM_BROADBAND_MODEM_HUAWEI (ctx->modem), data, primary);
+ task = g_task_new (self, NULL, callback, user_data);
+ g_task_set_task_data (task, ctx, (GDestroyNotify)disconnect_3gpp_context_free);
+
/* Start! */
- disconnect_3gpp_context_step (ctx);
+ disconnect_3gpp_context_step (task);
}
/*****************************************************************************/