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



commit 64f03eb3930339d691ca5a850b9f824ce7e6b204
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 | 124 +++++++++++++++++++++++++++++-------------
 src/nautilus-file-utilities.h |  10 ++--
 src/nautilus-file.c           |  11 +++-
 4 files changed, 101 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..5dcbabb33 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,83 @@ 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);
+    g_print("MOVE UPDATE RECENT %s -> %s: %p\n", old_uri, new_uri, existing_file);
+
+    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]