From f64fd3979c68de3bb17b8d0fdd4539db62022fe1 Mon Sep 17 00:00:00 2001 From: David Zeuthen Date: Fri, 6 Jun 2008 21:17:04 -0400 Subject: [PATCH] add support for optical discs and rework media type handling In particular, use the data exported by the newly rewritten cdrom_id program; reported a few bugs to Kay about that one. --- doc/TODO | 4 +- src/95-devkit-disks.rules | 27 +-- src/devkit-disks-device-private.h | 10 + src/devkit-disks-device.c | 324 ++++++++++++++++++++++++- src/org.freedesktop.DeviceKit.Disks.Device.xml | 74 +++++- tools/devkit-disks.c | 41 +++- 6 files changed, 451 insertions(+), 29 deletions(-) diff --git a/doc/TODO b/doc/TODO index 984194f..3b49be2 100644 --- a/doc/TODO +++ b/doc/TODO @@ -54,8 +54,6 @@ Before (next) release: - Poll storage devices - - Use new cdrom_id attrs from udev - - Need to figure out what PolicyKit authorizations to use - it's really a big mess right now @@ -78,6 +76,8 @@ Before (next) release: unlocked by someone else? Should probably require a separate authorization + - Document what udev properties we rely on + ------------------------------------------------------------------------ - Current features (TODO: this section is incomplete) ------------------------------------------------------------------------ diff --git a/src/95-devkit-disks.rules b/src/95-devkit-disks.rules index 39f3ebc..65cec62 100644 --- a/src/95-devkit-disks.rules +++ b/src/95-devkit-disks.rules @@ -9,24 +9,15 @@ KERNEL=="hd*[0-9]", ATTR{removable}=="1", GOTO="probe_parttable_end" # Example rule for tagging a device with a specific media type. Where and # how to store this database needs some thought. # -SYSFS{idVendor}=="050d", SYSFS{idProduct}=="0248", ENV{ID_INSTANCE}=="0:0", ENV{COMPAT_MEDIA_TYPE}="flash_cf" -SYSFS{idVendor}=="050d", SYSFS{idProduct}=="0248", ENV{ID_INSTANCE}=="0:1", ENV{COMPAT_MEDIA_TYPE}="flash_ms" -SYSFS{idVendor}=="050d", SYSFS{idProduct}=="0248", ENV{ID_INSTANCE}=="0:2", ENV{COMPAT_MEDIA_TYPE}="flash_sm" -SYSFS{idVendor}=="050d", SYSFS{idProduct}=="0248", ENV{ID_INSTANCE}=="0:3", ENV{COMPAT_MEDIA_TYPE}="flash_sd" - -SYSFS{idVendor}=="05e3", SYSFS{idProduct}=="070e", ENV{ID_INSTANCE}=="0:0", ENV{COMPAT_MEDIA_TYPE}="flash_cf" -SYSFS{idVendor}=="05e3", SYSFS{idProduct}=="070e", ENV{ID_INSTANCE}=="0:1", ENV{COMPAT_MEDIA_TYPE}="flash_sm" -SYSFS{idVendor}=="05e3", SYSFS{idProduct}=="070e", ENV{ID_INSTANCE}=="0:2", ENV{COMPAT_MEDIA_TYPE}="flash_sd" -SYSFS{idVendor}=="05e3", SYSFS{idProduct}=="070e", ENV{ID_INSTANCE}=="0:3", ENV{COMPAT_MEDIA_TYPE}="flash_ms" - -# The following needs to come from cdrom_id and needs to set -# more than just "optical". See the drive-media property. -# -ENV{ID_CDROM}=="1", ENV{COMPAT_MEDIA_TYPE}="optical" - -# Right now we just default to the first type of media the drive supports -ENV{COMPAT_MEDIA_TYPE}!="", ENV{MEDIA_TYPE}="$env{COMPAT_MEDIA_TYPE}" - +SYSFS{idVendor}=="050d", SYSFS{idProduct}=="0248", ENV{ID_INSTANCE}=="0:0", ENV{ID_DRIVE_FLASH_CF}="1" +SYSFS{idVendor}=="050d", SYSFS{idProduct}=="0248", ENV{ID_INSTANCE}=="0:1", ENV{ID_DRIVE_FLASH_MS}="1" +SYSFS{idVendor}=="050d", SYSFS{idProduct}=="0248", ENV{ID_INSTANCE}=="0:2", ENV{ID_DRIVE_FLASH_SM}="1" +SYSFS{idVendor}=="050d", SYSFS{idProduct}=="0248", ENV{ID_INSTANCE}=="0:3", ENV{ID_DRIVE_FLASH_SD}="1" + +SYSFS{idVendor}=="05e3", SYSFS{idProduct}=="070e", ENV{ID_INSTANCE}=="0:0", ENV{ID_DRIVE_FLASH_CF}="1" +SYSFS{idVendor}=="05e3", SYSFS{idProduct}=="070e", ENV{ID_INSTANCE}=="0:1", ENV{ID_DRIVE_FLASH_SM}="1" +SYSFS{idVendor}=="05e3", SYSFS{idProduct}=="070e", ENV{ID_INSTANCE}=="0:2", ENV{ID_DRIVE_FLASH_SD}="1" +SYSFS{idVendor}=="05e3", SYSFS{idProduct}=="070e", ENV{ID_INSTANCE}=="0:3", ENV{ID_DRIVE_FLASH_MS}="1" # scan for partition table only if we're not a partition # diff --git a/src/devkit-disks-device-private.h b/src/devkit-disks-device-private.h index 2eeb576..d1ba21c 100644 --- a/src/devkit-disks-device-private.h +++ b/src/devkit-disks-device-private.h @@ -86,6 +86,7 @@ struct DevkitDisksDevicePrivate gboolean device_is_media_available; gboolean device_is_read_only; gboolean device_is_drive; + gboolean device_is_optical_disc; gboolean device_is_luks_cleartext; gboolean device_is_linux_md_component; gboolean device_is_linux_md; @@ -126,6 +127,15 @@ struct DevkitDisksDevicePrivate GPtrArray *drive_media_compatibility; char *drive_media; + gboolean optical_disc_is_recordable; + gboolean optical_disc_is_rewritable; + gboolean optical_disc_is_blank; + gboolean optical_disc_is_appendable; + gboolean optical_disc_is_closed; + gboolean optical_disc_has_audio; + guint optical_disc_num_tracks; + guint optical_disc_num_sessions; + char *luks_cleartext_slave; uid_t luks_cleartext_unlocked_by_uid; diff --git a/src/devkit-disks-device.c b/src/devkit-disks-device.c index 415492a..29b6c8d 100644 --- a/src/devkit-disks-device.c +++ b/src/devkit-disks-device.c @@ -128,6 +128,7 @@ enum PROP_DEVICE_IS_MEDIA_AVAILABLE, PROP_DEVICE_IS_READ_ONLY, PROP_DEVICE_IS_DRIVE, + PROP_DEVICE_IS_OPTICAL_DISC, PROP_DEVICE_IS_LUKS_CLEARTEXT, PROP_DEVICE_IS_LINUX_MD_COMPONENT, PROP_DEVICE_IS_LINUX_MD, @@ -181,6 +182,15 @@ enum PROP_DRIVE_MEDIA_COMPATIBILITY, PROP_DRIVE_MEDIA, + PROP_OPTICAL_DISC_IS_RECORDABLE, + PROP_OPTICAL_DISC_IS_REWRITABLE, + PROP_OPTICAL_DISC_IS_BLANK, + PROP_OPTICAL_DISC_IS_APPENDABLE, + PROP_OPTICAL_DISC_IS_CLOSED, + PROP_OPTICAL_DISC_HAS_AUDIO, + PROP_OPTICAL_DISC_NUM_TRACKS, + PROP_OPTICAL_DISC_NUM_SESSIONS, + PROP_DRIVE_SMART_IS_CAPABLE, PROP_DRIVE_SMART_IS_ENABLED, PROP_DRIVE_SMART_TIME_COLLECTED, @@ -284,6 +294,9 @@ get_property (GObject *object, case PROP_DEVICE_IS_DRIVE: g_value_set_boolean (value, device->priv->info.device_is_drive); break; + case PROP_DEVICE_IS_OPTICAL_DISC: + g_value_set_boolean (value, device->priv->info.device_is_optical_disc); + break; case PROP_DEVICE_IS_LUKS_CLEARTEXT: g_value_set_boolean (value, device->priv->info.device_is_luks_cleartext); break; @@ -436,6 +449,31 @@ get_property (GObject *object, g_value_set_string (value, device->priv->info.drive_media); break; + case PROP_OPTICAL_DISC_IS_RECORDABLE: + g_value_set_boolean (value, device->priv->info.optical_disc_is_recordable); + break; + case PROP_OPTICAL_DISC_IS_REWRITABLE: + g_value_set_boolean (value, device->priv->info.optical_disc_is_rewritable); + break; + case PROP_OPTICAL_DISC_IS_BLANK: + g_value_set_boolean (value, device->priv->info.optical_disc_is_blank); + break; + case PROP_OPTICAL_DISC_IS_APPENDABLE: + g_value_set_boolean (value, device->priv->info.optical_disc_is_appendable); + break; + case PROP_OPTICAL_DISC_IS_CLOSED: + g_value_set_boolean (value, device->priv->info.optical_disc_is_closed); + break; + case PROP_OPTICAL_DISC_HAS_AUDIO: + g_value_set_boolean (value, device->priv->info.optical_disc_has_audio); + break; + case PROP_OPTICAL_DISC_NUM_TRACKS: + g_value_set_uint (value, device->priv->info.optical_disc_num_tracks); + break; + case PROP_OPTICAL_DISC_NUM_SESSIONS: + g_value_set_uint (value, device->priv->info.optical_disc_num_sessions); + break; + case PROP_DRIVE_SMART_IS_CAPABLE: g_value_set_boolean (value, device->priv->drive_smart_is_capable); break; @@ -607,6 +645,10 @@ devkit_disks_device_class_init (DevkitDisksDeviceClass *klass) g_param_spec_boolean ("device-is-drive", NULL, NULL, FALSE, G_PARAM_READABLE)); g_object_class_install_property ( object_class, + PROP_DEVICE_IS_OPTICAL_DISC, + g_param_spec_boolean ("device-is-optical-disc", NULL, NULL, FALSE, G_PARAM_READABLE)); + g_object_class_install_property ( + object_class, PROP_DEVICE_IS_LUKS_CLEARTEXT, g_param_spec_boolean ("device-is-luks-cleartext", NULL, NULL, FALSE, G_PARAM_READABLE)); g_object_class_install_property ( @@ -806,6 +848,39 @@ devkit_disks_device_class_init (DevkitDisksDeviceClass *klass) g_object_class_install_property ( object_class, + PROP_OPTICAL_DISC_IS_RECORDABLE, + g_param_spec_boolean ("optical-disc-is-recordable", NULL, NULL, FALSE, G_PARAM_READABLE)); + g_object_class_install_property ( + object_class, + PROP_OPTICAL_DISC_IS_REWRITABLE, + g_param_spec_boolean ("optical-disc-is-rewritable", NULL, NULL, FALSE, G_PARAM_READABLE)); + g_object_class_install_property ( + object_class, + PROP_OPTICAL_DISC_IS_BLANK, + g_param_spec_boolean ("optical-disc-is-blank", NULL, NULL, FALSE, G_PARAM_READABLE)); + g_object_class_install_property ( + object_class, + PROP_OPTICAL_DISC_IS_APPENDABLE, + g_param_spec_boolean ("optical-disc-is-appendable", NULL, NULL, FALSE, G_PARAM_READABLE)); + g_object_class_install_property ( + object_class, + PROP_OPTICAL_DISC_IS_CLOSED, + g_param_spec_boolean ("optical-disc-is-closed", NULL, NULL, FALSE, G_PARAM_READABLE)); + g_object_class_install_property ( + object_class, + PROP_OPTICAL_DISC_HAS_AUDIO, + g_param_spec_boolean ("optical-disc-has-audio", NULL, NULL, FALSE, G_PARAM_READABLE)); + g_object_class_install_property ( + object_class, + PROP_OPTICAL_DISC_NUM_TRACKS, + g_param_spec_uint ("optical-disc-num-tracks", NULL, NULL, 0, G_MAXUINT, 0, G_PARAM_READABLE)); + g_object_class_install_property ( + object_class, + PROP_OPTICAL_DISC_NUM_SESSIONS, + g_param_spec_uint ("optical-disc-num-sessions", NULL, NULL, 0, G_MAXUINT, 0, G_PARAM_READABLE)); + + g_object_class_install_property ( + object_class, PROP_DRIVE_SMART_IS_CAPABLE, g_param_spec_boolean ("drive-smart-is-capable", NULL, NULL, FALSE, G_PARAM_READABLE)); g_object_class_install_property ( @@ -1428,13 +1503,237 @@ update_info_properties_cb (DevkitDevice *d, const char *key, const char *value, } } - } else if (strcmp (key, "COMPAT_MEDIA_TYPE") == 0) { - char **tokens = devkit_device_dup_property_as_strv (d, key); - for (n = 0; tokens[n] != NULL; n++) - g_ptr_array_add (device->priv->info.drive_media_compatibility, tokens[n]); - g_free (tokens); - } else if (strcmp (key, "MEDIA_TYPE") == 0) { - device->priv->info.drive_media = g_strdup (value); + /* ---------------------------------------------------------------------------------------------------- */ + + } else if (strcmp (key, "ID_DRIVE_FLASH") == 0 && strcmp (value, "1") == 0) { + g_ptr_array_add (device->priv->info.drive_media_compatibility, g_strdup ("flash")); + } else if (strcmp (key, "ID_DRIVE_FLASH_CF") == 0 && strcmp (value, "1") == 0) { + g_ptr_array_add (device->priv->info.drive_media_compatibility, g_strdup ("flash_cf")); + } else if (strcmp (key, "ID_DRIVE_FLASH_MS") == 0 && strcmp (value, "1") == 0) { + g_ptr_array_add (device->priv->info.drive_media_compatibility, g_strdup ("flash_ms")); + } else if (strcmp (key, "ID_DRIVE_FLASH_SM") == 0 && strcmp (value, "1") == 0) { + g_ptr_array_add (device->priv->info.drive_media_compatibility, g_strdup ("flash_sm")); + } else if (strcmp (key, "ID_DRIVE_FLASH_SD") == 0 && strcmp (value, "1") == 0) { + g_ptr_array_add (device->priv->info.drive_media_compatibility, g_strdup ("flash_sd")); + } else if (strcmp (key, "ID_DRIVE_FLASH_SDHC") == 0 && strcmp (value, "1") == 0) { + g_ptr_array_add (device->priv->info.drive_media_compatibility, g_strdup ("flash_sdhc")); + } else if (strcmp (key, "ID_DRIVE_FLASH_MMC") == 0 && strcmp (value, "1") == 0) { + g_ptr_array_add (device->priv->info.drive_media_compatibility, g_strdup ("flash_mmc")); + } else if (strcmp (key, "ID_DRIVE_FLOPPY") == 0 && strcmp (value, "1") == 0) { + g_ptr_array_add (device->priv->info.drive_media_compatibility, g_strdup ("floppy")); + } else if (strcmp (key, "ID_DRIVE_FLOPPY_ZIP") == 0 && strcmp (value, "1") == 0) { + g_ptr_array_add (device->priv->info.drive_media_compatibility, g_strdup ("floppy_zip")); + } else if (strcmp (key, "ID_DRIVE_FLOPPY_JAZ") == 0 && strcmp (value, "1") == 0) { + g_ptr_array_add (device->priv->info.drive_media_compatibility, g_strdup ("floppy_jaz")); + + /* ---------------------------------------------------------------------------------------------------- */ + + } else if (strcmp (key, "ID_DRIVE_MEDIA_FLASH") == 0 && strcmp (value, "1") == 0) { + g_free (device->priv->info.drive_media); + device->priv->info.drive_media = g_strdup ("flash"); + } else if (strcmp (key, "ID_DRIVE_MEDIA_FLASH_CF") == 0 && strcmp (value, "1") == 0) { + g_free (device->priv->info.drive_media); + device->priv->info.drive_media = g_strdup ("flash_cf"); + } else if (strcmp (key, "ID_DRIVE_MEDIA_FLASH_MS") == 0 && strcmp (value, "1") == 0) { + g_free (device->priv->info.drive_media); + device->priv->info.drive_media = g_strdup ("flash_ms"); + } else if (strcmp (key, "ID_DRIVE_MEDIA_FLASH_SM") == 0 && strcmp (value, "1") == 0) { + g_free (device->priv->info.drive_media); + device->priv->info.drive_media = g_strdup ("flash_sm"); + } else if (strcmp (key, "ID_DRIVE_MEDIA_FLASH_SD") == 0 && strcmp (value, "1") == 0) { + g_free (device->priv->info.drive_media); + device->priv->info.drive_media = g_strdup ("flash_sd"); + } else if (strcmp (key, "ID_DRIVE_MEDIA_FLASH_SDHC") == 0 && strcmp (value, "1") == 0) { + g_free (device->priv->info.drive_media); + device->priv->info.drive_media = g_strdup ("flash_sdhc"); + } else if (strcmp (key, "ID_DRIVE_MEDIA_FLASH_MMC") == 0 && strcmp (value, "1") == 0) { + g_free (device->priv->info.drive_media); + device->priv->info.drive_media = g_strdup ("flash_mmc"); + } else if (strcmp (key, "ID_DRIVE_MEDIA_FLOPPY") == 0 && strcmp (value, "1") == 0) { + g_free (device->priv->info.drive_media); + device->priv->info.drive_media = g_strdup ("floppy"); + } else if (strcmp (key, "ID_DRIVE_MEDIA_FLOPPY_ZIP") == 0 && strcmp (value, "1") == 0) { + g_free (device->priv->info.drive_media); + device->priv->info.drive_media = g_strdup ("floppy_zip"); + } else if (strcmp (key, "ID_DRIVE_MEDIA_FLOPPY_JAZ") == 0 && strcmp (value, "1") == 0) { + g_free (device->priv->info.drive_media); + device->priv->info.drive_media = g_strdup ("floppy_jaz"); + + /* ---------------------------------------------------------------------------------------------------- */ + + } else if (strcmp (key, "ID_CDROM_MEDIA_TRACK_COUNT") == 0) { + device->priv->info.optical_disc_num_tracks = devkit_device_get_property_as_int (d, key); + device->priv->info.device_is_optical_disc = TRUE; + } else if (strcmp (key, "ID_CDROM_MEDIA_SESSION_COUNT") == 0) { + device->priv->info.optical_disc_num_sessions = devkit_device_get_property_as_int (d, key); + device->priv->info.device_is_optical_disc = TRUE; + } else if (strcmp (key, "ID_CDROM_MEDIA_STATE") == 0) { + device->priv->info.device_is_optical_disc = TRUE; + if (strcmp (value, "blank") == 0) { + device->priv->info.optical_disc_is_blank = TRUE; + } else if (strcmp (value, "appendable") == 0) { + device->priv->info.optical_disc_is_appendable = TRUE; + } else if (strcmp (value, "complete") == 0) { + device->priv->info.optical_disc_is_closed = TRUE; + } + } else if (strcmp (key, "ID_CDROM_MEDIA_HAS_AUDIO") == 0 && strcmp (value, "1") == 0) { + device->priv->info.device_is_optical_disc = TRUE; + device->priv->info.optical_disc_has_audio = TRUE; + + /* ---------------------------------------------------------------------------------------------------- */ + + } else if (strcmp (key, "ID_CDROM") == 0 && strcmp (value, "1") == 0) { + g_ptr_array_add (device->priv->info.drive_media_compatibility, g_strdup ("optical_cd")); + } else if (strcmp (key, "ID_CDROM_CD") == 0 && strcmp (value, "1") == 0) { + g_ptr_array_add (device->priv->info.drive_media_compatibility, g_strdup ("optical_cd")); + } else if (strcmp (key, "ID_CDROM_CD_R") == 0 && strcmp (value, "1") == 0) { + g_ptr_array_add (device->priv->info.drive_media_compatibility, g_strdup ("optical_cd_r")); + } else if (strcmp (key, "ID_CDROM_CD_RW") == 0 && strcmp (value, "1") == 0) { + g_ptr_array_add (device->priv->info.drive_media_compatibility, g_strdup ("optical_cd_rw")); + + } else if (strcmp (key, "ID_CDROM_DVD") == 0 && strcmp (value, "1") == 0) { + g_ptr_array_add (device->priv->info.drive_media_compatibility, g_strdup ("optical_dvd")); + } else if (strcmp (key, "ID_CDROM_DVD_R") == 0 && strcmp (value, "1") == 0) { + g_ptr_array_add (device->priv->info.drive_media_compatibility, g_strdup ("optical_dvd_r")); + } else if (strcmp (key, "ID_CDROM_DVD_RW") == 0 && strcmp (value, "1") == 0) { + g_ptr_array_add (device->priv->info.drive_media_compatibility, g_strdup ("optical_dvd_rw")); + } else if (strcmp (key, "ID_CDROM_DVD_RAM") == 0 && strcmp (value, "1") == 0) { + g_ptr_array_add (device->priv->info.drive_media_compatibility, g_strdup ("optical_dvd_ram")); + } else if (strcmp (key, "ID_CDROM_DVD_PLUS_R") == 0 && strcmp (value, "1") == 0) { + g_ptr_array_add (device->priv->info.drive_media_compatibility, g_strdup ("optical_dvd_plus_r")); + } else if (strcmp (key, "ID_CDROM_DVD_PLUS_RW") == 0 && strcmp (value, "1") == 0) { + g_ptr_array_add (device->priv->info.drive_media_compatibility, g_strdup ("optical_dvd_plus_rw")); + } else if (strcmp (key, "ID_CDROM_DVD_PLUS_R_DL") == 0 && strcmp (value, "1") == 0) { + g_ptr_array_add (device->priv->info.drive_media_compatibility, g_strdup ("optical_dvd_plus_r_dl")); + } else if (strcmp (key, "ID_CDROM_DVD_PlUS_RW_DL") == 0 && strcmp (value, "1") == 0) { + g_ptr_array_add (device->priv->info.drive_media_compatibility, g_strdup ("optical_dvd_plus_rw_dl")); + + } else if (strcmp (key, "ID_CDROM_BD") == 0 && strcmp (value, "1") == 0) { + g_ptr_array_add (device->priv->info.drive_media_compatibility, g_strdup ("optical_bd")); + } else if (strcmp (key, "ID_CDROM_BD_R") == 0 && strcmp (value, "1") == 0) { + g_ptr_array_add (device->priv->info.drive_media_compatibility, g_strdup ("optical_bd_r")); + } else if (strcmp (key, "ID_CDROM_BD_RE") == 0 && strcmp (value, "1") == 0) { + g_ptr_array_add (device->priv->info.drive_media_compatibility, g_strdup ("optical_bd_re")); + + } else if (strcmp (key, "ID_CDROM_HDDVD") == 0 && strcmp (value, "1") == 0) { + g_ptr_array_add (device->priv->info.drive_media_compatibility, g_strdup ("optical_hddvd")); + } else if (strcmp (key, "ID_CDROM_HDDVD_R") == 0 && strcmp (value, "1") == 0) { + g_ptr_array_add (device->priv->info.drive_media_compatibility, g_strdup ("optical_hddvd_r")); + } else if (strcmp (key, "ID_CDROM_HDDVD_RW") == 0 && strcmp (value, "1") == 0) { + g_ptr_array_add (device->priv->info.drive_media_compatibility, g_strdup ("optical_hddvd_rw")); + + } else if (strcmp (key, "ID_CDROM_MO") == 0 && strcmp (value, "1") == 0) { + g_ptr_array_add (device->priv->info.drive_media_compatibility, g_strdup ("optical_mo")); + + } else if (strcmp (key, "ID_CDROM_MRW") == 0 && strcmp (value, "1") == 0) { + g_ptr_array_add (device->priv->info.drive_media_compatibility, g_strdup ("optical_mrw")); + } else if (strcmp (key, "ID_CDROM_MRW_W") == 0 && strcmp (value, "1") == 0) { + g_ptr_array_add (device->priv->info.drive_media_compatibility, g_strdup ("optical_mrw_w")); + + /* ---------------------------------------------------------------------------------------------------- */ + + } else if (strcmp (key, "ID_CDROM_MEDIA_CD") == 0 && strcmp (value, "1") == 0) { + device->priv->info.device_is_optical_disc = TRUE; + g_free (device->priv->info.drive_media); + device->priv->info.drive_media = g_strdup ("optical_cd"); + } else if (strcmp (key, "ID_CDROM_MEDIA_CD_R") == 0 && strcmp (value, "1") == 0) { + device->priv->info.device_is_optical_disc = TRUE; + g_free (device->priv->info.drive_media); + device->priv->info.drive_media = g_strdup ("optical_cd_r"); + } else if (strcmp (key, "ID_CDROM_MEDIA_CD_RW") == 0 && strcmp (value, "1") == 0) { + device->priv->info.device_is_optical_disc = TRUE; + g_free (device->priv->info.drive_media); + device->priv->info.drive_media = g_strdup ("optical_cd_rw"); + + } else if (strcmp (key, "ID_CDROM_MEDIA_DVD") == 0 && strcmp (value, "1") == 0) { + device->priv->info.device_is_optical_disc = TRUE; + g_free (device->priv->info.drive_media); + device->priv->info.drive_media = g_strdup ("optical_dvd"); + } else if (strcmp (key, "ID_CDROM_MEDIA_DVD_R") == 0 && strcmp (value, "1") == 0) { + device->priv->info.device_is_optical_disc = TRUE; + device->priv->info.optical_disc_is_recordable = TRUE; + g_free (device->priv->info.drive_media); + device->priv->info.drive_media = g_strdup ("optical_dvd_r"); + } else if (strcmp (key, "ID_CDROM_MEDIA_DVD_RW") == 0 && strcmp (value, "1") == 0) { + device->priv->info.device_is_optical_disc = TRUE; + device->priv->info.optical_disc_is_recordable = TRUE; + device->priv->info.optical_disc_is_rewritable = TRUE; + g_free (device->priv->info.drive_media); + device->priv->info.drive_media = g_strdup ("optical_dvd_rw"); + } else if (strcmp (key, "ID_CDROM_MEDIA_DVD_RAM") == 0 && strcmp (value, "1") == 0) { + device->priv->info.device_is_optical_disc = TRUE; + device->priv->info.optical_disc_is_recordable = TRUE; + device->priv->info.optical_disc_is_rewritable = TRUE; + g_free (device->priv->info.drive_media); + device->priv->info.drive_media = g_strdup ("optical_dvd_ram"); + } else if (strcmp (key, "ID_CDROM_MEDIA_DVD_PLUS_R") == 0 && strcmp (value, "1") == 0) { + device->priv->info.device_is_optical_disc = TRUE; + device->priv->info.optical_disc_is_recordable = TRUE; + g_free (device->priv->info.drive_media); + device->priv->info.drive_media = g_strdup ("optical_dvd_plus_r"); + } else if (strcmp (key, "ID_CDROM_MEDIA_DVD_PLUS_RW") == 0 && strcmp (value, "1") == 0) { + device->priv->info.device_is_optical_disc = TRUE; + device->priv->info.optical_disc_is_recordable = TRUE; + device->priv->info.optical_disc_is_rewritable = TRUE; + g_free (device->priv->info.drive_media); + device->priv->info.drive_media = g_strdup ("optical_dvd_plus_rw"); + } else if (strcmp (key, "ID_CDROM_MEDIA_DVD_PLUS_R_DL") == 0 && strcmp (value, "1") == 0) { + device->priv->info.device_is_optical_disc = TRUE; + device->priv->info.optical_disc_is_recordable = TRUE; + g_free (device->priv->info.drive_media); + device->priv->info.drive_media = g_strdup ("optical_dvd_plus_r_dl"); + } else if (strcmp (key, "ID_CDROM_MEDIA_DVD_PlUS_RW_DL") == 0 && strcmp (value, "1") == 0) { + device->priv->info.device_is_optical_disc = TRUE; + device->priv->info.optical_disc_is_recordable = TRUE; + device->priv->info.optical_disc_is_rewritable = TRUE; + g_free (device->priv->info.drive_media); + device->priv->info.drive_media = g_strdup ("optical_dvd_plus_rw_dl"); + + } else if (strcmp (key, "ID_CDROM_MEDIA_BD") == 0 && strcmp (value, "1") == 0) { + device->priv->info.device_is_optical_disc = TRUE; + g_free (device->priv->info.drive_media); + device->priv->info.drive_media = g_strdup ("optical_bd"); + } else if (strcmp (key, "ID_CDROM_MEDIA_BD_R") == 0 && strcmp (value, "1") == 0) { + device->priv->info.device_is_optical_disc = TRUE; + device->priv->info.optical_disc_is_recordable = TRUE; + g_free (device->priv->info.drive_media); + device->priv->info.drive_media = g_strdup ("optical_bd_r"); + } else if (strcmp (key, "ID_CDROM_MEDIA_BD_RE") == 0 && strcmp (value, "1") == 0) { + device->priv->info.device_is_optical_disc = TRUE; + device->priv->info.optical_disc_is_recordable = TRUE; + device->priv->info.optical_disc_is_rewritable = TRUE; + g_free (device->priv->info.drive_media); + device->priv->info.drive_media = g_strdup ("optical_bd_re"); + + } else if (strcmp (key, "ID_CDROM_MEDIA_HDDVD") == 0 && strcmp (value, "1") == 0) { + device->priv->info.device_is_optical_disc = TRUE; + g_free (device->priv->info.drive_media); + device->priv->info.drive_media = g_strdup ("optical_hddvd"); + } else if (strcmp (key, "ID_CDROM_MEDIA_HDDVD_R") == 0 && strcmp (value, "1") == 0) { + device->priv->info.device_is_optical_disc = TRUE; + device->priv->info.optical_disc_is_recordable = TRUE; + g_free (device->priv->info.drive_media); + device->priv->info.drive_media = g_strdup ("optical_hddvd_r"); + } else if (strcmp (key, "ID_CDROM_MEDIA_HDDVD_RW") == 0 && strcmp (value, "1") == 0) { + device->priv->info.device_is_optical_disc = TRUE; + device->priv->info.optical_disc_is_recordable = TRUE; + device->priv->info.optical_disc_is_rewritable = TRUE; + g_free (device->priv->info.drive_media); + device->priv->info.drive_media = g_strdup ("optical_hddvd_rw"); + + } else if (strcmp (key, "ID_CDROM_MEDIA_MO") == 0 && strcmp (value, "1") == 0) { + g_free (device->priv->info.drive_media); + device->priv->info.drive_media = g_strdup ("optical_mo"); + + } else if (strcmp (key, "ID_CDROM_MEDIA_MRW") == 0 && strcmp (value, "1") == 0) { + g_free (device->priv->info.drive_media); + device->priv->info.drive_media = g_strdup ("optical_mrw"); + } else if (strcmp (key, "ID_CDROM_MEDIA_MRW_W") == 0 && strcmp (value, "1") == 0) { + device->priv->info.device_is_optical_disc = TRUE; + device->priv->info.optical_disc_is_recordable = TRUE; + device->priv->info.optical_disc_is_rewritable = TRUE; + g_free (device->priv->info.drive_media); + device->priv->info.drive_media = g_strdup ("optical_mrw_w"); } else if (strcmp (key, "MEDIA_AVAILABLE") == 0) { @@ -1896,6 +2195,17 @@ update_info (DevkitDisksDevice *device) goto out; } + if (device->priv->info.drive_media_compatibility->len > 0) { + /* make sure compat media is sorted */ + g_ptr_array_sort (device->priv->info.drive_media_compatibility, (GCompareFunc) strcmp); + + /* if we don't know the media but do know the media compat, just select the first one */ + if (device->priv->info.drive_media == NULL) { + device->priv->info.drive_media = + g_strdup (device->priv->info.drive_media_compatibility->pdata[0]); + } + } + update_slaves (device); /* Linux MD detection */ diff --git a/src/org.freedesktop.DeviceKit.Disks.Device.xml b/src/org.freedesktop.DeviceKit.Disks.Device.xml index b29b472..360a371 100644 --- a/src/org.freedesktop.DeviceKit.Disks.Device.xml +++ b/src/org.freedesktop.DeviceKit.Disks.Device.xml @@ -1276,7 +1276,14 @@ - TRUE if the device is a drive. See drive- properties for details. + TRUE if the device is a drive. + See the drive- properties for details. + + + + + TRUE if the device is an optical drive and an optical disc is inserted. + See the optical-disc- properties for details. @@ -1903,6 +1910,71 @@ + + + TRUE only if the disc is recordable. + This property is only valid if + device-is-optical-disc + is TRUE. + + + + + TRUE only if the disc is rewritable. + This property is only valid if + device-is-optical-disc + is TRUE. + + + + + TRUE only if the disc is appendable. + This property is only valid if + device-is-optical-disc + is TRUE. + + + + + TRUE only if the disc is appendable. + This property is only valid if + device-is-optical-disc + is TRUE. + + + + + TRUE only if the disc is appendable. + This property is only valid if + device-is-optical-disc + is TRUE. + + + + + TRUE only if the disc contains audio tracks. + This property is only valid if + device-is-optical-disc + is TRUE. + + + + + Number of tracks on the disc. + This property is only valid if + device-is-optical-disc + is TRUE. + + + + + Number of sessions on the disc. + This property is only valid if + device-is-optical-disc + is TRUE. + + + TRUE only if drive is diff --git a/tools/devkit-disks.c b/tools/devkit-disks.c index 28d18b2..5df7d91 100644 --- a/tools/devkit-disks.c +++ b/tools/devkit-disks.c @@ -407,6 +407,7 @@ typedef struct gboolean device_is_media_available; gboolean device_is_read_only; gboolean device_is_drive; + gboolean device_is_optical_disc; gboolean device_is_luks_cleartext; gboolean device_is_mounted; gboolean device_is_busy; @@ -460,6 +461,15 @@ typedef struct char **drive_media_compatibility; char *drive_media; + gboolean optical_disc_is_recordable; + gboolean optical_disc_is_rewritable; + gboolean optical_disc_is_blank; + gboolean optical_disc_is_appendable; + gboolean optical_disc_is_closed; + gboolean optical_disc_has_audio; + guint optical_disc_num_tracks; + guint optical_disc_num_sessions; + gboolean drive_smart_is_capable; gboolean drive_smart_is_enabled; guint64 drive_smart_time_collected; @@ -516,6 +526,8 @@ collect_props (const char *key, const GValue *value, DeviceProperties *props) props->device_is_read_only = g_value_get_boolean (value); else if (strcmp (key, "device-is-drive") == 0) props->device_is_drive = g_value_get_boolean (value); + else if (strcmp (key, "device-is-optical-disc") == 0) + props->device_is_optical_disc = g_value_get_boolean (value); else if (strcmp (key, "device-is-luks-cleartext") == 0) props->device_is_luks_cleartext = g_value_get_boolean (value); else if (strcmp (key, "device-is-linux-md-component") == 0) @@ -622,6 +634,23 @@ collect_props (const char *key, const GValue *value, DeviceProperties *props) else if (strcmp (key, "drive-media") == 0) props->drive_media = g_strdup (g_value_get_string (value)); + else if (strcmp (key, "optical-disc-is-recordable") == 0) + props->optical_disc_is_recordable = g_value_get_boolean (value); + else if (strcmp (key, "optical-disc-is-rewritable") == 0) + props->optical_disc_is_rewritable = g_value_get_boolean (value); + else if (strcmp (key, "optical-disc-is-blank") == 0) + props->optical_disc_is_blank = g_value_get_boolean (value); + else if (strcmp (key, "optical-disc-is-appendable") == 0) + props->optical_disc_is_appendable = g_value_get_boolean (value); + else if (strcmp (key, "optical-disc-is-closed") == 0) + props->optical_disc_is_closed = g_value_get_boolean (value); + else if (strcmp (key, "optical-disc-has-audio") == 0) + props->optical_disc_has_audio = g_value_get_boolean (value); + else if (strcmp (key, "optical-disc-num-tracks") == 0) + props->optical_disc_num_tracks = g_value_get_uint (value); + else if (strcmp (key, "optical-disc-num-sessions") == 0) + props->optical_disc_num_sessions = g_value_get_uint (value); + else if (strcmp (key, "drive-smart-is-capable") == 0) props->drive_smart_is_capable = g_value_get_boolean (value); else if (strcmp (key, "drive-smart-is-enabled") == 0) @@ -899,6 +928,17 @@ do_show_info (const char *object_path) g_print (" label: %s\n", props->partition_label); g_print (" uuid: %s\n", props->partition_uuid); } + if (props->device_is_optical_disc) { + g_print (" optical disc:\n"); + g_print (" recordable: %d\n", props->optical_disc_is_recordable); + g_print (" rewritable: %d\n", props->optical_disc_is_rewritable); + g_print (" blank: %d\n", props->optical_disc_is_blank); + g_print (" appendable: %d\n", props->optical_disc_is_appendable); + g_print (" closed: %d\n", props->optical_disc_is_closed); + g_print (" has audio: %d\n", props->optical_disc_has_audio); + g_print (" num tracks: %d\n", props->optical_disc_num_tracks); + g_print (" num sessions: %d\n", props->optical_disc_num_sessions); + } if (props->device_is_drive) { g_print (" drive:\n"); g_print (" vendor: %s\n", props->drive_vendor); @@ -919,7 +959,6 @@ do_show_info (const char *object_path) else g_print (" if speed: %" G_GINT64_FORMAT " bits/s\n", props->drive_connection_speed); - g_print (" media: %s\n", props->drive_media); if (!props->drive_smart_is_capable) { g_print (" S.M.A.R.T.: not capable\n"); } else if (props->drive_smart_time_collected == 0) { -- 2.7.4