diff options
author | Leesoo Ahn <yisooan@fedoraproject.org> | 2020-07-19 16:50:26 +0900 |
---|---|---|
committer | Leesoo Ahn <yisooan@fedoraproject.org> | 2020-07-19 16:53:58 +0900 |
commit | 098d9c70466efc65c5a5a83b44072fc2094c8157 (patch) | |
tree | 2dd5b51ae466300602114de3861c47867f186ad6 | |
parent | b875a51514995580275cad23f7e80c4ad9c6491c (diff) | |
download | libgfbgraph-098d9c70466efc65c5a5a83b44072fc2094c8157.tar.gz |
user: use GTask instead of deprecated APIs on getting albumsmnth/dev
Replace all the deprecated APIs with GTask for those async jobs.
-rw-r--r-- | gfbgraph/gfbgraph-user.c | 131 |
1 files changed, 81 insertions, 50 deletions
diff --git a/gfbgraph/gfbgraph-user.c b/gfbgraph/gfbgraph-user.c index 0c27cb0..b61355e 100644 --- a/gfbgraph/gfbgraph-user.c +++ b/gfbgraph/gfbgraph-user.c @@ -49,9 +49,10 @@ struct _GFBGraphUserPrivate { }; typedef struct { + GFBGraphUser *user; GFBGraphAuthorizer *authorizer; GList *nodes; -} GFBGraphUserConnectionAsyncData; +} UserAsyncData; #define GFBGRAPH_USER_GET_PRIVATE(o) \ (G_TYPE_INSTANCE_GET_PRIVATE((o), GFBGRAPH_TYPE_USER, GFBGraphUserPrivate)) @@ -164,14 +165,6 @@ gfbgraph_user_class_init (GFBGraphUserClass *klass) /* --- Private Functions --- */ static void -connection_async_data_free (GFBGraphUserConnectionAsyncData *data) -{ - g_object_unref (data->authorizer); - - g_slice_free (GFBGraphUserConnectionAsyncData, data); -} - -static void get_me_async_io_thread (GTask *task, gpointer source_object, gpointer task_data, @@ -192,18 +185,60 @@ get_me_async_io_thread (GTask *task, } } +static UserAsyncData * +user_async_data_new (GFBGraphUser *user, + GFBGraphAuthorizer *authorizer) +{ + UserAsyncData *new_data = NULL; + + new_data = g_slice_new0 (UserAsyncData); + if (GFBGRAPH_IS_USER (user)) + new_data->user = g_object_ref (user); + if (GFBGRAPH_IS_AUTHORIZER (authorizer)) + new_data->authorizer = g_object_ref (authorizer); + + return new_data; +} + static void -get_albums_async_thread (GSimpleAsyncResult *simple_async, - GFBGraphUser *user, - GCancellable cancellable) +user_async_data_free (gpointer data) { - GFBGraphUserConnectionAsyncData *data; + UserAsyncData *real_data = (UserAsyncData *)data; + + g_return_if_fail (data != NULL); + + if (GFBGRAPH_IS_USER (real_data->user)) + g_object_unref (real_data->user); + if (GFBGRAPH_IS_AUTHORIZER (real_data->authorizer)) + g_object_unref (real_data->authorizer); + if (real_data->nodes) + g_list_free_full (real_data->nodes, g_object_unref/* XXX */); + + g_slice_free (UserAsyncData, real_data); +} + +static void +get_albums_async_io_thread (GTask *task, + gpointer source_object, + gpointer task_data, + GCancellable *cancellable) +{ + UserAsyncData *data = NULL; GError *error = NULL; - data = (GFBGraphUserConnectionAsyncData *) g_simple_async_result_get_op_res_gpointer (simple_async); - data->nodes = gfbgraph_user_get_albums (user, data->authorizer, &error); - if (error != NULL) - g_simple_async_result_take_error (simple_async, error); + data = (UserAsyncData *)task_data; + if (data && data->user && data->authorizer) + { + data->nodes = gfbgraph_user_get_albums (data->user, data->authorizer, &error); + if (data->nodes && !error) + g_task_return_pointer (task, data, user_async_data_free); + } + else + { + if (error) + g_task_return_error (task, error); + user_async_data_free (data); + } } /** @@ -386,35 +421,25 @@ gfbgraph_user_get_albums_async (GFBGraphUser *user, GAsyncReadyCallback callback, gpointer user_data) { - GSimpleAsyncResult *simple_async; - GFBGraphUserConnectionAsyncData *data; + GTask *task; + UserAsyncData *data; g_return_if_fail (GFBGRAPH_IS_USER (user)); g_return_if_fail (GFBGRAPH_IS_AUTHORIZER (authorizer)); g_return_if_fail (cancellable == NULL || G_IS_CANCELLABLE (cancellable)); g_return_if_fail (callback != NULL); - simple_async = g_simple_async_result_new (G_OBJECT (user), - callback, - user_data, - gfbgraph_user_get_albums_async); - g_simple_async_result_set_check_cancellable (simple_async, - cancellable); - - data = g_slice_new (GFBGraphUserConnectionAsyncData); - data->nodes = NULL; - data->authorizer = authorizer; - g_object_ref (data->authorizer); - - g_simple_async_result_set_op_res_gpointer (simple_async, - data, - (GDestroyNotify)connection_async_data_free); - g_simple_async_result_run_in_thread (simple_async, - (GSimpleAsyncThreadFunc)get_albums_async_thread, - G_PRIORITY_DEFAULT, - cancellable); - - g_object_unref (simple_async); + task = g_task_new (user, + cancellable, + callback, + user_data); + + data = user_async_data_new (user, authorizer); + g_task_set_task_data (task, data, NULL); + + g_task_run_in_thread (task, get_albums_async_io_thread); + + g_object_unref (task); } /** @@ -433,22 +458,28 @@ gfbgraph_user_get_albums_async_finish (GFBGraphUser *user, GAsyncResult *result, GError **error) { - GSimpleAsyncResult *simple_async; - GFBGraphUserConnectionAsyncData *data; + UserAsyncData *data; + GList *nodes = NULL; g_return_val_if_fail (GFBGRAPH_IS_USER (user), NULL); - g_return_val_if_fail (g_simple_async_result_is_valid (result, - G_OBJECT (user), - gfbgraph_user_get_albums_async), NULL); + g_return_val_if_fail (g_task_is_valid (result, NULL), NULL); g_return_val_if_fail (error == NULL || *error == NULL, NULL); - simple_async = G_SIMPLE_ASYNC_RESULT (result); - - if (g_simple_async_result_propagate_error (simple_async, error)) + data = g_task_propagate_pointer (G_TASK (result), error); + if (!data || g_task_had_error (G_TASK (result))) /* error */ + /* Don't need to free or unref objects about UserAsyncData, + * GTask takes the responsibility inside its thread. */ return NULL; - data = (GFBGraphUserConnectionAsyncData *) g_simple_async_result_get_op_res_gpointer (simple_async); - return data->nodes; + if (data->nodes) + { + nodes = data->nodes; + data->nodes = NULL; /* For freeing UserAsyncData */ + } + + user_async_data_free (data); + + return nodes; } /** |