diff options
Diffstat (limited to 'src/gtask-helper.c')
-rw-r--r-- | src/gtask-helper.c | 152 |
1 files changed, 152 insertions, 0 deletions
diff --git a/src/gtask-helper.c b/src/gtask-helper.c new file mode 100644 index 0000000..2dd042f --- /dev/null +++ b/src/gtask-helper.c @@ -0,0 +1,152 @@ +/* -*- 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); +} |