summaryrefslogtreecommitdiff
path: root/daemon/gvfsbackend.c
diff options
context:
space:
mode:
authorAlexander Larsson <alexl@src.gnome.org>2007-09-13 10:37:59 +0000
committerAlexander Larsson <alexl@src.gnome.org>2007-09-13 10:37:59 +0000
commit3eb2c102c1d95a7cd205267754a38799792a66c2 (patch)
tree20295aa5604b5de82ad167607d842d9083bbfccf /daemon/gvfsbackend.c
parent31d8952c4e4e97018537902993889dcd5299c991 (diff)
downloadgvfs-3eb2c102c1d95a7cd205267754a38799792a66c2.tar.gz
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 <alex@greebo.(none)> at 1165844556 +0100 svn path=/trunk/; revision=222
Diffstat (limited to 'daemon/gvfsbackend.c')
-rw-r--r--daemon/gvfsbackend.c150
1 files changed, 87 insertions, 63 deletions
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);
}