From 57f27703b0a9189afbde9b40753c9cdd017d2f3a Mon Sep 17 00:00:00 2001 From: David Zeuthen Date: Mon, 15 Jun 2009 11:30:07 -0400 Subject: [PATCH] Remove :drive-requires-eject and read udev props for detached/ejectable --- doc/man/DeviceKit-disks.xml | 26 ++++++++++++++++++ src/95-devkit-disks.rules | 2 +- src/devkit-disks-device-private.c | 10 ------- src/devkit-disks-device-private.h | 2 -- src/devkit-disks-device.c | 37 ++++++++++---------------- src/org.freedesktop.DeviceKit.Disks.Device.xml | 17 +----------- tools/devkit-disks.c | 4 --- 7 files changed, 42 insertions(+), 56 deletions(-) diff --git a/doc/man/DeviceKit-disks.xml b/doc/man/DeviceKit-disks.xml index 8c6e0c8..d903336 100644 --- a/doc/man/DeviceKit-disks.xml +++ b/doc/man/DeviceKit-disks.xml @@ -66,6 +66,32 @@ + + Whether the media in the drive is physically ejectable. Only + set this to 1 (or 0) if the drive truly uses (or doesn't) ejectable media. + In particular, it is not necessary to set this for e.g. iPod or Kindle + devices where it is necessary to send a command via + + eject1 + + since the desktop user session will offer this option for + removable devices regardless of whether they are + ejectable. If this property is not set, a heuristic will + be used to determine if the media is ejectable (drives + using optical, Zip or Jaz media are considered ejectable). + + + + + Whether the device is detachable. It is only meaningful + to set this to 0 (to avoid marking a device as detachable) since the + code for detaching the device is part of DeviceKit-disks itself. + If this property is not set, a heuristic will be used to determine if the + drive is detachable (currently only devices connected through USB are + detachable). + + + The device is compatible with flash. diff --git a/src/95-devkit-disks.rules b/src/95-devkit-disks.rules index 03647f3..e9d75b7 100644 --- a/src/95-devkit-disks.rules +++ b/src/95-devkit-disks.rules @@ -80,7 +80,7 @@ SYSFS{idVendor}=="05e3", SYSFS{idProduct}=="070e", ENV{ID_INSTANCE}=="0:3", ENV{ # Apple iPod Video # -SYSFS{idVendor}=="05ac", SYSFS{idProduct}=="1209", ENV{ID_DRIVE_REQUIRES_EJECT}="1", ENV{DKD_PRESENTATION_ICON_NAME}="multimedia-player-ipod-white" +SYSFS{idVendor}=="05ac", SYSFS{idProduct}=="1209", ENV{DKD_PRESENTATION_ICON_NAME}="multimedia-player-ipod-white" # USB floppy drives # diff --git a/src/devkit-disks-device-private.c b/src/devkit-disks-device-private.c index 46d6fac..bf25e3e 100644 --- a/src/devkit-disks-device-private.c +++ b/src/devkit-disks-device-private.c @@ -720,16 +720,6 @@ devkit_disks_device_set_drive_is_media_ejectable (DevkitDisksDevice *device, gbo } void -devkit_disks_device_set_drive_requires_eject (DevkitDisksDevice *device, gboolean value) -{ - if (G_UNLIKELY (device->priv->drive_requires_eject != value)) - { - device->priv->drive_requires_eject = value; - emit_changed (device, "drive_requires_eject"); - } -} - -void devkit_disks_device_set_drive_can_detach (DevkitDisksDevice *device, gboolean value) { if (G_UNLIKELY (device->priv->drive_can_detach != value)) diff --git a/src/devkit-disks-device-private.h b/src/devkit-disks-device-private.h index 8657df8..ad8e22e 100644 --- a/src/devkit-disks-device-private.h +++ b/src/devkit-disks-device-private.h @@ -152,7 +152,6 @@ struct DevkitDisksDevicePrivate GPtrArray *drive_media_compatibility; char *drive_media; gboolean drive_is_media_ejectable; - gboolean drive_requires_eject; gboolean drive_can_detach; gboolean optical_disc_is_blank; @@ -283,7 +282,6 @@ void devkit_disks_device_set_drive_connection_speed (DevkitDisksDevice *device, void devkit_disks_device_set_drive_media_compatibility (DevkitDisksDevice *device, GStrv value); void devkit_disks_device_set_drive_media (DevkitDisksDevice *device, const gchar *value); void devkit_disks_device_set_drive_is_media_ejectable (DevkitDisksDevice *device, gboolean value); -void devkit_disks_device_set_drive_requires_eject (DevkitDisksDevice *device, gboolean value); void devkit_disks_device_set_drive_can_detach (DevkitDisksDevice *device, gboolean value); void devkit_disks_device_set_optical_disc_is_blank (DevkitDisksDevice *device, gboolean value); diff --git a/src/devkit-disks-device.c b/src/devkit-disks-device.c index 7df2cda..812e110 100644 --- a/src/devkit-disks-device.c +++ b/src/devkit-disks-device.c @@ -205,7 +205,6 @@ enum PROP_DRIVE_MEDIA_COMPATIBILITY, PROP_DRIVE_MEDIA, PROP_DRIVE_IS_MEDIA_EJECTABLE, - PROP_DRIVE_REQUIRES_EJECT, PROP_DRIVE_CAN_DETACH, PROP_OPTICAL_DISC_IS_BLANK, @@ -510,9 +509,6 @@ get_property (GObject *object, case PROP_DRIVE_IS_MEDIA_EJECTABLE: g_value_set_boolean (value, device->priv->drive_is_media_ejectable); break; - case PROP_DRIVE_REQUIRES_EJECT: - g_value_set_boolean (value, device->priv->drive_requires_eject); - break; case PROP_DRIVE_CAN_DETACH: g_value_set_boolean (value, device->priv->drive_can_detach); break; @@ -984,10 +980,6 @@ devkit_disks_device_class_init (DevkitDisksDeviceClass *klass) g_param_spec_boolean ("drive-is-media-ejectable", NULL, NULL, FALSE, G_PARAM_READABLE)); g_object_class_install_property ( object_class, - PROP_DRIVE_REQUIRES_EJECT, - g_param_spec_boolean ("drive-requires-eject", NULL, NULL, FALSE, G_PARAM_READABLE)); - g_object_class_install_property ( - object_class, PROP_DRIVE_CAN_DETACH, g_param_spec_boolean ("drive-can-detach", NULL, NULL, FALSE, G_PARAM_READABLE)); @@ -2043,7 +2035,6 @@ update_info_drive (DevkitDisksDevice *device) GPtrArray *media_compat_array; const gchar *media_in_drive; gboolean drive_is_ejectable; - gboolean drive_requires_eject; gboolean drive_can_detach; gchar *decoded_string; guint n; @@ -2076,18 +2067,15 @@ update_info_drive (DevkitDisksDevice *device) */ update_drive_properties_from_sysfs (device); - if (devkit_device_has_property (device->priv->d, "ID_DRIVE_IS_MEDIA_EJECTABLE")) - drive_is_ejectable = devkit_device_get_property_as_boolean (device->priv->d, "ID_DRIVE_IS_MEDIA_EJECTABLE"); - else + if (devkit_device_has_property (device->priv->d, "ID_DRIVE_EJECTABLE")) { + drive_is_ejectable = devkit_device_get_property_as_boolean (device->priv->d, "ID_DRIVE_EJECTABLE"); + } else { drive_is_ejectable = FALSE; - + drive_is_ejectable |= devkit_device_has_property (device->priv->d, "ID_CDROM"); + drive_is_ejectable |= devkit_device_has_property (device->priv->d, "ID_DRIVE_FLOPPY_ZIP"); + drive_is_ejectable |= devkit_device_has_property (device->priv->d, "ID_DRIVE_FLOPPY_JAZ"); + } devkit_disks_device_set_drive_is_media_ejectable (device, drive_is_ejectable); - if (devkit_device_has_property (device->priv->d, "ID_DRIVE_REQUIRES_EJECT")) - drive_requires_eject = devkit_device_get_property_as_boolean (device->priv->d, "ID_DRIVE_REQUIRES_EJECT"); - else - drive_requires_eject = FALSE; - drive_requires_eject |= devkit_device_has_property (device->priv->d, "ID_CDROM"); - devkit_disks_device_set_drive_requires_eject (device, drive_requires_eject); media_compat_array = g_ptr_array_new (); for (n = 0; drive_media_mapping[n].udev_property != NULL; n++) { @@ -2140,6 +2128,9 @@ update_info_drive (DevkitDisksDevice *device) if (g_strcmp0 (device->priv->drive_connection_interface, "usb") == 0) { drive_can_detach = TRUE; } + if (devkit_device_has_property (device->priv->d, "ID_DRIVE_DETACHABLE")) { + drive_can_detach = devkit_device_get_property_as_boolean (device->priv->d, "ID_DRIVE_DETACHABLE"); + } devkit_disks_device_set_drive_can_detach (device, drive_can_detach); return TRUE; @@ -5167,9 +5158,9 @@ devkit_disks_device_drive_detach_authorized_cb (DevkitDisksDaemon *daemon, goto out; } - if (!device->priv->device_is_media_available) { + if (!device->priv->drive_can_detach) { throw_error (context, DEVKIT_DISKS_ERROR_FAILED, - "No media in drive"); + "Device is not detachable"); goto out; } @@ -5220,9 +5211,9 @@ devkit_disks_device_drive_detach (DevkitDisksDevice *device, goto out; } - if (!device->priv->device_is_media_available) { + if (!device->priv->drive_can_detach) { throw_error (context, DEVKIT_DISKS_ERROR_FAILED, - "No media in drive"); + "Device is not detachable"); goto out; } diff --git a/src/org.freedesktop.DeviceKit.Disks.Device.xml b/src/org.freedesktop.DeviceKit.Disks.Device.xml index b650c94..97c9d66 100644 --- a/src/org.freedesktop.DeviceKit.Disks.Device.xml +++ b/src/org.freedesktop.DeviceKit.Disks.Device.xml @@ -1954,22 +1954,7 @@ TRUE only if the media can be physically ejected by issuing a command - from the host to the drive (e.g. optical drives). For devices, like iPod's, - that require an eject ioctl to be sent in order to be safely removed, use the - drive-requires-eject - property instead. - This property is only valid if - device-is-drive - is TRUE. - - - - - TRUE only if the drive requires an eject ioctl to be safely removed; typically - this includes multimedia devices like the iPod. If media can be physically - ejected from the drive, use the - drive-is-media-ejectable - property instead. + from the host to the drive (e.g. optical and Zip drives). This property is only valid if device-is-drive is TRUE. diff --git a/tools/devkit-disks.c b/tools/devkit-disks.c index 415e445..836b6e0 100644 --- a/tools/devkit-disks.c +++ b/tools/devkit-disks.c @@ -381,7 +381,6 @@ typedef struct char **drive_media_compatibility; char *drive_media; gboolean drive_is_media_ejectable; - gboolean drive_requires_eject; gboolean drive_can_detach; gboolean optical_disc_is_blank; @@ -578,8 +577,6 @@ collect_props (const char *key, const GValue *value, DeviceProperties *props) props->drive_media = g_strdup (g_value_get_string (value)); else if (strcmp (key, "drive-is-media-ejectable") == 0) props->drive_is_media_ejectable = g_value_get_boolean (value); - else if (strcmp (key, "drive-requires-eject") == 0) - props->drive_requires_eject = g_value_get_boolean (value); else if (strcmp (key, "drive-can-detach") == 0) props->drive_can_detach = g_value_get_boolean (value); @@ -1093,7 +1090,6 @@ do_show_info (const char *object_path) g_print (" serial: %s\n", props->drive_serial); g_print (" detachable: %d\n", props->drive_can_detach); g_print (" ejectable: %d\n", props->drive_is_media_ejectable); - g_print (" require eject: %d\n", props->drive_requires_eject); g_print (" media: %s\n", props->drive_media); g_print (" compat: "); for (n = 0; props->drive_media_compatibility[n] != NULL; n++) -- 2.7.4