[nautilus/recent-manager-update] file-utilities: make update recent potentially async



commit 0909ca090031d14843dabc60eb78411525085504
Author: Marco Trevisan (TreviƱo) <mail 3v1n0 net>
Date:   Fri Nov 9 23:02:52 2018 -0600

    file-utilities: make update recent potentially async
    
    In case we need to fetch the file infos for the moved file, we should do this
    using an async call to fetch the file infos.

 src/nautilus-directory.c      |   2 +-
 src/nautilus-file-utilities.c | 123 +++++++++++++++++++++++++++++-------------
 src/nautilus-file-utilities.h |  10 ++--
 src/nautilus-file.c           |  11 ++--
 4 files changed, 100 insertions(+), 46 deletions(-)
---
diff --git a/src/nautilus-directory.c b/src/nautilus-directory.c
index f093df6bc..7872864e5 100644
--- a/src/nautilus-directory.c
+++ b/src/nautilus-directory.c
@@ -1669,7 +1669,7 @@ nautilus_directory_notify_files_moved (GList *file_pairs)
             unref_list = g_list_prepend (unref_list, file);
         }
 
-        nautilus_file_moved_update_recent (from_uri, to_uri, NULL, NULL);
+        nautilus_file_moved_update_recent_async (from_uri, to_uri, NULL, NULL, NULL);
     }
 
     /* Now send out the changed and added signals for existing file objects. */
diff --git a/src/nautilus-file-utilities.c b/src/nautilus-file-utilities.c
index 0b8d22b17..d3e83f1d8 100644
--- a/src/nautilus-file-utilities.c
+++ b/src/nautilus-file-utilities.c
@@ -28,7 +28,6 @@
 #include "nautilus-metadata.h"
 #include "nautilus-file.h"
 #include "nautilus-file-operations.h"
-#include "nautilus-file-private.h"
 #include "nautilus-search-directory.h"
 #include "nautilus-starred-directory.h"
 #include "nautilus-ui-utilities.h"
@@ -1510,45 +1509,14 @@ nautilus_file_system_is_remote (const char *file_system)
     return file_system != NULL && g_strv_contains (remote_types, file_system);
 }
 
-void
-nautilus_file_moved_update_recent (const gchar *old_uri,
-                                   const gchar *new_uri,
-                                   const gchar *old_display_name,
-                                   const gchar *new_display_name)
+static void
+nautilus_file_moved_update_recent (NautilusFile *file,
+                                   const gchar  *old_uri,
+                                   const gchar  *new_uri,
+                                   const gchar  *old_display_name,
+                                   const gchar  *new_display_name)
 {
     GtkRecentManager *recent_manager = gtk_recent_manager_get_default ();
-    g_autoptr (NautilusFile) file = NULL;
-    NautilusFile *existing_file;
-
-    if (new_uri == NULL || old_uri == NULL ||
-        (g_strcmp0 (old_uri, new_uri) == 0 &&
-         g_strcmp0 (old_display_name, new_display_name) == 0))
-    {
-        return;
-    }
-
-    existing_file = nautilus_file_get_existing_by_uri (new_uri);
-
-    if (existing_file)
-    {
-        file = g_object_ref (existing_file);
-    }
-    else
-    {
-        g_autoptr (GFile) location = g_file_new_for_uri (new_uri);
-        g_autoptr (GFileInfo) file_info = NULL;
-
-        file_info = g_file_query_info (location,
-                                       NAUTILUS_FILE_DEFAULT_ATTRIBUTES,
-                                       0, NULL, NULL);
-        if (file_info == NULL)
-        {
-            return;
-        }
-
-        file = nautilus_file_get (location);
-        nautilus_file_update_info (file, file_info);
-    }
 
     if (nautilus_file_is_directory (file))
     {
@@ -1640,3 +1608,82 @@ nautilus_file_moved_update_recent (const gchar *old_uri,
         }
     }
 }
+
+typedef struct
+{
+    NautilusFileOperation *op;
+    const gchar  *old_uri;
+    const gchar  *new_uri;
+    const gchar  *old_display_name;
+    const gchar  *new_display_name;
+} RecentInfoUpdateData;
+G_DEFINE_AUTOPTR_CLEANUP_FUNC (RecentInfoUpdateData, g_free);
+
+static void
+file_moved_recent_info_callback (GObject      *source_object,
+                                 GAsyncResult *res,
+                                 gpointer      callback_data)
+{
+    g_autoptr (GError) error = NULL;
+    g_autoptr (GFileInfo) info = NULL;
+    g_autoptr (RecentInfoUpdateData) recent_data = callback_data;
+    GFile *location = G_FILE (source_object);
+
+    info = g_file_query_info_finish (location, res, &error);
+
+    if (info != NULL)
+    {
+        g_autoptr (NautilusFile) file = nautilus_file_get (location);
+        nautilus_file_update_info (file, info);
+        nautilus_file_moved_update_recent (file,
+                                           recent_data->old_uri,
+                                           recent_data->new_uri,
+                                           recent_data->old_display_name,
+                                           recent_data->new_display_name);
+    }
+
+    nautilus_file_operation_complete (recent_data->op, NULL, error);
+}
+
+void
+nautilus_file_moved_update_recent_async (const gchar           *old_uri,
+                                         const gchar           *new_uri,
+                                         const gchar           *old_display_name,
+                                         const gchar           *new_display_name,
+                                         NautilusFileOperation *op)
+{
+    NautilusFile *existing_file;
+
+    if (new_uri == NULL || old_uri == NULL ||
+        (g_strcmp0 (old_uri, new_uri) == 0 &&
+         g_strcmp0 (old_display_name, new_display_name) == 0))
+    {
+        return;
+    }
+
+    existing_file = nautilus_file_get_existing_by_uri (new_uri);
+
+    if (existing_file)
+    {
+        nautilus_file_moved_update_recent (existing_file,
+                                           old_uri, new_uri,
+                                           old_display_name, new_display_name);
+
+        if (op != NULL)
+            nautilus_file_operation_complete (op, NULL, NULL);
+    }
+    else
+    {
+        g_autoptr (GFile) location = g_file_new_for_uri (new_uri);
+        RecentInfoUpdateData *recent_data = g_new0 (RecentInfoUpdateData, 1);
+        recent_data->op = op;
+
+        g_file_query_info_async (location,
+                                 NAUTILUS_FILE_DEFAULT_ATTRIBUTES,
+                                 0,
+                                 G_PRIORITY_DEFAULT,
+                                 op ? op->cancellable : NULL,
+                                 file_moved_recent_info_callback,
+                                 recent_data);
+    }
+}
diff --git a/src/nautilus-file-utilities.h b/src/nautilus-file-utilities.h
index 386ae4aec..91494b647 100644
--- a/src/nautilus-file-utilities.h
+++ b/src/nautilus-file-utilities.h
@@ -27,6 +27,7 @@
 
 #include <config.h>
 
+#include "nautilus-file-private.h"
 #include "nautilus-query.h"
 
 #define NAUTILUS_DESKTOP_ID APPLICATION_ID ".desktop"
@@ -144,7 +145,8 @@ NautilusQueryRecursive location_settings_search_get_recursive_for_location (GFil
 
 gboolean nautilus_file_system_is_remote (const char *file_system);
 
-void nautilus_file_moved_update_recent (const char *old_uri,
-                                        const char *new_uri,
-                                        const char *old_display_name,
-                                        const char *new_dispaly_name);
+void nautilus_file_moved_update_recent_async (const char            *old_uri,
+                                              const char            *new_uri,
+                                              const char            *old_display_name,
+                                              const char            *new_dispaly_name,
+                                              NautilusFileOperation *op);
diff --git a/src/nautilus-file.c b/src/nautilus-file.c
index 407b812e4..41ba9822f 100644
--- a/src/nautilus-file.c
+++ b/src/nautilus-file.c
@@ -1887,10 +1887,15 @@ rename_get_info_callback (GObject      *source_object,
         new_display_name = nautilus_file_get_display_name (op->file);
 
         nautilus_directory_moved (old_uri, new_uri);
-        nautilus_file_moved_update_recent (old_uri, new_uri,
-                                           old_display_name, new_display_name);
+        nautilus_file_moved_update_recent_async (old_uri, new_uri,
+                                                 old_display_name,
+                                                 new_display_name,
+                                                 op);
+    }
+    else
+    {
+        nautilus_file_operation_complete (op, NULL, error);
     }
-    nautilus_file_operation_complete (op, NULL, error);
 }
 
 static void


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