Add properties about currently inserted optical media to the drive interface
authorDavid Zeuthen <davidz@redhat.com>
Thu, 29 Sep 2011 18:01:05 +0000 (14:01 -0400)
committerDavid Zeuthen <davidz@redhat.com>
Thu, 29 Sep 2011 18:01:05 +0000 (14:01 -0400)
Signed-off-by: David Zeuthen <davidz@redhat.com>
data/org.freedesktop.UDisks2.xml
doc/udisks2-sections.txt
src/udiskslinuxdrive.c
udisks/udisksutil.c

index 1240611..fe7a606 100644 (file)
     <!-- MediaRemovable: Whether the media can be removed from the drive. -->
     <property name="MediaRemovable" type="b" access="read"/>
 
+    <!-- Optical: %TRUE if the drive contains an optical disc. -->
+    <property name="Optical" type="b" access="read"/>
+
+    <!-- OpticalBlank: %TRUE if the disc is blank.
+         This is only valid if the property #org.freedesktop.UDisks2.Drive:Optical is %TRUE.
+      -->
+    <property name="OpticalBlank" type="b" access="read"/>
+
+    <!-- OpticalNumTracks: The number of tracks.
+         This is only valid if the property #org.freedesktop.UDisks2.Drive:Optical is %TRUE.
+      -->
+    <property name="OpticalNumTracks" type="u" access="read"/>
+
+    <!-- OpticalNumAudioTracks: The number of audio tracks.
+         This is only valid if the property #org.freedesktop.UDisks2.Drive:Optical is %TRUE.
+      -->
+    <property name="OpticalNumAudioTracks" type="u" access="read"/>
+
+    <!-- OpticalNumDataTracks: The number of data tracks.
+         This is only valid if the property #org.freedesktop.UDisks2.Drive:Optical is %TRUE.
+      -->
+    <property name="OpticalNumDataTracks" type="u" access="read"/>
+
+    <!-- OpticalNumSessions: The number of sessions.
+         This is only valid if the property #org.freedesktop.UDisks2.Drive:Optical is %TRUE.
+     -->
+    <property name="OpticalNumSessions" type="u" access="read"/>
+
     <!-- RotationRate: The rotational rate of the drive.
       <itemizedlist>
         <listitem><para>-1 if known to be rotating media but rotation rate isn't known</para></listitem>
index 6c16d87..861b970 100644 (file)
@@ -501,6 +501,12 @@ udisks_drive_get_connection_bus
 udisks_drive_get_media
 udisks_drive_get_media_compatibility
 udisks_drive_get_media_removable
+udisks_drive_get_optical
+udisks_drive_get_optical_blank
+udisks_drive_get_optical_num_tracks
+udisks_drive_get_optical_num_audio_tracks
+udisks_drive_get_optical_num_data_tracks
+udisks_drive_get_optical_num_sessions
 udisks_drive_get_model
 udisks_drive_get_revision
 udisks_drive_get_rotation_rate
@@ -522,6 +528,12 @@ udisks_drive_set_connection_bus
 udisks_drive_set_media
 udisks_drive_set_media_compatibility
 udisks_drive_set_media_removable
+udisks_drive_set_optical
+udisks_drive_set_optical_blank
+udisks_drive_set_optical_num_tracks
+udisks_drive_set_optical_num_audio_tracks
+udisks_drive_set_optical_num_data_tracks
+udisks_drive_set_optical_num_sessions
 udisks_drive_set_model
 udisks_drive_set_revision
 udisks_drive_set_rotation_rate
index da98af3..8ca3080 100644 (file)
@@ -196,6 +196,12 @@ set_media (UDisksDrive      *iface,
   guint n;
   GPtrArray *media_compat_array;
   const gchar *media_in_drive;
+  gboolean is_disc = FALSE;
+  gboolean disc_is_blank = FALSE;
+  guint disc_session_count = 0;
+  guint disc_track_count = 0;
+  guint disc_track_count_audio = 0;
+  guint disc_track_count_data = 0;
 
   media_compat_array = g_ptr_array_new ();
   for (n = 0; drive_media_mapping[n].udev_property != NULL; n++)
@@ -228,6 +234,25 @@ set_media (UDisksDrive      *iface,
   udisks_drive_set_media_compatibility (iface, (const gchar* const *) media_compat_array->pdata);
   udisks_drive_set_media (iface, media_in_drive);
   g_ptr_array_free (media_compat_array, TRUE);
+
+  if (g_udev_device_get_property_as_boolean (device, "ID_CDROM_MEDIA"))
+    {
+      const gchar *state;
+      is_disc = TRUE;
+      state = g_udev_device_get_property (device, "ID_CDROM_MEDIA_STATE");
+      if (g_strcmp0 (state, "blank") == 0)
+        disc_is_blank = TRUE;
+      disc_session_count = g_udev_device_get_property_as_int (device, "ID_CDROM_MEDIA_SESSION_COUNT");
+      disc_track_count = g_udev_device_get_property_as_int (device, "ID_CDROM_MEDIA_TRACK_COUNT");
+      disc_track_count_audio = g_udev_device_get_property_as_int (device, "ID_CDROM_MEDIA_TRACK_COUNT_AUDIO");
+      disc_track_count_data = g_udev_device_get_property_as_int (device, "ID_CDROM_MEDIA_TRACK_COUNT_DATA");
+    }
+  udisks_drive_set_optical (iface, is_disc);
+  udisks_drive_set_optical_blank (iface, disc_is_blank);
+  udisks_drive_set_optical_num_sessions (iface, disc_session_count);
+  udisks_drive_set_optical_num_tracks (iface, disc_track_count);
+  udisks_drive_set_optical_num_audio_tracks (iface, disc_track_count_audio);
+  udisks_drive_set_optical_num_data_tracks (iface, disc_track_count_data);
 }
 
 static void
index b2eed15..cfa3286 100644 (file)
@@ -563,7 +563,33 @@ udisks_util_get_drive_info (UDisksDrive  *drive,
       g_free (s);
     }
 
-  /* TODO: prepend "Blank ", "Mixed " or "Audio " for optical discs */
+  /* prepend a qualifier to the media description, based on the disc state */
+  if (udisks_drive_get_optical_blank (drive))
+    {
+      gchar *s;
+      /* Translators: String used for a blank disc. The %s is the disc type e.g. "CD-RW Disc" */
+      s = g_strdup_printf (_("Blank %s"), media_description);
+      g_free (media_description);
+      media_description = s;
+    }
+  else if (udisks_drive_get_optical_num_audio_tracks (drive) > 0 &&
+           udisks_drive_get_optical_num_data_tracks (drive) > 0)
+    {
+      gchar *s;
+      /* Translators: String used for a mixed disc. The %s is the disc type e.g. "CD-ROM Disc" */
+      s = g_strdup_printf (_("Mixed %s"), media_description);
+      g_free (media_description);
+      media_description = s;
+    }
+  else if (udisks_drive_get_optical_num_audio_tracks (drive) > 0 &&
+           udisks_drive_get_optical_num_data_tracks (drive) == 0)
+    {
+      gchar *s;
+      /* Translators: String used for an audio disc. The %s is the disc type e.g. "CD-ROM Disc" */
+      s = g_strdup_printf (_("Audio %s"), media_description);
+      g_free (media_description);
+      media_description = s;
+    }
 
   /* return values to caller */
   if (out_name != NULL)