/* -*- Mode: C; c-basic-offset: 4; indent-tabs-mode: nil -*- */ /* Copyright (C) 2016 Red Hat, Inc. This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.0 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #include "config.h" #include "gtask-helper.h" typedef struct _GTaskHelperData { GTask *task; GError *error; gint integer; gboolean boolean; gpointer pointer; GDestroyNotify destroy_notify_cb; } GTaskHelperData; static GTaskHelperData * g_task_helper_new(void) { return g_new0(GTaskHelperData, 1); } static void g_task_helper_data_free(GTaskHelperData *data) { g_clear_object(&data->task); g_free(data); } static gboolean complete_in_idle_boolean_cb(gpointer user_data) { GTaskHelperData *data = user_data; g_task_return_boolean(data->task, data->boolean); g_task_helper_data_free(data); return FALSE; } static gboolean complete_in_idle_integer_cb(gpointer user_data) { GTaskHelperData *data = user_data; g_task_return_int(data->task, data->integer); g_task_helper_data_free(data); return FALSE; } static gboolean complete_in_idle_error_cb(gpointer user_data) { GTaskHelperData *data = user_data; g_task_return_error(data->task, data->error); g_task_helper_data_free(data); return FALSE; } static gboolean complete_in_idle_pointer_cb(gpointer user_data) { GTaskHelperData *data = user_data; g_task_return_pointer(data->task, data->pointer, data->destroy_notify_cb); g_task_helper_data_free(data); return FALSE; } void g_task_helper_return_boolean(GTask *task, gboolean boolean) { GTaskHelperData *data = g_task_helper_new(); data->task = g_object_ref(task); data->boolean = boolean; g_idle_add(complete_in_idle_boolean_cb, data); } void g_task_helper_return_integer(GTask *task, gint integer) { GTaskHelperData *data = g_task_helper_new(); data->task = g_object_ref(task); data->integer = integer; g_idle_add(complete_in_idle_integer_cb, data); } void g_task_helper_return_error(GTask *task, GError *error) { GTaskHelperData *data = g_task_helper_new(); data->task = g_object_ref(task); g_propagate_error(&data->error, error); g_idle_add(complete_in_idle_error_cb, data); } void g_task_helper_return_new_error(GTask *task, GQuark domain, gint code, const char *format, ...) { GTaskHelperData *data = g_task_helper_new(); va_list args; data->task = g_object_ref(task); va_start(args, format); data->error = g_error_new_valist(domain, code, format, args); va_end(args); g_idle_add(complete_in_idle_error_cb, data); } void g_task_helper_return_pointer(GTask *task, gpointer pointer, GDestroyNotify destroy_notify_cb) { GTaskHelperData *data = g_task_helper_new(); data->task = g_object_ref(task); data->pointer = pointer; data->destroy_notify_cb = destroy_notify_cb; g_idle_add(complete_in_idle_pointer_cb, data); }