Store various VM state in one dict, not random attributes

Storing some Qubes Manager specific properties in QubesVm object isn't
completely right, but if do so, try to keep them in one dict, not bunch
of attributes. Index this dict with named "enum" (implemented as class)
entries.
This commit is contained in:
Marek Marczykowski 2013-04-13 04:10:13 +02:00
parent 009782189c
commit 3994038d76

View File

@ -70,6 +70,11 @@ session_bus = None
power_order = Qt.DescendingOrder power_order = Qt.DescendingOrder
update_order = Qt.AscendingOrder update_order = Qt.AscendingOrder
class QMVmState:
ErrorMsg = 1
AudioRecAvailable = 2
AudioRecAllowed = 3
class QubesManagerFileWatcher(ProcessEvent): class QubesManagerFileWatcher(ProcessEvent):
def __init__ (self, update_func): def __init__ (self, update_func):
@ -290,8 +295,8 @@ class VmInfoWidget (QWidget):
self.blk_icon.setVisible(blk_visible) self.blk_icon.setVisible(blk_visible)
if rec_visible != None: if rec_visible != None:
self.rec_icon.setVisible(rec_visible) self.rec_icon.setVisible(rec_visible)
self.error_icon.setToolTip(vm.error_msg) self.error_icon.setToolTip(vm.qubes_manager_state[QMVmState.ErrorMsg])
self.error_icon.setVisible(vm.error_msg is not None) self.error_icon.setVisible(vm.qubes_manager_state[QMVmState.ErrorMsg] is not None)
class VmTemplateItem (QTableWidgetItem): class VmTemplateItem (QTableWidgetItem):
@ -976,14 +981,13 @@ class VmManagerWindow(Ui_VmManagerWindow, QMainWindow):
for vm in vms_list: for vm in vms_list:
vm.last_power_state = vm.get_power_state() vm.last_power_state = vm.get_power_state()
vm.last_running = vm.last_power_state in ["Running", "Transient"] vm.last_running = vm.last_power_state in ["Running", "Transient"]
vm.rec_available = session_bus.interface().isServiceRegistered('org.QubesOS.Audio.%s' % vm.name).value()
if vm.rec_available:
self.vm_rec[vm.name] = self.get_audio_rec_allowed(vm.name)
if vm.last_running: if vm.last_running:
running_count += 1 running_count += 1
if vm.internal: if vm.internal:
internal_count += 1 internal_count += 1
vm.error_msg = self.vm_errors[vm.qid] if vm.qid in self.vm_errors else None vm.qubes_manager_state = {}
self.update_audio_rec_info(vm)
vm.qubes_manager_state[QMVmState.ErrorMsg]= self.vm_errors[vm.qid] if vm.qid in self.vm_errors else None
self.running_vms_count = running_count self.running_vms_count = running_count
self.internal_vms_count = internal_count self.internal_vms_count = internal_count
@ -1051,10 +1055,7 @@ class VmManagerWindow(Ui_VmManagerWindow, QMainWindow):
prev_running = vm.last_running prev_running = vm.last_running
vm.last_power_state = state vm.last_power_state = state
vm.last_running = (state in ["Running", "Transient"]) vm.last_running = (state in ["Running", "Transient"])
vm.rec_available = session_bus.interface().isServiceRegistered( self.update_audio_rec_info(vm)
'org.QubesOS.Audio.%s' % vm.name).value()
if vm.rec_available:
self.vm_rec[vm.name] = self.get_audio_rec_allowed(vm.name)
if not prev_running and vm.last_running: if not prev_running and vm.last_running:
self.running_vms_count += 1 self.running_vms_count += 1
some_vms_have_changed_power_state = True some_vms_have_changed_power_state = True
@ -1186,7 +1187,7 @@ class VmManagerWindow(Ui_VmManagerWindow, QMainWindow):
self.action_appmenus.setEnabled(not vm.is_netvm()) self.action_appmenus.setEnabled(not vm.is_netvm())
self.action_editfwrules.setEnabled(vm.is_networked() and not (vm.is_netvm() and not vm.is_proxyvm())) self.action_editfwrules.setEnabled(vm.is_networked() and not (vm.is_netvm() and not vm.is_proxyvm()))
self.action_updatevm.setEnabled(vm.is_updateable() or vm.qid == 0) self.action_updatevm.setEnabled(vm.is_updateable() or vm.qid == 0)
self.action_toggle_audio_input.setEnabled(vm.rec_available) self.action_toggle_audio_input.setEnabled(vm.qubes_manager_state[QMVmState.AudioRecAvailable])
self.action_run_command_in_vm.setEnabled(not vm.last_power_state == "Paused" and vm.qid != 0) self.action_run_command_in_vm.setEnabled(not vm.last_power_state == "Paused" and vm.qid != 0)
self.action_set_keyboard_layout.setEnabled(vm.qid != 0 and vm.last_running) self.action_set_keyboard_layout.setEnabled(vm.qid != 0 and vm.last_running)
else: else:
@ -1215,7 +1216,7 @@ class VmManagerWindow(Ui_VmManagerWindow, QMainWindow):
def set_error(self, qid, message): def set_error(self, qid, message):
for vm in self.vms_list: for vm in self.vms_list:
if vm.qid == qid: if vm.qid == qid:
vm.error_msg = message vm.qubes_manager_state[QMVmState.ErrorMsg] = message
# Store error in separate dict to make it immune to VM list reload # Store error in separate dict to make it immune to VM list reload
self.vm_errors[qid] = message self.vm_errors[qid] = message
@ -1223,13 +1224,13 @@ class VmManagerWindow(Ui_VmManagerWindow, QMainWindow):
self.vm_errors.pop(qid, None) self.vm_errors.pop(qid, None)
for vm in self.vms_list: for vm in self.vms_list:
if vm.qid == qid: if vm.qid == qid:
vm.error_msg = None vm.qubes_manager_state[QMVmState.ErrorMsg] = None
def clear_error_exact(self, qid, message): def clear_error_exact(self, qid, message):
for vm in self.vms_list: for vm in self.vms_list:
if vm.qid == qid: if vm.qid == qid:
if vm.error_msg == message: if vm.qubes_manager_state[QMVmState.ErrorMsg] == message:
vm.error_msg = None vm.qubes_manager_state[QMVmState.ErrorMsg] = None
self.vm_errors.pop(qid, None) self.vm_errors.pop(qid, None)
@pyqtSlot(name='on_action_createvm_triggered') @pyqtSlot(name='on_action_createvm_triggered')
@ -1504,6 +1505,14 @@ class VmManagerWindow(Ui_VmManagerWindow, QMainWindow):
settings_window = VMSettingsWindow(vm, app, self.qvm_collection, "applications") settings_window = VMSettingsWindow(vm, app, self.qvm_collection, "applications")
settings_window.exec_() settings_window.exec_()
def update_audio_rec_info(self, vm):
vm.qubes_manager_state[QMVmState.AudioRecAvailable] = (
session_bus.interface().isServiceRegistered('org.QubesOS.Audio.%s' % vm.name).value())
if vm.qubes_manager_state[QMVmState.AudioRecAvailable]:
vm.qubes_manager_state[QMVmState.AudioRecAllowed] = self.get_audio_rec_allowed(vm.name)
else:
vm.qubes_manager_state[QMVmState.AudioRecAllowed] = False
def get_audio_rec_allowed(self, vmname): def get_audio_rec_allowed(self, vmname):
properties = QDBusInterface('org.QubesOS.Audio.%s' % vmname, properties = QDBusInterface('org.QubesOS.Audio.%s' % vmname,
'/org/qubesos/audio', 'org.freedesktop.DBus.Properties', session_bus) '/org/qubesos/audio', 'org.freedesktop.DBus.Properties', session_bus)