From b9937d6020eaee793afbe13cb350a7d967ea87d6 Mon Sep 17 00:00:00 2001 From: David Zeuthen Date: Fri, 1 May 2009 16:02:18 -0400 Subject: [PATCH] add :device-media-detection-time property This property aids desktop automounters in determining they shouldn't automount devices that are created as a result of formatting/partitioning. --- src/devkit-disks-device-private.c | 20 ++++++++++++++++++ src/devkit-disks-device-private.h | 3 +++ src/devkit-disks-device.c | 28 ++++++++++++++++++++------ src/org.freedesktop.DeviceKit.Disks.Device.xml | 7 +++++++ tools/devkit-disks.c | 12 ++++++++++- 5 files changed, 63 insertions(+), 7 deletions(-) diff --git a/src/devkit-disks-device-private.c b/src/devkit-disks-device-private.c index b23ae64..35c7826 100644 --- a/src/devkit-disks-device-private.c +++ b/src/devkit-disks-device-private.c @@ -104,6 +104,26 @@ ptr_str_array_from_strv (GStrv s) } void +devkit_disks_device_set_device_detection_time (DevkitDisksDevice *device, guint64 value) +{ + if (G_UNLIKELY (device->priv->device_detection_time != value)) + { + device->priv->device_detection_time = value; + emit_changed (device, "device_detection_time"); + } +} + +void +devkit_disks_device_set_device_media_detection_time (DevkitDisksDevice *device, guint64 value) +{ + if (G_UNLIKELY (device->priv->device_media_detection_time != value)) + { + device->priv->device_media_detection_time = value; + emit_changed (device, "device_media_detection_time"); + } +} + +void devkit_disks_device_set_job_in_progress (DevkitDisksDevice *device, gboolean value) { if (G_UNLIKELY (device->priv->job_in_progress != value)) diff --git a/src/devkit-disks-device-private.h b/src/devkit-disks-device-private.h index a5ef43d..a2410ea 100644 --- a/src/devkit-disks-device-private.h +++ b/src/devkit-disks-device-private.h @@ -74,6 +74,7 @@ struct DevkitDisksDevicePrivate char *object_path; char *native_path; guint64 device_detection_time; + guint64 device_media_detection_time; gboolean removed; @@ -224,6 +225,8 @@ void devkit_disks_device_set_job_initiated_by_uid (DevkitDisksDevice *device, gu void devkit_disks_device_set_job_is_cancellable (DevkitDisksDevice *device, gboolean value); void devkit_disks_device_set_job_percentage (DevkitDisksDevice *device, gdouble value); +void devkit_disks_device_set_device_detection_time (DevkitDisksDevice *device, guint64 value); +void devkit_disks_device_set_device_media_detection_time (DevkitDisksDevice *device, guint64 value); void devkit_disks_device_set_device_file (DevkitDisksDevice *device, const gchar *value); void devkit_disks_device_set_device_file_by_id (DevkitDisksDevice *device, GStrv value); void devkit_disks_device_set_device_file_by_path (DevkitDisksDevice *device, GStrv value); diff --git a/src/devkit-disks-device.c b/src/devkit-disks-device.c index 968ad0d..044a0bd 100644 --- a/src/devkit-disks-device.c +++ b/src/devkit-disks-device.c @@ -136,6 +136,7 @@ enum PROP_NATIVE_PATH, PROP_DEVICE_DETECTION_TIME, + PROP_DEVICE_MEDIA_DETECTION_TIME, PROP_DEVICE_MAJOR, PROP_DEVICE_MINOR, PROP_DEVICE_FILE, @@ -304,6 +305,9 @@ get_property (GObject *object, case PROP_DEVICE_DETECTION_TIME: g_value_set_uint64 (value, device->priv->device_detection_time); break; + case PROP_DEVICE_MEDIA_DETECTION_TIME: + g_value_set_uint64 (value, device->priv->device_media_detection_time); + break; case PROP_DEVICE_MAJOR: g_value_set_int64 (value, major (device->priv->dev)); break; @@ -708,6 +712,10 @@ devkit_disks_device_class_init (DevkitDisksDeviceClass *klass) g_param_spec_uint64 ("device-detection-time", NULL, NULL, 0, G_MAXUINT64, 0, G_PARAM_READABLE)); g_object_class_install_property ( object_class, + PROP_DEVICE_MEDIA_DETECTION_TIME, + g_param_spec_uint64 ("device-media-detection-time", NULL, NULL, 0, G_MAXUINT64, 0, G_PARAM_READABLE)); + g_object_class_install_property ( + object_class, PROP_DEVICE_MAJOR, g_param_spec_int64 ("device-major", NULL, NULL, -G_MAXINT64, G_MAXINT64, 0, G_PARAM_READABLE)); g_object_class_install_property ( @@ -2849,6 +2857,7 @@ update_info (DevkitDisksDevice *device) GPtrArray *holders; gint major; gint minor; + gboolean media_available; ret = FALSE; @@ -2906,21 +2915,28 @@ update_info (DevkitDisksDevice *device) devkit_disks_device_set_device_is_removable (device, (sysfs_get_int (device->priv->native_path, "removable") != 0)); - /* device_is_media_available property */ + /* device_is_media_available and device_media_detection_time property */ if (device->priv->device_is_removable) { + media_available = FALSE; if (devkit_device_has_property (device->priv->d, "DKD_MEDIA_AVAILABLE")) { - devkit_disks_device_set_device_is_media_available (device, - devkit_device_get_property_as_boolean (device->priv->d, "DKD_MEDIA_AVAILABLE")); + media_available = devkit_device_get_property_as_boolean (device->priv->d, "DKD_MEDIA_AVAILABLE"); } else { if (devkit_device_has_property (device->priv->d, "ID_CDROM_MEDIA_STATE")) { - devkit_disks_device_set_device_is_media_available (device, TRUE); + media_available = TRUE; } else { - devkit_disks_device_set_device_is_media_available (device, FALSE); + media_available = FALSE; } } } else { - devkit_disks_device_set_device_is_media_available (device, TRUE); + media_available = TRUE; } + devkit_disks_device_set_device_is_media_available (device, media_available); + if (media_available) { + if (device->priv->device_media_detection_time == 0) + devkit_disks_device_set_device_media_detection_time (device, (guint64) time (NULL)); + } else { + devkit_disks_device_set_device_media_detection_time (device, 0); + } /* device_size, device_block_size and device_is_read_only properties */ if (device->priv->device_is_media_available) { diff --git a/src/org.freedesktop.DeviceKit.Disks.Device.xml b/src/org.freedesktop.DeviceKit.Disks.Device.xml index b4f6237..b006b3b 100644 --- a/src/org.freedesktop.DeviceKit.Disks.Device.xml +++ b/src/org.freedesktop.DeviceKit.Disks.Device.xml @@ -1219,6 +1219,13 @@ was detected by the daemon. + + + The point in time (seconds since the Epoch Jan 1, 1970 0:00 UTC) when the + media currently in the device was detected by the daemon or 0 if the + device has no media. + + Major for the device or -1 if not set. diff --git a/tools/devkit-disks.c b/tools/devkit-disks.c index 5e73a1c..1f556d0 100644 --- a/tools/devkit-disks.c +++ b/tools/devkit-disks.c @@ -364,6 +364,7 @@ typedef struct char *native_path; guint64 device_detection_time; + guint64 device_media_detection_time; gint64 device_major; gint64 device_minor; char *device_file; @@ -496,6 +497,8 @@ collect_props (const char *key, const GValue *value, DeviceProperties *props) else if (strcmp (key, "device-detection-time") == 0) props->device_detection_time = g_value_get_uint64 (value); + else if (strcmp (key, "device-media-detection-time") == 0) + props->device_media_detection_time = g_value_get_uint64 (value); else if (strcmp (key, "device-major") == 0) props->device_major = g_value_get_int64 (value); else if (strcmp (key, "device-minor") == 0) @@ -1017,7 +1020,14 @@ do_show_info (const char *object_path) g_print (" detected at: %s\n", time_buf); g_print (" system internal: %d\n", props->device_is_system_internal); g_print (" removable: %d\n", props->device_is_removable); - g_print (" has media: %d\n", props->device_is_media_available); + g_print (" has media: %d", props->device_is_media_available); + if (props->device_media_detection_time != 0) { + time = (time_t) props->device_media_detection_time; + time_tm = localtime (&time); + strftime (time_buf, sizeof time_buf, "%c", time_tm); + g_print (" (detected at %s)", time_buf); + } + g_print ("\n"); g_print (" detects change: %d\n", props->device_is_media_change_detected); g_print (" detection by polling: %d\n", props->device_is_media_change_detection_polling); g_print (" detection inhibitable: %d\n", props->device_is_media_change_detection_inhibitable); -- 2.7.4