From 3eb2c102c1d95a7cd205267754a38799792a66c2 Mon Sep 17 00:00:00 2001 From: Alexander Larsson Date: Thu, 13 Sep 2007 10:37:59 +0000 Subject: New model to handle uris. All uri -> dbus mapping is done client side. The mappings will be specified in a config file the client reads Original git commit by Alexander Larsson at 1165844556 +0100 svn path=/trunk/; revision=222 --- daemon/gvfsbackend.c | 150 +++++++++++++++++++++++++++++---------------------- 1 file changed, 87 insertions(+), 63 deletions(-) (limited to 'daemon/gvfsbackend.c') diff --git a/daemon/gvfsbackend.c b/daemon/gvfsbackend.c index 2ebe463e..af3c19dc 100644 --- a/daemon/gvfsbackend.c +++ b/daemon/gvfsbackend.c @@ -15,29 +15,30 @@ enum { PROP_0, - PROP_MOUNTPOINT + PROP_OBJECT_PATH, + PROP_BUS_NAME, }; /* 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 void g_vfs_backend_reset (GVfsJobSource *job_source); +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); G_DEFINE_TYPE_WITH_CODE (GVfsBackend, g_vfs_backend, G_TYPE_OBJECT, G_IMPLEMENT_INTERFACE (G_TYPE_VFS_JOB_SOURCE, g_vfs_backend_job_source_iface_init)) -volatile gint mountpoint_counter = 0; - static void g_vfs_backend_finalize (GObject *object) { @@ -45,10 +46,8 @@ g_vfs_backend_finalize (GObject *object) backend = G_VFS_BACKEND (object); - if (backend->mountpoint) - g_vfs_mountpoint_free (backend->mountpoint); - - g_free (backend->mountpoint_path); + g_free (backend->object_path); + g_free (backend->bus_name); if (G_OBJECT_CLASS (g_vfs_backend_parent_class)->finalize) (*G_OBJECT_CLASS (g_vfs_backend_parent_class)->finalize) (object); @@ -57,7 +56,6 @@ g_vfs_backend_finalize (GObject *object) static void g_vfs_backend_job_source_iface_init (GVfsJobSourceIface *iface) { - iface->reset = g_vfs_backend_reset; } static void @@ -65,28 +63,33 @@ g_vfs_backend_class_init (GVfsBackendClass *klass) { GObjectClass *gobject_class = G_OBJECT_CLASS (klass); + 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_MOUNTPOINT, - g_param_spec_pointer ("mountpoint", - P_("Mountpoint"), - P_("The mountpoint this backend handles."), + PROP_OBJECT_PATH, + g_param_spec_string ("object-path", + P_("Object path"), + P_("dbus object path for the mountpoint"), + "", 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_BUS_NAME, + g_param_spec_string ("bus-name", + P_("Bus name"), + P_("dbus bus name for the mountpoint"), + "", + 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) { - int id; - - id = g_atomic_int_exchange_and_add (&mountpoint_counter, 1); - backend->mountpoint_path = g_strdup_printf ("/org/gtk/vfs/mountpoint/%d", id); } static void @@ -99,8 +102,13 @@ g_vfs_backend_set_property (GObject *object, switch (prop_id) { - case PROP_MOUNTPOINT: - backend->mountpoint = g_vfs_mountpoint_copy (g_value_get_pointer (value)); + case PROP_OBJECT_PATH: + g_free (backend->object_path); + backend->object_path = g_value_dup_string (value); + break; + case PROP_BUS_NAME: + g_free (backend->bus_name); + backend->bus_name = g_value_dup_string (value); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); @@ -118,8 +126,11 @@ g_vfs_backend_get_property (GObject *object, switch (prop_id) { - case PROP_MOUNTPOINT: - g_value_set_pointer (value, backend->mountpoint); + case PROP_OBJECT_PATH: + g_value_set_string (value, backend->object_path); + break; + case PROP_BUS_NAME: + g_value_set_string (value, backend->bus_name); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); @@ -127,6 +138,49 @@ g_vfs_backend_get_property (GObject *object, } } +static GObject* +g_vfs_backend_constructor (GType type, + guint n_construct_properties, + GObjectConstructParam *construct_params) +{ + GObject *object; + GVfsBackend *backend; + unsigned int flags; + DBusError error; + DBusConnection *conn; + int ret; + + object = (* G_OBJECT_CLASS (g_vfs_backend_parent_class)->constructor) (type, + n_construct_properties, + construct_params); + + backend = G_VFS_BACKEND (object); + + if (backend->bus_name) + { + conn = dbus_bus_get (DBUS_BUS_SESSION, NULL); + if (conn) + { + flags = DBUS_NAME_FLAG_ALLOW_REPLACEMENT | DBUS_NAME_FLAG_DO_NOT_QUEUE; + + dbus_error_init (&error); + ret = dbus_bus_request_name (conn, backend->bus_name, flags, &error); + if (ret == -1) + { + g_printerr ("Failed to acquire bus name '%s': %s", + backend->bus_name, error.message); + dbus_error_free (&error); + } + else if (ret != DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER) + g_printerr ("Unable to acquire bus name '%s'\n", backend->bus_name); + + dbus_connection_unref (conn); + } + } + + return object; +} + gboolean g_vfs_backend_open_for_read (GVfsBackend *backend, GVfsJobOpenForRead *job, @@ -206,43 +260,13 @@ backend_dbus_handler (DBusConnection *connection, return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; } -static void -signal_mountpoint (GVfsBackend *backend) -{ - DBusMessage *signal; - DBusMessageIter iter; - DBusConnection *bus; - - signal = dbus_message_new_signal (backend->mountpoint_path, - G_VFS_DBUS_MOUNTPOINT_INTERFACE, - G_VFS_DBUS_ANNOUNCE_MOUNTPOINT); - - dbus_message_iter_init_append (signal, &iter); - - g_vfs_mountpoint_to_dbus (backend->mountpoint, &iter); - - bus = dbus_bus_get (DBUS_BUS_SESSION, NULL); - if (bus) - { - dbus_connection_send (bus, signal, NULL); - dbus_connection_unref (bus); - } - - dbus_message_unref (signal); -} - -static void -g_vfs_backend_reset (GVfsJobSource *job_source) -{ - signal_mountpoint (G_VFS_BACKEND (job_source)); -} void g_vfs_backend_register_with_daemon (GVfsBackend *backend, GVfsDaemon *daemon) { + g_print ("registering %s\n", backend->object_path); g_vfs_daemon_add_job_source (daemon, G_VFS_JOB_SOURCE (backend)); - g_vfs_daemon_register_path (daemon, backend->mountpoint_path, + g_vfs_daemon_register_path (daemon, backend->object_path, backend_dbus_handler, backend); - signal_mountpoint (backend); } -- cgit v1.2.1