nautilus r14376 - in trunk: . libnautilus-private



Author: cneumair
Date: Sun Jul 20 12:45:12 2008
New Revision: 14376
URL: http://svn.gnome.org/viewvc/nautilus?rev=14376&view=rev

Log:
2008-07-20  Christian Neumair  <cneumair gnome org>

	* libnautilus-private/nautilus-dnd.c (check_same_fs),
	(nautilus_drag_default_drop_action_for_icons):
	* libnautilus-private/nautilus-file-private.h:
	* libnautilus-private/nautilus-file.c (nautilus_file_clear_info),
	(finalize), (update_info_internal),
	(nautilus_file_get_filesystem_id):
	* libnautilus-private/nautilus-file.h:
	Query filesystem ID, as referenced string. Use it to determine whether
	two files are on the same FS during DND. Gets rid of synchronous I/O.


Modified:
   trunk/ChangeLog
   trunk/libnautilus-private/nautilus-dnd.c
   trunk/libnautilus-private/nautilus-file-private.h
   trunk/libnautilus-private/nautilus-file.c
   trunk/libnautilus-private/nautilus-file.h

Modified: trunk/libnautilus-private/nautilus-dnd.c
==============================================================================
--- trunk/libnautilus-private/nautilus-dnd.c	(original)
+++ trunk/libnautilus-private/nautilus-dnd.c	Sun Jul 20 12:45:12 2008
@@ -388,47 +388,27 @@
 }
 
 static gboolean
-check_same_fs (GFile *file1, GFile *file2)
+check_same_fs (NautilusFile *file1,
+	       NautilusFile *file2)
 {
-	GFileInfo *info1, *info2;
-	const char *id1, *id2;
-	gboolean res;
-	
-	info1 = g_file_query_info (file1,
-				   G_FILE_ATTRIBUTE_ID_FILESYSTEM,
-				   0, NULL, NULL);
+	char *id1, *id2;
+	gboolean result;
 
-	if (info1 == NULL) {
-		return FALSE;
-	}
+	result = FALSE;
 
-	id1 = g_file_info_get_attribute_string (info1, G_FILE_ATTRIBUTE_ID_FILESYSTEM);
-	if (id1 == NULL) {
-		g_object_unref (info1);
-		return FALSE;
-	}
-	
-	info2 = g_file_query_info (file2,
-				   G_FILE_ATTRIBUTE_ID_FILESYSTEM,
-				   0, NULL, NULL);
-	if (info2 == NULL) {
-		g_object_unref (info1);
-		return FALSE;
-	}
+	if (file1 != NULL && file2 != NULL) {
+		id1 = nautilus_file_get_filesystem_id (file1);
+		id2 = nautilus_file_get_filesystem_id (file2);
 
-	id2 = g_file_info_get_attribute_string (info2, G_FILE_ATTRIBUTE_ID_FILESYSTEM);
-	if (id2 == NULL) {
-		g_object_unref (info1);
-		g_object_unref (info2);
-		return FALSE;
+		if (id1 != NULL && id2 != NULL) {
+			result = (strcmp (id1, id2) == 0);
+		}
+
+		g_free (id1);
+		g_free (id2);
 	}
 
-	res = strcmp (id1, id2) == 0;
-	
-	g_object_unref (info1);
-	g_object_unref (info2);
-	
-	return res;
+	return result;
 }
 
 void
@@ -510,12 +490,13 @@
 		target = g_file_new_for_uri (target_uri_string);
 	}
 
+	same_fs = check_same_fs (target_file, dropped_file);
+
 	nautilus_file_unref (dropped_file);
 	nautilus_file_unref (target_file);
 	
 	/* Compare the first dropped uri with the target uri for same fs match. */
 	dropped = g_file_new_for_uri (dropped_uri);
-	same_fs = check_same_fs (target, dropped);
 	target_is_source_parent = g_file_has_prefix (dropped, target);
 	
 	if (same_fs || target_is_source_parent ||

Modified: trunk/libnautilus-private/nautilus-file-private.h
==============================================================================
--- trunk/libnautilus-private/nautilus-file-private.h	(original)
+++ trunk/libnautilus-private/nautilus-file-private.h	Sun Jul 20 12:45:12 2008
@@ -46,7 +46,7 @@
 	 GNOME_VFS_FILE_INFO_GET_ACCESS_RIGHTS)
 
 #define NAUTILUS_FILE_DEFAULT_ATTRIBUTES				\
-	"standard::*,access::*,mountable::*,time::*,unix::*,owner::*,selinux::*,thumbnail::*"
+	"standard::*,access::*,mountable::*,time::*,unix::*,owner::*,selinux::*,thumbnail::*,id::filesystem"
 
 /* These are in the typical sort order. Known things come first, then
  * things where we can't know, finally things where we don't yet know.
@@ -115,6 +115,11 @@
 	char *custom_icon;
 	GFile *activation_location;
 
+	/* used during DND, for checking whether source and destination are on
+	 * the same file system.
+	 */
+	eel_ref_str filesystem_id;
+
 	/* The following is for file operations in progress. Since
 	 * there are normally only a few of these, we can move them to
 	 * a separate hash table or something if required to keep the

Modified: trunk/libnautilus-private/nautilus-file.c
==============================================================================
--- trunk/libnautilus-private/nautilus-file.c	(original)
+++ trunk/libnautilus-private/nautilus-file.c	Sun Jul 20 12:45:12 2008
@@ -353,6 +353,9 @@
 	file->details->mime_type = NULL;
 	g_free (file->details->selinux_context);
 	file->details->selinux_context = NULL;
+
+	eel_ref_str_unref (file->details->filesystem_id);
+	file->details->filesystem_id = NULL;
 }
 
 static NautilusFile *
@@ -674,6 +677,8 @@
 	if (file->details->mount) {
 		g_object_unref (file->details->mount);
 	}
+
+	eel_ref_str_unref (file->details->filesystem_id);
 	
 	eel_g_list_free_deep (file->details->mime_list);
 
@@ -1555,6 +1560,7 @@
 	GFile *old_activation_location;
 	const char *activation_uri;
 	const char *description;
+	const char *filesystem_id;
 	
 	if (file->details->is_gone) {
 		return FALSE;
@@ -1819,6 +1825,13 @@
 		g_free (file->details->description);
 		file->details->description = g_strdup (description);
 	}
+
+	filesystem_id = g_file_info_get_attribute_string (info, G_FILE_ATTRIBUTE_ID_FILESYSTEM);
+	if (eel_strcmp (file->details->filesystem_id, filesystem_id) != 0) {
+		changed = TRUE;
+		eel_ref_str_unref (file->details->filesystem_id);
+		file->details->filesystem_id = eel_ref_str_get_unique (filesystem_id);
+	}
 	
 	if (update_name) {
 		name = g_file_info_get_name (info);
@@ -6125,6 +6138,12 @@
 	return g_strdup (nautilus_file_peek_top_left_text (file, FALSE, NULL));
 }
 
+char *
+nautilus_file_get_filesystem_id (NautilusFile *file)
+{
+	return g_strdup (eel_ref_str_peek (file->details->filesystem_id));
+}
+
 
 void
 nautilus_file_mark_gone (NautilusFile *file)

Modified: trunk/libnautilus-private/nautilus-file.h
==============================================================================
--- trunk/libnautilus-private/nautilus-file.h	(original)
+++ trunk/libnautilus-private/nautilus-file.h	Sun Jul 20 12:45:12 2008
@@ -225,6 +225,8 @@
 									 gpointer                        callback_data);
 GFilesystemPreviewType  nautilus_file_get_filesystem_use_preview        (NautilusFile *file);
 
+char *                  nautilus_file_get_filesystem_id                 (NautilusFile                   *file);
+
 /* Permissions. */
 gboolean                nautilus_file_can_get_permissions               (NautilusFile                   *file);
 gboolean                nautilus_file_can_set_permissions               (NautilusFile                   *file);



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