From 30dbbcda563813d3beda55f2c2aa8056e6194aab Mon Sep 17 00:00:00 2001 From: Cole Robinson Date: Mon, 30 Nov 2009 10:50:04 -0500 Subject: [PATCH] mediadev: Associate media-added/removed signals Rather than have these come from halhelper, push them to users via mediadev, since this will be useful for non-hal backeneds (libvirt) --- src/virtManager/halhelper.py | 24 +++++++++------------- src/virtManager/mediadev.py | 39 +++++++++++++++++++++++++++++++++--- src/virtManager/uihelpers.py | 23 +++++++++------------ 3 files changed, 55 insertions(+), 31 deletions(-) diff --git a/src/virtManager/halhelper.py b/src/virtManager/halhelper.py index 194095a25..a8c1b8f89 100644 --- a/src/virtManager/halhelper.py +++ b/src/virtManager/halhelper.py @@ -36,7 +36,7 @@ class vmmHalHelper(gobject.GObject): "optical-added" : (gobject.SIGNAL_RUN_FIRST, gobject.TYPE_NONE, [object]), "optical-media-added" : (gobject.SIGNAL_RUN_FIRST, gobject.TYPE_NONE, - [object]), + [str, str, str]), "device-removed": (gobject.SIGNAL_RUN_FIRST, gobject.TYPE_NONE, [str]), } @@ -129,13 +129,9 @@ class vmmHalHelper(gobject.GObject): continue devnode, media_label, media_hal_path = self._fetch_cdrom_info(path) - obj = vmmMediaDevice(str(devnode), str(path), media_label, + self.add_optical_dev(str(devnode), str(path), media_label, media_hal_path) - optical_info[str(devnode)] = obj - - for obj in optical_info.values(): - self.emit("optical-added", obj) def populate_netdevs(self): bondMasters = get_bonding_masters() @@ -169,19 +165,19 @@ class vmmHalHelper(gobject.GObject): def _device_removed(self, path): self.emit("device-removed", str(path)) + def add_optical_dev(self, devpath, halpath, media_label, media_hal_path): + obj = vmmMediaDevice(devpath, halpath, media_label, media_hal_path) + obj.set_hal_media_signals(self) + self.emit("optical-added", obj) def _optical_added(self, halpath): devpath, media_label, media_hal_path = self._fetch_cdrom_info(halpath) + self.add_optical_dev(devpath, halpath, media_label, media_hal_path) - obj = vmmMediaDevice(devpath, halpath, media_label, media_hal_path) - self.emit("optical-added", obj) + def _optical_media_added(self, media_hal_path): + media_label, devpath = self._fetch_media_info(media_hal_path) - def _optical_media_added(self, halpath): - media_hal_path = halpath - media_label, devpath = self._fetch_media_info(halpath) - - obj = vmmMediaDevice(devpath, halpath, media_label, media_hal_path) - self.emit("optical-media-added", obj) + self.emit("optical-media-added", devpath, media_label, media_hal_path) def _net_phys_device_added(self, halpath): dbusobj = self.dbus_dev_lookup(halpath) diff --git a/src/virtManager/mediadev.py b/src/virtManager/mediadev.py index 7133eee69..2706addb5 100644 --- a/src/virtManager/mediadev.py +++ b/src/virtManager/mediadev.py @@ -21,7 +21,17 @@ import gobject class vmmMediaDevice(gobject.GObject): - __gsignals__ = {} + __gsignals__ = { + "media-added" : (gobject.SIGNAL_RUN_FIRST, gobject.TYPE_NONE, + []), + "media-removed" : (gobject.SIGNAL_RUN_FIRST, + gobject.TYPE_NONE, []), + } + + def __init__(self): + self.__gobject_init__() + + self.bus = None def __init__(self, path, key, media_label, media_key): self.__gobject_init__() @@ -49,8 +59,7 @@ class vmmMediaDevice(gobject.GObject): self.media_label = media_label self.media_key = media_key def clear_media(self): - self.media_label = None - self.media_key = None + self.set_media(None, None) def pretty_label(self): media_label = self.get_media_label() @@ -58,4 +67,28 @@ class vmmMediaDevice(gobject.GObject): media_label = _("No media present") return "%s (%s)" % (media_label, self.get_path()) + + ############################ + # HAL media signal helpers # + ############################ + + def set_hal_media_signals(self, halhelper): + halhelper.connect("optical-media-added", self.hal_media_added) + halhelper.connect("device-removed", self.hal_media_removed) + + def hal_media_added(self, ignore, devpath, media_label, media_key): + if devpath != self.get_path(): + return + + self.set_media(media_label, media_key) + self.emit("media-added") + + def hal_media_removed(self, ignore, media_hal_path): + if media_hal_path != self.get_media_key(): + return + + self.clear_media() + self.emit("media-removed") + + gobject.type_register(vmmMediaDevice) diff --git a/src/virtManager/uihelpers.py b/src/virtManager/uihelpers.py index 16b4b2ca2..294a874c1 100644 --- a/src/virtManager/uihelpers.py +++ b/src/virtManager/uihelpers.py @@ -266,7 +266,6 @@ def init_optical_combo(widget, empty_sensitive=False): helper = vmmHalHelper() helper.connect("optical-added", optical_added, widget) - helper.connect("optical-media-added", optical_media_added, widget) helper.connect("device-removed", optical_removed, widget) widget.set_active(-1) @@ -285,17 +284,8 @@ def optical_removed(ignore_helper, key, widget): active = widget.get_active() idx = 0 - # Search for the row containing matching media key and update - # (clear) it, de-activating it if its currently selected for row in model: - if row[OPTICAL_MEDIA_KEY] == key: - row[OPTICAL_MEDIADEV].clear_media() - set_row_from_object(row) - - if idx == active: - widget.set_active(-1) - - elif row[OPTICAL_DEV_KEY] == key: + if row[OPTICAL_DEV_KEY] == key: # Whole device removed del(model[idx]) widget.set_active(-1) @@ -307,12 +297,15 @@ def optical_removed(ignore_helper, key, widget): def optical_added(ignore_helper, newobj, widget): model = widget.get_model() + newobj.connect("media-added", optical_media_changed, widget) + newobj.connect("media-removed", optical_media_changed, widget) + # Brand new device row = [None, None, None, None, None, newobj] set_row_from_object(row) model.append(row) -def optical_media_added(ignore_helper, newobj, widget): +def optical_media_changed(newobj, widget): model = widget.get_model() active = widget.get_active() idx = 0 @@ -322,11 +315,13 @@ def optical_media_added(ignore_helper, newobj, widget): # selection, select the new media. for row in model: if row[OPTICAL_DEV_PATH] == newobj.get_path(): - row[OPTICAL_MEDIADEV] = newobj set_row_from_object(row) + has_media = row[OPTICAL_IS_MEDIA_PRESENT] - if active == -1: + if has_media and active == -1: widget.set_active(idx) + elif not has_media and active == idx: + widget.set_active(-1) idx = idx + 1