Thomas Gläßle avatar Thomas Gläßle committed 30e6793

Use DbusProperties proxy to access properties

Comments (0)

Files changed (1)

udiskie/device.py

 import logging
 import os
+import dbus
 
 DBUS_PROPS_INTERFACE = 'org.freedesktop.DBus.Properties'
 UDISKS_INTERFACE = 'org.freedesktop.UDisks'
 UDISKS_OBJECT = 'org.freedesktop.UDisks'
 UDISKS_OBJECT_PATH = '/org/freedesktop/UDisks'
 
+class DbusProperties:
+    """
+    Dbus property map abstraction.
+
+    Properties of the object can be accessed as attributes.
+
+    """
+    def __init__(self, dbus_object, interface):
+        """Initialize a proxy object with standard dbus property interface."""
+        self.__proxy = dbus.Interface(
+                dbus_object,
+                dbus_interface=DBUS_PROPS_INTERFACE)
+        self.__interface = interface
+
+    def __getattr__(self, property):
+        """Retrieve the property via the dbus proxy."""
+        return self.__proxy.Get(self.__interface, property)
+
 class Device:
     def __init__(self, bus, device_path):
         self.log = logging.getLogger('udiskie.device.Device')
         self.bus = bus
         self.device_path = device_path
         self.device = self.bus.get_object(UDISKS_OBJECT, device_path)
+        self.property = DbusProperties(self.device, UDISKS_DEVICE_INTERFACE)
 
     def __str__(self):
         return self.device_path
 
-    def _get_property(self, property):
-        return self.device.Get(UDISKS_DEVICE_INTERFACE, property,
-                               dbus_interface=DBUS_PROPS_INTERFACE)
-
     def partition_slave(self):
-        return self._get_property('PartitionSlave')
+        """Get the partition slave."""
+        return self.property.PartitionSlave
 
     def is_partition_table(self):
-        return self._get_property('DeviceIsPartitionTable')
+        """Check if the device is a partition table."""
+        return self.property.DeviceIsPartitionTable
 
     def is_systeminternal(self):
-        return self._get_property('DeviceIsSystemInternal')
+        """Check if the device is internal."""
+        return self.property.DeviceIsSystemInternal
 
     def is_handleable(self):
-        """Should this device be handled by udiskie?
+        """
+        Should this device be handled by udiskie?
 
         Currently this just means that the device is removable and holds a
-        filesystem."""
+        filesystem or the device is a LUKS encrypted volume.
+
+        """
         return (self.is_filesystem() or self.is_crypto()) and not self.is_systeminternal()
 
     def is_mounted(self):
-        return self._get_property('DeviceIsMounted')
+        """Check if the device is mounted."""
+        return self.property.DeviceIsMounted
 
     def is_unlocked(self):
         """Check if device is already unlocked."""
         return self.is_luks() and self.luks_cleartext_holder()
 
     def mount_paths(self):
-        raw_paths = self._get_property('DeviceMountPaths')
+        raw_paths = self.property.DeviceMountPaths
         return [os.path.normpath(path) for path in raw_paths]
 
     def device_file(self):
-        return os.path.normpath(self._get_property('DeviceFile'))
+        return os.path.normpath(self.property.DeviceFile)
 
     def is_filesystem(self):
-        return self._get_property('IdUsage') == 'filesystem'
+        return self.property.IdUsage == 'filesystem'
 
     def is_crypto(self):
-        return self._get_property('IdUsage') == 'crypto'
+        return self.property.IdUsage == 'crypto'
 
     def is_luks(self):
-        return self._get_property('DeviceIsLuks')
+        return self.property.DeviceIsLuks
 
     def is_luks_cleartext(self):
         """Check whether this is a luks cleartext device."""
-        return self._get_property('DeviceIsLuksCleartext')
+        return self.property.DeviceIsLuksCleartext
 
     def luks_cleartext_slave(self):
         """Get luks crypto device."""
-        return self._get_property('LuksCleartextSlave')
+        return self.property.LuksCleartextSlave
 
     def luks_cleartext_holder(self):
         """Get unlocked luks cleartext device."""
-        return self._get_property('LuksHolder')
+        return self.property.LuksHolder
 
     def is_luks_cleartext_slave(self):
         """Check whether the luks device is currently in use."""
         return False
 
     def has_media(self):
-        return self._get_property('DeviceIsMediaAvailable')
+        return self.property.DeviceIsMediaAvailable
 
     def id_type(self):
-        return self._get_property('IdType')
+        return self.property.IdType
 
     def id_uuid(self):
-        return self._get_property('IdUuid')
+        return self.property.IdUuid
 
     def mount(self, filesystem, options):
         self.device.FilesystemMount(filesystem, options,
Tip: Filter by directory path e.g. /media app.js to search for public/media/app.js.
Tip: Use camelCasing e.g. ProjME to search for ProjectModifiedEvent.java.
Tip: Filter by extension type e.g. /repo .js to search for all .js files in the /repo directory.
Tip: Separate your search with spaces e.g. /ssh pom.xml to search for src/ssh/pom.xml.
Tip: Use ↑ and ↓ arrow keys to navigate and return to view the file.
Tip: You can also navigate files with Ctrl+j (next) and Ctrl+k (previous) and view the file with Ctrl+o.
Tip: You can also navigate files with Alt+j (next) and Alt+k (previous) and view the file with Alt+o.