add :device-media-detection-time property
authorDavid Zeuthen <davidz@redhat.com>
Fri, 1 May 2009 20:02:18 +0000 (16:02 -0400)
committerDavid Zeuthen <davidz@redhat.com>
Fri, 1 May 2009 20:02:18 +0000 (16:02 -0400)
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
src/devkit-disks-device-private.h
src/devkit-disks-device.c
src/org.freedesktop.DeviceKit.Disks.Device.xml
tools/devkit-disks.c

index b23ae64..35c7826 100644 (file)
@@ -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))
index a5ef43d..a2410ea 100644 (file)
@@ -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);
index 968ad0d..044a0bd 100644 (file)
@@ -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) {
index b4f6237..b006b3b 100644 (file)
             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.
index 5e73a1c..1f556d0 100644 (file)
@@ -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);