summaryrefslogtreecommitdiff
path: root/daemon
diff options
context:
space:
mode:
authorAlexander Larsson <alexl@redhat.com>2008-02-15 14:29:11 +0000
committerAlexander Larsson <alexl@src.gnome.org>2008-02-15 14:29:11 +0000
commit6317daa2e09d54f98668588e89bf457d98383d57 (patch)
treeef8e2bc0f5d9486823091fcc1e71e310cd07d564 /daemon
parent873f1148616870fc3b7080688e32cd7d0f27a3ee (diff)
downloadgvfs-6317daa2e09d54f98668588e89bf457d98383d57.tar.gz
Pass an optional uri to query_info and enumerate
2008-02-15 Alexander Larsson <alexl@redhat.com> * client/gdaemonfile.c: Pass an optional uri to query_info and enumerate * daemon/gvfsbackend.[ch]: Add automatic info filling, implement thumbnail checking if uri passed in. * daemon/gvfsjobenumerate.[ch]: * daemon/gvfsjobqueryinfo.[ch]: Get optional uri argument. Call automatic backend info filling. svn path=/trunk/; revision=1276
Diffstat (limited to 'daemon')
-rw-r--r--daemon/gvfsbackend.c64
-rw-r--r--daemon/gvfsbackend.h6
-rw-r--r--daemon/gvfsjobenumerate.c47
-rw-r--r--daemon/gvfsjobenumerate.h1
-rw-r--r--daemon/gvfsjobqueryinfo.c55
-rw-r--r--daemon/gvfsjobqueryinfo.h1
6 files changed, 139 insertions, 35 deletions
diff --git a/daemon/gvfsbackend.c b/daemon/gvfsbackend.c
index f1f4459f..1746bd83 100644
--- a/daemon/gvfsbackend.c
+++ b/daemon/gvfsbackend.c
@@ -363,7 +363,71 @@ g_vfs_backend_get_mount_spec (GVfsBackend *backend)
return backend->priv->mount_spec;
}
+static void
+get_thumbnail_attributes (const char *uri,
+ GFileInfo *info)
+{
+ GChecksum *checksum;
+ char *filename;
+ char *basename;
+
+ checksum = g_checksum_new (G_CHECKSUM_MD5);
+ g_checksum_update (checksum, (const guchar *) uri, strlen (uri));
+
+ basename = g_strconcat (g_checksum_get_string (checksum), ".png", NULL);
+ g_checksum_free (checksum);
+
+ filename = g_build_filename (g_get_home_dir (),
+ ".thumbnails", "normal", basename,
+ NULL);
+ if (g_file_test (filename, G_FILE_TEST_IS_REGULAR))
+ g_file_info_set_attribute_byte_string (info, G_FILE_ATTRIBUTE_THUMBNAIL_PATH, filename);
+ else
+ {
+ g_free (filename);
+ filename = g_build_filename (g_get_home_dir (),
+ ".thumbnails", "fail",
+ "gnome-thumbnail-factory",
+ basename,
+ NULL);
+
+ if (g_file_test (filename, G_FILE_TEST_IS_REGULAR))
+ g_file_info_set_attribute_boolean (info, G_FILE_ATTRIBUTE_THUMBNAILING_FAILED, TRUE);
+ }
+ g_free (basename);
+ g_free (filename);
+}
+
+void
+g_vfs_backend_add_auto_info (GVfsBackend *backend,
+ GFileAttributeMatcher *matcher,
+ GFileInfo *info,
+ const char *uri)
+{
+ GMountSpec *spec;
+ char *id;
+
+ if (g_file_attribute_matcher_matches (matcher,
+ G_FILE_ATTRIBUTE_ID_FILESYSTEM))
+ {
+ spec = g_vfs_backend_get_mount_spec (backend);
+ if (spec)
+ {
+ id = g_mount_spec_to_string (spec);
+ g_file_info_set_attribute_string (info,
+ G_FILE_ATTRIBUTE_ID_FILESYSTEM,
+ id);
+ g_free (id);
+ }
+ }
+
+ if (uri != NULL &&
+ g_file_attribute_matcher_matches (matcher,
+ G_FILE_ATTRIBUTE_THUMBNAIL_PATH))
+ get_thumbnail_attributes (uri, info);
+
+}
static DBusHandlerResult
backend_dbus_handler (DBusConnection *connection,
diff --git a/daemon/gvfsbackend.h b/daemon/gvfsbackend.h
index 203be153..c99d18bf 100644
--- a/daemon/gvfsbackend.h
+++ b/daemon/gvfsbackend.h
@@ -399,6 +399,12 @@ const char *g_vfs_backend_get_stable_name (GVfsBackend *ba
const char *g_vfs_backend_get_icon_name (GVfsBackend *backend);
GMountSpec *g_vfs_backend_get_mount_spec (GVfsBackend *backend);
GVfsDaemon *g_vfs_backend_get_daemon (GVfsBackend *backend);
+
+void g_vfs_backend_add_auto_info (GVfsBackend *backend,
+ GFileAttributeMatcher *matcher,
+ GFileInfo *info,
+ const char *uri);
+
G_END_DECLS
#endif /* __G_VFS_BACKEND_H__ */
diff --git a/daemon/gvfsjobenumerate.c b/daemon/gvfsjobenumerate.c
index 7109c0b8..edec81c8 100644
--- a/daemon/gvfsjobenumerate.c
+++ b/daemon/gvfsjobenumerate.c
@@ -54,6 +54,7 @@ g_vfs_job_enumerate_finalize (GObject *object)
g_free (job->attributes);
g_file_attribute_matcher_unref (job->attribute_matcher);
g_free (job->object_path);
+ g_free (job->uri);
if (G_OBJECT_CLASS (g_vfs_job_enumerate_parent_class)->finalize)
(*G_OBJECT_CLASS (g_vfs_job_enumerate_parent_class)->finalize) (object);
@@ -89,17 +90,19 @@ g_vfs_job_enumerate_new (DBusConnection *connection,
int path_len;
const char *obj_path;
const char *path_data;
- char *attributes;
+ char *attributes, *uri;
dbus_uint32_t flags;
+ DBusMessageIter iter;
+ dbus_message_iter_init (message, &iter);
dbus_error_init (&derror);
- if (!dbus_message_get_args (message, &derror,
- DBUS_TYPE_ARRAY, DBUS_TYPE_BYTE,
- &path_data, &path_len,
- DBUS_TYPE_STRING, &obj_path,
- DBUS_TYPE_STRING, &attributes,
- DBUS_TYPE_UINT32, &flags,
- 0))
+ if (!_g_dbus_message_iter_get_args (&iter, &derror,
+ DBUS_TYPE_ARRAY, DBUS_TYPE_BYTE,
+ &path_data, &path_len,
+ DBUS_TYPE_STRING, &obj_path,
+ DBUS_TYPE_STRING, &attributes,
+ DBUS_TYPE_UINT32, &flags,
+ 0))
{
reply = dbus_message_new_error (message,
derror.name,
@@ -110,6 +113,12 @@ g_vfs_job_enumerate_new (DBusConnection *connection,
return NULL;
}
+ /* Optional uri arg for thumbnail info */
+ if (!_g_dbus_message_iter_get_args (&iter, NULL,
+ DBUS_TYPE_STRING, &uri,
+ 0))
+ uri = NULL;
+
job = g_object_new (G_VFS_TYPE_JOB_ENUMERATE,
"message", message,
"connection", connection,
@@ -121,6 +130,7 @@ g_vfs_job_enumerate_new (DBusConnection *connection,
job->attributes = g_strdup (attributes);
job->attribute_matcher = g_file_attribute_matcher_new (attributes);
job->flags = flags;
+ job->uri = g_strdup (uri);
return G_VFS_JOB (job);
}
@@ -143,6 +153,7 @@ g_vfs_job_enumerate_add_info (GVfsJobEnumerate *job,
GFileInfo *info)
{
DBusMessage *message, *orig_message;
+ char *uri, *escaped_name;
if (job->building_infos == NULL)
{
@@ -166,7 +177,27 @@ g_vfs_job_enumerate_add_info (GVfsJobEnumerate *job,
job->n_building_infos = 0;
}
+
+
+ uri = NULL;
+ if (job->uri != NULL &&
+ g_file_info_get_name (info) != NULL)
+ {
+ escaped_name = g_uri_escape_string (g_file_info_get_name (info),
+ G_URI_RESERVED_CHARS_ALLOWED_IN_PATH,
+ FALSE);
+ uri = g_build_filename (job->uri, escaped_name);
+ g_free (escaped_name);
+ }
+
+ g_vfs_backend_add_auto_info (job->backend,
+ job->attribute_matcher,
+ info,
+ uri);
+ g_free (uri);
+
g_file_info_set_attribute_mask (info, job->attribute_matcher);
+
_g_dbus_append_file_info (&job->building_array_iter, info);
job->n_building_infos++;
diff --git a/daemon/gvfsjobenumerate.h b/daemon/gvfsjobenumerate.h
index b8936f5b..5e8a3ece 100644
--- a/daemon/gvfsjobenumerate.h
+++ b/daemon/gvfsjobenumerate.h
@@ -49,6 +49,7 @@ struct _GVfsJobEnumerate
char *attributes;
GFileAttributeMatcher *attribute_matcher;
GFileQueryInfoFlags flags;
+ char *uri;
DBusMessage *building_infos;
DBusMessageIter building_iter;
diff --git a/daemon/gvfsjobqueryinfo.c b/daemon/gvfsjobqueryinfo.c
index 40539b9a..42b0c07c 100644
--- a/daemon/gvfsjobqueryinfo.c
+++ b/daemon/gvfsjobqueryinfo.c
@@ -55,6 +55,7 @@ g_vfs_job_query_info_finalize (GObject *object)
g_free (job->filename);
g_free (job->attributes);
g_file_attribute_matcher_unref (job->attribute_matcher);
+ g_free (job->uri);
if (G_OBJECT_CLASS (g_vfs_job_query_info_parent_class)->finalize)
(*G_OBJECT_CLASS (g_vfs_job_query_info_parent_class)->finalize) (object);
@@ -89,15 +90,19 @@ g_vfs_job_query_info_new (DBusConnection *connection,
int path_len;
const char *path_data;
char *attributes;
+ char *uri;
dbus_uint32_t flags;
+ DBusMessageIter iter;
+
+ dbus_message_iter_init (message, &iter);
dbus_error_init (&derror);
- if (!dbus_message_get_args (message, &derror,
- DBUS_TYPE_ARRAY, DBUS_TYPE_BYTE,
- &path_data, &path_len,
- DBUS_TYPE_STRING, &attributes,
- DBUS_TYPE_UINT32, &flags,
- 0))
+ if (!_g_dbus_message_iter_get_args (&iter, &derror,
+ DBUS_TYPE_ARRAY, DBUS_TYPE_BYTE,
+ &path_data, &path_len,
+ DBUS_TYPE_STRING, &attributes,
+ DBUS_TYPE_UINT32, &flags,
+ 0))
{
reply = dbus_message_new_error (message,
derror.name,
@@ -108,6 +113,12 @@ g_vfs_job_query_info_new (DBusConnection *connection,
return NULL;
}
+ /* Optional uri arg for thumbnail info */
+ if (!_g_dbus_message_iter_get_args (&iter, NULL,
+ DBUS_TYPE_STRING, &uri,
+ 0))
+ uri = NULL;
+
job = g_object_new (G_VFS_TYPE_JOB_QUERY_INFO,
"message", message,
"connection", connection,
@@ -118,6 +129,7 @@ g_vfs_job_query_info_new (DBusConnection *connection,
job->attributes = g_strdup (attributes);
job->attribute_matcher = g_file_attribute_matcher_new (attributes);
job->flags = flags;
+ job->uri = g_strdup (uri);
job->file_info = g_file_info_new ();
g_file_info_set_attribute_mask (job->file_info, job->attribute_matcher);
@@ -139,11 +151,11 @@ run (GVfsJob *job)
}
class->query_info (op_job->backend,
- op_job,
- op_job->filename,
- op_job->flags,
- op_job->file_info,
- op_job->attribute_matcher);
+ op_job,
+ op_job->filename,
+ op_job->flags,
+ op_job->file_info,
+ op_job->attribute_matcher);
}
static gboolean
@@ -172,29 +184,18 @@ create_reply (GVfsJob *job,
GVfsJobQueryInfo *op_job = G_VFS_JOB_QUERY_INFO (job);
DBusMessage *reply;
DBusMessageIter iter;
- GMountSpec *spec;
- char *id;
reply = dbus_message_new_method_return (message);
dbus_message_iter_init_append (reply, &iter);
- if (g_file_attribute_matcher_matches (op_job->attribute_matcher,
- G_FILE_ATTRIBUTE_ID_FILESYSTEM))
- {
- spec = g_vfs_backend_get_mount_spec (op_job->backend);
- if (spec)
- {
- id = g_mount_spec_to_string (spec);
- g_file_info_set_attribute_string (op_job->file_info,
- G_FILE_ATTRIBUTE_ID_FILESYSTEM,
- id);
- g_free (id);
- }
- }
+ g_vfs_backend_add_auto_info (op_job->backend,
+ op_job->attribute_matcher,
+ op_job->file_info,
+ op_job->uri);
_g_dbus_append_file_info (&iter,
- op_job->file_info);
+ op_job->file_info);
return reply;
}
diff --git a/daemon/gvfsjobqueryinfo.h b/daemon/gvfsjobqueryinfo.h
index 8f15d246..4a6b5d88 100644
--- a/daemon/gvfsjobqueryinfo.h
+++ b/daemon/gvfsjobqueryinfo.h
@@ -48,6 +48,7 @@ struct _GVfsJobQueryInfo
char *attributes;
GFileAttributeMatcher *attribute_matcher;
GFileQueryInfoFlags flags;
+ char *uri;
GFileInfo *file_info;
};