Add properties to identify extended and logical dos partitions
authorDavid Zeuthen <davidz@redhat.com>
Mon, 24 Oct 2011 16:58:10 +0000 (12:58 -0400)
committerDavid Zeuthen <davidz@redhat.com>
Mon, 24 Oct 2011 16:58:19 +0000 (12:58 -0400)
This allows to remove special-casing of dos and 0x05, 0x0f and 0x85
partition types in each client.

Signed-off-by: David Zeuthen <davidz@redhat.com>
data/org.freedesktop.UDisks2.xml
doc/udisks2-sections.txt
src/udiskslinuxpartition.c

index 0a61606..2b34f7e 100644 (file)
          object that the partition entry belongs to.
     -->
     <property name="Table" type="o" access="read"/>
+
+    <!-- IsContainer:
+         Set to %TRUE if the partition itself is a container for other
+         partitions.
+
+         For example, for <literal>dos</literal> partition tables,
+         this applies to socalled <emphasis>extended partition</emphasis> (partitions of type
+         <constant>0x05</constant>, <constant>0x0f</constant> or <constant>0x85</constant>)
+         containing socalled <emphasis>logical partitions</emphasis>.
+    -->
+    <property name="IsContainer" type="b" access="read"/>
+
+    <!-- IsContained:
+         Set to %TRUE of the partition is contained in another partition.
+         See the #org.freedesktop.UDisks2.Partition:IsContainer property for more information.
+    -->
+    <property name="IsContained" type="b" access="read"/>
   </interface>
 
   <!-- ********************************************************************** -->
index 5d54558..f119212 100644 (file)
@@ -1158,19 +1158,23 @@ udisks_partition_get_flags
 udisks_partition_get_name
 udisks_partition_get_uuid
 udisks_partition_get_table
+udisks_partition_get_is_container
+udisks_partition_get_is_contained
 udisks_partition_dup_type_
 udisks_partition_dup_flags
 udisks_partition_dup_name
 udisks_partition_dup_uuid
 udisks_partition_dup_table
-udisks_partition_set_flags
-udisks_partition_set_name
 udisks_partition_set_number
+udisks_partition_set_type_
 udisks_partition_set_offset
 udisks_partition_set_size
-udisks_partition_set_table
-udisks_partition_set_type_
+udisks_partition_set_flags
+udisks_partition_set_name
 udisks_partition_set_uuid
+udisks_partition_set_table
+udisks_partition_set_is_container
+udisks_partition_set_is_contained
 UDisksPartitionProxy
 UDisksPartitionProxyClass
 udisks_partition_proxy_new
index fc9a699..2ea5902 100644 (file)
@@ -119,6 +119,8 @@ udisks_linux_partition_update (UDisksLinuxPartition  *partition,
   const gchar *uuid = NULL;
   const gchar *flags = NULL;
   const gchar *table_object_path = "/";
+  gboolean is_container = FALSE;
+  gboolean is_contained = FALSE;
 
   device = udisks_linux_block_object_get_device (object);
   if (g_udev_device_has_property (device, "ID_PART_ENTRY_TYPE"))
@@ -142,6 +144,22 @@ udisks_linux_partition_update (UDisksLinuxPartition  *partition,
                                                             makedev (disk_major, disk_minor));
             }
         }
+
+      if (g_strcmp0 (g_udev_device_get_property (device, "ID_PART_ENTRY_SCHEME"), "dos") == 0)
+        {
+          if (number <= 4)
+            {
+              gint type_as_int = strtol (type, NULL, 0);
+              if (type_as_int == 0x05 || type_as_int == 0x0f || type_as_int == 0x85)
+                {
+                  is_container = TRUE;
+                }
+            }
+          else if (number >= 5)
+            {
+              is_contained = TRUE;
+            }
+        }
     }
   else
     {
@@ -169,6 +187,8 @@ udisks_linux_partition_update (UDisksLinuxPartition  *partition,
   udisks_partition_set_name (UDISKS_PARTITION (partition), name);
   udisks_partition_set_uuid (UDISKS_PARTITION (partition), uuid);
   udisks_partition_set_table (UDISKS_PARTITION (partition), table_object_path);
+  udisks_partition_set_is_container (UDISKS_PARTITION (partition), is_container);
+  udisks_partition_set_is_contained (UDISKS_PARTITION (partition), is_contained);
 
   g_free (name);
   g_clear_object (&device);