[tepl] Metadata: query if GFile location exists



commit 5104a50ef42f34b6f717638d5ebff382a6a05cbc
Author: Sébastien Wilmet <swilmet gnome org>
Date:   Thu Apr 16 13:54:56 2020 +0200

    Metadata: query if GFile location exists
    
    Now all unit tests pass, yay \o/

 tepl/tepl-metadata.c           | 151 +++++++++++++++++++++++++----------------
 testsuite/test-file-metadata.c |  10 +--
 2 files changed, 99 insertions(+), 62 deletions(-)
---
diff --git a/tepl/tepl-metadata.c b/tepl/tepl-metadata.c
index 3491d8a..2b7e816 100644
--- a/tepl/tepl-metadata.c
+++ b/tepl/tepl-metadata.c
@@ -54,21 +54,23 @@ use_gvfs_metadata (void)
 }
 
 /******************************************************************************/
-/* Simplify TeplMetadataStore is_activated/is_loaded/is_loading/load */
+/* Common task for GFile query exists +
+ * TeplMetadataStore is_activated/is_loaded/is_loading/load
+ */
 
 static void
-load_metadata_store__notify_loaded_cb (TeplMetadataStore *store,
-                                      GParamSpec        *pspec,
-                                      GTask             *task)
+common_task__metadata_store_notify_loaded_cb (TeplMetadataStore *store,
+                                             GParamSpec        *pspec,
+                                             GTask             *task)
 {
        g_task_return_boolean (task, TRUE);
        g_object_unref (task);
 }
 
 static void
-load_metadata_store__load_cb (GObject      *source_object,
-                             GAsyncResult *result,
-                             gpointer      user_data)
+common_task__metadata_store_load_cb (GObject      *source_object,
+                                    GAsyncResult *result,
+                                    gpointer      user_data)
 {
        TeplMetadataStore *store = TEPL_METADATA_STORE (source_object);
        GTask *task = G_TASK (user_data);
@@ -88,19 +90,34 @@ load_metadata_store__load_cb (GObject      *source_object,
 }
 
 static void
-load_metadata_store_async (TeplMetadataStore   *store,
-                          gint                 io_priority,
-                          GCancellable        *cancellable,
-                          GAsyncReadyCallback  callback,
-                          gpointer             user_data)
+common_task__query_exists_cb (GObject      *source_object,
+                             GAsyncResult *result,
+                             gpointer      user_data)
 {
-       GTask *task;
+       GFile *location = G_FILE (source_object);
+       GTask *task = G_TASK (user_data);
+       GFileInfo *info;
+       GError *error = NULL;
+       TeplMetadataStore *store;
 
-       g_return_if_fail (TEPL_IS_METADATA_STORE (store));
-       g_return_if_fail (cancellable == NULL || G_IS_CANCELLABLE (cancellable));
+       info = g_file_query_info_finish (location, result, &error);
+       g_clear_object (&info);
+       if (error != NULL)
+       {
+               /* The location doesn't exist. Do the same behavior as the GFile
+                * metadata APIs, return an error. Having the same behavior with
+                * both backends (GVfs and TeplMetadataStore) is easier for
+                * testing, it's more consistent.
+                * Note that we haven't used tepl_utils_file_query_exists_*()
+                * because we need the GError instead of creating our own
+                * GError.
+                */
+               g_task_return_error (task, error);
+               g_object_unref (task);
+               return;
+       }
 
-       task = g_task_new (store, cancellable, callback, user_data);
-       g_task_set_priority (task, io_priority);
+       store = tepl_metadata_store_get_singleton ();
 
        if (!_tepl_metadata_store_is_activated (store))
        {
@@ -120,27 +137,51 @@ load_metadata_store_async (TeplMetadataStore   *store,
        {
                g_signal_connect (store,
                                  "notify::loaded",
-                                 G_CALLBACK (load_metadata_store__notify_loaded_cb),
+                                 G_CALLBACK (common_task__metadata_store_notify_loaded_cb),
                                  task);
        }
        else
        {
                _tepl_metadata_store_load_async (store,
-                                                io_priority,
-                                                cancellable,
-                                                load_metadata_store__load_cb,
+                                                g_task_get_priority (task),
+                                                g_task_get_cancellable (task),
+                                                common_task__metadata_store_load_cb,
                                                 task);
        }
 }
 
+static void
+common_task_async (GFile               *location,
+                  gint                 io_priority,
+                  GCancellable        *cancellable,
+                  GAsyncReadyCallback  callback,
+                  gpointer             user_data)
+{
+       GTask *task;
+
+       g_return_if_fail (G_IS_FILE (location));
+       g_return_if_fail (cancellable == NULL || G_IS_CANCELLABLE (cancellable));
+
+       task = g_task_new (location, cancellable, callback, user_data);
+       g_task_set_priority (task, io_priority);
+
+       g_file_query_info_async (location,
+                                G_FILE_ATTRIBUTE_STANDARD_TYPE,
+                                G_FILE_QUERY_INFO_NONE,
+                                io_priority,
+                                cancellable,
+                                common_task__query_exists_cb,
+                                task);
+}
+
 static gboolean
-load_metadata_store_finish (TeplMetadataStore  *store,
-                           GAsyncResult       *result,
-                           GError            **error)
+common_task_finish (GFile         *location,
+                   GAsyncResult  *result,
+                   GError       **error)
 {
-       g_return_val_if_fail (TEPL_IS_METADATA_STORE (store), FALSE);
+       g_return_val_if_fail (G_IS_FILE (location), FALSE);
        g_return_val_if_fail (error == NULL || *error == NULL, FALSE);
-       g_return_val_if_fail (g_task_is_valid (result, store), FALSE);
+       g_return_val_if_fail (g_task_is_valid (result, location), FALSE);
 
        return g_task_propagate_boolean (G_TASK (result), error);
 }
@@ -149,9 +190,9 @@ load_metadata_store_finish (TeplMetadataStore  *store,
 /* Query info */
 
 static void
-do_query_info (TeplMetadataStore *store,
-              GTask             *task)
+do_query_info (GTask *task)
 {
+       TeplMetadataStore *store = tepl_metadata_store_get_singleton ();
        GFile *location = g_task_get_source_object (task);
        GFileInfo *file_info;
 
@@ -167,15 +208,15 @@ do_query_info (TeplMetadataStore *store,
 }
 
 static void
-query_info__load_metadata_store_cb (GObject      *source_object,
-                                   GAsyncResult *result,
-                                   gpointer      user_data)
+query_info__common_task_cb (GObject      *source_object,
+                           GAsyncResult *result,
+                           gpointer      user_data)
 {
-       TeplMetadataStore *store = TEPL_METADATA_STORE (source_object);
+       GFile *location = G_FILE (source_object);
        GTask *task = G_TASK (user_data);
        GError *error = NULL;
 
-       load_metadata_store_finish (store, result, &error);
+       common_task_finish (location, result, &error);
        if (error != NULL)
        {
                g_task_return_error (task, error);
@@ -183,7 +224,7 @@ query_info__load_metadata_store_cb (GObject      *source_object,
                return;
        }
 
-       do_query_info (store, task);
+       do_query_info (task);
 }
 
 void
@@ -194,7 +235,6 @@ _tepl_metadata_query_info_async (GFile               *location,
                                 gpointer             user_data)
 {
        GTask *task;
-       TeplMetadataStore *store;
 
        if (use_gvfs_metadata ())
        {
@@ -214,13 +254,11 @@ _tepl_metadata_query_info_async (GFile               *location,
        task = g_task_new (location, cancellable, callback, user_data);
        g_task_set_priority (task, io_priority);
 
-       store = tepl_metadata_store_get_singleton ();
-
-       load_metadata_store_async (store,
-                                  io_priority,
-                                  cancellable,
-                                  query_info__load_metadata_store_cb,
-                                  task);
+       common_task_async (location,
+                          io_priority,
+                          cancellable,
+                          query_info__common_task_cb,
+                          task);
 }
 
 GFileInfo *
@@ -244,9 +282,9 @@ _tepl_metadata_query_info_finish (GFile         *location,
 /* Set attributes */
 
 static void
-do_set_attributes (TeplMetadataStore *store,
-                  GTask             *task)
+do_set_attributes (GTask *task)
 {
+       TeplMetadataStore *store = tepl_metadata_store_get_singleton ();
        GFile *location = g_task_get_source_object (task);
        GFileInfo *file_info_to_merge = g_task_get_task_data (task);
        GFileInfo *full_file_info;
@@ -294,15 +332,15 @@ do_set_attributes (TeplMetadataStore *store,
 }
 
 static void
-set_attributes__load_metadata_store_cb (GObject      *source_object,
-                                       GAsyncResult *result,
-                                       gpointer      user_data)
+set_attributes__common_task_cb (GObject      *source_object,
+                               GAsyncResult *result,
+                               gpointer      user_data)
 {
-       TeplMetadataStore *store = TEPL_METADATA_STORE (source_object);
+       GFile *location = G_FILE (source_object);
        GTask *task = G_TASK (user_data);
        GError *error = NULL;
 
-       load_metadata_store_finish (store, result, &error);
+       common_task_finish (location, result, &error);
        if (error != NULL)
        {
                g_task_return_error (task, error);
@@ -310,7 +348,7 @@ set_attributes__load_metadata_store_cb (GObject      *source_object,
                return;
        }
 
-       do_set_attributes (store, task);
+       do_set_attributes (task);
 }
 
 void
@@ -322,7 +360,6 @@ _tepl_metadata_set_attributes_async (GFile               *location,
                                     gpointer             user_data)
 {
        GTask *task;
-       TeplMetadataStore *store;
 
        if (use_gvfs_metadata ())
        {
@@ -340,13 +377,11 @@ _tepl_metadata_set_attributes_async (GFile               *location,
        g_task_set_priority (task, io_priority);
        g_task_set_task_data (task, g_file_info_dup (file_info), g_object_unref);
 
-       store = tepl_metadata_store_get_singleton ();
-
-       load_metadata_store_async (store,
-                                  io_priority,
-                                  cancellable,
-                                  set_attributes__load_metadata_store_cb,
-                                  task);
+       common_task_async (location,
+                          io_priority,
+                          cancellable,
+                          set_attributes__common_task_cb,
+                          task);
 }
 
 gboolean
diff --git a/testsuite/test-file-metadata.c b/testsuite/test-file-metadata.c
index 2e3be64..55e5517 100644
--- a/testsuite/test-file-metadata.c
+++ b/testsuite/test-file-metadata.c
@@ -321,7 +321,8 @@ test_set_without_load (gpointer      fixture,
 }
 
 static void
-test_arbitrary_keys_and_values_success (void)
+test_arbitrary_keys_and_values_success (gpointer      fixture,
+                                       gconstpointer user_data)
 {
        check_round_trip ("tepl-simple-key", "simple-value");
        check_round_trip ("tepl-simple-key", " ");
@@ -386,7 +387,8 @@ test_for_remote_file_success (gpointer      fixture,
 }
 
 static void
-test_for_remote_file_failure (void)
+test_for_remote_file_failure (gpointer      fixture,
+                             gconstpointer user_data)
 {
        if (g_test_subprocess ())
        {
@@ -599,13 +601,13 @@ main (int    argc,
 
        add_test ("get_set_metadata", test_get_set_metadata);
        add_test ("set_without_load", test_set_without_load);
-       g_test_add_func ("/file_metadata/arbitrary_keys_and_values_success", 
test_arbitrary_keys_and_values_success);
+       add_test ("arbitrary_keys_and_values_success", test_arbitrary_keys_and_values_success);
        add_test ("arbitrary_keys_and_values_failure_01", test_arbitrary_keys_and_values_failure_01);
        add_test ("arbitrary_keys_and_values_failure_02", test_arbitrary_keys_and_values_failure_02);
        add_test ("arbitrary_keys_and_values_failure_03", test_arbitrary_keys_and_values_failure_03);
        add_test ("arbitrary_keys_and_values_failure_04", test_arbitrary_keys_and_values_failure_04);
        add_test ("for_remote_file_success", test_for_remote_file_success);
-       g_test_add_func ("/file_metadata/for_remote_file_failure", test_for_remote_file_failure);
+       add_test ("for_remote_file_failure", test_for_remote_file_failure);
        add_test ("simulate_several_apps", test_simulate_several_apps);
        add_test ("save_as_new_document", test_save_as_new_document);
        add_test ("open_existing_document_and_save_as", test_open_existing_document_and_save_as);


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