[libsecret/wip/nielsdg/more-gtask] paths: Port from GSimpleAsyncResult to GTask



commit 9087c668c7046a0e6872433e7ea136b6e5355e37
Author: Niels De Graef <nielsdegraef gmail com>
Date:   Sat May 18 12:40:41 2019 +0200

    paths: Port from GSimpleAsyncResult to GTask

 libsecret/secret-paths.c | 577 ++++++++++++++++++++++-------------------------
 1 file changed, 273 insertions(+), 304 deletions(-)
---
diff --git a/libsecret/secret-paths.c b/libsecret/secret-paths.c
index 2eafca2..bfdf0ef 100644
--- a/libsecret/secret-paths.c
+++ b/libsecret/secret-paths.c
@@ -301,20 +301,20 @@ on_search_items_complete (GObject *source,
                           GAsyncResult *result,
                           gpointer user_data)
 {
-       GSimpleAsyncResult *res = G_SIMPLE_ASYNC_RESULT (user_data);
+       GTask *task = G_TASK (user_data);
        GError *error = NULL;
        GVariant *response;
 
        response = g_dbus_proxy_call_finish (G_DBUS_PROXY (source), result, &error);
        if (error != NULL) {
-               g_simple_async_result_take_error (res, error);
+               g_task_return_error (task, g_steal_pointer (&error));
        } else {
-               g_simple_async_result_set_op_res_gpointer (res, response,
-                                                          (GDestroyNotify)g_variant_unref);
+               g_task_return_pointer (task,
+                                      g_steal_pointer (&response),
+                                      (GDestroyNotify) g_variant_unref);
        }
 
-       g_simple_async_result_complete (res);
-       g_object_unref (res);
+       g_object_unref (task);
 }
 
 /**
@@ -347,7 +347,7 @@ secret_collection_search_for_dbus_paths (SecretCollection *collection,
                                          GAsyncReadyCallback callback,
                                          gpointer user_data)
 {
-       GSimpleAsyncResult *async;
+       GTask *task = NULL;
        const gchar *schema_name = NULL;
 
        g_return_if_fail (SECRET_IS_COLLECTION (collection));
@@ -361,15 +361,16 @@ secret_collection_search_for_dbus_paths (SecretCollection *collection,
        if (schema != NULL && !(schema->flags & SECRET_SCHEMA_DONT_MATCH_NAME))
                schema_name = schema->name;
 
-       async = g_simple_async_result_new (G_OBJECT (collection), callback, user_data,
-                                          secret_collection_search_for_dbus_paths);
+       task = g_task_new (collection, cancellable, callback, user_data);
+       g_task_set_source_tag (task, secret_collection_search_for_dbus_paths);
 
        g_dbus_proxy_call (G_DBUS_PROXY (collection), "SearchItems",
-                          g_variant_new ("(@a{ss})", _secret_attributes_to_variant (attributes, 
schema_name)),
+                          g_variant_new ("(@a{ss})",
+                          _secret_attributes_to_variant (attributes, schema_name)),
                           G_DBUS_CALL_FLAGS_NONE, -1, cancellable,
-                          on_search_items_complete, g_object_ref (async));
+                          on_search_items_complete, g_steal_pointer (&task));
 
-       g_object_unref (async);
+       g_clear_object (&task);
 }
 
 /**
@@ -394,21 +395,22 @@ secret_collection_search_for_dbus_paths_finish (SecretCollection *collection,
                                                 GAsyncResult *result,
                                                 GError **error)
 {
-       GVariant *retval;
-       GSimpleAsyncResult *async;
+       GVariant *retval = NULL;
        gchar **paths = NULL;
 
-       g_return_val_if_fail (g_simple_async_result_is_valid (result, G_OBJECT (collection),
-                             secret_collection_search_for_dbus_paths), FALSE);
-       g_return_val_if_fail (error == NULL || *error == NULL, FALSE);
+       g_return_val_if_fail (g_task_is_valid (result, collection), NULL);
+       g_return_val_if_fail (g_task_get_source_tag (G_TASK (result)) ==
+                             secret_collection_search_for_dbus_paths, NULL);
+       g_return_val_if_fail (error == NULL || *error == NULL, NULL);
 
-       async = G_SIMPLE_ASYNC_RESULT (result);
-       if (_secret_util_propagate_error (async, error))
-               return FALSE;
+       retval = g_task_propagate_pointer (G_TASK (result), error);
+       if (retval == NULL) {
+               _secret_util_strip_remote_error (error);
+               return NULL;
+       }
 
-       retval= g_simple_async_result_get_op_res_gpointer (async);
        g_variant_get (retval, "(^ao)", &paths);
-       return paths;
+       return g_steal_pointer (&paths);
 }
 
 /**
@@ -520,21 +522,21 @@ _secret_service_search_for_paths_variant (SecretService *self,
                                           GAsyncReadyCallback callback,
                                           gpointer user_data)
 {
-       GSimpleAsyncResult *res;
+       GTask *task = NULL;
 
        g_return_if_fail (SECRET_IS_SERVICE (self));
        g_return_if_fail (attributes != NULL);
        g_return_if_fail (cancellable == NULL || G_IS_CANCELLABLE (cancellable));
 
-       res = g_simple_async_result_new (G_OBJECT (self), callback, user_data,
-                                        secret_service_search_for_dbus_paths);
+       task = g_task_new (self, cancellable, callback, user_data);
+       g_task_set_source_tag (task, secret_service_search_for_dbus_paths);
 
        g_dbus_proxy_call (G_DBUS_PROXY (self), "SearchItems",
                           g_variant_new ("(@a{ss})", attributes),
                           G_DBUS_CALL_FLAGS_NONE, -1, cancellable,
-                          on_search_items_complete, g_object_ref (res));
+                          on_search_items_complete, g_steal_pointer (&task));
 
-       g_object_unref (res);
+       g_clear_object (&task);
 }
 
 /**
@@ -572,27 +574,30 @@ secret_service_search_for_dbus_paths_finish (SecretService *self,
                                              GError **error)
 {
        GVariant *response;
-       GSimpleAsyncResult *res;
-       gchar **dummy = NULL;
+       gchar **unlocked_ret = NULL, **locked_ret = NULL;
 
-       g_return_val_if_fail (g_simple_async_result_is_valid (result, G_OBJECT (self),
-                             secret_service_search_for_dbus_paths), FALSE);
+       g_return_val_if_fail (g_task_is_valid (result, self), FALSE);
+       g_return_val_if_fail (g_task_get_source_tag (G_TASK (result)) ==
+                             secret_service_search_for_dbus_paths, FALSE);
        g_return_val_if_fail (error == NULL || *error == NULL, FALSE);
 
-       res = G_SIMPLE_ASYNC_RESULT (result);
-       if (_secret_util_propagate_error (res, error))
+       response = g_task_propagate_pointer (G_TASK (result), error);
+       if (response == NULL) {
+               _secret_util_strip_remote_error (error);
                return FALSE;
-
-       if (unlocked || locked) {
-               if (!unlocked)
-                       unlocked = &dummy;
-               else if (!locked)
-                       locked = &dummy;
-               response = g_simple_async_result_get_op_res_gpointer (res);
-               g_variant_get (response, "(^ao^ao)", unlocked, locked);
        }
 
-       g_strfreev (dummy);
+       g_variant_get (response, "(^ao^ao)", &unlocked_ret, &locked_ret);
+
+       if (unlocked)
+               *unlocked = g_steal_pointer (&unlocked_ret);
+       if (locked)
+               *locked = g_steal_pointer (&locked_ret);
+
+       g_strfreev (unlocked_ret);
+       g_strfreev (locked_ret);
+       g_variant_unref (response);
+
        return TRUE;
 }
 
@@ -638,8 +643,8 @@ secret_service_search_for_dbus_paths_sync (SecretService *self,
                                            GError **error)
 {
        const gchar *schema_name = NULL;
-       gchar **dummy = NULL;
        GVariant *response;
+       gchar **unlocked_ret = NULL, **locked_ret = NULL;
 
        g_return_val_if_fail (SECRET_IS_SERVICE (self), FALSE);
        g_return_val_if_fail (attributes != NULL, FALSE);
@@ -655,43 +660,24 @@ secret_service_search_for_dbus_paths_sync (SecretService *self,
 
        response = g_dbus_proxy_call_sync (G_DBUS_PROXY (self), "SearchItems",
                                           g_variant_new ("(@a{ss})",
-                                                         _secret_attributes_to_variant (attributes, 
schema_name)),
-                                          G_DBUS_CALL_FLAGS_NONE, -1, cancellable, error);
-
-       if (response != NULL) {
-               if (unlocked || locked) {
-                       if (!unlocked)
-                               unlocked = &dummy;
-                       else if (!locked)
-                               locked = &dummy;
-                       g_variant_get (response, "(^ao^ao)", unlocked, locked);
-               }
-
-               g_variant_unref (response);
-       }
+                                          _secret_attributes_to_variant (attributes, schema_name)),
+                                          G_DBUS_CALL_FLAGS_NONE, -1,
+                                          cancellable, error);
 
-       g_strfreev (dummy);
+       if (response == NULL)
+               return FALSE;
 
-       return response != NULL;
-}
+       g_variant_get (response, "(^ao^ao)", &unlocked_ret, &locked_ret);
+       if (unlocked)
+               *unlocked = g_steal_pointer (&unlocked_ret);
+       if (locked)
+               *locked = g_steal_pointer (&locked_ret);
+       g_variant_unref (response);
 
-typedef struct {
-       GCancellable *cancellable;
-       GVariant *in;
-       GVariant *out;
-       GHashTable *items;
-} GetClosure;
+       g_strfreev (unlocked_ret);
+       g_strfreev (locked_ret);
 
-static void
-get_closure_free (gpointer data)
-{
-       GetClosure *closure = data;
-       if (closure->in)
-               g_variant_unref (closure->in);
-       if (closure->out)
-               g_variant_unref (closure->out);
-       g_clear_object (&closure->cancellable);
-       g_slice_free (GetClosure, closure);
+       return TRUE;
 }
 
 static void
@@ -699,17 +685,18 @@ on_get_secrets_complete (GObject *source,
                          GAsyncResult *result,
                          gpointer user_data)
 {
-       GSimpleAsyncResult *res = G_SIMPLE_ASYNC_RESULT (user_data);
-       GetClosure *closure = g_simple_async_result_get_op_res_gpointer (res);
+       GTask *task = G_TASK (user_data);
+       GVariant *ret;
        GError *error = NULL;
 
-       closure->out = g_dbus_proxy_call_finish (G_DBUS_PROXY (source), result, &error);
+       ret = g_dbus_proxy_call_finish (G_DBUS_PROXY (source), result, &error);
        if (error != NULL) {
-               g_simple_async_result_take_error (res, error);
+               g_task_return_error (task, g_steal_pointer (&error));
+       } else {
+               g_task_return_pointer (task, ret, (GDestroyNotify) g_variant_unref);
        }
-       g_simple_async_result_complete (res);
 
-       g_object_unref (res);
+       g_clear_object (&task);
 }
 
 static void
@@ -717,25 +704,25 @@ on_get_secrets_session (GObject *source,
                         GAsyncResult *result,
                         gpointer user_data)
 {
-       GSimpleAsyncResult *res = G_SIMPLE_ASYNC_RESULT (user_data);
-       GetClosure *closure = g_simple_async_result_get_op_res_gpointer (res);
+       GTask *task = G_TASK (user_data);
+       GVariant *item_paths = g_task_get_task_data (task);
+       GCancellable *cancellable = g_task_get_cancellable (task);
        GError *error = NULL;
        const gchar *session;
 
        secret_service_ensure_session_finish (SECRET_SERVICE (source), result, &error);
        if (error != NULL) {
-               g_simple_async_result_take_error (res, error);
-               g_simple_async_result_complete (res);
+               g_task_return_error (task, g_steal_pointer (&error));
        } else {
                session = secret_service_get_session_dbus_path (SECRET_SERVICE (source));
                g_dbus_proxy_call (G_DBUS_PROXY (source), "GetSecrets",
-                                  g_variant_new ("(@aoo)", closure->in, session),
+                                  g_variant_new ("(@aoo)", item_paths, session),
                                   G_DBUS_CALL_FLAGS_NO_AUTO_START, -1,
-                                  closure->cancellable, on_get_secrets_complete,
-                                  g_object_ref (res));
+                                  cancellable, on_get_secrets_complete,
+                                  g_steal_pointer (&task));
        }
 
-       g_object_unref (res);
+       g_clear_object (&task);
 }
 
 /**
@@ -763,26 +750,24 @@ secret_service_get_secret_for_dbus_path (SecretService *self,
                                          GAsyncReadyCallback callback,
                                          gpointer user_data)
 {
-       GSimpleAsyncResult *res;
-       GetClosure *closure;
+       GTask *task;
+       GVariant *path_variant;
 
        g_return_if_fail (SECRET_IS_SERVICE (self));
        g_return_if_fail (item_path != NULL);
        g_return_if_fail (cancellable == NULL || G_IS_CANCELLABLE (cancellable));
 
-       res = g_simple_async_result_new (G_OBJECT (self), callback, user_data,
-                                        secret_service_get_secret_for_dbus_path);
+       path_variant = g_variant_ref_sink (g_variant_new_objv (&item_path, 1));
 
-       closure = g_slice_new0 (GetClosure);
-       closure->cancellable = cancellable ? g_object_ref (cancellable) : NULL;
-       closure->in = g_variant_ref_sink (g_variant_new_objv (&item_path, 1));
-       g_simple_async_result_set_op_res_gpointer (res, closure, get_closure_free);
+       task = g_task_new (self, cancellable, callback, user_data);
+       g_task_set_source_tag (task, secret_service_get_secret_for_dbus_path);
+       g_task_set_task_data (task, path_variant, (GDestroyNotify) g_variant_unref);
 
        secret_service_ensure_session (self, cancellable,
                                       on_get_secrets_session,
-                                      g_object_ref (res));
+                                      g_steal_pointer (&task));
 
-       g_object_unref (res);
+       g_clear_object (&task);
 }
 
 /**
@@ -806,20 +791,21 @@ secret_service_get_secret_for_dbus_path_finish (SecretService *self,
                                                 GAsyncResult *result,
                                                 GError **error)
 {
-       GSimpleAsyncResult *res;
-       GetClosure *closure;
+       GVariant *ret;
 
        g_return_val_if_fail (SECRET_IS_SERVICE (self), NULL);
-       g_return_val_if_fail (g_simple_async_result_is_valid (result, G_OBJECT (self),
-                             secret_service_get_secret_for_dbus_path), NULL);
+       g_return_val_if_fail (g_task_is_valid (result, self), NULL);
+       g_return_val_if_fail (g_task_get_source_tag (G_TASK (result)) ==
+                             secret_service_get_secret_for_dbus_path, NULL);
        g_return_val_if_fail (error == NULL || *error == NULL, NULL);
 
-       res = G_SIMPLE_ASYNC_RESULT (result);
-       if (_secret_util_propagate_error (res, error))
+       ret = g_task_propagate_pointer (G_TASK (result), error);
+       if (ret == NULL) {
+               _secret_util_strip_remote_error (error);
                return NULL;
+       }
 
-       closure = g_simple_async_result_get_op_res_gpointer (res);
-       return _secret_service_decode_get_secrets_first (self, closure->out);
+       return _secret_service_decode_get_secrets_first (self, ret);
 }
 
 /**
@@ -900,26 +886,24 @@ secret_service_get_secrets_for_dbus_paths (SecretService *self,
                                            GAsyncReadyCallback callback,
                                            gpointer user_data)
 {
-       GSimpleAsyncResult *res;
-       GetClosure *closure;
+       GTask *task;
+       GVariant *paths_variant;
 
        g_return_if_fail (SECRET_IS_SERVICE (self));
        g_return_if_fail (item_paths != NULL);
        g_return_if_fail (cancellable == NULL || G_IS_CANCELLABLE (cancellable));
 
-       res = g_simple_async_result_new (G_OBJECT (self), callback, user_data,
-                                        secret_service_get_secret_for_dbus_path);
+       paths_variant = g_variant_ref_sink (g_variant_new_objv (item_paths, -1));
 
-       closure = g_slice_new0 (GetClosure);
-       closure->cancellable = cancellable ? g_object_ref (cancellable) : NULL;
-       closure->in = g_variant_ref_sink (g_variant_new_objv (item_paths, -1));
-       g_simple_async_result_set_op_res_gpointer (res, closure, get_closure_free);
+       task = g_task_new (self, cancellable, callback, user_data);
+       g_task_set_source_tag (task, secret_service_get_secret_for_dbus_path);
+       g_task_set_task_data (task, paths_variant, (GDestroyNotify) g_variant_unref);
 
        secret_service_ensure_session (self, cancellable,
                                       on_get_secrets_session,
-                                      g_object_ref (res));
+                                      g_steal_pointer (&task));
 
-       g_object_unref (res);
+       g_clear_object (&task);
 }
 
 /**
@@ -944,20 +928,21 @@ secret_service_get_secrets_for_dbus_paths_finish (SecretService *self,
                                                   GAsyncResult *result,
                                                   GError **error)
 {
-       GSimpleAsyncResult *res;
-       GetClosure *closure;
+       GVariant *ret;
 
        g_return_val_if_fail (SECRET_IS_SERVICE (self), NULL);
-       g_return_val_if_fail (g_simple_async_result_is_valid (result, G_OBJECT (self),
-                             secret_service_get_secret_for_dbus_path), NULL);
+       g_return_val_if_fail (g_task_is_valid (result, self), NULL);
+       g_return_val_if_fail (g_task_get_source_tag (G_TASK (result)) ==
+                             secret_service_get_secret_for_dbus_path, NULL);
        g_return_val_if_fail (error == NULL || *error == NULL, NULL);
 
-       res = G_SIMPLE_ASYNC_RESULT (result);
-       if (_secret_util_propagate_error (res, error))
+       ret = g_task_propagate_pointer (G_TASK (result), error);
+       if (ret == NULL) {
+               _secret_util_strip_remote_error (error);
                return NULL;
+       }
 
-       closure = g_simple_async_result_get_op_res_gpointer (res);
-       return _secret_service_decode_get_secrets_all (self, closure->out);
+       return _secret_service_decode_get_secrets_all (self, ret);
 }
 
 /**
@@ -1016,19 +1001,14 @@ secret_service_get_secrets_for_dbus_paths_sync (SecretService *self,
 
 
 typedef struct {
-       GCancellable *cancellable;
        SecretPrompt *prompt;
-       GPtrArray *xlocked;
 } XlockClosure;
 
 static void
 xlock_closure_free (gpointer data)
 {
        XlockClosure *closure = data;
-       g_clear_object (&closure->cancellable);
        g_clear_object (&closure->prompt);
-       if (closure->xlocked)
-               g_ptr_array_unref (closure->xlocked);
        g_slice_free (XlockClosure, closure);
 }
 
@@ -1037,27 +1017,31 @@ on_xlock_prompted (GObject *source,
                    GAsyncResult *result,
                    gpointer user_data)
 {
-       GSimpleAsyncResult *res = G_SIMPLE_ASYNC_RESULT (user_data);
-       XlockClosure *closure = g_simple_async_result_get_op_res_gpointer (res);
+       GTask *task = G_TASK (user_data);
        SecretService *self = SECRET_SERVICE (source);
+       GPtrArray *xlocked_array;
        GError *error = NULL;
        GVariantIter iter;
        GVariant *retval;
        gchar *path;
 
        retval = secret_service_prompt_finish (self, result, &error);
-       if (error != NULL)
-               g_simple_async_result_take_error (res, error);
+       if (error != NULL) {
+               g_task_return_error (task, g_steal_pointer (&error));
 
-       if (retval != NULL) {
+       } else {
+               xlocked_array = g_ptr_array_new_with_free_func (g_free);
                g_variant_iter_init (&iter, retval);
                while (g_variant_iter_loop (&iter, "o", &path))
-                       g_ptr_array_add (closure->xlocked, g_strdup (path));
+                       g_ptr_array_add (xlocked_array, g_strdup (path));
                g_variant_unref (retval);
+
+               g_task_return_pointer (task,
+                                      xlocked_array,
+                                      (GDestroyNotify) g_ptr_array_unref);
        }
 
-       g_simple_async_result_complete (res);
-       g_object_unref (res);
+       g_clear_object (&task);
 }
 
 static void
@@ -1065,9 +1049,11 @@ on_xlock_called (GObject *source,
                  GAsyncResult *result,
                  gpointer user_data)
 {
-       GSimpleAsyncResult *res = G_SIMPLE_ASYNC_RESULT (user_data);
-       XlockClosure *closure = g_simple_async_result_get_op_res_gpointer (res);
-       SecretService *self = SECRET_SERVICE (g_async_result_get_source_object (user_data));
+       GTask *task = G_TASK (user_data);
+       XlockClosure *closure = g_task_get_task_data (task);
+       GCancellable *cancellable = g_task_get_cancellable (task);
+       SecretService *self = SECRET_SERVICE (g_task_get_source_object (task));
+       GPtrArray *xlocked_array;
        const gchar *prompt = NULL;
        gchar **xlocked = NULL;
        GError *error = NULL;
@@ -1076,29 +1062,33 @@ on_xlock_called (GObject *source,
 
        retval = g_dbus_proxy_call_finish (G_DBUS_PROXY (source), result, &error);
        if (error != NULL) {
-               g_simple_async_result_take_error (res, error);
-               g_simple_async_result_complete (res);
+               g_task_return_error (task, g_steal_pointer (&error));
 
        } else {
+               xlocked_array = g_ptr_array_new_with_free_func (g_free);
+
                g_variant_get (retval, "(^ao&o)", &xlocked, &prompt);
 
                if (_secret_util_empty_path (prompt)) {
                        for (i = 0; xlocked[i]; i++)
-                               g_ptr_array_add (closure->xlocked, g_strdup (xlocked[i]));
-                       g_simple_async_result_complete (res);
+                               g_ptr_array_add (xlocked_array, g_strdup (xlocked[i]));
+
+                       g_task_return_pointer (task,
+                                              xlocked_array,
+                                              (GDestroyNotify) g_ptr_array_unref);
 
                } else {
                        closure->prompt = _secret_prompt_instance (self, prompt);
                        secret_service_prompt (self, closure->prompt, G_VARIANT_TYPE ("ao"),
-                                              closure->cancellable, on_xlock_prompted, g_object_ref (res));
+                                              cancellable,
+                                              on_xlock_prompted, g_steal_pointer (&task));
                }
 
                g_strfreev (xlocked);
                g_variant_unref (retval);
        }
 
-       g_object_unref (self);
-       g_object_unref (res);
+       g_clear_object (&task);
 }
 
 void
@@ -1109,22 +1099,20 @@ _secret_service_xlock_paths_async (SecretService *self,
                                    GAsyncReadyCallback callback,
                                    gpointer user_data)
 {
-       GSimpleAsyncResult *res;
+       GTask *task = NULL;
        XlockClosure *closure;
 
-       res = g_simple_async_result_new (G_OBJECT (self), callback, user_data,
-                                        _secret_service_xlock_paths_async);
+       task = g_task_new (self, cancellable, callback, user_data);
+       g_task_set_source_tag (task, _secret_service_xlock_paths_async);
        closure = g_slice_new0 (XlockClosure);
-       closure->cancellable = cancellable ? g_object_ref (cancellable) : cancellable;
-       closure->xlocked = g_ptr_array_new_with_free_func (g_free);
-       g_simple_async_result_set_op_res_gpointer (res, closure, xlock_closure_free);
+       g_task_set_task_data (task, closure, xlock_closure_free);
 
        g_dbus_proxy_call (G_DBUS_PROXY (self), method,
                           g_variant_new ("(@ao)", g_variant_new_objv (paths, -1)),
                           G_DBUS_CALL_FLAGS_NO_AUTO_START, -1,
-                          cancellable, on_xlock_called, g_object_ref (res));
+                          cancellable, on_xlock_called, g_steal_pointer (&task));
 
-       g_object_unref (res);
+       g_clear_object (&task);
 }
 
 gint
@@ -1133,22 +1121,26 @@ _secret_service_xlock_paths_finish (SecretService *self,
                                     gchar ***xlocked,
                                     GError **error)
 {
-       GSimpleAsyncResult *res;
-       XlockClosure *closure;
+       GPtrArray *xlocked_array = NULL;
+       gchar **xlocked_ret = NULL;
        gint count;
 
-       res = G_SIMPLE_ASYNC_RESULT (result);
-       if (_secret_util_propagate_error (res, error))
+       xlocked_array = g_task_propagate_pointer (G_TASK (result), error);
+       if (xlocked_array == NULL) {
+               _secret_util_strip_remote_error (error);
                return -1;
+       }
 
-       closure = g_simple_async_result_get_op_res_gpointer (res);
-       count = closure->xlocked->len;
+       count = xlocked_array->len;
+       /* Add NULL-terminator after storing the count,
+        * but before getting out the raw pointer */
+       g_ptr_array_add (xlocked_array, NULL);
+       xlocked_ret = (gchar **) g_ptr_array_free (xlocked_array, FALSE);
 
-       if (xlocked != NULL) {
-               g_ptr_array_add (closure->xlocked, NULL);
-               *xlocked = (gchar **)g_ptr_array_free (closure->xlocked, FALSE);
-               closure->xlocked = NULL;
-       }
+       if (xlocked != NULL)
+               *xlocked = g_steal_pointer (&xlocked_ret);
+
+       g_strfreev (xlocked_ret);
 
        return count;
 }
@@ -1413,9 +1405,7 @@ secret_service_unlock_dbus_paths_finish (SecretService *self,
 }
 
 typedef struct {
-       GCancellable *cancellable;
        SecretPrompt *prompt;
-       gboolean deleted;
 } DeleteClosure;
 
 static void
@@ -1423,7 +1413,6 @@ delete_closure_free (gpointer data)
 {
        DeleteClosure *closure = data;
        g_clear_object (&closure->prompt);
-       g_clear_object (&closure->cancellable);
        g_slice_free (DeleteClosure, closure);
 }
 
@@ -1432,22 +1421,21 @@ on_delete_prompted (GObject *source,
                     GAsyncResult *result,
                     gpointer user_data)
 {
-       GSimpleAsyncResult *res = G_SIMPLE_ASYNC_RESULT (user_data);
-       DeleteClosure *closure = g_simple_async_result_get_op_res_gpointer (res);
+       GTask *task = G_TASK (user_data);
        GError *error = NULL;
        GVariant *retval;
 
        retval = secret_service_prompt_finish (SECRET_SERVICE (source), result,
                                               &error);
+       if (retval != NULL)
+               g_variant_unref (retval);
 
        if (error == NULL)
-               closure->deleted = TRUE;
+               g_task_return_boolean (task, TRUE);
        else
-               g_simple_async_result_take_error (res, error);
-       if (retval != NULL)
-               g_variant_unref (retval);
-       g_simple_async_result_complete (res);
-       g_object_unref (res);
+               g_task_return_error (task, g_steal_pointer (&error));
+
+       g_object_unref (task);
 }
 
 static void
@@ -1455,9 +1443,10 @@ on_delete_complete (GObject *source,
                     GAsyncResult *result,
                     gpointer user_data)
 {
-       GSimpleAsyncResult *res = G_SIMPLE_ASYNC_RESULT (user_data);
-       DeleteClosure *closure = g_simple_async_result_get_op_res_gpointer (res);
-       SecretService *self = SECRET_SERVICE (g_async_result_get_source_object (user_data));
+       GTask *task = G_TASK (user_data);
+       DeleteClosure *closure = g_task_get_task_data (task);
+       SecretService *self = SECRET_SERVICE (g_task_get_source_object (task));
+       GCancellable *cancellable = g_task_get_cancellable (task);
        const gchar *prompt_path;
        GError *error = NULL;
        GVariant *retval;
@@ -1467,27 +1456,24 @@ on_delete_complete (GObject *source,
                g_variant_get (retval, "(&o)", &prompt_path);
 
                if (_secret_util_empty_path (prompt_path)) {
-                       closure->deleted = TRUE;
-                       g_simple_async_result_complete (res);
+                       g_task_return_boolean (task, TRUE);
 
                } else {
                        closure->prompt = _secret_prompt_instance (self, prompt_path);
 
                        secret_service_prompt (self, closure->prompt, NULL,
-                                              closure->cancellable,
+                                              cancellable,
                                               on_delete_prompted,
-                                              g_object_ref (res));
+                                              g_steal_pointer (&task));
                }
 
                g_variant_unref (retval);
 
        } else {
-               g_simple_async_result_take_error (res, error);
-               g_simple_async_result_complete (res);
+               g_task_return_error (task, g_steal_pointer (&error));
        }
 
-       g_object_unref (self);
-       g_object_unref (res);
+       g_clear_object (&task);
 }
 
 void
@@ -1498,27 +1484,28 @@ _secret_service_delete_path (SecretService *self,
                              GAsyncReadyCallback callback,
                              gpointer user_data)
 {
-       GSimpleAsyncResult *res;
+       GTask *task = NULL;
        DeleteClosure *closure;
 
        g_return_if_fail (SECRET_IS_SERVICE (self));
        g_return_if_fail (object_path != NULL);
        g_return_if_fail (cancellable == NULL || G_IS_CANCELLABLE (cancellable));
 
-       res = g_simple_async_result_new (G_OBJECT (self), callback, user_data,
-                                        _secret_service_delete_path);
+       task = g_task_new (self, cancellable, callback, user_data);
+       g_task_set_source_tag (task, _secret_service_delete_path);
        closure = g_slice_new0 (DeleteClosure);
-       closure->cancellable = cancellable ? g_object_ref (cancellable) : NULL;
-       g_simple_async_result_set_op_res_gpointer (res, closure, delete_closure_free);
+       g_task_set_task_data (task, closure, delete_closure_free);
 
        g_dbus_connection_call (g_dbus_proxy_get_connection (G_DBUS_PROXY (self)),
-                               g_dbus_proxy_get_name (G_DBUS_PROXY (self)), object_path,
+                               g_dbus_proxy_get_name (G_DBUS_PROXY (self)),
+                               object_path,
                                is_an_item ? SECRET_ITEM_INTERFACE : SECRET_COLLECTION_INTERFACE,
                                "Delete", g_variant_new ("()"), G_VARIANT_TYPE ("(o)"),
                                G_DBUS_CALL_FLAGS_NO_AUTO_START, -1,
-                               cancellable, on_delete_complete, g_object_ref (res));
+                               cancellable,
+                               on_delete_complete, g_steal_pointer (&task));
 
-       g_object_unref (res);
+       g_clear_object (&task);
 }
 
 gboolean
@@ -1526,20 +1513,18 @@ _secret_service_delete_path_finish (SecretService *self,
                                     GAsyncResult *result,
                                     GError **error)
 {
-       GSimpleAsyncResult *res;
-       DeleteClosure *closure;
-
        g_return_val_if_fail (SECRET_IS_SERVICE (self), FALSE);
        g_return_val_if_fail (error == NULL || *error == NULL, FALSE);
-       g_return_val_if_fail (g_simple_async_result_is_valid (result, G_OBJECT (self),
-                             _secret_service_delete_path), FALSE);
+       g_return_val_if_fail (g_task_is_valid (result, self), FALSE);
+       g_return_val_if_fail (g_task_get_source_tag (G_TASK (result)) ==
+                             _secret_service_delete_path, FALSE);
 
-       res = G_SIMPLE_ASYNC_RESULT (result);
-       if (_secret_util_propagate_error (res, error))
+       if (!g_task_propagate_boolean (G_TASK (result), error)) {
+               _secret_util_strip_remote_error (error);
                return FALSE;
+       }
 
-       closure = g_simple_async_result_get_op_res_gpointer (res);
-       return closure->deleted;
+       return TRUE;
 }
 
 /**
@@ -1591,11 +1576,6 @@ secret_service_delete_item_dbus_path_finish (SecretService *self,
                                              GAsyncResult *result,
                                              GError **error)
 {
-       g_return_val_if_fail (SECRET_IS_SERVICE (self), FALSE);
-       g_return_val_if_fail (error == NULL || *error == NULL, FALSE);
-       g_return_val_if_fail (g_simple_async_result_is_valid (result, G_OBJECT (self),
-                             _secret_service_delete_path), FALSE);
-
        return _secret_service_delete_path_finish (self, result, error);
 }
 
@@ -1649,18 +1629,14 @@ secret_service_delete_item_dbus_path_sync (SecretService *self,
 }
 
 typedef struct {
-       GCancellable *cancellable;
        SecretPrompt *prompt;
-       gchar *collection_path;
 } CollectionClosure;
 
 static void
 collection_closure_free (gpointer data)
 {
        CollectionClosure *closure = data;
-       g_clear_object (&closure->cancellable);
        g_clear_object (&closure->prompt);
-       g_free (closure->collection_path);
        g_slice_free (CollectionClosure, closure);
 }
 
@@ -1669,21 +1645,21 @@ on_create_collection_prompt (GObject *source,
                              GAsyncResult *result,
                              gpointer user_data)
 {
-       GSimpleAsyncResult *res = G_SIMPLE_ASYNC_RESULT (user_data);
-       CollectionClosure *closure = g_simple_async_result_get_op_res_gpointer (res);
+       GTask *task = G_TASK (user_data);
        GError *error = NULL;
        GVariant *value;
+       gchar *collection_path;
 
        value = secret_service_prompt_finish (SECRET_SERVICE (source), result, &error);
-       if (error != NULL)
-               g_simple_async_result_take_error (res, error);
-       if (value != NULL) {
-               closure->collection_path = g_variant_dup_string (value, NULL);
+       if (error != NULL) {
+               g_task_return_error (task, g_steal_pointer (&error));
+       } else {
+               collection_path = g_variant_dup_string (value, NULL);
+               g_task_return_pointer (task, collection_path, g_free);
                g_variant_unref (value);
        }
 
-       g_simple_async_result_complete (res);
-       g_object_unref (res);
+       g_clear_object (&task);
 }
 
 static void
@@ -1691,9 +1667,10 @@ on_create_collection_called (GObject *source,
                              GAsyncResult *result,
                              gpointer user_data)
 {
-       GSimpleAsyncResult *res = G_SIMPLE_ASYNC_RESULT (user_data);
-       CollectionClosure *closure = g_simple_async_result_get_op_res_gpointer (res);
-       SecretService *self = SECRET_SERVICE (g_async_result_get_source_object (user_data));
+       GTask *task = G_TASK (user_data);
+       CollectionClosure *closure = g_task_get_task_data (task);
+       GCancellable *cancellable = g_task_get_cancellable (task);
+       SecretService *self = SECRET_SERVICE (g_task_get_source_object (task));
        const gchar *prompt_path = NULL;
        const gchar *collection_path = NULL;
        GError *error = NULL;
@@ -1705,23 +1682,20 @@ on_create_collection_called (GObject *source,
                if (!_secret_util_empty_path (prompt_path)) {
                        closure->prompt = _secret_prompt_instance (self, prompt_path);
                        secret_service_prompt (self, closure->prompt, G_VARIANT_TYPE ("o"),
-                                              closure->cancellable, on_create_collection_prompt,
-                                              g_object_ref (res));
+                                              cancellable, on_create_collection_prompt,
+                                              g_steal_pointer (&task));
 
                } else {
-                       closure->collection_path = g_strdup (collection_path);
-                       g_simple_async_result_complete (res);
+                       g_task_return_pointer (task, g_strdup (collection_path), g_free);
                }
 
                g_variant_unref (retval);
 
        } else {
-               g_simple_async_result_take_error (res, error);
-               g_simple_async_result_complete (res);
+               g_task_return_error (task, g_steal_pointer (&error));
        }
 
-       g_object_unref (self);
-       g_object_unref (res);
+       g_clear_object (&task);
 }
 
 /**
@@ -1771,7 +1745,7 @@ secret_service_create_collection_dbus_path (SecretService *self,
                                             GAsyncReadyCallback callback,
                                             gpointer user_data)
 {
-       GSimpleAsyncResult *res;
+       GTask *task = NULL;
        CollectionClosure *closure;
        GVariant *params;
        GVariant *props;
@@ -1784,11 +1758,10 @@ secret_service_create_collection_dbus_path (SecretService *self,
        if (alias == NULL)
                alias = "";
 
-       res = g_simple_async_result_new (G_OBJECT (self), callback, user_data,
-                                        secret_service_create_collection_dbus_path);
+       task = g_task_new (self, cancellable, callback, user_data);
+       g_task_set_source_tag (task, secret_service_create_collection_dbus_path);
        closure = g_slice_new0 (CollectionClosure);
-       closure->cancellable = cancellable ? g_object_ref (cancellable) : NULL;
-       g_simple_async_result_set_op_res_gpointer (res, closure, collection_closure_free);
+       g_task_set_task_data (task, closure, collection_closure_free);
 
        props = _secret_util_variant_for_properties (properties);
        params = g_variant_new ("(@a{sv}s)", props, alias);
@@ -1800,12 +1773,11 @@ secret_service_create_collection_dbus_path (SecretService *self,
                                SECRET_SERVICE_INTERFACE,
                                "CreateCollection", params, G_VARIANT_TYPE ("(oo)"),
                                G_DBUS_CALL_FLAGS_NONE, -1,
-                               closure->cancellable,
+                               cancellable,
                                on_create_collection_called,
-                               g_object_ref (res));
-
-       g_object_unref (res);
+                               g_steal_pointer (&task));
 
+       g_clear_object (&task);
 }
 
 /**
@@ -1827,23 +1799,20 @@ secret_service_create_collection_dbus_path_finish (SecretService *self,
                                                    GAsyncResult *result,
                                                    GError **error)
 {
-       GSimpleAsyncResult *res;
-       CollectionClosure *closure;
        gchar *path;
 
-       g_return_val_if_fail (g_simple_async_result_is_valid (result, G_OBJECT (self),
-                             secret_service_create_collection_dbus_path), NULL);
+       g_return_val_if_fail (g_task_is_valid (result, self), NULL);
+       g_return_val_if_fail (g_task_get_source_tag (G_TASK (result)) ==
+                             secret_service_create_collection_dbus_path, NULL);
        g_return_val_if_fail (error == NULL || *error == NULL, NULL);
 
-       res = G_SIMPLE_ASYNC_RESULT (result);
-
-       if (_secret_util_propagate_error (res, error))
+       path = g_task_propagate_pointer (G_TASK (result), error);
+       if (path == NULL) {
+               _secret_util_strip_remote_error (error);
                return NULL;
+       }
 
-       closure = g_simple_async_result_get_op_res_gpointer (res);
-       path = closure->collection_path;
-       closure->collection_path = NULL;
-       return path;
+       return g_steal_pointer (&path);
 }
 
 /**
@@ -1917,23 +1886,19 @@ secret_service_create_collection_dbus_path_sync (SecretService *self,
 }
 
 typedef struct {
-       GCancellable *cancellable;
        GVariant *properties;
        SecretValue *value;
        gboolean replace;
        gchar *collection_path;
        SecretPrompt *prompt;
-       gchar *item_path;
 } ItemClosure;
 
 static void
 item_closure_free (gpointer data)
 {
        ItemClosure *closure = data;
-       g_free (closure->item_path);
        g_variant_unref (closure->properties);
        secret_value_unref (closure->value);
-       g_clear_object (&closure->cancellable);
        g_free (closure->collection_path);
        g_clear_object (&closure->prompt);
        g_slice_free (ItemClosure, closure);
@@ -1944,21 +1909,21 @@ on_create_item_prompt (GObject *source,
                        GAsyncResult *result,
                        gpointer user_data)
 {
-       GSimpleAsyncResult *res = G_SIMPLE_ASYNC_RESULT (user_data);
-       ItemClosure *closure = g_simple_async_result_get_op_res_gpointer (res);
+       GTask *task = G_TASK (user_data);
        GError *error = NULL;
        GVariant *value;
+       gchar *item_path;
 
        value = secret_service_prompt_finish (SECRET_SERVICE (source), result, &error);
-       if (error != NULL)
-               g_simple_async_result_take_error (res, error);
-       if (value != NULL) {
-               closure->item_path = g_variant_dup_string (value, NULL);
+       if (error != NULL) {
+               g_task_return_error (task, g_steal_pointer (&error));
+       } else {
+               item_path = g_variant_dup_string (value, NULL);
                g_variant_unref (value);
+               g_task_return_pointer (task, item_path, g_free);
        }
 
-       g_simple_async_result_complete (res);
-       g_object_unref (res);
+       g_clear_object (&task);
 }
 
 static void
@@ -1966,9 +1931,10 @@ on_create_item_called (GObject *source,
                        GAsyncResult *result,
                        gpointer user_data)
 {
-       GSimpleAsyncResult *res = G_SIMPLE_ASYNC_RESULT (user_data);
-       ItemClosure *closure = g_simple_async_result_get_op_res_gpointer (res);
-       SecretService *self = SECRET_SERVICE (g_async_result_get_source_object (user_data));
+       GTask *task = G_TASK (user_data);
+       ItemClosure *closure = g_task_get_task_data (task);
+       SecretService *self = SECRET_SERVICE (g_task_get_source_object (task));
+       GCancellable *cancellable = g_task_get_cancellable (task);
        const gchar *prompt_path = NULL;
        const gchar *item_path = NULL;
        GError *error = NULL;
@@ -1980,23 +1946,20 @@ on_create_item_called (GObject *source,
                if (!_secret_util_empty_path (prompt_path)) {
                        closure->prompt = _secret_prompt_instance (self, prompt_path);
                        secret_service_prompt (self, closure->prompt, G_VARIANT_TYPE ("o"),
-                                              closure->cancellable, on_create_item_prompt,
-                                              g_object_ref (res));
+                                              cancellable, on_create_item_prompt,
+                                              g_steal_pointer (&task));
 
                } else {
-                       closure->item_path = g_strdup (item_path);
-                       g_simple_async_result_complete (res);
+                       g_task_return_pointer (task, g_strdup (item_path), g_free);
                }
 
                g_variant_unref (retval);
 
        } else {
-               g_simple_async_result_take_error (res, error);
-               g_simple_async_result_complete (res);
+               g_task_return_error (task, g_steal_pointer (&error));
        }
 
-       g_object_unref (self);
-       g_object_unref (res);
+       g_clear_object (&task);
 }
 
 static void
@@ -2004,9 +1967,10 @@ on_create_item_session (GObject *source,
                         GAsyncResult *result,
                         gpointer user_data)
 {
-       GSimpleAsyncResult *res = G_SIMPLE_ASYNC_RESULT (user_data);
-       ItemClosure *closure = g_simple_async_result_get_op_res_gpointer (res);
+       GTask *task = G_TASK (user_data);
+       ItemClosure *closure = g_task_get_task_data (task);
        SecretService *self = SECRET_SERVICE (source);
+       GCancellable *cancellable = g_task_get_cancellable (task);
        SecretSession *session;
        GVariant *params;
        GError *error = NULL;
@@ -2027,15 +1991,14 @@ on_create_item_session (GObject *source,
                                        SECRET_COLLECTION_INTERFACE,
                                        "CreateItem", params, G_VARIANT_TYPE ("(oo)"),
                                        G_DBUS_CALL_FLAGS_NONE, -1,
-                                       closure->cancellable,
+                                       cancellable,
                                        on_create_item_called,
-                                       g_object_ref (res));
+                                       g_steal_pointer (&task));
        } else {
-               g_simple_async_result_take_error (res, error);
-               g_simple_async_result_complete (res);
+               g_task_return_error (task, g_steal_pointer (&error));
        }
 
-       g_object_unref (res);
+       g_clear_object (&task);
 }
 
 /**
@@ -2082,7 +2045,7 @@ secret_service_create_item_dbus_path (SecretService *self,
                                       GAsyncReadyCallback callback,
                                       gpointer user_data)
 {
-       GSimpleAsyncResult *res;
+       GTask *task = NULL;
        ItemClosure *closure;
 
        g_return_if_fail (SECRET_IS_SERVICE (self));
@@ -2091,22 +2054,21 @@ secret_service_create_item_dbus_path (SecretService *self,
        g_return_if_fail (value != NULL);
        g_return_if_fail (cancellable == NULL || G_IS_CANCELLABLE (cancellable));
 
-       res = g_simple_async_result_new (G_OBJECT (self), callback, user_data,
-                                        secret_service_create_item_dbus_path);
+       task = g_task_new (self, cancellable, callback, user_data);
+       g_task_set_source_tag (task, secret_service_create_item_dbus_path);
        closure = g_slice_new0 (ItemClosure);
-       closure->cancellable = cancellable ? g_object_ref (cancellable) : NULL;
        closure->properties = _secret_util_variant_for_properties (properties);
        g_variant_ref_sink (closure->properties);
        closure->replace = flags & SECRET_ITEM_CREATE_REPLACE;
        closure->value = secret_value_ref (value);
        closure->collection_path = g_strdup (collection_path);
-       g_simple_async_result_set_op_res_gpointer (res, closure, item_closure_free);
+       g_task_set_task_data (task, closure, item_closure_free);
 
        secret_service_ensure_session (self, cancellable,
                                       on_create_item_session,
-                                      g_object_ref (res));
+                                      g_steal_pointer (&task));
 
-       g_object_unref (res);
+       g_clear_object (&task);
 }
 
 /**
@@ -2128,30 +2090,37 @@ secret_service_create_item_dbus_path_finish (SecretService *self,
                                              GAsyncResult *result,
                                              GError **error)
 {
-       GSimpleAsyncResult *res;
-       ItemClosure *closure;
        gchar *path;
 
-       g_return_val_if_fail (g_simple_async_result_is_valid (result, G_OBJECT (self),
-                             secret_service_create_item_dbus_path), NULL);
+       g_return_val_if_fail (g_task_is_valid (result, self), NULL);
+       g_return_val_if_fail (g_task_get_source_tag (G_TASK (result)) ==
+                             secret_service_create_item_dbus_path, NULL);
        g_return_val_if_fail (error == NULL || *error == NULL, NULL);
 
-       res = G_SIMPLE_ASYNC_RESULT (result);
-
-       if (_secret_util_propagate_error (res, error))
+       path = g_task_propagate_pointer (G_TASK (result), error);
+       if (path == NULL) {
+               _secret_util_strip_remote_error (error);
                return NULL;
+       }
 
-       closure = g_simple_async_result_get_op_res_gpointer (res);
-       path = closure->item_path;
-       closure->item_path = NULL;
-       return path;
+       return g_steal_pointer (&path);
 }
 
+/* Same as the function above, but doesn't strip the remote error and throws
+ * away the result */
 void
 _secret_service_create_item_dbus_path_finish_raw (GAsyncResult *result,
                                                   GError **error)
 {
-       g_simple_async_result_propagate_error (G_SIMPLE_ASYNC_RESULT (result), error);
+       gchar *path;
+
+       g_return_if_fail (g_task_get_source_tag (G_TASK (result)) ==
+                         secret_service_create_item_dbus_path);
+       g_return_if_fail (error == NULL || *error == NULL);
+
+       path = g_task_propagate_pointer (G_TASK (result), error);
+
+       g_free (path);
 }
 
 /**



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]