[nautilus] Use gvfs based metadata



commit fc4e74e6763000bac2a459e83811cf01e6cb7720
Author: Alexander Larsson <alexl redhat com>
Date:   Tue Jun 23 21:12:58 2009 +0200

    Use gvfs based metadata

 libnautilus-private/Makefile.am             |    1 +
 libnautilus-private/nautilus-file-private.h |    4 +-
 libnautilus-private/nautilus-file.c         |  431 ++++++++++++++++++++++-----
 libnautilus-private/nautilus-file.h         |    6 +-
 libnautilus-private/nautilus-metadata.c     |   79 +++++
 libnautilus-private/nautilus-metadata.h     |   12 +-
 src/file-manager/fm-list-view.c             |   16 +-
 7 files changed, 450 insertions(+), 99 deletions(-)
---
diff --git a/libnautilus-private/Makefile.am b/libnautilus-private/Makefile.am
index 186a4a5..51bb759 100644
--- a/libnautilus-private/Makefile.am
+++ b/libnautilus-private/Makefile.am
@@ -129,6 +129,7 @@ libnautilus_private_la_SOURCES = \
 	nautilus-merged-directory.c \
 	nautilus-merged-directory.h \
 	nautilus-metadata.h \
+	nautilus-metadata.c \
 	nautilus-metafile.c \
 	nautilus-metafile.h \
 	nautilus-mime-actions.c \
diff --git a/libnautilus-private/nautilus-file-private.h b/libnautilus-private/nautilus-file-private.h
index a2fe8ab..aa752ad 100644
--- a/libnautilus-private/nautilus-file-private.h
+++ b/libnautilus-private/nautilus-file-private.h
@@ -40,7 +40,7 @@
 #define NAUTILUS_FILE_TOP_LEFT_TEXT_MAXIMUM_BYTES               1024
 
 #define NAUTILUS_FILE_DEFAULT_ATTRIBUTES				\
-	"standard::*,access::*,mountable::*,time::*,unix::*,owner::*,selinux::*,thumbnail::*,id::filesystem,trash::orig-path"
+	"standard::*,access::*,mountable::*,time::*,unix::*,owner::*,selinux::*,thumbnail::*,id::filesystem,trash::orig-path,metadata::*"
 
 /* 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.
@@ -142,6 +142,8 @@ struct NautilusFileDetails
 	GHashTable *extension_attributes;
 	GHashTable *pending_extension_attributes;
 
+	GHashTable *metadata;
+
 	/* Mount for mountpoint or the references GMount for a "mountable" */
 	GMount *mount;
 	
diff --git a/libnautilus-private/nautilus-file.c b/libnautilus-private/nautilus-file.c
index 0222867..a703b68 100644
--- a/libnautilus-private/nautilus-file.c
+++ b/libnautilus-private/nautilus-file.c
@@ -97,6 +97,8 @@
 /* Name of Nautilus trash directories */
 #define TRASH_DIRECTORY_NAME ".Trash"
 
+#define METADATA_ID_IS_LIST_MASK (1<<31)
+
 typedef enum {
 	SHOW_HIDDEN = 1 << 0,
 	SHOW_BACKUP = 1 << 1
@@ -262,6 +264,123 @@ nautilus_file_clear_display_name (NautilusFile *file)
 	file->details->edit_name = NULL;
 }
 
+static gboolean
+foreach_metadata_free (gpointer  key,
+		       gpointer  value,
+		       gpointer  user_data)
+{
+	guint id;
+
+	id = GPOINTER_TO_UINT (key);
+
+	if (id & METADATA_ID_IS_LIST_MASK) {
+		g_strfreev ((char **)value);
+	} else {
+		g_free ((char *)value);
+	}
+	return TRUE;
+}
+
+
+static void
+metadata_hash_free (GHashTable *hash)
+{
+	g_hash_table_foreach_remove (hash,
+				     foreach_metadata_free,
+				     NULL);
+	g_hash_table_destroy (hash);
+}
+
+static gboolean
+metadata_hash_equal (GHashTable *hash1,
+		     GHashTable *hash2)
+{
+	GHashTableIter iter;
+	gpointer key1, value1, value2;
+	guint id;
+
+	if (hash1 == NULL && hash2 == NULL) {
+		return TRUE;
+	}
+
+	if (hash1 == NULL || hash2 == NULL) {
+		return FALSE;
+	}
+
+	if (g_hash_table_size (hash1) !=
+	    g_hash_table_size (hash2)) {
+		return FALSE;
+	}
+
+	g_hash_table_iter_init (&iter, hash1);
+	while (g_hash_table_iter_next (&iter, &key1, &value1)) {
+		value2 = g_hash_table_lookup (hash2, key1);
+		if (value2 == NULL) {
+			return FALSE;
+		}
+		id = GPOINTER_TO_UINT (key1);
+		if (id & METADATA_ID_IS_LIST_MASK) {
+			if (!eel_g_strv_equal ((char **)value1, (char **)value2)) {
+				return FALSE;
+			}
+		} else {
+			if (strcmp ((char *)value1, (char *)value2) != 0) {
+				return FALSE;
+			}
+		}
+	}
+
+	return TRUE;
+}
+
+static void
+clear_metadata (NautilusFile *file)
+{
+	if (file->details->metadata) {
+		metadata_hash_free (file->details->metadata);
+		file->details->metadata = NULL;
+	}
+}
+
+static GHashTable *
+get_metadata_from_info (GFileInfo *info)
+{
+	GHashTable *metadata;
+	char **attrs;
+	guint id;
+	int i;
+	GFileAttributeType type;
+	gpointer value;
+
+	attrs = g_file_info_list_attributes (info, "metadata");
+
+	metadata = g_hash_table_new (NULL, NULL);
+
+	for (i = 0; attrs[i] != NULL; i++) {
+		id = nautilus_metadata_get_id (attrs[i] + strlen ("metadata::"));
+		if (id == 0) {
+			continue;
+		}
+
+		if (!g_file_info_get_attribute_data (info, attrs[i],
+						     &type, &value, NULL)) {
+			continue;
+		}
+
+		if (type == G_FILE_ATTRIBUTE_TYPE_STRING) {
+			g_hash_table_insert (metadata, GUINT_TO_POINTER (id),
+					     g_strdup ((char *)value));
+		} else if (type == G_FILE_ATTRIBUTE_TYPE_STRINGV) {
+			id |= METADATA_ID_IS_LIST_MASK;
+			g_hash_table_insert (metadata, GUINT_TO_POINTER (id),
+					     g_strdupv ((char **)value));
+		}
+	}
+
+	g_strfreev (attrs);
+
+	return metadata;
+}
 
 void
 nautilus_file_clear_info (NautilusFile *file)
@@ -339,6 +458,8 @@ nautilus_file_clear_info (NautilusFile *file)
 
 	eel_ref_str_unref (file->details->filesystem_id);
 	file->details->filesystem_id = NULL;
+
+	clear_metadata (file);
 }
 
 static NautilusFile *
@@ -2023,7 +2144,24 @@ update_info_internal (NautilusFile *file,
 		g_free (file->details->trash_orig_path);
 		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);
+	}
+
 	if (update_name) {
 		name = g_file_info_get_name (info);
 		if (file->details->name == NULL ||
@@ -3027,60 +3165,119 @@ nautilus_file_list_filter_hidden_and_backup (GList    *files,
 	return filtered_files;
 }
 
-
-
-
-/* We use the file's URI for the metadata for files in a directory,
- * but we use a hard-coded string for the metadata for the directory
- * itself.
- */
-static const char *
-get_metadata_name (NautilusFile *file)
-{
-	if (nautilus_file_is_self_owned (file)) {
-		return FILE_NAME_FOR_DIRECTORY_METADATA;
-	}
-	return eel_ref_str_peek (file->details->name);
-}
-
 char *
 nautilus_file_get_metadata (NautilusFile *file,
 			    const char *key,
 			    const char *default_metadata)
 {
+	guint id;
+	char *value;
+
 	g_return_val_if_fail (key != NULL, g_strdup (default_metadata));
 	g_return_val_if_fail (key[0] != '\0', g_strdup (default_metadata));
-	if (file == NULL) {
+
+	if (file == NULL ||
+	    file->details->metadata == NULL) {
 		return g_strdup (default_metadata);
 	}
+
 	g_return_val_if_fail (NAUTILUS_IS_FILE (file), g_strdup (default_metadata));
 
-	return nautilus_directory_get_file_metadata
-		(file->details->directory,
-		 get_metadata_name (file),
-		 key,
-		 default_metadata);
+	id = nautilus_metadata_get_id (key);
+	value = g_hash_table_lookup (file->details->metadata, GUINT_TO_POINTER (id));
+
+	if (value) {
+		return g_strdup (value);
+	}
+	return g_strdup (default_metadata);
 }
 
 GList *
 nautilus_file_get_metadata_list (NautilusFile *file,
-				 const char *list_key,
-				 const char *list_subkey)
+				 const char *key)
 {
-	g_return_val_if_fail (list_key != NULL, NULL);
-	g_return_val_if_fail (list_key[0] != '\0', NULL);
-	g_return_val_if_fail (list_subkey != NULL, NULL);
-	g_return_val_if_fail (list_subkey[0] != '\0', NULL);
-	if (file == NULL) {
+	GList *res;
+	guint id;
+	char **value;
+	int i;
+
+	g_return_val_if_fail (key != NULL, NULL);
+	g_return_val_if_fail (key[0] != '\0', NULL);
+
+	if (file == NULL ||
+	    file->details->metadata == NULL) {
 		return NULL;
 	}
+
 	g_return_val_if_fail (NAUTILUS_IS_FILE (file), NULL);
 
-	return nautilus_directory_get_file_metadata_list
-		(file->details->directory,
-		 get_metadata_name (file),
-		 list_key,
-		 list_subkey);
+	id = nautilus_metadata_get_id (key);
+	id |= METADATA_ID_IS_LIST_MASK;
+
+	value = g_hash_table_lookup (file->details->metadata, GUINT_TO_POINTER (id));
+
+	if (value) {
+		res = NULL;
+		for (i = 0; value[i] != NULL; i++) {
+			res = g_list_prepend (res, g_strdup (value[i]));
+		}
+		return g_list_reverse (res);
+	}
+
+	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) {
+		nautilus_file_update_info (file, new_info);
+		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
@@ -3089,36 +3286,84 @@ nautilus_file_set_metadata (NautilusFile *file,
 			    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');
 
-	nautilus_directory_set_file_metadata
-		(file->details->directory,
-		 get_metadata_name (file),
-		 key,
-		 default_metadata,
-		 metadata);
+	info = g_file_info_new ();
+
+	val = metadata;
+	if (val == NULL) {
+		val = default_metadata;
+	}
+
+	if (val == NULL) {
+		g_print ("TODO: setting NULL string metadata");
+		val = "<null>";
+	}
+
+	g_print ("setting key %s to %s\n", key, val);
+	gio_key = g_strconcat ("metadata::", key, NULL);
+	g_file_info_set_attribute_string (info, gio_key, val);
+	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);
 }
 
 void
 nautilus_file_set_metadata_list (NautilusFile *file,
-				 const char *list_key,
-				 const char *list_subkey,
+				 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 (list_key != NULL);
-	g_return_if_fail (list_key[0] != '\0');
-	g_return_if_fail (list_subkey != NULL);
-	g_return_if_fail (list_subkey[0] != '\0');
+	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++) {
+		val[i] = l->data;
+	}
+	val[i] = NULL;
+
+	g_print ("setting list key %s to %d items\n", key, len);
+	gio_key = g_strconcat ("metadata::", key, NULL);
+	g_file_info_set_attribute_stringv (info, gio_key, val);
+	g_free (gio_key);
 
-	nautilus_directory_set_file_metadata_list
-		(file->details->directory,
-		 get_metadata_name (file),
-		 list_key,
-		 list_subkey,
-		 list);
+	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);
 }
 
 
@@ -3127,18 +3372,33 @@ nautilus_file_get_boolean_metadata (NautilusFile *file,
 				    const char   *key,
 				    gboolean      default_metadata)
 {
+	char *result_as_string;
+	gboolean result;
+
 	g_return_val_if_fail (key != NULL, default_metadata);
 	g_return_val_if_fail (key[0] != '\0', default_metadata);
+
 	if (file == NULL) {
 		return default_metadata;
 	}
+
 	g_return_val_if_fail (NAUTILUS_IS_FILE (file), default_metadata);
 
-	return nautilus_directory_get_boolean_file_metadata
-		(file->details->directory,
-		 get_metadata_name (file),
-		 key,
-		 default_metadata);
+	result_as_string = nautilus_file_get_metadata
+		(file, key, default_metadata ? "true" : "false");
+	g_assert (result_as_string != NULL);
+
+	if (g_ascii_strcasecmp (result_as_string, "true") == 0) {
+		result = TRUE;
+	} else if (g_ascii_strcasecmp (result_as_string, "false") == 0) {
+		result = FALSE;
+	} else {
+		g_error ("boolean metadata with value other than true or false");
+		result = default_metadata;
+	}
+
+	g_free (result_as_string);
+	return result;
 }
 
 int
@@ -3146,18 +3406,36 @@ nautilus_file_get_integer_metadata (NautilusFile *file,
 				    const char   *key,
 				    int           default_metadata)
 {
+	char *result_as_string;
+	char default_as_string[32];
+	int result;
+	char c;
+
 	g_return_val_if_fail (key != NULL, default_metadata);
 	g_return_val_if_fail (key[0] != '\0', default_metadata);
+
 	if (file == NULL) {
 		return default_metadata;
 	}
 	g_return_val_if_fail (NAUTILUS_IS_FILE (file), default_metadata);
 
-	return nautilus_directory_get_integer_file_metadata
-		(file->details->directory,
-		 get_metadata_name (file),
-		 key,
-		 default_metadata);
+	g_snprintf (default_as_string, sizeof (default_as_string), "%d", default_metadata);
+	result_as_string = nautilus_file_get_metadata
+		(file, key, default_as_string);
+
+	/* Normally we can't get a a NULL, but we check for it here to
+	 * handle the oddball case of a non-existent directory.
+	 */
+	if (result_as_string == NULL) {
+		result = default_metadata;
+	} else {
+		if (sscanf (result_as_string, " %d %c", &result, &c) != 1) {
+			result = default_metadata;
+		}
+		g_free (result_as_string);
+	}
+
+	return result;
 }
 
 static gboolean
@@ -3227,12 +3505,9 @@ nautilus_file_set_boolean_metadata (NautilusFile *file,
 	g_return_if_fail (key != NULL);
 	g_return_if_fail (key[0] != '\0');
 
-	nautilus_directory_set_boolean_file_metadata
-		(file->details->directory,
-		 get_metadata_name (file),
-		 key,
-		 default_metadata,
-		 metadata);
+	nautilus_file_set_metadata (file, key,
+				    default_metadata ? "true" : "false",
+				    metadata ? "true" : "false");
 }
 
 void
@@ -3241,16 +3516,18 @@ nautilus_file_set_integer_metadata (NautilusFile *file,
 				    int           default_metadata,
 				    int           metadata)
 {
+	char value_as_string[32];
+	char default_as_string[32];
+
 	g_return_if_fail (NAUTILUS_IS_FILE (file));
 	g_return_if_fail (key != NULL);
 	g_return_if_fail (key[0] != '\0');
 
-	nautilus_directory_set_integer_file_metadata
-		(file->details->directory,
-		 get_metadata_name (file),
-		 key,
-		 default_metadata,
-		 metadata);
+	g_snprintf (value_as_string, sizeof (value_as_string), "%d", metadata);
+	g_snprintf (default_as_string, sizeof (default_as_string), "%d", default_metadata);
+
+	nautilus_file_set_metadata (file, key,
+				    default_as_string, value_as_string);
 }
 
 static const char *
@@ -6027,7 +6304,7 @@ nautilus_file_get_keywords (NautilusFile *file)
 
 	/* Put all the keywords into a list. */
 	keywords = nautilus_file_get_metadata_list
-		(file, "keyword", "name");
+		(file, NAUTILUS_METADATA_KEY_KEYWORD);
 
 	keywords = g_list_concat (keywords, eel_g_str_list_copy (file->details->extension_emblems));
 	keywords = g_list_concat (keywords, eel_g_str_list_copy (file->details->pending_extension_emblems));
@@ -6057,7 +6334,7 @@ nautilus_file_set_keywords (NautilusFile *file, GList *keywords)
 	canonical_keywords = sort_keyword_list_and_remove_duplicates
 		(g_list_copy (keywords));
 	nautilus_file_set_metadata_list
-		(file, "keyword", "name", canonical_keywords);
+		(file, NAUTILUS_METADATA_KEY_KEYWORD, canonical_keywords);
 	g_list_free (canonical_keywords);
 }
 
diff --git a/libnautilus-private/nautilus-file.h b/libnautilus-private/nautilus-file.h
index 0544308..f984017 100644
--- a/libnautilus-private/nautilus-file.h
+++ b/libnautilus-private/nautilus-file.h
@@ -312,15 +312,13 @@ char *                  nautilus_file_get_metadata                      (Nautilu
 									 const char                     *key,
 									 const char                     *default_metadata);
 GList *                 nautilus_file_get_metadata_list                 (NautilusFile                   *file,
-									 const char                     *list_key,
-									 const char                     *list_subkey);
+									 const char                     *key);
 void                    nautilus_file_set_metadata                      (NautilusFile                   *file,
 									 const char                     *key,
 									 const char                     *default_metadata,
 									 const char                     *metadata);
 void                    nautilus_file_set_metadata_list                 (NautilusFile                   *file,
-									 const char                     *list_key,
-									 const char                     *list_subkey,
+									 const char                     *key,
 									 GList                          *list);
 
 /* Covers for common data types. */
diff --git a/libnautilus-private/nautilus-metadata.c b/libnautilus-private/nautilus-metadata.c
new file mode 100644
index 0000000..c569aca
--- /dev/null
+++ b/libnautilus-private/nautilus-metadata.c
@@ -0,0 +1,79 @@
+/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*-*/
+
+/* nautilus-metadata.c - metadata utils
+ *
+ * Copyright (C) 2009 Red Hatl, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#include <config.h>
+#include "nautilus-metadata.h"
+#include <glib.h>
+
+static char *used_metadata_names[] = {
+  NAUTILUS_METADATA_KEY_DEFAULT_COMPONENT,
+  NAUTILUS_METADATA_KEY_LOCATION_BACKGROUND_COLOR,
+  NAUTILUS_METADATA_KEY_LOCATION_BACKGROUND_IMAGE,
+  NAUTILUS_METADATA_KEY_ICON_VIEW_ZOOM_LEVEL,
+  NAUTILUS_METADATA_KEY_ICON_VIEW_AUTO_LAYOUT,
+  NAUTILUS_METADATA_KEY_ICON_VIEW_TIGHTER_LAYOUT,
+  NAUTILUS_METADATA_KEY_ICON_VIEW_SORT_BY,
+  NAUTILUS_METADATA_KEY_ICON_VIEW_SORT_REVERSED,
+  NAUTILUS_METADATA_KEY_ICON_VIEW_KEEP_ALIGNED,
+  NAUTILUS_METADATA_KEY_ICON_VIEW_LAYOUT_TIMESTAMP,
+  NAUTILUS_METADATA_KEY_LIST_VIEW_ZOOM_LEVEL,
+  NAUTILUS_METADATA_KEY_LIST_VIEW_SORT_COLUMN,
+  NAUTILUS_METADATA_KEY_LIST_VIEW_SORT_REVERSED,
+  NAUTILUS_METADATA_KEY_LIST_VIEW_VISIBLE_COLUMNS,
+  NAUTILUS_METADATA_KEY_LIST_VIEW_COLUMN_ORDER,
+  NAUTILUS_METADATA_KEY_COMPACT_VIEW_ZOOM_LEVEL,
+  NAUTILUS_METADATA_KEY_WINDOW_GEOMETRY,
+  NAUTILUS_METADATA_KEY_WINDOW_SCROLL_POSITION,
+  NAUTILUS_METADATA_KEY_WINDOW_SHOW_HIDDEN_FILES,
+  NAUTILUS_METADATA_KEY_WINDOW_MAXIMIZED,
+  NAUTILUS_METADATA_KEY_WINDOW_STICKY,
+  NAUTILUS_METADATA_KEY_WINDOW_KEEP_ABOVE,
+  NAUTILUS_METADATA_KEY_SIDEBAR_BACKGROUND_COLOR,
+  NAUTILUS_METADATA_KEY_SIDEBAR_BACKGROUND_IMAGE,
+  NAUTILUS_METADATA_KEY_SIDEBAR_BUTTONS,
+  NAUTILUS_METADATA_KEY_ANNOTATION,
+  NAUTILUS_METADATA_KEY_ICON_POSITION,
+  NAUTILUS_METADATA_KEY_ICON_POSITION_TIMESTAMP,
+  NAUTILUS_METADATA_KEY_ICON_SCALE,
+  NAUTILUS_METADATA_KEY_CUSTOM_ICON,
+  NAUTILUS_METADATA_KEY_SCREEN,
+  NAUTILUS_METADATA_KEY_KEYWORD,
+  NULL
+};
+
+guint
+nautilus_metadata_get_id (const char *metadata)
+{
+  static GHashTable *hash;
+  int i;
+
+  if (hash == NULL)
+    {
+      hash = g_hash_table_new (g_str_hash, g_str_equal);
+      for (i = 0; used_metadata_names[i] != NULL; i++)
+	g_hash_table_insert (hash,
+			     used_metadata_names[i],
+			     GINT_TO_POINTER (i + 1));
+    }
+
+  return GPOINTER_TO_INT (g_hash_table_lookup (hash, metadata));
+}
diff --git a/libnautilus-private/nautilus-metadata.h b/libnautilus-private/nautilus-metadata.h
index be19f7c..ffebddb 100644
--- a/libnautilus-private/nautilus-metadata.h
+++ b/libnautilus-private/nautilus-metadata.h
@@ -27,11 +27,12 @@
 
 /* Keys for getting/setting Nautilus metadata. All metadata used in Nautilus
  * should define its key here, so we can keep track of the whole set easily.
+ * Any updates here needs to be added in nautilus-metadata.c too.
  */
 
-/* Per-file */
+#include <glib.h>
 
-#define NAUTILUS_METADATA_KEY_CONTENT_VIEWS              	"content_views"
+/* Per-file */
 
 #define NAUTILUS_METADATA_KEY_DEFAULT_COMPONENT		 	"default_component"
 
@@ -51,7 +52,6 @@
 #define NAUTILUS_METADATA_KEY_LIST_VIEW_SORT_REVERSED    	"list_view_sort_reversed"
 #define NAUTILUS_METADATA_KEY_LIST_VIEW_VISIBLE_COLUMNS    	"list_view_visible_columns"
 #define NAUTILUS_METADATA_KEY_LIST_VIEW_COLUMN_ORDER    	"list_view_column_order"
-#define NAUTILUS_METADATA_SUBKEY_COLUMNS                        "columns" 
 
 #define NAUTILUS_METADATA_KEY_COMPACT_VIEW_ZOOM_LEVEL		"compact_view_zoom_level"
 
@@ -65,8 +65,6 @@
 #define NAUTILUS_METADATA_KEY_SIDEBAR_BACKGROUND_COLOR   	"sidebar_background_color"
 #define NAUTILUS_METADATA_KEY_SIDEBAR_BACKGROUND_IMAGE   	"sidebar_background_tile_image"
 #define NAUTILUS_METADATA_KEY_SIDEBAR_BUTTONS			"sidebar_buttons"
-#define NAUTILUS_METADATA_KEY_SIDEBAR_TAB_COLOR		 	"sidebar_tab_color"
-#define NAUTILUS_METADATA_KEY_SIDEBAR_TITLE_TAB_COLOR	 	"sidebar_title_tab_color"
 
 #define NAUTILUS_METADATA_KEY_ANNOTATION                 	"annotation"
 #define NAUTILUS_METADATA_KEY_ICON_POSITION              	"icon_position"
@@ -74,9 +72,9 @@
 #define NAUTILUS_METADATA_KEY_ICON_SCALE                 	"icon_scale"
 #define NAUTILUS_METADATA_KEY_CUSTOM_ICON                	"custom_icon"
 #define NAUTILUS_METADATA_KEY_SCREEN				"screen"
+#define NAUTILUS_METADATA_KEY_KEYWORD				"keyword"
 
-/* per link file */
 
-#define NAUTILUS_METADATA_KEY_EXTRA_TEXT		 	"extra_text"
+guint nautilus_metadata_get_id (const char *metadata);
 
 #endif /* NAUTILUS_METADATA_H */
diff --git a/src/file-manager/fm-list-view.c b/src/file-manager/fm-list-view.c
index 86f6ebd..c82de19 100644
--- a/src/file-manager/fm-list-view.c
+++ b/src/file-manager/fm-list-view.c
@@ -1533,8 +1533,7 @@ get_visible_columns (FMListView *list_view)
 
 	visible_columns = nautilus_file_get_metadata_list 
 		(file,
-		 NAUTILUS_METADATA_KEY_LIST_VIEW_VISIBLE_COLUMNS,
-		 NAUTILUS_METADATA_SUBKEY_COLUMNS);
+		 NAUTILUS_METADATA_KEY_LIST_VIEW_VISIBLE_COLUMNS);
 
 	if (visible_columns) {
 		GPtrArray *res;
@@ -1565,8 +1564,7 @@ get_column_order (FMListView *list_view)
 
 	column_order = nautilus_file_get_metadata_list 
 		(file,
-		 NAUTILUS_METADATA_KEY_LIST_VIEW_COLUMN_ORDER,
-		 NAUTILUS_METADATA_SUBKEY_COLUMNS);
+		 NAUTILUS_METADATA_KEY_LIST_VIEW_COLUMN_ORDER);
 
 	if (column_order) {
 		GPtrArray *res;
@@ -2051,7 +2049,6 @@ column_chooser_changed_callback (NautilusColumnChooser *chooser,
 	list = g_list_reverse (list);
 	nautilus_file_set_metadata_list (file,
 					 NAUTILUS_METADATA_KEY_LIST_VIEW_VISIBLE_COLUMNS,
-					 NAUTILUS_METADATA_SUBKEY_COLUMNS,
 					 list);
 	g_list_free (list);
 
@@ -2062,7 +2059,6 @@ column_chooser_changed_callback (NautilusColumnChooser *chooser,
 	list = g_list_reverse (list);
 	nautilus_file_set_metadata_list (file,
 					 NAUTILUS_METADATA_KEY_LIST_VIEW_COLUMN_ORDER,
-					 NAUTILUS_METADATA_SUBKEY_COLUMNS,
 					 list);
 	g_list_free (list);
 
@@ -2105,8 +2101,8 @@ column_chooser_use_default_callback (NautilusColumnChooser *chooser,
 	file = fm_directory_view_get_directory_as_file 
 		(FM_DIRECTORY_VIEW (view));
 
-	nautilus_file_set_metadata_list (file, NAUTILUS_METADATA_KEY_LIST_VIEW_COLUMN_ORDER, NAUTILUS_METADATA_SUBKEY_COLUMNS, NULL);
-	nautilus_file_set_metadata_list (file, NAUTILUS_METADATA_KEY_LIST_VIEW_VISIBLE_COLUMNS, NAUTILUS_METADATA_SUBKEY_COLUMNS, NULL);
+	nautilus_file_set_metadata_list (file, NAUTILUS_METADATA_KEY_LIST_VIEW_COLUMN_ORDER, NULL);
+	nautilus_file_set_metadata_list (file, NAUTILUS_METADATA_KEY_LIST_VIEW_VISIBLE_COLUMNS, NULL);
 
 	set_columns_settings_from_metadata_and_preferences (FM_LIST_VIEW (view));
 	column_chooser_set_from_settings (chooser, view);
@@ -2279,8 +2275,8 @@ fm_list_view_reset_to_defaults (FMDirectoryView *view)
 	nautilus_file_set_metadata (file, NAUTILUS_METADATA_KEY_LIST_VIEW_SORT_COLUMN, NULL, NULL);
 	nautilus_file_set_metadata (file, NAUTILUS_METADATA_KEY_LIST_VIEW_SORT_REVERSED, NULL, NULL);
 	nautilus_file_set_metadata (file, NAUTILUS_METADATA_KEY_LIST_VIEW_ZOOM_LEVEL, NULL, NULL);
-	nautilus_file_set_metadata_list (file, NAUTILUS_METADATA_KEY_LIST_VIEW_COLUMN_ORDER, NAUTILUS_METADATA_SUBKEY_COLUMNS, NULL);
-	nautilus_file_set_metadata_list (file, NAUTILUS_METADATA_KEY_LIST_VIEW_VISIBLE_COLUMNS, NAUTILUS_METADATA_SUBKEY_COLUMNS, NULL);
+	nautilus_file_set_metadata_list (file, NAUTILUS_METADATA_KEY_LIST_VIEW_COLUMN_ORDER, NULL);
+	nautilus_file_set_metadata_list (file, NAUTILUS_METADATA_KEY_LIST_VIEW_VISIBLE_COLUMNS, NULL);
 
 	gtk_tree_sortable_set_sort_column_id
 		(GTK_TREE_SORTABLE (FM_LIST_VIEW (view)->details->model),



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