[nautilus] Move metadata setting to a NautilusFile vfunc



commit 02f908f3d864f1f3bf0729158907f312e0306c05
Author: Alexander Larsson <alexl redhat com>
Date:   Mon Jun 29 14:37:54 2009 +0200

    Move metadata setting to a NautilusFile vfunc
    
    This allows non-vfs backends to implement metadata

 libnautilus-private/nautilus-file-private.h |    2 +
 libnautilus-private/nautilus-file.c         |  149 ++++++---------------------
 libnautilus-private/nautilus-file.h         |    7 ++
 libnautilus-private/nautilus-vfs-file.c     |  119 +++++++++++++++++++++
 4 files changed, 162 insertions(+), 115 deletions(-)
---
diff --git a/libnautilus-private/nautilus-file-private.h b/libnautilus-private/nautilus-file-private.h
index aa752ad..00fa2fb 100644
--- a/libnautilus-private/nautilus-file-private.h
+++ b/libnautilus-private/nautilus-file-private.h
@@ -260,6 +260,8 @@ gboolean      nautilus_file_update_info                    (NautilusFile
 							    GFileInfo              *info);
 gboolean      nautilus_file_update_name                    (NautilusFile           *file,
 							    const char             *name);
+gboolean      nautilus_file_update_metadata_from_info      (NautilusFile           *file,
+							    GFileInfo              *info);
 
 gboolean      nautilus_file_update_name_and_directory      (NautilusFile           *file,
 							    const char             *name,
diff --git a/libnautilus-private/nautilus-file.c b/libnautilus-private/nautilus-file.c
index 5c478d0..f263818 100644
--- a/libnautilus-private/nautilus-file.c
+++ b/libnautilus-private/nautilus-file.c
@@ -378,6 +378,31 @@ get_metadata_from_info (GFileInfo *info)
 	return metadata;
 }
 
+gboolean
+nautilus_file_update_metadata_from_info (NautilusFile *file,
+					 GFileInfo *info)
+{
+	gboolean changed = FALSE;
+
+	if (g_file_info_has_namespace (info, "metadata")) {
+		GHashTable *metadata;
+
+		metadata = get_metadata_from_info (info);
+		if (!metadata_hash_equal (metadata,
+					  file->details->metadata)) {
+			changed = TRUE;
+			clear_metadata (file);
+			file->details->metadata = metadata;
+		} else {
+			metadata_hash_free (metadata);
+		}
+	} else if (file->details->metadata) {
+		changed = TRUE;
+		clear_metadata (file);
+	}
+	return changed;
+}
+
 void
 nautilus_file_clear_info (NautilusFile *file)
 {
@@ -2132,22 +2157,8 @@ update_info_internal (NautilusFile *file,
 		file->details->trash_orig_path = g_strdup (trash_orig_path);
 	}
 
-	if (g_file_info_has_namespace (info, "metadata")) {
-		GHashTable *metadata;
-
-		metadata = get_metadata_from_info (info);
-		if (!metadata_hash_equal (metadata,
-					  file->details->metadata)) {
-			changed = TRUE;
-			clear_metadata (file);
-			file->details->metadata = metadata;
-		} else {
-			metadata_hash_free (metadata);
-		}
-	} else if (file->details->metadata) {
-		changed = TRUE;
-		clear_metadata (file);
-	}
+	changed |=
+		nautilus_file_update_metadata_from_info (file, info);
 
 	if (update_name) {
 		name = g_file_info_get_name (info);
@@ -3214,104 +3225,26 @@ nautilus_file_get_metadata_list (NautilusFile *file,
 	return NULL;
 }
 
-static void
-set_metadata_get_info_callback (GObject *source_object,
-				GAsyncResult *res,
-				gpointer callback_data)
-{
-	NautilusFile *file;
-	GFileInfo *new_info;
-	GError *error;
-
-	file = callback_data;
-
-	error = NULL;
-	new_info = g_file_query_info_finish (G_FILE (source_object), res, &error);
-	if (new_info != NULL) {
-		if (nautilus_file_update_info (file, new_info)) {
-			nautilus_file_changed (file);
-		}
-		g_object_unref (new_info);
-	}
-	nautilus_file_unref (file);
-	if (error) {
-		g_error_free (error);
-	}
-}
-
-static void
-set_metadata_callback (GObject *source_object,
-		       GAsyncResult *result,
-		       gpointer callback_data)
-{
-	NautilusFile *file;
-	GError *error;
-	gboolean res;
-
-	file = callback_data;
-
-	error = NULL;
-	res = g_file_set_attributes_finish (G_FILE (source_object),
-					    result,
-					    NULL,
-					    &error);
-
-	if (res) {
-		g_file_query_info_async (G_FILE (source_object),
-					 NAUTILUS_FILE_DEFAULT_ATTRIBUTES,
-					 0,
-					 G_PRIORITY_DEFAULT,
-					 NULL,
-					 set_metadata_get_info_callback, file);
-	} else {
-		nautilus_file_unref (file);
-		g_error_free (error);
-	}
-}
-
 void
 nautilus_file_set_metadata (NautilusFile *file,
 			    const char *key,
 			    const char *default_metadata,
 			    const char *metadata)
 {
-	GFile *location;
-	GFileInfo *info;
 	const char *val;
-	char *gio_key;
 
 	g_return_if_fail (NAUTILUS_IS_FILE (file));
 	g_return_if_fail (key != NULL);
 	g_return_if_fail (key[0] != '\0');
 
-	info = g_file_info_new ();
-
 	val = metadata;
 	if (val == NULL) {
 		val = default_metadata;
 	}
 
-	gio_key = g_strconcat ("metadata::", key, NULL);
-	if (val != NULL) {
-		g_file_info_set_attribute_string (info, gio_key, val);
-	} else {
-		/* Unset the key */
-		g_file_info_set_attribute (info, gio_key,
-					   G_FILE_ATTRIBUTE_TYPE_INVALID,
-					   NULL);
-	}
-	g_free (gio_key);
-
-	location = nautilus_file_get_location (file);
-	g_file_set_attributes_async (location,
-				     info,
-				     0,
-				     G_PRIORITY_DEFAULT,
-				     NULL,
-				     set_metadata_callback,
-				     nautilus_file_ref (file));
-	g_object_unref (location);
-	g_object_unref (info);
+	EEL_CALL_METHOD
+		(NAUTILUS_FILE_CLASS, file,
+		 set_metadata, (file, key, val));
 }
 
 void
@@ -3319,19 +3252,14 @@ nautilus_file_set_metadata_list (NautilusFile *file,
 				 const char *key,
 				 GList *list)
 {
-	GFile *location;
-	GFileInfo *info;
 	char **val;
 	int len, i;
 	GList *l;
-	char *gio_key;
 
 	g_return_if_fail (NAUTILUS_IS_FILE (file));
 	g_return_if_fail (key != NULL);
 	g_return_if_fail (key[0] != '\0');
 
-	info = g_file_info_new ();
-
 	len = g_list_length (list);
 	val = g_new (char *, len + 1);
 	for (l = list, i = 0; l != NULL; l = l->next, i++) {
@@ -3339,20 +3267,11 @@ nautilus_file_set_metadata_list (NautilusFile *file,
 	}
 	val[i] = NULL;
 
-	gio_key = g_strconcat ("metadata::", key, NULL);
-	g_file_info_set_attribute_stringv (info, gio_key, val);
-	g_free (gio_key);
+	EEL_CALL_METHOD
+		(NAUTILUS_FILE_CLASS, file,
+		 set_metadata_as_list, (file, key, val));
 
-	location = nautilus_file_get_location (file);
-	g_file_set_attributes_async (location,
-				     info,
-				     0,
-				     G_PRIORITY_DEFAULT,
-				     NULL,
-				     set_metadata_callback,
-				     nautilus_file_ref (file));
-	g_object_unref (info);
-	g_object_unref (location);
+	g_free (val);
 }
 
 
diff --git a/libnautilus-private/nautilus-file.h b/libnautilus-private/nautilus-file.h
index f3c8e99..0ee9367 100644
--- a/libnautilus-private/nautilus-file.h
+++ b/libnautilus-private/nautilus-file.h
@@ -513,6 +513,13 @@ typedef struct {
 							  time_t                 *date);
 	char *                (* get_where_string)       (NautilusFile           *file);
 
+	void                  (* set_metadata)           (NautilusFile           *file,
+							  const char             *key,
+							  const char             *value);
+	void                  (* set_metadata_as_list)   (NautilusFile           *file,
+							  const char             *key,
+							  char                  **value);
+	
 	void                  (* mount)                  (NautilusFile                   *file,
 							  GMountOperation                *mount_op,
 							  GCancellable                   *cancellable,
diff --git a/libnautilus-private/nautilus-vfs-file.c b/libnautilus-private/nautilus-vfs-file.c
index 8714575..c3e9bd3 100644
--- a/libnautilus-private/nautilus-vfs-file.c
+++ b/libnautilus-private/nautilus-vfs-file.c
@@ -26,6 +26,7 @@
 #include <config.h>
 #include "nautilus-vfs-file.h"
 
+#include "nautilus-directory-notify.h"
 #include "nautilus-directory-private.h"
 #include "nautilus-file-private.h"
 #include "nautilus-autorun.h"
@@ -89,6 +90,122 @@ vfs_file_check_if_ready (NautilusFile *file,
 		 file_attributes);
 }
 
+static void
+set_metadata_get_info_callback (GObject *source_object,
+				GAsyncResult *res,
+				gpointer callback_data)
+{
+	NautilusFile *file;
+	GFileInfo *new_info;
+	GError *error;
+
+	file = callback_data;
+
+	error = NULL;
+	new_info = g_file_query_info_finish (G_FILE (source_object), res, &error);
+	if (new_info != NULL) {
+		if (nautilus_file_update_info (file, new_info)) {
+			nautilus_file_changed (file);
+		}
+		g_object_unref (new_info);
+	}
+	nautilus_file_unref (file);
+	if (error) {
+		g_error_free (error);
+	}
+}
+
+static void
+set_metadata_callback (GObject *source_object,
+		       GAsyncResult *result,
+		       gpointer callback_data)
+{
+	NautilusFile *file;
+	GError *error;
+	gboolean res;
+
+	file = callback_data;
+
+	error = NULL;
+	res = g_file_set_attributes_finish (G_FILE (source_object),
+					    result,
+					    NULL,
+					    &error);
+
+	if (res) {
+		g_file_query_info_async (G_FILE (source_object),
+					 NAUTILUS_FILE_DEFAULT_ATTRIBUTES,
+					 0,
+					 G_PRIORITY_DEFAULT,
+					 NULL,
+					 set_metadata_get_info_callback, file);
+	} else {
+		nautilus_file_unref (file);
+		g_error_free (error);
+	}
+}
+
+static void
+vfs_file_set_metadata (NautilusFile           *file,
+		       const char             *key,
+		       const char             *value)
+{
+	GFileInfo *info;
+	GFile *location;
+	char *gio_key;
+
+	info = g_file_info_new ();
+	
+	gio_key = g_strconcat ("metadata::", key, NULL);
+	if (value != NULL) {
+		g_file_info_set_attribute_string (info, gio_key, value);
+	} else {
+		/* Unset the key */
+		g_file_info_set_attribute (info, gio_key,
+					   G_FILE_ATTRIBUTE_TYPE_INVALID,
+					   NULL);
+	}
+	g_free (gio_key);
+
+	location = nautilus_file_get_location (file);
+	g_file_set_attributes_async (location,
+				     info,
+				     0,
+				     G_PRIORITY_DEFAULT,
+				     NULL,
+				     set_metadata_callback,
+				     nautilus_file_ref (file));
+	g_object_unref (location);
+	g_object_unref (info);
+}
+
+static void
+vfs_file_set_metadata_as_list (NautilusFile           *file,
+			       const char             *key,
+			       char                  **value)
+{
+	GFile *location;
+	GFileInfo *info;
+	char *gio_key;
+
+	info = g_file_info_new ();
+
+	gio_key = g_strconcat ("metadata::", key, NULL);
+	g_file_info_set_attribute_stringv (info, gio_key, value);
+	g_free (gio_key);
+
+	location = nautilus_file_get_location (file);
+	g_file_set_attributes_async (location,
+				     info,
+				     0,
+				     G_PRIORITY_DEFAULT,
+				     NULL,
+				     set_metadata_callback,
+				     nautilus_file_ref (file));
+	g_object_unref (info);
+	g_object_unref (location);
+}
+
 static gboolean
 vfs_file_get_item_count (NautilusFile *file, 
 			 guint *count,
@@ -515,6 +632,8 @@ nautilus_vfs_file_class_init (gpointer klass)
 	file_class->get_deep_counts = vfs_file_get_deep_counts;
 	file_class->get_date = vfs_file_get_date;
 	file_class->get_where_string = vfs_file_get_where_string;
+	file_class->set_metadata = vfs_file_set_metadata;
+	file_class->set_metadata_as_list = vfs_file_set_metadata_as_list;
 	file_class->mount = vfs_file_mount;
 	file_class->unmount = vfs_file_unmount;
 	file_class->eject = vfs_file_eject;



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