Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSayamindu Dasgupta <sayamindu@gmail.com>2009-11-05 16:00:29 (GMT)
committer Sayamindu Dasgupta <sayamindu@gmail.com>2009-11-05 16:00:29 (GMT)
commitcbd9cbe67af4d8024fe84850a6e61f5d86f38dfd (patch)
treef6466bd5797e1857a3eeeda81e35961cd9a8c15b
parentf6bcbc57b4599341f8fde3c22ab7c7857fa19dea (diff)
Add devicemanager to deal with removable devices
-rw-r--r--devicemanager.py85
1 files changed, 85 insertions, 0 deletions
diff --git a/devicemanager.py b/devicemanager.py
new file mode 100644
index 0000000..8c50db1
--- /dev/null
+++ b/devicemanager.py
@@ -0,0 +1,85 @@
+import os
+import gobject
+import dbus
+
+from dbus.mainloop.glib import DBusGMainLoop
+DBusGMainLoop(set_as_default=True)
+
+class DeviceManager(gobject.GObject):
+ __gsignals__ = {
+ 'device-added': (gobject.SIGNAL_RUN_FIRST,
+ gobject.TYPE_NONE,
+ ([])),
+ 'device-removed': (gobject.SIGNAL_RUN_FIRST,
+ gobject.TYPE_NONE,
+ ([]))
+ }
+ def __init__(self):
+ gobject.GObject.__init__(self)
+
+ self._devices = []
+ self._bus = dbus.SystemBus ()
+
+ self._populate_devices()
+
+ self._bus.add_signal_receiver(self.__device_added,
+ "DeviceAdded",
+ "org.freedesktop.Hal.Manager",
+ "org.freedesktop.Hal",
+ "/org/freedesktop/Hal/Manager")
+ self._bus.add_signal_receiver(self.__device_removed,
+ "DeviceRemoved",
+ "org.freedesktop.Hal.Manager",
+ "org.freedesktop.Hal",
+ "/org/freedesktop/Hal/Manager")
+ def _populate_devices(self):
+ hal_obj = self._bus.get_object ('org.freedesktop.Hal', '/org/freedesktop/Hal/Manager')
+ hal = dbus.Interface (hal_obj, 'org.freedesktop.Hal.Manager')
+
+ udis = hal.FindDeviceByCapability ('volume')
+ for udi in udis:
+ self.__device_added(udi)
+
+ def _is_removable_volume(self, dev):
+ # Apart from determining if this is a removable volume,
+ # this also tries to find if there is a catalog.xml in the
+ # root
+
+ if not dev.QueryCapability('volume'):
+ return False
+
+ parent_udi = dev.GetProperty('info.parent')
+ parent_dev_obj = self._bus.get_object('org.freedesktop.Hal', parent_udi)
+ parent = dbus.Interface(parent_dev_obj, 'org.freedesktop.Hal.Device')
+
+ if not parent.GetProperty('storage.removable'):
+ return False
+
+ mount_point = dev.GetProperty('volume.mount_point')
+
+ return os.path.exists(os.path.join(mount_point, 'catalog.xml'))
+
+ def __device_added(self, udi):
+ dev_obj = self._bus.get_object ('org.freedesktop.Hal', udi)
+ # get an interface to the device
+ dev = dbus.Interface (dev_obj, 'org.freedesktop.Hal.Device')
+ if self._is_removable_volume(dev):
+ self.emit('device-added')
+ self._devices.append((udi, dev))
+
+ def __device_removed(self, udi):
+ for device in self._devices:
+ if udi in device:
+ self.emit('device-removed')
+ self._devices.remove(device)
+
+ def get_devices(self):
+ return self._devices
+
+if __name__ == '__main__':
+ dm = DeviceManager()
+ print dm.get_devices()[0][1].GetProperty('volume.mount_point'), dm.get_devices()[0][1].GetProperty('volume.label')
+
+ loop = gobject.MainLoop()
+ loop.run()
+