diff options
Diffstat (limited to 'daemon/gvfsbackend.c')
-rw-r--r-- | daemon/gvfsbackend.c | 654 |
1 files changed, 0 insertions, 654 deletions
diff --git a/daemon/gvfsbackend.c b/daemon/gvfsbackend.c deleted file mode 100644 index 4e6e9a53..00000000 --- a/daemon/gvfsbackend.c +++ /dev/null @@ -1,654 +0,0 @@ -/* GIO - GLib Input, Output and Streaming Library - * - * Copyright (C) 2006-2007 Red Hat, Inc. - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser 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 - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser 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. - * - * Author: Alexander Larsson <alexl@redhat.com> - */ - -#include <config.h> - -#include <stdlib.h> -#include <unistd.h> -#include <sys/types.h> -#include <sys/socket.h> -#include <sys/un.h> - -#include <glib.h> -#include <dbus/dbus.h> -#include <glib/gi18n.h> -#include "gvfsbackend.h" -#include "gvfsjobsource.h" -#include "gvfsdaemonprotocol.h" -#include <gvfsjobopenforread.h> -#include <gvfsjobopenforwrite.h> -#include <gvfsjobqueryinfo.h> -#include <gvfsjobqueryfsinfo.h> -#include <gvfsjobsetdisplayname.h> -#include <gvfsjobenumerate.h> -#include <gvfsjobdelete.h> -#include <gvfsjobtrash.h> -#include <gvfsjobunmount.h> -#include <gvfsjobmountmountable.h> -#include <gvfsjobunmountmountable.h> -#include <gvfsjobmakedirectory.h> -#include <gvfsjobmakesymlink.h> -#include <gvfsjobcreatemonitor.h> -#include <gvfsjobcopy.h> -#include <gvfsjobmove.h> -#include <gvfsjobpush.h> -#include <gvfsjobpull.h> -#include <gvfsjobsetattribute.h> -#include <gvfsjobqueryattributes.h> -#include <gdbusutils.h> - -enum { - PROP_0, - PROP_OBJECT_PATH, - PROP_DAEMON -}; - -struct _GVfsBackendPrivate -{ - GVfsDaemon *daemon; - char *object_path; - - char *display_name; - char *stable_name; - char **x_content_types; - char *icon; - char *prefered_filename_encoding; - gboolean user_visible; - GMountSpec *mount_spec; -}; - - -/* TODO: Real P_() */ -#define P_(_x) (_x) - -static void g_vfs_backend_job_source_iface_init (GVfsJobSourceIface *iface); -static void g_vfs_backend_get_property (GObject *object, - guint prop_id, - GValue *value, - GParamSpec *pspec); -static void g_vfs_backend_set_property (GObject *object, - guint prop_id, - const GValue *value, - GParamSpec *pspec); -static GObject* g_vfs_backend_constructor (GType type, - guint n_construct_properties, - GObjectConstructParam *construct_params); -static DBusHandlerResult backend_dbus_handler (DBusConnection *connection, - DBusMessage *message, - void *user_data); - - -G_DEFINE_TYPE_WITH_CODE (GVfsBackend, g_vfs_backend, G_TYPE_OBJECT, - G_IMPLEMENT_INTERFACE (G_VFS_TYPE_JOB_SOURCE, - g_vfs_backend_job_source_iface_init)) - - -static GHashTable *registered_backends = NULL; - -void -g_vfs_register_backend (GType backend_type, - const char *type) -{ - if (registered_backends == NULL) - registered_backends = g_hash_table_new_full (g_str_hash, g_str_equal, - g_free, NULL); - - g_hash_table_insert (registered_backends, - g_strdup (type), (void *)backend_type); -} - -GType -g_vfs_lookup_backend (const char *type) -{ - gpointer res; - - if (registered_backends != NULL) - { - res = g_hash_table_lookup (registered_backends, type); - if (res != NULL) - return (GType)res; - } - - return G_TYPE_INVALID; -} - -static void -g_vfs_backend_finalize (GObject *object) -{ - GVfsBackend *backend; - - backend = G_VFS_BACKEND (object); - - g_vfs_daemon_unregister_path (backend->priv->daemon, backend->priv->object_path); - g_object_unref (backend->priv->daemon); - g_free (backend->priv->object_path); - - g_free (backend->priv->display_name); - g_free (backend->priv->stable_name); - g_strfreev (backend->priv->x_content_types); - g_free (backend->priv->icon); - g_free (backend->priv->prefered_filename_encoding); - if (backend->priv->mount_spec) - g_mount_spec_unref (backend->priv->mount_spec); - - if (G_OBJECT_CLASS (g_vfs_backend_parent_class)->finalize) - (*G_OBJECT_CLASS (g_vfs_backend_parent_class)->finalize) (object); -} - -static void -g_vfs_backend_job_source_iface_init (GVfsJobSourceIface *iface) -{ -} - -static void -g_vfs_backend_class_init (GVfsBackendClass *klass) -{ - GObjectClass *gobject_class = G_OBJECT_CLASS (klass); - - g_type_class_add_private (klass, sizeof (GVfsBackendPrivate)); - - gobject_class->constructor = g_vfs_backend_constructor; - gobject_class->finalize = g_vfs_backend_finalize; - gobject_class->set_property = g_vfs_backend_set_property; - gobject_class->get_property = g_vfs_backend_get_property; - - g_object_class_install_property (gobject_class, - PROP_OBJECT_PATH, - g_param_spec_string ("object-path", - P_("Backend object path"), - P_("The dbus object path for the backend object."), - "", - G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | - G_PARAM_STATIC_NAME|G_PARAM_STATIC_NICK|G_PARAM_STATIC_BLURB)); - g_object_class_install_property (gobject_class, - PROP_DAEMON, - g_param_spec_object ("daemon", - P_("Daemon"), - P_("The daemon this backend is handled by."), - G_VFS_TYPE_DAEMON, - G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | - G_PARAM_STATIC_NAME|G_PARAM_STATIC_NICK|G_PARAM_STATIC_BLURB)); -} - -static void -g_vfs_backend_init (GVfsBackend *backend) -{ - backend->priv = G_TYPE_INSTANCE_GET_PRIVATE (backend, G_VFS_TYPE_BACKEND, GVfsBackendPrivate); - backend->priv->icon = g_strdup (""); - backend->priv->prefered_filename_encoding = g_strdup (""); - backend->priv->display_name = g_strdup (""); - backend->priv->stable_name = g_strdup (""); - backend->priv->user_visible = TRUE; -} - -static void -g_vfs_backend_set_property (GObject *object, - guint prop_id, - const GValue *value, - GParamSpec *pspec) -{ - GVfsBackend *backend = G_VFS_BACKEND (object); - - switch (prop_id) - { - case PROP_OBJECT_PATH: - backend->priv->object_path = g_value_dup_string (value); - break; - case PROP_DAEMON: - backend->priv->daemon = G_VFS_DAEMON (g_value_dup_object (value)); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); - break; - } -} - -static void -g_vfs_backend_get_property (GObject *object, - guint prop_id, - GValue *value, - GParamSpec *pspec) -{ - GVfsBackend *backend = G_VFS_BACKEND (object); - - switch (prop_id) - { - case PROP_OBJECT_PATH: - g_value_set_string (value, backend->priv->object_path); - break; - case PROP_DAEMON: - g_value_set_object (value, backend->priv->daemon); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); - break; - } -} - -static GObject* -g_vfs_backend_constructor (GType type, - guint n_construct_properties, - GObjectConstructParam *construct_params) -{ - GObject *object; - GVfsBackend *backend; - - object = (* G_OBJECT_CLASS (g_vfs_backend_parent_class)->constructor) (type, - n_construct_properties, - construct_params); - backend = G_VFS_BACKEND (object); - - g_vfs_daemon_register_path (backend->priv->daemon, - backend->priv->object_path, - backend_dbus_handler, - backend); - - return object; -} - -GVfsDaemon * -g_vfs_backend_get_daemon (GVfsBackend *backend) -{ - return backend->priv->daemon; -} - - -void -g_vfs_backend_set_display_name (GVfsBackend *backend, - const char *display_name) -{ - g_free (backend->priv->display_name); - backend->priv->display_name = g_strdup (display_name); -} - -/** - * g_vfs_backend_set_stable_name: - * @backend: backend - * @stable_name: the stable name - * - * For filesystems that can change the name during the lifetime - * of the filesystem this can be uses to set a separate stable - * name. This is used for instance as the directory representing - * the mounted file system in the standard UNIX file system - * namespace. - * - * If this function isn't called, the value passed to - * g_vfs_backend_set_display_name() will be used instead. - **/ -void -g_vfs_backend_set_stable_name (GVfsBackend *backend, - const char *stable_name) -{ - g_free (backend->priv->stable_name); - backend->priv->stable_name = g_strdup (stable_name); -} - -/** - * g_vfs_backend_set_x_content_types: - * @backend: backend - * @x_content_types: the x-content types - * - * For backends where the x-content type is known ahead of time and - * won't change (such as a CDDA audio disc backend), this function - * should be called when the backend is constructed with the given - * types. - * - * See the <ulink url="http://www.freedesktop.org/wiki/Specifications/shared-mime-info-spec">shared-mime-info</ulink> - * specification for more on x-content types. - **/ -void -g_vfs_backend_set_x_content_types (GVfsBackend *backend, - char **x_content_types) -{ - g_strfreev (backend->priv->x_content_types); - backend->priv->x_content_types = g_strdupv (x_content_types); -} - -void -g_vfs_backend_set_icon_name (GVfsBackend *backend, - const char *icon) -{ - g_free (backend->priv->icon); - backend->priv->icon = g_strdup (icon); -} - -void -g_vfs_backend_set_prefered_filename_encoding (GVfsBackend *backend, - const char *prefered_filename_encoding) -{ - g_free (backend->priv->prefered_filename_encoding); - backend->priv->prefered_filename_encoding = g_strdup (prefered_filename_encoding); -} - -void -g_vfs_backend_set_user_visible (GVfsBackend *backend, - gboolean user_visible) -{ - backend->priv->user_visible = user_visible; -} - -void -g_vfs_backend_set_mount_spec (GVfsBackend *backend, - GMountSpec *mount_spec) -{ - if (backend->priv->mount_spec) - g_mount_spec_unref (backend->priv->mount_spec); - backend->priv->mount_spec = g_mount_spec_ref (mount_spec); -} - -const char * -g_vfs_backend_get_backend_type (GVfsBackend *backend) -{ - if (backend->priv->mount_spec) - return g_mount_spec_get_type (backend->priv->mount_spec); - return NULL; -} - -const char * -g_vfs_backend_get_display_name (GVfsBackend *backend) -{ - return backend->priv->display_name; -} - -const char * -g_vfs_backend_get_stable_name (GVfsBackend *backend) -{ - return backend->priv->stable_name; -} - -char ** -g_vfs_backend_get_x_content_types (GVfsBackend *backend) -{ - return backend->priv->x_content_types; -} - -const char * -g_vfs_backend_get_icon_name (GVfsBackend *backend) -{ - return backend->priv->icon; -} - -GMountSpec * -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, - DBusMessage *message, - void *user_data) -{ - GVfsBackend *backend = user_data; - GVfsJob *job; - - job = NULL; - - g_print ("backend_dbus_handler %s:%s\n", - dbus_message_get_interface (message), - dbus_message_get_member (message)); - - if (dbus_message_is_method_call (message, - G_VFS_DBUS_MOUNT_INTERFACE, - G_VFS_DBUS_MOUNT_OP_UNMOUNT)) - job = g_vfs_job_unmount_new (connection, message, backend); - else if (dbus_message_is_method_call (message, - G_VFS_DBUS_MOUNT_INTERFACE, - G_VFS_DBUS_MOUNT_OP_OPEN_FOR_READ)) - job = g_vfs_job_open_for_read_new (connection, message, backend); - else if (dbus_message_is_method_call (message, - G_VFS_DBUS_MOUNT_INTERFACE, - G_VFS_DBUS_MOUNT_OP_QUERY_INFO)) - job = g_vfs_job_query_info_new (connection, message, backend); - else if (dbus_message_is_method_call (message, - G_VFS_DBUS_MOUNT_INTERFACE, - G_VFS_DBUS_MOUNT_OP_QUERY_FILESYSTEM_INFO)) - job = g_vfs_job_query_fs_info_new (connection, message, backend); - else if (dbus_message_is_method_call (message, - G_VFS_DBUS_MOUNT_INTERFACE, - G_VFS_DBUS_MOUNT_OP_ENUMERATE)) - job = g_vfs_job_enumerate_new (connection, message, backend); - else if (dbus_message_is_method_call (message, - G_VFS_DBUS_MOUNT_INTERFACE, - G_VFS_DBUS_MOUNT_OP_OPEN_FOR_WRITE)) - job = g_vfs_job_open_for_write_new (connection, message, backend); - else if (dbus_message_is_method_call (message, - G_VFS_DBUS_MOUNT_INTERFACE, - G_VFS_DBUS_MOUNT_OP_MOUNT_MOUNTABLE)) - job = g_vfs_job_mount_mountable_new (connection, message, backend); - else if (dbus_message_is_method_call (message, - G_VFS_DBUS_MOUNT_INTERFACE, - G_VFS_DBUS_MOUNT_OP_UNMOUNT_MOUNTABLE)) - job = g_vfs_job_unmount_mountable_new (connection, message, backend, FALSE); - else if (dbus_message_is_method_call (message, - G_VFS_DBUS_MOUNT_INTERFACE, - G_VFS_DBUS_MOUNT_OP_EJECT_MOUNTABLE)) - job = g_vfs_job_unmount_mountable_new (connection, message, backend, TRUE); - else if (dbus_message_is_method_call (message, - G_VFS_DBUS_MOUNT_INTERFACE, - G_VFS_DBUS_MOUNT_OP_SET_DISPLAY_NAME)) - job = g_vfs_job_set_display_name_new (connection, message, backend); - else if (dbus_message_is_method_call (message, - G_VFS_DBUS_MOUNT_INTERFACE, - G_VFS_DBUS_MOUNT_OP_DELETE)) - job = g_vfs_job_delete_new (connection, message, backend); - else if (dbus_message_is_method_call (message, - G_VFS_DBUS_MOUNT_INTERFACE, - G_VFS_DBUS_MOUNT_OP_TRASH)) - job = g_vfs_job_trash_new (connection, message, backend); - else if (dbus_message_is_method_call (message, - G_VFS_DBUS_MOUNT_INTERFACE, - G_VFS_DBUS_MOUNT_OP_MAKE_DIRECTORY)) - job = g_vfs_job_make_directory_new (connection, message, backend); - else if (dbus_message_is_method_call (message, - G_VFS_DBUS_MOUNT_INTERFACE, - G_VFS_DBUS_MOUNT_OP_MAKE_SYMBOLIC_LINK)) - job = g_vfs_job_make_symlink_new (connection, message, backend); - else if (dbus_message_is_method_call (message, - G_VFS_DBUS_MOUNT_INTERFACE, - G_VFS_DBUS_MOUNT_OP_COPY)) - job = g_vfs_job_copy_new (connection, message, backend); - else if (dbus_message_is_method_call (message, - G_VFS_DBUS_MOUNT_INTERFACE, - G_VFS_DBUS_MOUNT_OP_PUSH)) - job = g_vfs_job_push_new (connection, message, backend); - else if (dbus_message_is_method_call (message, - G_VFS_DBUS_MOUNT_INTERFACE, - G_VFS_DBUS_MOUNT_OP_PULL)) - job = g_vfs_job_pull_new (connection, message, backend); - else if (dbus_message_is_method_call (message, - G_VFS_DBUS_MOUNT_INTERFACE, - G_VFS_DBUS_MOUNT_OP_MOVE)) - job = g_vfs_job_move_new (connection, message, backend); - else if (dbus_message_is_method_call (message, - G_VFS_DBUS_MOUNT_INTERFACE, - G_VFS_DBUS_MOUNT_OP_SET_ATTRIBUTE)) - job = g_vfs_job_set_attribute_new (connection, message, backend); - else if (dbus_message_is_method_call (message, - G_VFS_DBUS_MOUNT_INTERFACE, - G_VFS_DBUS_MOUNT_OP_QUERY_SETTABLE_ATTRIBUTES)) - job = g_vfs_job_query_attributes_new (connection, message, backend, FALSE); - else if (dbus_message_is_method_call (message, - G_VFS_DBUS_MOUNT_INTERFACE, - G_VFS_DBUS_MOUNT_OP_QUERY_WRITABLE_NAMESPACES)) - job = g_vfs_job_query_attributes_new (connection, message, backend, TRUE); - else if (dbus_message_is_method_call (message, - G_VFS_DBUS_MOUNT_INTERFACE, - G_VFS_DBUS_MOUNT_OP_CREATE_DIR_MONITOR)) - job = g_vfs_job_create_monitor_new (connection, message, backend, TRUE); - else if (dbus_message_is_method_call (message, - G_VFS_DBUS_MOUNT_INTERFACE, - G_VFS_DBUS_MOUNT_OP_CREATE_FILE_MONITOR)) - job = g_vfs_job_create_monitor_new (connection, message, backend, FALSE); - - if (job) - { - g_vfs_job_source_new_job (G_VFS_JOB_SOURCE (backend), job); - g_object_unref (job); - return DBUS_HANDLER_RESULT_HANDLED; - } - - return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; -} - -void -g_vfs_backend_register_mount (GVfsBackend *backend, - GAsyncDBusCallback callback, - gpointer user_data) -{ - const char *stable_name; - DBusMessage *message; - DBusMessageIter iter; - dbus_bool_t user_visible; - char *x_content_types_string; - - if (backend->priv->x_content_types != NULL && g_strv_length (backend->priv->x_content_types) > 0) - x_content_types_string = g_strjoinv (" ", backend->priv->x_content_types); - else - x_content_types_string = g_strdup (""); - - message = dbus_message_new_method_call (G_VFS_DBUS_DAEMON_NAME, - G_VFS_DBUS_MOUNTTRACKER_PATH, - G_VFS_DBUS_MOUNTTRACKER_INTERFACE, - G_VFS_DBUS_MOUNTTRACKER_OP_REGISTER_MOUNT); - if (message == NULL) - _g_dbus_oom (); - - if (backend->priv->stable_name != NULL && - *backend->priv->stable_name != 0) - stable_name = backend->priv->stable_name; - else - stable_name = backend->priv->display_name; - - user_visible = backend->priv->user_visible; - if (!dbus_message_append_args (message, - DBUS_TYPE_OBJECT_PATH, &backend->priv->object_path, - DBUS_TYPE_STRING, &backend->priv->display_name, - DBUS_TYPE_STRING, &stable_name, - DBUS_TYPE_STRING, &x_content_types_string, - DBUS_TYPE_STRING, &backend->priv->icon, - DBUS_TYPE_STRING, &backend->priv->prefered_filename_encoding, - DBUS_TYPE_BOOLEAN, &user_visible, - 0)) - _g_dbus_oom (); - - dbus_message_iter_init_append (message, &iter); - g_mount_spec_to_dbus (&iter, backend->priv->mount_spec); - - dbus_message_set_auto_start (message, TRUE); - - _g_dbus_connection_call_async (NULL, message, -1, - callback, user_data); - dbus_message_unref (message); - - g_free (x_content_types_string); -} - -void -g_vfs_backend_unregister_mount (GVfsBackend *backend, - GAsyncDBusCallback callback, - gpointer user_data) -{ - DBusMessage *message; - - message = dbus_message_new_method_call (G_VFS_DBUS_DAEMON_NAME, - G_VFS_DBUS_MOUNTTRACKER_PATH, - G_VFS_DBUS_MOUNTTRACKER_INTERFACE, - G_VFS_DBUS_MOUNTTRACKER_OP_UNREGISTER_MOUNT); - if (message == NULL) - _g_dbus_oom (); - - if (!dbus_message_append_args (message, - DBUS_TYPE_OBJECT_PATH, &backend->priv->object_path, - 0)) - _g_dbus_oom (); - - _g_dbus_connection_call_async (NULL, message, -1, - callback, user_data); - dbus_message_unref (message); -} |