summaryrefslogtreecommitdiff
path: root/monitor/proxy
diff options
context:
space:
mode:
authorDavid Zeuthen <davidz@redhat.com>2011-10-13 16:55:18 -0400
committerDavid Zeuthen <davidz@redhat.com>2011-10-18 14:33:06 -0400
commit2b5e26a0ca1f9a38fe981f431ee6fc29180d8fff (patch)
tree7caead6d404eb1dce8ea6be3e8788c78cc89c89a /monitor/proxy
parentc3a401f8314588e0d16d7eecf2ad8a9c815645eb (diff)
downloadgvfs-2b5e26a0ca1f9a38fe981f431ee6fc29180d8fff.tar.gz
Support get_sort_key() in out-of-process volume monitors and gvfs-mount(1)
This is detailed in this bug https://bugzilla.gnome.org/show_bug.cgi?id=661711 Also extend the private D-Bus protocol used between the client- and service-side for out-of-process volume monitors. In particular, introduce a new a{sv} member that we can use in the future to for expansion without breaking ABI. Signed-off-by: David Zeuthen <davidz@redhat.com>
Diffstat (limited to 'monitor/proxy')
-rw-r--r--monitor/proxy/gproxydrive.c40
-rw-r--r--monitor/proxy/gproxymount.c26
-rw-r--r--monitor/proxy/gproxyshadowmount.c14
-rw-r--r--monitor/proxy/gproxyvolume.c27
-rw-r--r--monitor/proxy/gproxyvolumemonitor.c24
-rw-r--r--monitor/proxy/gvfsproxyvolumemonitordaemon.c46
6 files changed, 172 insertions, 5 deletions
diff --git a/monitor/proxy/gproxydrive.c b/monitor/proxy/gproxydrive.c
index 49e9ae12..be2b600f 100644
--- a/monitor/proxy/gproxydrive.c
+++ b/monitor/proxy/gproxydrive.c
@@ -60,6 +60,8 @@ struct _GProxyDrive {
GDriveStartStopType start_stop_type;
GHashTable *identifiers;
+
+ gchar *sort_key;
};
static void g_proxy_drive_drive_iface_init (GDriveIface *iface);
@@ -84,6 +86,7 @@ g_proxy_drive_finalize (GObject *object)
g_strfreev (drive->volume_ids);
if (drive->identifiers != NULL)
g_hash_table_unref (drive->identifiers);
+ g_free (drive->sort_key);
if (G_OBJECT_CLASS (g_proxy_drive_parent_class)->finalize)
(*G_OBJECT_CLASS (g_proxy_drive_parent_class)->finalize) (object);
@@ -133,8 +136,10 @@ g_proxy_drive_new (GProxyVolumeMonitor *volume_monitor)
* uint32 start-stop-type
* array:string volume-ids
* dict:string->string identifiers
+ * string sort_key
+ * a{sv} expansion
*/
-#define DRIVE_STRUCT_TYPE "(sssbbbbbbbbuasa{ss})"
+#define DRIVE_STRUCT_TYPE "(sssbbbbbbbbuasa{ss}sa{sv})"
void
g_proxy_drive_update (GProxyDrive *drive,
@@ -156,6 +161,7 @@ g_proxy_drive_update (GProxyDrive *drive,
dbus_uint32_t start_stop_type;
GPtrArray *volume_ids;
GHashTable *identifiers;
+ const char *sort_key;
dbus_message_iter_recurse (iter, &iter_struct);
dbus_message_iter_get_basic (&iter_struct, &id);
@@ -198,6 +204,15 @@ g_proxy_drive_update (GProxyDrive *drive,
identifiers = _get_identifiers (&iter_struct);
dbus_message_iter_next (&iter_struct);
+ /* make sure we are backwards compat with old daemon instance */
+ sort_key = NULL;
+ if (dbus_message_iter_has_next (&iter_struct))
+ {
+ dbus_message_iter_get_basic (&iter_struct, &sort_key);
+ dbus_message_iter_next (&iter_struct);
+ /* TODO: decode expansion, once used */
+ }
+
if (drive->id != NULL && strcmp (drive->id, id) != 0)
{
g_warning ("id mismatch during update of drive");
@@ -207,6 +222,9 @@ g_proxy_drive_update (GProxyDrive *drive,
if (strlen (name) == 0)
name = NULL;
+ if (sort_key != NULL && strlen (sort_key) == 0)
+ sort_key = NULL;
+
/* out with the old */
g_free (drive->id);
g_free (drive->name);
@@ -215,6 +233,7 @@ g_proxy_drive_update (GProxyDrive *drive,
g_strfreev (drive->volume_ids);
if (drive->identifiers != NULL)
g_hash_table_unref (drive->identifiers);
+ g_free (drive->sort_key);
/* in with the new */
drive->id = g_strdup (id);
@@ -223,7 +242,6 @@ g_proxy_drive_update (GProxyDrive *drive,
drive->icon = NULL;
else
drive->icon = g_icon_new_for_string (gicon_data, NULL);
-
drive->can_eject = can_eject;
drive->can_poll_for_media = can_poll_for_media;
drive->has_media = has_media;
@@ -235,6 +253,7 @@ g_proxy_drive_update (GProxyDrive *drive,
drive->start_stop_type = start_stop_type;
drive->identifiers = identifiers != NULL ? g_hash_table_ref (identifiers) : NULL;
drive->volume_ids = g_strdupv ((char **) volume_ids->pdata);
+ drive->sort_key = g_strdup (sort_key);
out:
g_ptr_array_free (volume_ids, TRUE);
@@ -267,6 +286,12 @@ g_proxy_drive_get_name (GDrive *drive)
return name;
}
+static gboolean
+volume_compare (GVolume *a, GVolume *b)
+{
+ return g_strcmp0 (g_volume_get_sort_key (a), g_volume_get_sort_key (b));
+}
+
static GList *
g_proxy_drive_get_volumes (GDrive *drive)
{
@@ -290,6 +315,8 @@ g_proxy_drive_get_volumes (GDrive *drive)
}
G_UNLOCK (proxy_drive);
+ l = g_list_sort (l, (GCompareFunc) volume_compare);
+
return l;
}
@@ -1121,6 +1148,14 @@ g_proxy_drive_poll_for_media_finish (GDrive *drive,
/* ---------------------------------------------------------------------------------------------------- */
+static const gchar *
+g_proxy_drive_get_sort_key (GDrive *_drive)
+{
+ GProxyDrive *drive = G_PROXY_DRIVE (_drive);
+ return drive->sort_key;
+}
+
+/* ---------------------------------------------------------------------------------------------------- */
static void
g_proxy_drive_drive_iface_init (GDriveIface *iface)
@@ -1150,6 +1185,7 @@ g_proxy_drive_drive_iface_init (GDriveIface *iface)
iface->stop = g_proxy_drive_stop;
iface->stop_finish = g_proxy_drive_stop_finish;
iface->get_start_stop_type = g_proxy_drive_get_start_stop_type;
+ iface->get_sort_key = g_proxy_drive_get_sort_key;
}
void
diff --git a/monitor/proxy/gproxymount.c b/monitor/proxy/gproxymount.c
index 626d592e..cd3ca49b 100644
--- a/monitor/proxy/gproxymount.c
+++ b/monitor/proxy/gproxymount.c
@@ -54,6 +54,7 @@ struct _GProxyMount {
char **x_content_types;
GFile *root;
GIcon *icon;
+ gchar *sort_key;
};
static void g_proxy_mount_mount_iface_init (GMountIface *iface);
@@ -82,6 +83,8 @@ g_proxy_mount_finalize (GObject *object)
if (mount->volume_monitor != NULL)
g_object_unref (mount->volume_monitor);
+ g_free (mount->sort_key);
+
if (G_OBJECT_CLASS (g_proxy_mount_parent_class)->finalize)
(*G_OBJECT_CLASS (g_proxy_mount_parent_class)->finalize) (object);
}
@@ -156,6 +159,7 @@ g_proxy_mount_update (GProxyMount *mount,
dbus_bool_t can_unmount;
const char *volume_id;
GPtrArray *x_content_types;
+ const gchar *sort_key;
dbus_message_iter_recurse (iter, &iter_struct);
dbus_message_iter_get_basic (&iter_struct, &id);
@@ -185,6 +189,15 @@ g_proxy_mount_update (GProxyMount *mount,
g_ptr_array_add (x_content_types, NULL);
dbus_message_iter_next (&iter_struct);
+ /* make sure we are backwards compat with old daemon instance */
+ sort_key = NULL;
+ if (dbus_message_iter_has_next (&iter_struct))
+ {
+ dbus_message_iter_get_basic (&iter_struct, &sort_key);
+ dbus_message_iter_next (&iter_struct);
+ /* TODO: decode expansion, once used */
+ }
+
if (mount->id != NULL && strcmp (mount->id, id) != 0)
{
g_warning ("id mismatch during update of mount");
@@ -195,6 +208,8 @@ g_proxy_mount_update (GProxyMount *mount,
name = NULL;
if (strlen (uuid) == 0)
uuid = NULL;
+ if (sort_key != NULL && strlen (sort_key) == 0)
+ sort_key = NULL;
/* out with the old */
g_free (mount->id);
@@ -206,6 +221,7 @@ g_proxy_mount_update (GProxyMount *mount,
g_strfreev (mount->x_content_types);
if (mount->root != NULL)
g_object_unref (mount->root);
+ g_free (mount->sort_key);
/* in with the new */
mount->id = g_strdup (id);
@@ -219,6 +235,7 @@ g_proxy_mount_update (GProxyMount *mount,
mount->can_unmount = can_unmount;
mount->volume_id = g_strdup (volume_id);
mount->x_content_types = g_strdupv ((char **) x_content_types->pdata);
+ mount->sort_key = g_strdup (sort_key);
out:
g_ptr_array_free (x_content_types, TRUE);
@@ -677,6 +694,14 @@ g_proxy_mount_guess_content_type_sync (GMount *mount,
return g_strdupv (proxy_mount->x_content_types);
}
+
+static const gchar *
+g_proxy_mount_get_sort_key (GMount *_mount)
+{
+ GProxyMount *mount = G_PROXY_MOUNT (_mount);
+ return mount->sort_key;
+}
+
static void
g_proxy_mount_mount_iface_init (GMountIface *iface)
{
@@ -699,6 +724,7 @@ g_proxy_mount_mount_iface_init (GMountIface *iface)
iface->guess_content_type = g_proxy_mount_guess_content_type;
iface->guess_content_type_finish = g_proxy_mount_guess_content_type_finish;
iface->guess_content_type_sync = g_proxy_mount_guess_content_type_sync;
+ iface->get_sort_key = g_proxy_mount_get_sort_key;
}
void
diff --git a/monitor/proxy/gproxyshadowmount.c b/monitor/proxy/gproxyshadowmount.c
index f8a5dfb5..b83d2f1b 100644
--- a/monitor/proxy/gproxyshadowmount.c
+++ b/monitor/proxy/gproxyshadowmount.c
@@ -477,6 +477,19 @@ g_proxy_shadow_mount_get_activation_root (GProxyShadowMount *mount)
return g_object_ref (mount->root);
}
+static const gchar *
+g_proxy_shadow_mount_get_sort_key (GMount *mount)
+{
+ GProxyShadowMount *proxy_shadow_mount = G_PROXY_SHADOW_MOUNT (mount);
+ const gchar *ret;
+
+ G_LOCK (proxy_shadow_mount);
+ ret = g_mount_get_sort_key (proxy_shadow_mount->real_mount);
+ G_UNLOCK (proxy_shadow_mount);
+
+ return ret;
+}
+
static void
g_proxy_shadow_mount_mount_iface_init (GMountIface *iface)
{
@@ -499,6 +512,7 @@ g_proxy_shadow_mount_mount_iface_init (GMountIface *iface)
iface->guess_content_type = g_proxy_shadow_mount_guess_content_type;
iface->guess_content_type_finish = g_proxy_shadow_mount_guess_content_type_finish;
iface->guess_content_type_sync = g_proxy_shadow_mount_guess_content_type_sync;
+ iface->get_sort_key = g_proxy_shadow_mount_get_sort_key;
}
void
diff --git a/monitor/proxy/gproxyvolume.c b/monitor/proxy/gproxyvolume.c
index d70ebc6b..b6b8c91b 100644
--- a/monitor/proxy/gproxyvolume.c
+++ b/monitor/proxy/gproxyvolume.c
@@ -65,6 +65,8 @@ struct _GProxyVolume {
gboolean should_automount;
GProxyShadowMount *shadow_mount;
+
+ gchar *sort_key;
};
static void g_proxy_volume_volume_iface_init (GVolumeIface *iface);
@@ -119,6 +121,7 @@ g_proxy_volume_finalize (GObject *object)
{
g_object_unref (volume->volume_monitor);
}
+ g_free (volume->sort_key);
if (G_OBJECT_CLASS (g_proxy_volume_parent_class)->finalize)
(*G_OBJECT_CLASS (g_proxy_volume_parent_class)->finalize) (object);
@@ -349,6 +352,8 @@ update_shadow_mount_in_idle (GProxyVolume *volume)
* string drive-id
* string mount-id
* dict:string->string identifiers
+ * string sort_key
+ * a{sv} expansion
*/
void g_proxy_volume_update (GProxyVolume *volume,
@@ -365,6 +370,7 @@ void g_proxy_volume_update (GProxyVolume *volume,
dbus_bool_t can_mount;
dbus_bool_t should_automount;
GHashTable *identifiers;
+ const gchar *sort_key;
dbus_message_iter_recurse (iter, &iter_struct);
dbus_message_iter_get_basic (&iter_struct, &id);
@@ -389,6 +395,15 @@ void g_proxy_volume_update (GProxyVolume *volume,
identifiers = _get_identifiers (&iter_struct);
dbus_message_iter_next (&iter_struct);
+ /* make sure we are backwards compat with old daemon instance */
+ sort_key = NULL;
+ if (dbus_message_iter_has_next (&iter_struct))
+ {
+ dbus_message_iter_get_basic (&iter_struct, &sort_key);
+ dbus_message_iter_next (&iter_struct);
+ /* TODO: decode expansion, once used */
+ }
+
if (volume->id != NULL && strcmp (volume->id, id) != 0)
{
g_warning ("id mismatch during update of volume");
@@ -401,6 +416,8 @@ void g_proxy_volume_update (GProxyVolume *volume,
uuid = NULL;
if (strlen (activation_uri) == 0)
activation_uri = NULL;
+ if (sort_key != NULL && strlen (sort_key) == 0)
+ sort_key = NULL;
/* out with the old */
g_free (volume->id);
@@ -413,6 +430,7 @@ void g_proxy_volume_update (GProxyVolume *volume,
g_free (volume->mount_id);
if (volume->identifiers != NULL)
g_hash_table_unref (volume->identifiers);
+ g_free (volume->sort_key);
/* in with the new */
volume->id = g_strdup (id);
@@ -428,6 +446,7 @@ void g_proxy_volume_update (GProxyVolume *volume,
volume->can_mount = can_mount;
volume->should_automount = should_automount;
volume->identifiers = identifiers != NULL ? g_hash_table_ref (identifiers) : NULL;
+ volume->sort_key = g_strdup (sort_key);
/* this calls into the union monitor; do it in idle to avoid locking issues */
update_shadow_mount_in_idle (volume);
@@ -960,6 +979,13 @@ g_proxy_volume_get_activation_root (GVolume *volume)
return g_file_new_for_uri (proxy_volume->activation_uri);
}
+static const gchar *
+g_proxy_volume_get_sort_key (GVolume *_volume)
+{
+ GProxyVolume *volume = G_PROXY_VOLUME (_volume);
+ return volume->sort_key;
+}
+
static void
g_proxy_volume_volume_iface_init (GVolumeIface *iface)
{
@@ -980,6 +1006,7 @@ g_proxy_volume_volume_iface_init (GVolumeIface *iface)
iface->get_identifier = g_proxy_volume_get_identifier;
iface->enumerate_identifiers = g_proxy_volume_enumerate_identifiers;
iface->get_activation_root = g_proxy_volume_get_activation_root;
+ iface->get_sort_key = g_proxy_volume_get_sort_key;
}
void
diff --git a/monitor/proxy/gproxyvolumemonitor.c b/monitor/proxy/gproxyvolumemonitor.c
index 8661d9d3..2c974d14 100644
--- a/monitor/proxy/gproxyvolumemonitor.c
+++ b/monitor/proxy/gproxyvolumemonitor.c
@@ -135,6 +135,24 @@ g_proxy_volume_monitor_dispose (GObject *object)
*/
}
+static gboolean
+drive_compare (GDrive *a, GDrive *b)
+{
+ return g_strcmp0 (g_drive_get_sort_key (a), g_drive_get_sort_key (b));
+}
+
+static gboolean
+volume_compare (GVolume *a, GVolume *b)
+{
+ return g_strcmp0 (g_volume_get_sort_key (a), g_volume_get_sort_key (b));
+}
+
+static gboolean
+mount_compare (GMount *a, GMount *b)
+{
+ return g_strcmp0 (g_mount_get_sort_key (a), g_mount_get_sort_key (b));
+}
+
static GList *
get_mounts (GVolumeMonitor *volume_monitor)
{
@@ -165,6 +183,8 @@ get_mounts (GVolumeMonitor *volume_monitor)
G_UNLOCK (proxy_vm);
+ l = g_list_sort (l, (GCompareFunc) mount_compare);
+
return l;
}
@@ -187,6 +207,8 @@ get_volumes (GVolumeMonitor *volume_monitor)
G_UNLOCK (proxy_vm);
+ l = g_list_sort (l, (GCompareFunc) volume_compare);
+
return l;
}
@@ -209,6 +231,8 @@ get_connected_drives (GVolumeMonitor *volume_monitor)
G_UNLOCK (proxy_vm);
+ l = g_list_sort (l, (GCompareFunc) drive_compare);
+
return l;
}
diff --git a/monitor/proxy/gvfsproxyvolumemonitordaemon.c b/monitor/proxy/gvfsproxyvolumemonitordaemon.c
index 413afc58..4be64e01 100644
--- a/monitor/proxy/gvfsproxyvolumemonitordaemon.c
+++ b/monitor/proxy/gvfsproxyvolumemonitordaemon.c
@@ -412,8 +412,10 @@ static void monitor_try_create (void);
* uint32 start-stop-type
* array:string volume-ids
* dict:string->string identifiers
+ * string sort_key
+ * a{sv} expansion
*/
-#define DRIVE_STRUCT_TYPE "(sssbbbbbbbbuasa{ss})"
+#define DRIVE_STRUCT_TYPE "(sssbbbbbbbbuasa{ss}sa{sv})"
static void
append_drive (GDrive *drive, DBusMessageIter *iter_array)
@@ -437,6 +439,8 @@ append_drive (GDrive *drive, DBusMessageIter *iter_array)
GList *volumes, *l;
char **identifiers;
int n;
+ const gchar *sort_key;
+ DBusMessageIter iter_expansion;
dbus_message_iter_open_container (iter_array, DBUS_TYPE_STRUCT, NULL, &iter_struct);
@@ -462,6 +466,10 @@ append_drive (GDrive *drive, DBusMessageIter *iter_array)
if (name == NULL)
name = g_strdup ("");
+ sort_key = g_drive_get_sort_key (drive);
+ if (sort_key == NULL)
+ sort_key = "";
+
dbus_message_iter_append_basic (&iter_struct, DBUS_TYPE_STRING, &id);
dbus_message_iter_append_basic (&iter_struct, DBUS_TYPE_STRING, &name);
dbus_message_iter_append_basic (&iter_struct, DBUS_TYPE_STRING, &icon_data);
@@ -503,6 +511,11 @@ append_drive (GDrive *drive, DBusMessageIter *iter_array)
}
dbus_message_iter_close_container (&iter_struct, &iter_identifiers);
+ dbus_message_iter_append_basic (&iter_struct, DBUS_TYPE_STRING, &sort_key);
+ dbus_message_iter_open_container (&iter_struct, DBUS_TYPE_ARRAY, "{sv}", &iter_expansion);
+ /* left for future expansion without ABI breaks */
+ dbus_message_iter_close_container (&iter_struct, &iter_expansion);
+
g_strfreev (identifiers);
g_list_foreach (volumes, (GFunc) g_object_unref, NULL);
g_list_free (volumes);
@@ -524,8 +537,10 @@ append_drive (GDrive *drive, DBusMessageIter *iter_array)
* string drive-id
* string mount-id
* dict:string->string identifiers
+ * string sort_key
+ * a{sv} expansion
*/
-#define VOLUME_STRUCT_TYPE "(sssssbbssa{ss})"
+#define VOLUME_STRUCT_TYPE "(sssssbbssa{ss}sa{sv})"
static void
append_volume (GVolume *volume, DBusMessageIter *iter_array)
@@ -547,6 +562,8 @@ append_volume (GVolume *volume, DBusMessageIter *iter_array)
char *mount_id;
char **identifiers;
int n;
+ const gchar *sort_key;
+ DBusMessageIter iter_expansion;
dbus_message_iter_open_container (iter_array, DBUS_TYPE_STRUCT, NULL, &iter_struct);
@@ -582,6 +599,10 @@ append_volume (GVolume *volume, DBusMessageIter *iter_array)
if (uuid == NULL)
uuid = g_strdup ("");
+ sort_key = g_volume_get_sort_key (volume);
+ if (sort_key == NULL)
+ sort_key = "";
+
dbus_message_iter_append_basic (&iter_struct, DBUS_TYPE_STRING, &id);
dbus_message_iter_append_basic (&iter_struct, DBUS_TYPE_STRING, &name);
dbus_message_iter_append_basic (&iter_struct, DBUS_TYPE_STRING, &icon_data);
@@ -611,6 +632,11 @@ append_volume (GVolume *volume, DBusMessageIter *iter_array)
}
dbus_message_iter_close_container (&iter_struct, &iter_identifiers);
+ dbus_message_iter_append_basic (&iter_struct, DBUS_TYPE_STRING, &sort_key);
+ dbus_message_iter_open_container (&iter_struct, DBUS_TYPE_ARRAY, "{sv}", &iter_expansion);
+ /* left for future expansion without ABI breaks */
+ dbus_message_iter_close_container (&iter_struct, &iter_expansion);
+
g_strfreev (identifiers);
g_free (mount_id);
if (mount != NULL)
@@ -638,8 +664,10 @@ append_volume (GVolume *volume, DBusMessageIter *iter_array)
* boolean can-unmount
* string volume-id
* array:string x-content-types
+ * string sort_key
+ * a{sv} expansion
*/
-#define MOUNT_STRUCT_TYPE "(sssssbsas)"
+#define MOUNT_STRUCT_TYPE "(sssssbsassa{sv})"
static void
append_mount (GMount *mount, DBusMessageIter *iter_array)
@@ -658,6 +686,8 @@ append_mount (GMount *mount, DBusMessageIter *iter_array)
char *volume_id;
char **x_content_types;
int n;
+ const gchar *sort_key;
+ DBusMessageIter iter_expansion;
dbus_message_iter_open_container (iter_array, DBUS_TYPE_STRUCT, NULL, &iter_struct);
@@ -683,6 +713,11 @@ append_mount (GMount *mount, DBusMessageIter *iter_array)
if (uuid == NULL)
uuid = g_strdup ("");
+ sort_key = g_mount_get_sort_key (mount);
+ if (sort_key == NULL)
+ sort_key = "";
+
+
dbus_message_iter_append_basic (&iter_struct, DBUS_TYPE_STRING, &id);
dbus_message_iter_append_basic (&iter_struct, DBUS_TYPE_STRING, &name);
dbus_message_iter_append_basic (&iter_struct, DBUS_TYPE_STRING, &icon_data);
@@ -700,6 +735,11 @@ append_mount (GMount *mount, DBusMessageIter *iter_array)
}
dbus_message_iter_close_container (&iter_struct, &iter_x_content_types_array);
+ dbus_message_iter_append_basic (&iter_struct, DBUS_TYPE_STRING, &sort_key);
+ dbus_message_iter_open_container (&iter_struct, DBUS_TYPE_ARRAY, "{sv}", &iter_expansion);
+ /* left for future expansion without ABI breaks */
+ dbus_message_iter_close_container (&iter_struct, &iter_expansion);
+
g_free (volume_id);
if (volume != NULL)
g_object_unref (volume);