From 2b714b5f203e1daae59a9955290ec71122b13205 Mon Sep 17 00:00:00 2001 From: David Zeuthen Date: Mon, 7 Jul 2008 15:38:38 +0000 Subject: [PATCH] Add new method g_volume_get_activation_root(). This is needed for easily 2008-07-06 David Zeuthen * gio.symbols: * gvolume.[ch]: Add new method g_volume_get_activation_root(). This is needed for easily handling adoption of foreign volumes by out-of-process volume monitors (#541793) svn path=/trunk/; revision=7169 --- docs/reference/gio/gio-sections.txt | 1 + gio/ChangeLog | 7 +++ gio/gio.symbols | 1 + gio/gvolume.c | 82 +++++++++++++++++++++++++++++ gio/gvolume.h | 6 +++ 5 files changed, 97 insertions(+) diff --git a/docs/reference/gio/gio-sections.txt b/docs/reference/gio/gio-sections.txt index 52a148204..7e6ba7131 100644 --- a/docs/reference/gio/gio-sections.txt +++ b/docs/reference/gio/gio-sections.txt @@ -835,6 +835,7 @@ g_volume_get_drive g_volume_get_mount g_volume_can_mount g_volume_should_automount +g_volume_get_activation_root g_volume_mount g_volume_mount_finish g_volume_can_eject diff --git a/gio/ChangeLog b/gio/ChangeLog index 658c7f44d..c5441e133 100644 --- a/gio/ChangeLog +++ b/gio/ChangeLog @@ -1,3 +1,10 @@ +2008-07-06 David Zeuthen + + * gio.symbols: + * gvolume.[ch]: Add new method g_volume_get_activation_root(). This + is needed for easily handling adoption of foreign volumes by + out-of-process volume monitors (#541793) + 2008-07-06 David Zeuthen * gvolumemonitor.[ch]: diff --git a/gio/gio.symbols b/gio/gio.symbols index 9a890f460..260b2548e 100644 --- a/gio/gio.symbols +++ b/gio/gio.symbols @@ -735,6 +735,7 @@ g_volume_eject g_volume_eject_finish g_volume_get_identifier g_volume_enumerate_identifiers +g_volume_get_activation_root #endif #endif diff --git a/gio/gvolume.c b/gio/gvolume.c index 70005828e..4530701a6 100644 --- a/gio/gvolume.c +++ b/gio/gvolume.c @@ -516,6 +516,88 @@ g_volume_enumerate_identifiers (GVolume *volume) return (* iface->enumerate_identifiers) (volume); } +/** + * g_volume_get_activation_root: + * @volume: a #GVolume + * + * Gets the activation root for a #GVolume if it is known ahead of + * mount time. Returns %NULL otherwise. If not %NULL and if @volume + * is mounted, then the result of g_mount_get_root() on the + * #GMount object obtained from g_volume_get_mount() will always + * either be equal or a prefix of what this function returns. In + * other words, in code + * + * + * GMount *mount; + * GFile *mount_root + * GFile *volume_activation_root; + * + * mount = g_volume_get_mount (volume); // mounted, so never NULL + * mount_root = g_mount_get_root (mount); + * volume_activation_root = g_volume_get_activation_root(volume); // assume not NULL + * + * + * then the expression + * + * + * (g_file_has_prefix (volume_activation_root, mount_root) || + g_file_equal (volume_activation_root, mount_root)) + * + * + * will always be %TRUE. + * + * There is a number of possible uses of this function. + * + * First, implementations of #GVolumeMonitor can use this method to + * determine if a #GMount should be adopted in the implementation of + * g_volume_monitor_adopt_orphan_mount() by testing if the result of + * this function equals (or has as prefix) the root of the given + * #GMount. In particular this is useful in the in-process proxy part + * of an out-of-process volume monitor implementation. + * + * Second, applications such as a file manager can use this to + * navigate to the correct root in response to the user navigating to + * a server. Now suppose there is a volume monitor for networked + * servers that creates #GVolume objects corresponding to the + * "favorite servers" (e.g. set up by the user via some "Connect to + * Server" dialog). Suppose also that one of the favorite servers is + * named "public_html @ fd.o" and the URI is + * sftp://people.freedesktop.org/home/david/public_html. + * + * Now, due to the way GIO works, when the corresponding #GVolume is + * mounted then a #GMount (typically adopted by the volume monitor) + * will appear with the mount root (e.g. the result of + * g_mount_get_root()) + * sftp://people.freedesktop.org. However, this + * function (g_volume_get_activation_root()) can return a #GFile for + * the URI + * sftp://people.freedesktop.org/home/david/public_html. + * + * All this means that a file manager can use the latter URI for + * navigating when the user clicks an icon representing the #GVolume + * (e.g. clicking an icon with the name "public_html @ fd.o" or + * similar). + * + * Returns: the activation root of @volume or %NULL. Use + * g_object_unref() to free. + * + * Since: 2.18 + **/ +GFile * +g_volume_get_activation_root (GVolume *volume) +{ + GVolumeIface *iface; + + g_return_val_if_fail (G_IS_VOLUME (volume), NULL); + iface = G_VOLUME_GET_IFACE (volume); + + if (iface->get_activation_root == NULL) + return NULL; + + return (* iface->get_activation_root) (volume); +} + + #define __G_VOLUME_C__ #include "gioaliasdef.c" diff --git a/gio/gvolume.h b/gio/gvolume.h index 72a74e14d..5631dbd1a 100644 --- a/gio/gvolume.h +++ b/gio/gvolume.h @@ -94,6 +94,8 @@ G_BEGIN_DECLS * @enumerate_identifiers: Returns an array strings listing the kinds * of identifiers which the #GVolume has. * @should_automount: Returns %TRUE if the #GVolume should be automatically mounted. + * @get_activation_root: Returns the activation root for the #GVolume if it is known in advance or %NULL if + * it is not known. * * Interface for implementing operations for mountable volumes. **/ @@ -140,6 +142,8 @@ struct _GVolumeIface char ** (*enumerate_identifiers) (GVolume *volume); gboolean (*should_automount) (GVolume *volume); + + GFile * (*get_activation_root) (GVolume *volume); }; @@ -174,6 +178,8 @@ char * g_volume_get_identifier (GVolume *volume, const char *kind); char ** g_volume_enumerate_identifiers (GVolume *volume); +GFile * g_volume_get_activation_root (GVolume *volume); + G_END_DECLS