def load_models(unreleased=True): global models_dict global norm_models global norm_models_keys global model_dat global total_models global sorted_category_models global unsupported_models models_dict = model_dat.read_all_files(unreleased) log.debug("Raw models:") for m in models_dict: nm = models.normalizeModelUIName(m) models_dict[m]['norm_model'] = nm.strip('~') models_dict[m]['case_models'] = [] i, case_models = 1, [] while True: try: cm = models.normalizeModelUIName(models_dict[m]['model%d' % i]) except KeyError: break case_models.append(cm) i+= 1 if not case_models: case_models = [nm] models_dict[m]['case_models'] = case_models[:] cat = categorize2(m) models_dict[m]['category'] = cat for c in case_models: norm_models[c] = cat if models_dict[m]['support-type'] == SUPPORT_TYPE_NONE: unsupported_models.append((c, m)) norm_models_keys = list(norm_models.keys()) try: norm_models_keys.sort(key=lambda y: pat_prod_num.search(y).group(1)) except: norm_models_keys.sort(key=str.lower) unsupported_models.sort(key= lambda x: x[0]) total_models = len(norm_models)
def loadDevicesTable(self): self.DevicesTableWidget.setSortingEnabled(False) self.DevicesTableWidget.setRowCount(len(self.devices)) headers = [self.__tr('Model'), self.__tr('Device URI')] device_uri_col = 1 self.DevicesTableWidget.setColumnCount(len(headers)) self.DevicesTableWidget.setHorizontalHeaderLabels(headers) flags = Qt.ItemIsSelectable | Qt.ItemIsEnabled for row, d in enumerate(self.devices): back_end, is_hp, bus, model, serial, dev_file, host, zc, port = device.parseDeviceURI(d) model_ui = models.normalizeModelUIName(model) i = DeviceTableWidgetItem(str(model_ui), d) i.setFlags(flags) self.DevicesTableWidget.setItem(row, 0, i) i = QTableWidgetItem(str(d)) i.setFlags(flags) self.DevicesTableWidget.setItem(row, device_uri_col, i) self.DevicesTableWidget.resizeColumnsToContents() self.DevicesTableWidget.setSortingEnabled(True) self.DevicesTableWidget.sortItems(0) self.DevicesTableWidget.selectRow(0)
def loadDevicesTable(self): self.DevicesTableWidget.setRowCount(len(self.devices)) if self.bus == 'net': if self.discovery_method == 0: headers = [self.__tr('Model'), self.__tr('IP Address'), self.__tr('Host Name'), self.__tr('Device URI')] device_uri_col = 3 else: headers = [self.__tr('Model'), self.__tr('Host Name'), self.__tr('Device URI')] device_uri_col = 2 else: headers = [self.__tr('Model'), self.__tr('Device URI')] device_uri_col = 1 self.DevicesTableWidget.setColumnCount(len(headers)) self.DevicesTableWidget.setHorizontalHeaderLabels(headers) flags = Qt.ItemIsSelectable | Qt.ItemIsEnabled for row, d in enumerate(self.devices): back_end, is_hp, bus, model, serial, dev_file, host, zc, port = device.parseDeviceURI(d) model_ui = models.normalizeModelUIName(model) i = DeviceTableWidgetItem(QString(model_ui), d) i.setFlags(flags) self.DevicesTableWidget.setItem(row, 0, i) i = QTableWidgetItem(QString(d)) i.setFlags(flags) self.DevicesTableWidget.setItem(row, device_uri_col, i) if self.bus == 'net': #if device.ip_pat.search(host) is None: #host = socket.gethostbyname(host) i = QTableWidgetItem(QString(host)) i.setFlags(flags) self.DevicesTableWidget.setItem(row, 1, i) if self.discovery_method == 0: i = QTableWidgetItem(QString(self.devices[d][2])) i.setFlags(flags) self.DevicesTableWidget.setItem(row, 2, i) self.DevicesTableWidget.resizeColumnsToContents() self.DevicesTableWidget.selectRow(0) self.DevicesTableWidget.setSortingEnabled(True) self.DevicesTableWidget.sortItems(0)
def __init__(self, device_uri, needs_update=True): self.needs_update = needs_update self.device_uri = device_uri back_end, is_hp, bus, model, serial, dev_file, host, zc, port = \ device.parseDeviceURI(device_uri) if bus == 'usb': self.id = serial elif bus == 'net': self.id = host elif bus == 'par': self.id = dev_file else: self.id = 'unknown' self.model = models.normalizeModelUIName(model) if back_end == 'hp': self.device_type = DEVICE_TYPE_PRINTER self.menu_text = self.__tr("%1 Printer (%2)").arg(self.model).arg(self.id) elif back_end == 'hpaio': self.device_type = DEVICE_TYPE_SCANNER self.menu_text = self.__tr("%1 Scanner (%2)").arg(self.model).arg(self.id) elif back_end == 'hpfax': self.device_type = DEVICE_TYPE_FAX self.menu_text = self.__tr("%1 Fax (%2)").arg(self.model).arg(self.id) else: self.device_type = DEVICE_TYPE_UNKNOWN self.menu_text = self.__tr("%1 (%2)").arg(self.model).arg(self.id) self.mq = device.queryModelByURI(self.device_uri) self.index = 0 if self.mq.get('tech-type', TECH_TYPE_NONE) in (TECH_TYPE_MONO_LASER, TECH_TYPE_COLOR_LASER): self.index = 1 self.history = None
def __init__(self, device_uri, needs_update=True): self.needs_update = needs_update self.device_uri = device_uri back_end, is_hp, bus, model, serial, dev_file, host, zc, port = \ device.parseDeviceURI(device_uri) if bus == 'usb': self.id = serial elif bus == 'net': self.id = host elif bus == 'par': self.id = dev_file else: self.id = 'unknown' self.model = models.normalizeModelUIName(model) if back_end == 'hp': self.device_type = DEVICE_TYPE_PRINTER self.menu_text = self.__tr("%s Printer (%s)"%(self.model,self.id)) elif back_end == 'hpaio': self.device_type = DEVICE_TYPE_SCANNER self.menu_text = self.__tr("%s Scanner (%s)"%(self.model,self.id)) elif back_end == 'hpfax': self.device_type = DEVICE_TYPE_FAX self.menu_text = self.__tr("%s Fax (%s)"%(self.model,self.id)) else: self.device_type = DEVICE_TYPE_UNKNOWN self.menu_text = self.__tr("%s (%s)"%(self.model,self.id)) self.mq = device.queryModelByURI(self.device_uri) self.index = 0 if self.mq.get('tech-type', TECH_TYPE_NONE) in (TECH_TYPE_MONO_LASER, TECH_TYPE_COLOR_LASER): self.index = 1 self.history = None
def updateProbedDevicesPage(self, devices=None, param=''): QApplication.setOverrideCursor(QApplication.waitCursor) if self.bus == 'net': io_str = self.__tr("network") elif self.bus == 'usb': io_str = self.__tr("USB bus") elif self.bus == 'par': io_str = self.__tr("parallel port") QToolTip.add(self.searchFiltersPushButton, self.__tr('Current Settings: Filter: [%2] Search: "%3" TTL: %4 Timeout: %5s').arg(','.join(self.filter)).arg(self.search or '').arg(self.ttl).arg(self.timeout)) log.debug("Updating probed devices list...") log.debug(self.bus) self.probedDevicesListView.clear() while self.probedDevicesListView.columns(): self.probedDevicesListView.removeColumn(0) self.probedDevicesListView.addColumn(self.__tr("Model")) if self.bus == 'usb': self.probedDevicesListView.addColumn(self.__tr("Serial No.")) elif self.bus == 'net': self.probedDevicesListView.addColumn(self.__tr("IP Address")) self.probedDevicesListView.addColumn(self.__tr("Host Name")) elif self.bus == 'par': self.probedDevicesListView.addColumn(self.__tr("Device")) self.probedDevicesListView.addColumn(self.__tr("Device URI")) if devices is None: FILTER_MAP = {'print' : None, 'none' : None, 'scan': 'scan-type', 'copy': 'copy-type', 'pcard': 'pcard-type', 'fax': 'fax-type', } filter_dict = {} if prop.fax_build and prop.scan_build: for f in self.filter: if f in FILTER_MAP: filter_dict[FILTER_MAP[f]] = (operator.gt, 0) else: filter_dict[f] = (operator.gt, 0) else: filter_dict['scan-type'] = (operator.ge, SCAN_TYPE_NONE) devices = device.probeDevices([self.bus], self.timeout, self.ttl, filter_dict, self.search, net_search='slp') self.probeHeadingTextLabel.setText(self.__tr("%1 device(s) found on the %1:").arg(len(devices)).arg(io_str)) else: if self.bus == 'net': self.probeHeadingTextLabel.setText(self.__tr("%1 device(s) found on the %1 at address %2:").arg(len(devices)).arg(io_str).arg(param)) elif self.bus == 'usb': self.probeHeadingTextLabel.setText(self.__tr("%1 device(s) found on the %1 at ID %2:").arg(len(devices)).arg(io_str).arg(param)) elif self.bus == 'par': self.probeHeadingTextLabel.setText(self.__tr("%1 device(s) found on the %1 device node ID %2:").arg(len(devices)).arg(io_str).arg(param)) log.debug(devices) if devices: row = 0 for d in devices: back_end, is_hp, bus, model, serial, dev_file, host, zc, port = device.parseDeviceURI(d) mq = {} model_ui = models.normalizeModelUIName(model) if self.bus == 'usb': i = DeviceListViewItem(self.probedDevicesListView, d, mq, model_ui, serial, d) elif self.bus == 'net': i = DeviceListViewItem(self.probedDevicesListView, d, mq, model_ui, host, devices[d][2], d) elif self.bus == 'par': i = DeviceListViewItem(self.probedDevicesListView, d, mq, model_ui, dev_file, d) row += 1 i = self.probedDevicesListView.firstChild() self.probedDevicesListView.setCurrentItem(i) self.probedDevicesListView.setSelected(i, True) item = self.probedDevicesListView.currentItem() self.device_uri = item.device_uri self.updateModelQuery(item) self.setNextEnabled(self.ProbedDevicesPage, True) log.debug(self.device_uri) else: self.setNextEnabled(self.ProbedDevicesPage, False) QApplication.restoreOverrideCursor() return False QApplication.restoreOverrideCursor() return True
def notifierActivated(self, s): m = '' while True: try: r, w, e = select.select([self.read_pipe], [], [self.read_pipe], 1.0) except select.error: log.debug("Error in select()") break if e: log.error("Pipe error: %s" % e) break if r: #m = ''.join([m, os.read(self.read_pipe, self.fmt_size)]) m = os.read(self.read_pipe, self.fmt_size) while len(m) >= self.fmt_size: event = device.Event(*[x.rstrip(b'\x00').decode('utf-8') if isinstance(x, bytes) else x for x in struct.unpack(self.fmt, m[:self.fmt_size])]) m = m[self.fmt_size:] if event.event_code == EVENT_CUPS_QUEUES_REMOVED or event.event_code == EVENT_CUPS_QUEUES_ADDED: self.resetDevice() for d in device.getSupportedCUPSDevices(back_end_filter=['hp', 'hpfax']): self.addDevice(d) self.setMenu() if event.event_code == EVENT_USER_CONFIGURATION_CHANGED: log.debug("Re-reading configuration (EVENT_USER_CONFIGURATION_CHANGED)") self.user_settings.load() self.user_settings.debug() elif event.event_code == EVENT_SYSTEMTRAY_EXIT: self.quit() return if self.user_settings.systray_visible in \ (SYSTRAY_VISIBLE_SHOW_ALWAYS, SYSTRAY_VISIBLE_HIDE_WHEN_INACTIVE): log.debug("Showing...") self.tray_icon.setVisible(True) if event.event_code == EVENT_DEVICE_UPDATE_ACTIVE: if not self.active_icon: self.tray_icon.setIcon(self.prop_active_icon) self.active_icon = True continue elif event.event_code == EVENT_DEVICE_UPDATE_INACTIVE: if self.active_icon: self.tray_icon.setIcon(self.prop_icon) self.active_icon = False continue elif event.event_code == EVENT_DEVICE_UPDATE_BLIP: if not self.active_icon: self.tray_icon.setIcon(self.prop_active_icon) self.active_icon = True QTimer.singleShot(BLIP_DELAY, self.blipTimeout) continue if self.user_settings.systray_visible in (SYSTRAY_VISIBLE_HIDE_WHEN_INACTIVE, SYSTRAY_VISIBLE_HIDE_ALWAYS): log.debug("Waiting to hide...") QTimer.singleShot(HIDE_INACTIVE_DELAY, self.timeoutHideWhenInactive) if event.event_code <= EVENT_MAX_USER_EVENT or \ event.event_code == EVENT_CUPS_QUEUES_REMOVED or event.event_code == EVENT_CUPS_QUEUES_ADDED: if event.event_code != EVENT_CUPS_QUEUES_REMOVED: self.addDevice(event.device_uri) self.setMenu() if self.tray_icon.supportsMessages(): log.debug("Tray icon message:") event.debug() error_state = STATUS_TO_ERROR_STATE_MAP.get(event.event_code, ERROR_STATE_CLEAR) desc = device.queryString(event.event_code) show_message = False if self.user_settings.systray_messages == SYSTRAY_MESSAGES_SHOW_ALL: # OK, Busy show_message = True elif self.user_settings.systray_messages in (SYSTRAY_MESSAGES_SHOW_ERRORS_AND_WARNINGS, SYSTRAY_MESSAGES_SHOW_ERRORS_ONLY): if error_state == ERROR_STATE_ERROR: show_message = True elif self.user_settings.systray_messages == SYSTRAY_MESSAGES_SHOW_ERRORS_AND_WARNINGS and \ error_state in (ERROR_STATE_WARNING, ERROR_STATE_LOW_SUPPLIES, ERROR_STATE_LOW_PAPER): show_message = True if event.printer_name: d = event.printer_name else: back_end, is_hp, bus, model, serial, dev_file, host, zc, port = \ device.parseDeviceURI(event.device_uri) if bus == 'usb': idd = serial elif bus == 'net': idd = host elif bus == 'par': idd = dev_file else: idd = 'unknown' self.model = models.normalizeModelUIName(model) if back_end == 'hp': d = self.__tr("%s Printer (%s)"%(model,idd)) elif back_end == 'hpaio': d = self.__tr("%s Scanner (%s)"%(model,idd)) elif back_end == 'hpfax': d = self.__tr("%s Fax (%s)"%(model,idd)) else: d = self.__tr("%s (%s)"%(model,idd)) if show_message: if have_pynotify and pynotify.init("hplip"): # Use libnotify/pynotify icon, urgency = ERROR_STATE_TO_ICON_AND_URGENCY_PYNOTIFY.get(error_state, (getPynotifyIcon('info'), pynotify.URGENCY_NORMAL)) if event.job_id and event.title: msg = "%s\n%s: %s\n(%s/%s)" % (to_unicode(d), desc, event.title, event.username, event.job_id) log.debug("Notify: uri=%s desc=%s title=%s user=%s job_id=%d code=%d" % (event.device_uri, desc, event.title, event.username, event.job_id, event.event_code)) else: msg = "%s\n%s (%s)" % (to_unicode(d), desc, event.event_code) log.debug("Notify: uri=%s desc=%s code=%d" % (event.device_uri, desc, event.event_code)) n = pynotify.Notification("HPLIP Device Status", msg, icon) # CRID: 11833 Debian Traceback error notification exceeded n.set_hint('transient', True) n.set_urgency(urgency) if error_state == ERROR_STATE_ERROR: n.set_timeout(pynotify.EXPIRES_NEVER) else: n.set_timeout(TRAY_MESSAGE_DELAY) n.show() else: # Use "standard" message bubbles icon = ERROR_STATE_TO_ICON.get(error_state, QSystemTrayIcon.Information) if event.job_id and event.title: log.debug("Bubble: uri=%s desc=%s title=%s user=%s job_id=%d code=%d" % (event.device_uri, desc, event.title, event.username, event.job_id, event.event_code)) self.tray_icon.showMessage(self.__tr("HPLIP Device Status"), "%s\n%s: %s\n(%s/%s)"%(d,desc, event.title,event.username,event.job_id), icon, TRAY_MESSAGE_DELAY) else: log.debug("Bubble: uri=%s desc=%s code=%d" % (event.device_uri, desc, event.event_code)) self.tray_icon.showMessage(self.__tr("HPLIP Device Status"), "%s\n%s (%s)"%(d,desc,event.event_code), icon, TRAY_MESSAGE_DELAY) else: break
def notifierActivated(self, s): m = '' while True: try: r, w, e = select.select([self.read_pipe], [], [self.read_pipe], 1.0) except select.error: log.debug("Error in select()") break if e: log.error("Pipe error: %s" % e) break if r: m = ''.join([m, os.read(self.read_pipe, self.fmt_size)]) while len(m) >= self.fmt_size: event = device.Event(*struct.unpack(self.fmt, m[:self.fmt_size])) m = m[self.fmt_size:] if event.event_code == EVENT_USER_CONFIGURATION_CHANGED: log.debug("Re-reading configuration (EVENT_USER_CONFIGURATION_CHANGED)") self.user_settings.load() self.user_settings.debug() elif event.event_code == EVENT_SYSTEMTRAY_EXIT: self.quit() return if self.user_settings.systray_visible in \ (SYSTRAY_VISIBLE_SHOW_ALWAYS, SYSTRAY_VISIBLE_HIDE_WHEN_INACTIVE): log.debug("Showing...") self.tray_icon.setVisible(True) if event.event_code == EVENT_DEVICE_UPDATE_ACTIVE: if not self.active_icon: self.tray_icon.setIcon(self.prop_active_icon) self.active_icon = True continue elif event.event_code == EVENT_DEVICE_UPDATE_INACTIVE: if self.active_icon: self.tray_icon.setIcon(self.prop_icon) self.active_icon = False continue elif event.event_code == EVENT_DEVICE_UPDATE_BLIP: if not self.active_icon: self.tray_icon.setIcon(self.prop_active_icon) self.active_icon = True QTimer.singleShot(BLIP_DELAY, self.blipTimeout) continue if self.user_settings.systray_visible in (SYSTRAY_VISIBLE_HIDE_WHEN_INACTIVE, SYSTRAY_VISIBLE_HIDE_ALWAYS): log.debug("Waiting to hide...") QTimer.singleShot(HIDE_INACTIVE_DELAY, self.timeoutHideWhenInactive) if event.event_code <= EVENT_MAX_USER_EVENT: self.addDevice(event.device_uri) self.setMenu() if self.tray_icon.supportsMessages(): log.debug("Tray icon message:") event.debug() error_state = STATUS_TO_ERROR_STATE_MAP.get(event.event_code, ERROR_STATE_CLEAR) desc = device.queryString(event.event_code) show_message = False if self.user_settings.systray_messages == SYSTRAY_MESSAGES_SHOW_ALL: # OK, Busy show_message = True elif self.user_settings.systray_messages in (SYSTRAY_MESSAGES_SHOW_ERRORS_AND_WARNINGS, SYSTRAY_MESSAGES_SHOW_ERRORS_ONLY): if error_state == ERROR_STATE_ERROR: show_message = True elif self.user_settings.systray_messages == SYSTRAY_MESSAGES_SHOW_ERRORS_AND_WARNINGS and \ error_state in (ERROR_STATE_WARNING, ERROR_STATE_LOW_SUPPLIES, ERROR_STATE_LOW_PAPER): show_message = True if event.printer_name: d = QString(event.printer_name) else: back_end, is_hp, bus, model, serial, dev_file, host, zc, port = \ device.parseDeviceURI(event.device_uri) if bus == 'usb': idd = serial elif bus == 'net': idd = host elif bus == 'par': idd = dev_file else: idd = 'unknown' self.model = models.normalizeModelUIName(model) if back_end == 'hp': d = self.__tr("%1 Printer (%2)").arg(model).arg(idd) elif back_end == 'hpaio': d = self.__tr("%1 Scanner (%2)").arg(model).arg(idd) elif back_end == 'hpfax': d = self.__tr("%1 Fax (%2)").arg(model).arg(idd) else: d = self.__tr("%1 (%2)").arg(model).arg(idd) if show_message: if have_pynotify and pynotify.init("hplip"): # Use libnotify/pynotify icon, urgency = ERROR_STATE_TO_ICON_AND_URGENCY_PYNOTIFY.get(error_state, (getPynotifyIcon('info'), pynotify.URGENCY_NORMAL)) if event.job_id and event.title: msg = "%s\n%s: %s\n(%s/%s)" % (unicode(d), desc, event.title, event.username, event.job_id) log.debug("Notify: uri=%s desc=%s title=%s user=%s job_id=%d code=%d" % (event.device_uri, desc, event.title, event.username, event.job_id, event.event_code)) else: msg = "%s\n%s (%s)" % (unicode(d), desc, event.event_code) log.debug("Notify: uri=%s desc=%s code=%d" % (event.device_uri, desc, event.event_code)) n = pynotify.Notification("HPLIP Device Status", msg, icon) n.set_urgency(urgency) if error_state == ERROR_STATE_ERROR: n.set_timeout(pynotify.EXPIRES_NEVER) else: n.set_timeout(TRAY_MESSAGE_DELAY) n.show() else: # Use "standard" message bubbles icon = ERROR_STATE_TO_ICON.get(error_state, QSystemTrayIcon.Information) if event.job_id and event.title: log.debug("Bubble: uri=%s desc=%s title=%s user=%s job_id=%d code=%d" % (event.device_uri, desc, event.title, event.username, event.job_id, event.event_code)) self.tray_icon.showMessage(self.__tr("HPLIP Device Status"), QString("%1\n%2: %3\n(%4/%5)").\ arg(d).\ arg(desc).arg(event.title).\ arg(event.username).arg(event.job_id), icon, TRAY_MESSAGE_DELAY) else: log.debug("Bubble: uri=%s desc=%s code=%d" % (event.device_uri, desc, event.event_code)) self.tray_icon.showMessage(self.__tr("HPLIP Device Status"), QString("%1\n%2 (%3)").arg(d).\ arg(desc).arg(event.event_code), icon, TRAY_MESSAGE_DELAY) else: break
def updateProbedDevicesPage(self, devices=None, param=""): QApplication.setOverrideCursor(QApplication.waitCursor) if self.bus == "net": io_str = self.__tr("network") elif self.bus == "usb": io_str = self.__tr("USB bus") elif self.bus == "par": io_str = self.__tr("parallel port") QToolTip.add( self.searchFiltersPushButton, self.__tr('Current Settings: Filter: [%2] Search: "%3" TTL: %4 Timeout: %5s') .arg(",".join(self.filter)) .arg(self.search or "") .arg(self.ttl) .arg(self.timeout), ) log.debug("Updating probed devices list...") log.debug(self.bus) self.probedDevicesListView.clear() while self.probedDevicesListView.columns(): self.probedDevicesListView.removeColumn(0) self.probedDevicesListView.addColumn(self.__tr("Model")) if self.bus == "usb": self.probedDevicesListView.addColumn(self.__tr("Serial No.")) elif self.bus == "net": self.probedDevicesListView.addColumn(self.__tr("IP Address")) self.probedDevicesListView.addColumn(self.__tr("Host Name")) elif self.bus == "par": self.probedDevicesListView.addColumn(self.__tr("Device")) self.probedDevicesListView.addColumn(self.__tr("Device URI")) if devices is None: FILTER_MAP = { "print": None, "none": None, "scan": "scan-type", "copy": "copy-type", "pcard": "pcard-type", "fax": "fax-type", } filter_dict = {} if prop.fax_build and prop.scan_build: for f in self.filter: if f in FILTER_MAP: filter_dict[FILTER_MAP[f]] = (operator.gt, 0) else: filter_dict[f] = (operator.gt, 0) else: filter_dict["scan-type"] = (operator.ge, SCAN_TYPE_NONE) if self.bus == "usb": try: from base import smart_install except ImportError: log.error("Failed to Import smart_install.py") else: # check if any SmartInstall devices and disables (if not, ignores) smart_install.disable(GUI_MODE, "qt3") devices = device.probeDevices( [self.bus], self.timeout, self.ttl, filter_dict, self.search, net_search="slp" ) self.probeHeadingTextLabel.setText(self.__tr("%1 device(s) found on the %1:").arg(len(devices)).arg(io_str)) else: if self.bus == "net": self.probeHeadingTextLabel.setText( self.__tr("%1 device(s) found on the %1 at address %2:").arg(len(devices)).arg(io_str).arg(param) ) elif self.bus == "usb": self.probeHeadingTextLabel.setText( self.__tr("%1 device(s) found on the %1 at ID %2:").arg(len(devices)).arg(io_str).arg(param) ) elif self.bus == "par": self.probeHeadingTextLabel.setText( self.__tr("%1 device(s) found on the %1 device node ID %2:") .arg(len(devices)) .arg(io_str) .arg(param) ) log.debug(devices) if devices: row = 0 for d in devices: back_end, is_hp, bus, model, serial, dev_file, host, zc, port = device.parseDeviceURI(d) mq = {} model_ui = models.normalizeModelUIName(model) if self.bus == "usb": i = DeviceListViewItem(self.probedDevicesListView, d, mq, model_ui, serial, d) elif self.bus == "net": i = DeviceListViewItem(self.probedDevicesListView, d, mq, model_ui, host, devices[d][2], d) elif self.bus == "par": i = DeviceListViewItem(self.probedDevicesListView, d, mq, model_ui, dev_file, d) row += 1 i = self.probedDevicesListView.firstChild() self.probedDevicesListView.setCurrentItem(i) self.probedDevicesListView.setSelected(i, True) item = self.probedDevicesListView.currentItem() self.device_uri = item.device_uri self.updateModelQuery(item) self.setNextEnabled(self.ProbedDevicesPage, True) log.debug(self.device_uri) else: self.setNextEnabled(self.ProbedDevicesPage, False) QApplication.restoreOverrideCursor() return False QApplication.restoreOverrideCursor() return True
def notifierActivated(self, s): m = '' while True: try: r, w, e = select.select([self.read_pipe], [], [self.read_pipe], 1.0) except select.error: log.debug("Error in select()") break if e: log.error("Pipe error: %s" % e) break if r: #m = ''.join([m, os.read(self.read_pipe, self.fmt_size)]) m = os.read(self.read_pipe, self.fmt_size) while len(m) >= self.fmt_size: event = device.Event(*[x.rstrip(b'\x00').decode('utf-8') if isinstance(x, bytes) else x for x in struct.unpack(self.fmt, m[:self.fmt_size])]) m = m[self.fmt_size:] if event.event_code == EVENT_ERROR_NO_PROBED_DEVICES_FOUND: newmsg = "HPLIP cannot detect devices in your network. This may be due to existing firewall settings blocking the required ports like (5353/udp). When you are in a trusted network environment, you may open the ports for network services like mdns and slp in the firewall. For detailed steps follow the link.\n\n http://hplipopensource.com/node/375" FailureUI(None, newmsg, "") continue if event.event_code == EVENT_CUPS_QUEUES_REMOVED or event.event_code == EVENT_CUPS_QUEUES_ADDED: self.resetDevice() for d in device.getSupportedCUPSDevices(back_end_filter=['hp', 'hpfax']): self.addDevice(d) self.setMenu() if event.event_code == EVENT_USER_CONFIGURATION_CHANGED: log.debug("Re-reading configuration (EVENT_USER_CONFIGURATION_CHANGED)") self.user_settings.load() self.user_settings.debug() elif event.event_code == EVENT_SYSTEMTRAY_EXIT: self.quit() return if self.user_settings.systray_visible in \ (SYSTRAY_VISIBLE_SHOW_ALWAYS, SYSTRAY_VISIBLE_HIDE_WHEN_INACTIVE): log.debug("Showing...") self.tray_icon.setVisible(True) if event.event_code == EVENT_DEVICE_UPDATE_ACTIVE: if not self.active_icon: self.tray_icon.setIcon(self.prop_active_icon) self.active_icon = True continue elif event.event_code == EVENT_DEVICE_UPDATE_INACTIVE: if self.active_icon: self.tray_icon.setIcon(self.prop_icon) self.active_icon = False continue elif event.event_code == EVENT_DEVICE_UPDATE_BLIP: if not self.active_icon: self.tray_icon.setIcon(self.prop_active_icon) self.active_icon = True QTimer.singleShot(BLIP_DELAY, self.blipTimeout) continue if self.user_settings.systray_visible in (SYSTRAY_VISIBLE_HIDE_WHEN_INACTIVE, SYSTRAY_VISIBLE_HIDE_ALWAYS): log.debug("Waiting to hide...") QTimer.singleShot(HIDE_INACTIVE_DELAY, self.timeoutHideWhenInactive) if event.event_code <= EVENT_MAX_USER_EVENT or \ event.event_code == EVENT_CUPS_QUEUES_REMOVED or event.event_code == EVENT_CUPS_QUEUES_ADDED: if event.event_code != EVENT_CUPS_QUEUES_REMOVED: self.addDevice(event.device_uri) self.setMenu() if self.tray_icon.supportsMessages(): log.debug("Tray icon message:") event.debug() error_state = STATUS_TO_ERROR_STATE_MAP.get(event.event_code, ERROR_STATE_CLEAR) desc = device.queryString(event.event_code) show_message = False if self.user_settings.systray_messages == SYSTRAY_MESSAGES_SHOW_ALL: # OK, Busy show_message = True elif self.user_settings.systray_messages in (SYSTRAY_MESSAGES_SHOW_ERRORS_AND_WARNINGS, SYSTRAY_MESSAGES_SHOW_ERRORS_ONLY): if error_state == ERROR_STATE_ERROR: show_message = True elif self.user_settings.systray_messages == SYSTRAY_MESSAGES_SHOW_ERRORS_AND_WARNINGS and \ error_state in (ERROR_STATE_WARNING, ERROR_STATE_LOW_SUPPLIES, ERROR_STATE_LOW_PAPER): show_message = True if event.printer_name: d = QString(event.printer_name) else: back_end, is_hp, bus, model, serial, dev_file, host, zc, port = \ device.parseDeviceURI(event.device_uri) if bus == 'usb': idd = serial elif bus == 'net': idd = host elif bus == 'par': idd = dev_file else: idd = 'unknown' self.model = models.normalizeModelUIName(model) if back_end == 'hp': d = self.__tr("%s Printer (%s)"%(model,idd)) elif back_end == 'hpaio': d = self.__tr("%s Scanner (%s)"%(model,idd)) elif back_end == 'hpfax': d = self.__tr("%s Fax (%s)"%(model,idd)) else: d = self.__tr("%s (%s)"%(model,idd)) if show_message: if have_pynotify and pynotify.init("hplip"): # Use libnotify/pynotify icon, urgency = ERROR_STATE_TO_ICON_AND_URGENCY_PYNOTIFY.get(error_state, (getPynotifyIcon('info'), pynotify.URGENCY_NORMAL)) if event.job_id and event.title: msg = "%s\n%s: %s\n(%s/%s)" % (to_unicode(d), desc, event.title, event.username, event.job_id) log.debug("Notify: uri=%s desc=%s title=%s user=%s job_id=%d code=%d" % (event.device_uri, desc, event.title, event.username, event.job_id, event.event_code)) else: msg = "%s\n%s (%s)" % (to_unicode(d), desc, event.event_code) log.debug("Notify: uri=%s desc=%s code=%d" % (event.device_uri, desc, event.event_code)) n = pynotify.Notification("HPLIP Device Status", msg, icon) # CRID: 11833 Debian Traceback error notification exceeded n.set_hint('transient', True) n.set_urgency(urgency) if error_state == ERROR_STATE_ERROR: n.set_timeout(pynotify.EXPIRES_NEVER) else: n.set_timeout(TRAY_MESSAGE_DELAY) n.show() else: # Use "standard" message bubbles icon = ERROR_STATE_TO_ICON.get(error_state, QSystemTrayIcon.Information) if event.job_id and event.title: log.debug("Bubble: uri=%s desc=%s title=%s user=%s job_id=%d code=%d" % (event.device_uri, desc, event.title, event.username, event.job_id, event.event_code)) self.tray_icon.showMessage(self.__tr("HPLIP Device Status"), QString("%s\n%s: %s\n(%s/%s)"%(d,desc, event.title,event.username,event.job_id)), icon, TRAY_MESSAGE_DELAY) else: log.debug("Bubble: uri=%s desc=%s code=%d" % (event.device_uri, desc, event.event_code)) self.tray_icon.showMessage(self.__tr("HPLIP Device Status"), QString("%s\n%s (%s)"%(d,desc,event.event_code)), icon, TRAY_MESSAGE_DELAY) else: break