summaryrefslogtreecommitdiff
path: root/libnautilus-private
diff options
context:
space:
mode:
authorAlexander Larsson <alexl@redhat.com>2009-06-29 14:37:54 +0200
committerAlexander Larsson <alexl@redhat.com>2009-06-29 14:37:54 +0200
commit02f908f3d864f1f3bf0729158907f312e0306c05 (patch)
tree5a4bd6c33815450b89e52a47c439b1c394d48b03 /libnautilus-private
parent28d5e790dbe7752de156e01610c3e5c354064192 (diff)
downloadnautilus-02f908f3d864f1f3bf0729158907f312e0306c05.tar.gz
Move metadata setting to a NautilusFile vfunc
This allows non-vfs backends to implement metadata
Diffstat (limited to 'libnautilus-private')
-rw-r--r--libnautilus-private/nautilus-file-private.h2
-rw-r--r--libnautilus-private/nautilus-file.c149
-rw-r--r--libnautilus-private/nautilus-file.h7
-rw-r--r--libnautilus-private/nautilus-vfs-file.c119
4 files changed, 162 insertions, 115 deletions
diff --git a/libnautilus-private/nautilus-file-private.h b/libnautilus-private/nautilus-file-private.h
index aa752adb2..00fa2fbc8 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 5c478d0a9..f26381840 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 f3c8e997d..0ee9367b0 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 871457531..c3e9bd3f6 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;