From b37f13db77d5e93eeffff32e15f6d8bff3c3e01b Mon Sep 17 00:00:00 2001 From: Giovanni Campagna Date: Sun, 2 Jun 2013 20:08:17 +0200 Subject: GProxyVolume: extend the protocol so the volume monitor can force a call to Mount Some volume monitors, like gnome-online-accounts, want their mount implementation to be called even though the volume has an activation root. Allow them to advertise so using the expansion fields of the volume DBus representation. https://bugzilla.gnome.org/show_bug.cgi?id=696279 (cherry picked from commit 97a4246ba7f620ee348711b21cba8a1b67e8a056) --- monitor/proxy/gproxyvolume.c | 20 ++++++++++++++------ monitor/proxy/gvfsproxyvolumemonitordaemon.c | 13 ++++++++++++- monitor/proxy/gvfsproxyvolumemonitordaemon.h | 2 ++ 3 files changed, 28 insertions(+), 7 deletions(-) diff --git a/monitor/proxy/gproxyvolume.c b/monitor/proxy/gproxyvolume.c index a3d41a18..f0cfa116 100644 --- a/monitor/proxy/gproxyvolume.c +++ b/monitor/proxy/gproxyvolume.c @@ -62,6 +62,7 @@ struct _GProxyVolume { gboolean can_mount; gboolean should_automount; + gboolean always_call_mount; GProxyShadowMount *shadow_mount; @@ -356,7 +357,7 @@ update_shadow_mount_in_idle (GProxyVolume *volume) * a{sv} expansion */ -#define VOLUME_STRUCT_TYPE "(&s&s&s&s&s&sbb&s&sa{ss}&sa{sv})" +#define VOLUME_STRUCT_TYPE "(&s&s&s&s&s&sbb&s&sa{ss}&s@a{sv})" void g_proxy_volume_update (GProxyVolume *volume, GVariant *iter) @@ -374,7 +375,7 @@ void g_proxy_volume_update (GProxyVolume *volume, GHashTable *identifiers; const gchar *sort_key; GVariantIter *iter_identifiers; - GVariantIter *iter_expansion; + GVariant *expansion; sort_key = NULL; g_variant_get (iter, VOLUME_STRUCT_TYPE, @@ -385,7 +386,7 @@ void g_proxy_volume_update (GProxyVolume *volume, &drive_id, &mount_id, &iter_identifiers, &sort_key, - &iter_expansion); + &expansion); identifiers = _get_identifiers (iter_identifiers); @@ -439,14 +440,20 @@ void g_proxy_volume_update (GProxyVolume *volume, volume->identifiers = identifiers != NULL ? g_hash_table_ref (identifiers) : NULL; volume->sort_key = g_strdup (sort_key); - /* TODO: decode expansion, once used */ + if (volume->activation_uri) + { + if (!g_variant_lookup (expansion, "always-call-mount", "b", &volume->always_call_mount)) + volume->always_call_mount = FALSE; + } + else + volume->always_call_mount = FALSE; /* this calls into the union monitor; do it in idle to avoid locking issues */ update_shadow_mount_in_idle (volume); out: g_variant_iter_free (iter_identifiers); - g_variant_iter_free (iter_expansion); + g_variant_unref (expansion); g_hash_table_unref (identifiers); } @@ -876,7 +883,8 @@ g_proxy_volume_mount (GVolume *volume, GProxyVolume *proxy_volume = G_PROXY_VOLUME (volume); G_LOCK (proxy_volume); - if (proxy_volume->activation_uri != NULL) + if (proxy_volume->activation_uri != NULL && + !proxy_volume->always_call_mount) { ForeignMountOp *data; GFile *root; diff --git a/monitor/proxy/gvfsproxyvolumemonitordaemon.c b/monitor/proxy/gvfsproxyvolumemonitordaemon.c index 8e65d9fc..0201cf23 100644 --- a/monitor/proxy/gvfsproxyvolumemonitordaemon.c +++ b/monitor/proxy/gvfsproxyvolumemonitordaemon.c @@ -41,6 +41,7 @@ static const char *the_dbus_name = NULL; static GList *outstanding_ops = NULL; static GList *outstanding_mount_op_objects = NULL; static GHashTable *unique_names_being_watched = NULL; +static gboolean always_call_mount = FALSE; static GVfsRemoteVolumeMonitor *monitor_daemon = NULL; @@ -760,8 +761,12 @@ volume_to_dbus (GVolume *volume) g_free (id_value); } - expansion_builder = g_variant_builder_new (G_VARIANT_TYPE_VARDICT); /* left for future expansion without ABI breaks */ + expansion_builder = g_variant_builder_new (G_VARIANT_TYPE_VARDICT); + + if (always_call_mount) + g_variant_builder_add (expansion_builder, "{sv}", + "always-call-mount", g_variant_new_boolean (TRUE)); result = g_variant_new (VOLUME_STRUCT_TYPE, id, @@ -2012,3 +2017,9 @@ g_vfs_proxy_volume_monitor_daemon_main (int argc, return 0; } + +void +g_vfs_proxy_volume_monitor_daemon_set_always_call_mount (gboolean value) +{ + always_call_mount = value; +} diff --git a/monitor/proxy/gvfsproxyvolumemonitordaemon.h b/monitor/proxy/gvfsproxyvolumemonitordaemon.h index 3aed1539..77895dd2 100644 --- a/monitor/proxy/gvfsproxyvolumemonitordaemon.h +++ b/monitor/proxy/gvfsproxyvolumemonitordaemon.h @@ -32,4 +32,6 @@ int g_vfs_proxy_volume_monitor_daemon_main (int argc, const char *dbus_name, GType volume_monitor_type); +void g_vfs_proxy_volume_monitor_daemon_set_always_call_mount (gboolean always_call_mount); + #endif -- cgit v1.2.1