diff options
author | Aleksander Morgado <aleksander@lanedo.com> | 2012-01-20 10:53:44 +0100 |
---|---|---|
committer | Aleksander Morgado <aleksander@lanedo.com> | 2012-03-15 14:14:54 +0100 |
commit | 9ab4ad28ff8bdd62ba16012fc0af4f950720da02 (patch) | |
tree | 6870e401810b64b2c2427b487e4d5f3dd94e1274 /src/mm-bearer-list.c | |
parent | 43ac87170cffe9da225dc3a0e6dd2c0e6a487ca3 (diff) |
bearer-list: new async method to disconnect all bearers
Diffstat (limited to 'src/mm-bearer-list.c')
-rw-r--r-- | src/mm-bearer-list.c | 87 |
1 files changed, 86 insertions, 1 deletions
diff --git a/src/mm-bearer-list.c b/src/mm-bearer-list.c index d64b4ec6..37069acc 100644 --- a/src/mm-bearer-list.c +++ b/src/mm-bearer-list.c @@ -167,11 +167,96 @@ mm_bearer_list_foreach (MMBearerList *self, /*****************************************************************************/ +typedef struct { + GSimpleAsyncResult *result; + GList *pending; + MMBearer *current; +} DisconnectAllContext; + +static void +disconnect_all_context_complete_and_free (DisconnectAllContext *ctx) +{ + g_simple_async_result_complete (ctx->result); + g_object_unref (ctx->result); + if (ctx->current) + g_object_unref (ctx->current); + g_list_free_full (ctx->pending, (GDestroyNotify) g_object_unref); + g_free (ctx); +} + +gboolean +mm_bearer_list_disconnect_all_bearers_finish (MMBearerList *self, + GAsyncResult *res, + GError **error) +{ + return !g_simple_async_result_propagate_error (G_SIMPLE_ASYNC_RESULT (res), error); +} + +static void disconnect_next_bearer (DisconnectAllContext *ctx); + +static void +disconnect_ready (MMBearer *bearer, + GAsyncResult *res, + DisconnectAllContext *ctx) +{ + GError *error = NULL; + + if (!mm_bearer_disconnect_finish (bearer, res, &error)) { + g_simple_async_result_take_error (ctx->result, error); + disconnect_all_context_complete_and_free (ctx); + return; + } + + disconnect_next_bearer (ctx); +} + +static void +disconnect_next_bearer (DisconnectAllContext *ctx) +{ + if (ctx->current) + g_clear_object (&ctx->current); + + /* No more bearers? all done! */ + if (!ctx->pending) { + g_simple_async_result_set_op_res_gboolean (ctx->result, TRUE); + disconnect_all_context_complete_and_free (ctx); + return; + } + + ctx->current = MM_BEARER (ctx->pending->data); + ctx->pending = g_list_delete_link (ctx->pending, ctx->pending); + + mm_bearer_disconnect (ctx->current, + (GAsyncReadyCallback)disconnect_ready, + ctx); +} + +void +mm_bearer_list_disconnect_all_bearers (MMBearerList *self, + GAsyncReadyCallback callback, + gpointer user_data) +{ + DisconnectAllContext *ctx; + + ctx = g_new0 (DisconnectAllContext, 1); + ctx->result = g_simple_async_result_new (G_OBJECT (self), + callback, + user_data, + mm_bearer_list_disconnect_all_bearers); + /* Get a copy of the list */ + ctx->pending = g_list_copy (self->priv->bearers); + g_list_foreach (ctx->pending, (GFunc) g_object_ref, NULL); + + disconnect_next_bearer (ctx); +} + +/*****************************************************************************/ + MMBearerList * mm_bearer_list_new (guint max_bearers, guint max_active_bearers) { - mm_dbg ("Crearing bearer list (max: %u, max active: %u)", + mm_dbg ("Creating bearer list (max: %u, max active: %u)", max_bearers, max_active_bearers); |