bearer-list: new async method to disconnect all bearers

This commit is contained in:
Aleksander Morgado
2012-01-20 10:53:44 +01:00
parent 43ac87170c
commit 9ab4ad28ff
2 changed files with 93 additions and 1 deletions

View File

@@ -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 * MMBearerList *
mm_bearer_list_new (guint max_bearers, mm_bearer_list_new (guint max_bearers,
guint max_active_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_bearers,
max_active_bearers); max_active_bearers);

View File

@@ -72,4 +72,11 @@ void mm_bearer_list_foreach (MMBearerList *self,
MMBearerListForeachFunc func, MMBearerListForeachFunc func,
gpointer user_data); gpointer user_data);
void mm_bearer_list_disconnect_all_bearers (MMBearerList *self,
GAsyncReadyCallback callback,
gpointer user_data);
gboolean mm_bearer_list_disconnect_all_bearers_finish (MMBearerList *self,
GAsyncResult *res,
GError **error);
#endif /* MM_BEARER_LIST_H */ #endif /* MM_BEARER_LIST_H */