summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Zeuthen <davidz@redhat.com>2009-05-01 16:02:18 -0400
committerDavid Zeuthen <davidz@redhat.com>2009-05-01 16:02:18 -0400
commitb9937d6020eaee793afbe13cb350a7d967ea87d6 (patch)
tree9f2d32d4e73ac77e92d8d5f687dae4a7f949bb37
parente15e1a5bef5707a9a1df13856a29b460d12cbe9a (diff)
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.
-rw-r--r--src/devkit-disks-device-private.c20
-rw-r--r--src/devkit-disks-device-private.h3
-rw-r--r--src/devkit-disks-device.c28
-rw-r--r--src/org.freedesktop.DeviceKit.Disks.Device.xml7
-rw-r--r--tools/devkit-disks.c12
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.
</doc:para></doc:description></doc:doc>
</property>
+ <property name="device-media-detection-time" type="t" access="read">
+ <doc:doc><doc:description><doc:para>
+ 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.
+ </doc:para></doc:description></doc:doc>
+ </property>
<property name="device-major" type="x" access="read">
<doc:doc><doc:description><doc:para>
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);