[gvfs/wip/udisks2] udisks2: handle blank and audio discs
- From: David Zeuthen <davidz src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gvfs/wip/udisks2] udisks2: handle blank and audio discs
- Date: Thu, 29 Sep 2011 18:03:14 +0000 (UTC)
commit 02ca61f8dbbebbdb4ec6a17527daf6035af2a110
Author: David Zeuthen <davidz redhat com>
Date: Thu Sep 29 14:03:02 2011 -0400
udisks2: handle blank and audio discs
Signed-off-by: David Zeuthen <davidz redhat com>
monitor/udisks2/gvfsudisks2mount.c | 11 ++-
monitor/udisks2/gvfsudisks2volume.c | 39 ++---
monitor/udisks2/gvfsudisks2volumemonitor.c | 207 ++++++++++++++++++++++++++--
3 files changed, 223 insertions(+), 34 deletions(-)
---
diff --git a/monitor/udisks2/gvfsudisks2mount.c b/monitor/udisks2/gvfsudisks2mount.c
index 8453246..70b070c 100644
--- a/monitor/udisks2/gvfsudisks2mount.c
+++ b/monitor/udisks2/gvfsudisks2mount.c
@@ -809,7 +809,16 @@ gvfs_udisks2_mount_unmount_with_operation (GMount *_mount,
data->mount_operation = mount_operation != NULL ? g_object_ref (mount_operation) : NULL;
data->flags = flags;
- unmount_do (data, FALSE);
+ if (mount->is_burn_mount)
+ {
+ /* burn mounts are really never mounted so complete successfully immediately */
+ g_simple_async_result_complete_in_idle (data->simple);
+ unmount_data_free (data);
+ }
+ else
+ {
+ unmount_do (data, FALSE);
+ }
}
static gboolean
diff --git a/monitor/udisks2/gvfsudisks2volume.c b/monitor/udisks2/gvfsudisks2volume.c
index 5b11f61..05cd460 100644
--- a/monitor/udisks2/gvfsudisks2volume.c
+++ b/monitor/udisks2/gvfsudisks2volume.c
@@ -135,24 +135,6 @@ emit_changed (GVfsUDisks2Volume *volume)
g_signal_emit_by_name (volume->monitor, "volume-changed", volume);
}
-static UDisksDrive *
-get_udisks_drive (GVfsUDisks2Volume *volume)
-{
- UDisksDrive *ret = NULL;
- UDisksClient *client;
- UDisksObject *object;
-
- client = gvfs_udisks2_volume_monitor_get_udisks_client (volume->monitor);
- object = (UDisksObject *) g_dbus_object_manager_get_object (udisks_client_get_object_manager (client),
- udisks_block_get_drive (volume->block));
- if (object != NULL)
- {
- ret = udisks_object_peek_drive (object);
- g_object_unref (object);
- }
- return ret;
-}
-
static gboolean
update_volume (GVfsUDisks2Volume *volume)
{
@@ -205,7 +187,8 @@ update_volume (GVfsUDisks2Volume *volume)
g_free (s);
}
- udisks_drive = get_udisks_drive (volume);
+ udisks_drive = udisks_client_get_drive_for_block (gvfs_udisks2_volume_monitor_get_udisks_client (volume->monitor),
+ volume->block);
if (udisks_drive != NULL)
{
gchar *drive_desc;
@@ -229,15 +212,25 @@ update_volume (GVfsUDisks2Volume *volume)
drive_icon = NULL;
}
- //volume->name = g_strdup (media_desc);
+ /* Override name for blank and audio discs */
+ if (udisks_drive_get_optical_blank (udisks_drive))
+ {
+ g_free (volume->name);
+ volume->name = g_strdup (media_desc);
+ }
+ else if (volume->activation_root != NULL && g_file_has_uri_scheme (volume->activation_root, "cdda"))
+ {
+ g_free (volume->name);
+ volume->name = g_strdup (_("Audio Disc"));
+ }
+
volume->icon = media_icon != NULL ? g_object_ref (media_icon) : NULL;
g_free (media_desc);
if (media_icon != NULL)
g_object_unref (media_icon);
- }
- else
- {
+
+ g_object_unref (udisks_drive);
}
/* ---------------------------------------------------------------------------------------------------- */
diff --git a/monitor/udisks2/gvfsudisks2volumemonitor.c b/monitor/udisks2/gvfsudisks2volumemonitor.c
index 6eb45ad..f21c56d 100644
--- a/monitor/udisks2/gvfsudisks2volumemonitor.c
+++ b/monitor/udisks2/gvfsudisks2volumemonitor.c
@@ -728,6 +728,72 @@ block_compare (UDisksBlock *a, UDisksBlock *b)
/* ---------------------------------------------------------------------------------------------------- */
+static GVfsUDisks2Volume *
+find_disc_volume_for_udisks_drive (GVfsUDisks2VolumeMonitor *monitor,
+ UDisksDrive *udisks_drive)
+{
+ GVfsUDisks2Volume *ret = NULL;
+ GList *l;
+
+ for (l = monitor->disc_volumes; l != NULL; l = l->next)
+ {
+ GVolume *volume = G_VOLUME (l->data);
+ GDrive *drive = g_volume_get_drive (volume);
+ if (drive != NULL)
+ {
+ if (gvfs_udisks2_drive_get_udisks_drive (GVFS_UDISKS2_DRIVE (drive)) == udisks_drive)
+ {
+ ret = GVFS_UDISKS2_VOLUME (volume);
+ g_object_unref (drive);
+ goto out;
+ }
+ g_object_unref (drive);
+ }
+ }
+
+ out:
+ return ret;
+}
+
+/* ---------------------------------------------------------------------------------------------------- */
+
+static GVfsUDisks2Mount *
+find_disc_mount_for_udisks_drive (GVfsUDisks2VolumeMonitor *monitor,
+ UDisksDrive *udisks_drive)
+{
+ GVfsUDisks2Mount *ret = NULL;
+ GList *l;
+
+ for (l = monitor->disc_mounts; l != NULL; l = l->next)
+ {
+ GMount *mount = G_MOUNT (l->data);
+ GVolume *volume;
+
+ volume = g_mount_get_volume (mount);
+ if (volume != NULL)
+ {
+ GDrive *drive = g_volume_get_drive (volume);
+ if (drive != NULL)
+ {
+ if (gvfs_udisks2_drive_get_udisks_drive (GVFS_UDISKS2_DRIVE (drive)) == udisks_drive)
+ {
+ ret = GVFS_UDISKS2_MOUNT (mount);
+ g_object_unref (volume);
+ g_object_unref (drive);
+ goto out;
+ }
+ g_object_unref (drive);
+ }
+ g_object_unref (volume);
+ }
+ }
+
+ out:
+ return ret;
+}
+
+/* ---------------------------------------------------------------------------------------------------- */
+
static GVfsUDisks2Drive *
find_drive_for_udisks_drive (GVfsUDisks2VolumeMonitor *monitor,
UDisksDrive *udisks_drive)
@@ -768,16 +834,6 @@ find_volume_for_block (GVfsUDisks2VolumeMonitor *monitor,
}
}
- for (l = monitor->disc_volumes; l != NULL; l = l->next)
- {
- GVfsUDisks2Volume *volume = GVFS_UDISKS2_VOLUME (l->data);
- if (gvfs_udisks2_volume_get_block (volume) == block)
- {
- ret = volume;
- goto out;
- }
- }
-
out:
return ret;
}
@@ -1093,6 +1149,137 @@ update_discs (GVfsUDisks2VolumeMonitor *monitor,
GList **added_mounts,
GList **removed_mounts)
{
+ GList *objects;
+ GList *cur_disc_drives;
+ GList *new_disc_drives;
+ GList *removed, *added;
+ GList *l;
+ GVfsUDisks2Drive *drive;
+ GVfsUDisks2Volume *volume;
+ GVfsUDisks2Mount *mount;
+
+ /* we also need to generate GVolume + GMount objects for
+ *
+ * - optical discs with audio
+ * - optical discs that are blank
+ *
+ */
+
+ objects = g_dbus_object_manager_get_objects (udisks_client_get_object_manager (monitor->client));
+
+ cur_disc_drives = NULL;
+ for (l = monitor->disc_volumes; l != NULL; l = l->next)
+ {
+ volume = GVFS_UDISKS2_VOLUME (l->data);
+ drive = GVFS_UDISKS2_DRIVE (g_volume_get_drive (G_VOLUME (volume)));
+ if (drive != NULL)
+ {
+ cur_disc_drives = g_list_prepend (cur_disc_drives, gvfs_udisks2_drive_get_udisks_drive (drive));
+ g_object_unref (drive);
+ }
+ }
+
+ new_disc_drives = NULL;
+ for (l = objects; l != NULL; l = l->next)
+ {
+ UDisksDrive *udisks_drive = udisks_object_peek_drive (UDISKS_OBJECT (l->data));
+ if (udisks_drive == NULL)
+ continue;
+
+ /* only consider blank and audio discs */
+ if (!(udisks_drive_get_optical_blank (udisks_drive) ||
+ udisks_drive_get_optical_num_audio_tracks (udisks_drive) > 0))
+ continue;
+
+ new_disc_drives = g_list_prepend (new_disc_drives, udisks_drive);
+ }
+
+ cur_disc_drives = g_list_sort (cur_disc_drives, (GCompareFunc) udisks_drive_compare);
+ new_disc_drives = g_list_sort (new_disc_drives, (GCompareFunc) udisks_drive_compare);
+ diff_sorted_lists (cur_disc_drives, new_disc_drives, (GCompareFunc) udisks_drive_compare, &added, &removed);
+
+ for (l = removed; l != NULL; l = l->next)
+ {
+ UDisksDrive *udisks_drive = UDISKS_DRIVE (l->data);
+
+ volume = find_disc_volume_for_udisks_drive (monitor, udisks_drive);
+ mount = find_disc_mount_for_udisks_drive (monitor, udisks_drive);
+
+ if (mount != NULL)
+ {
+ gvfs_udisks2_mount_unmounted (mount);
+ monitor->disc_mounts = g_list_remove (monitor->disc_mounts, mount);
+ *removed_mounts = g_list_prepend (*removed_mounts, mount);
+ }
+ if (volume != NULL)
+ {
+ gvfs_udisks2_volume_removed (volume);
+ monitor->disc_volumes = g_list_remove (monitor->disc_volumes, volume);
+ *removed_volumes = g_list_prepend (*removed_volumes, volume);
+ }
+ }
+
+ for (l = added; l != NULL; l = l->next)
+ {
+ UDisksDrive *udisks_drive = UDISKS_DRIVE (l->data);
+ UDisksBlock *block;
+
+ block = udisks_client_get_block_for_drive (monitor->client, udisks_drive, FALSE);
+ if (block != NULL)
+ {
+ volume = find_disc_volume_for_udisks_drive (monitor, udisks_drive);
+ if (volume == NULL)
+ {
+ gchar *uri;
+ GFile *activation_root;
+ if (udisks_drive_get_optical_blank (udisks_drive))
+ {
+ uri = g_strdup ("burn://");
+ }
+ else
+ {
+ gchar *basename = g_path_get_basename (udisks_block_get_device (block));
+ uri = g_strdup_printf ("cdda://%s", basename);
+ g_free (basename);
+ }
+ activation_root = g_file_new_for_uri (uri);
+ volume = gvfs_udisks2_volume_new (monitor,
+ block,
+ find_drive_for_udisks_drive (monitor, udisks_drive),
+ activation_root);
+ if (volume != NULL)
+ {
+ monitor->disc_volumes = g_list_prepend (monitor->disc_volumes, volume);
+ *added_volumes = g_list_prepend (*added_volumes, g_object_ref (volume));
+
+ if (udisks_drive_get_optical_blank (udisks_drive))
+ {
+ mount = gvfs_udisks2_mount_new (monitor,
+ NULL, /* GUnixMountEntry */
+ volume);
+ if (mount != NULL)
+ {
+ monitor->disc_mounts = g_list_prepend (monitor->disc_mounts, mount);
+ *added_mounts = g_list_prepend (*added_mounts, g_object_ref (mount));
+ }
+ }
+ }
+
+ g_object_unref (activation_root);
+ g_free (uri);
+ }
+ g_object_unref (block);
+ }
+ }
+
+ g_list_free (added);
+ g_list_free (removed);
+
+ g_list_free (new_disc_drives);
+ g_list_free (cur_disc_drives);
+
+ g_list_foreach (objects, (GFunc) g_object_unref, NULL);
+ g_list_free (objects);
}
/* ---------------------------------------------------------------------------------------------------- */
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]