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)
This commit is contained in:
Cole Robinson 2009-11-30 10:50:04 -05:00
parent 8ab60836a0
commit 30dbbcda56
3 changed files with 55 additions and 31 deletions

View File

@ -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)

View File

@ -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)

View File

@ -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