diff options
author | David Zeuthen <davidz@redhat.com> | 2011-10-13 16:55:18 -0400 |
---|---|---|
committer | David Zeuthen <davidz@redhat.com> | 2011-10-18 14:33:06 -0400 |
commit | 2b5e26a0ca1f9a38fe981f431ee6fc29180d8fff (patch) | |
tree | 7caead6d404eb1dce8ea6be3e8788c78cc89c89a /monitor/proxy | |
parent | c3a401f8314588e0d16d7eecf2ad8a9c815645eb (diff) | |
download | gvfs-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.c | 40 | ||||
-rw-r--r-- | monitor/proxy/gproxymount.c | 26 | ||||
-rw-r--r-- | monitor/proxy/gproxyshadowmount.c | 14 | ||||
-rw-r--r-- | monitor/proxy/gproxyvolume.c | 27 | ||||
-rw-r--r-- | monitor/proxy/gproxyvolumemonitor.c | 24 | ||||
-rw-r--r-- | monitor/proxy/gvfsproxyvolumemonitordaemon.c | 46 |
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); |