# -*- coding: utf-8 -*- # # (c) Copyright 2001-2015 HP Development Company, L.P. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA # # Authors: Don Welch # # Local from base.g import * from base import device, utils from prnt import cups from base.codes import * from .ui_utils import * from installer import pluginhandler from base.sixext import to_unicode # Qt from PyQt5.QtCore import * from PyQt5.QtGui import * from PyQt5.QtWidgets import * # Ui from .plugindialog_base import Ui_Dialog #signal import signal PAGE_SOURCE = 0 # PAGE_LICENSE = 1 # part of plug-in itself, this is a placeholder PAGE_MAX = 1 class PluginDialog(QDialog, Ui_Dialog): def __init__(self, parent, install_mode=PLUGIN_NONE, plugin_reason=PLUGIN_REASON_NONE): QDialog.__init__(self, parent) self.install_mode = install_mode self.plugin_reason = plugin_reason self.plugin_path = "" self.result = False self.pluginObj = pluginhandler.PluginHandle() self.setupUi(self) self.user_settings = UserSettings() self.user_settings.load() self.user_settings.debug() self.initUi() QTimer.singleShot(0, self.showSourcePage) def isPluginInstalled(self): return self.pluginObj.getStatus() def initUi(self): # connect signals/slots # self.CancelButton.clicked.connect(self.CancelButton_clicked) self.CancelButton.clicked.connect(self.CancelButton_clicked) # self.NextButton.clicked.connect(self.NextButton_clicked) self.NextButton.clicked.connect(self.NextButton_clicked) # Application icon self.setWindowIcon(QIcon(load_pixmap('hp_logo', '128x128'))) self.PLUGIN_REASON_TEXT = { PLUGIN_REASON_NONE: None, PLUGIN_REASON_PRINTING_SUPPORT: self.__tr("This plugin will enable printing support."), PLUGIN_REASON_FASTER_PRINTING: self.__tr("This plugin will enhance print speed."), PLUGIN_REASON_BETTER_PRINTING_PQ: self.__tr("This plugin will enhance print quality."), PLUGIN_REASON_PRINTING_FEATURES: self.__tr("This plugin will add printing features."), PLUGIN_REASON_RESERVED_10: None, PLUGIN_REASON_RESERVED_20: None, PLUGIN_REASON_SCANNING_SUPPORT: self.__tr("This plugin will enable scanning support."), PLUGIN_REASON_FASTER_SCANNING: self.__tr("This plugin will enhance scanning speed."), PLUGIN_REASON_BETTER_SCANNING_IQ: self.__tr("This plugin will enhance scanning image quality."), PLUGIN_REASON_RESERVED_200: None, PLUGIN_REASON_RESERVED_400: None, PLUGIN_REASON_FAXING_SUPPORT: self.__tr("This plugin will enable faxing support."), PLUGIN_REASON_FAX_FEATURES: self.__tr("This plugin will enhnace faxing features."), PLUGIN_REASON_RESERVED_20000: None, PLUGIN_REASON_RESERVED_40000: None, } # # SOURCE PAGE # def showSourcePage(self): reason_text = self.plugin_reason_text() if self.install_mode == PLUGIN_REQUIRED: self.SkipRadioButton.setEnabled(False) msg = "An additional driver plug-in is required to operate this printer. You may download the plug-in directly from an HP authorized server (recommended), or, if you already have a copy of the file, you can specify a path to the file (advanced)." if reason_text is not None: msg += "<br><br>%s"%reason_text self.TitleLabel.setText(self.__tr(msg)) elif self.install_mode == PLUGIN_OPTIONAL: msg = "An optional driver plug-in is available to enhance the operation of this printer. You may download the plug-in directly from an HP authorized server (recommended), skip this installation (not recommended), or, if you already have a copy of the file, you can specify a path to the file (advanced)." if reason_text is not None: msg += "<br><br>%s"%reason_text self.TitleLabel.setText(self.__tr(msg)) self.DownloadRadioButton.toggled[bool].connect(self.DownloadRadioButton_toggled) self.CopyRadioButton.toggled[bool].connect(self.CopyRadioButton_toggled) self.SkipRadioButton.toggled[bool].connect(self.SkipRadioButton_toggled) self.PathLineEdit.textChanged["const QString &"].connect(self.PathLineEdit_textChanged) self.BrowseToolButton.clicked.connect(self.BrowseToolButton_clicked) signal.signal(signal.SIGINT, signal.SIG_DFL) self.BrowseToolButton.setIcon(QIcon(load_pixmap('folder_open', '16x16'))) self.displayPage(PAGE_SOURCE) def DownloadRadioButton_toggled(self, b): if b: self.PathLineEdit.setEnabled(False) self.BrowseToolButton.setEnabled(False) self.NextButton.setEnabled(True) try: self.PathLineEdit.setStyleSheet("") except AttributeError: pass self.plugin_path = None def CopyRadioButton_toggled(self, b): if b: self.PathLineEdit.setEnabled(True) self.BrowseToolButton.setEnabled(True) self.plugin_path = to_unicode(self.PathLineEdit.text()) self.setPathIndicators() def SkipRadioButton_toggled(self, b): if b: self.PathLineEdit.setEnabled(False) self.BrowseToolButton.setEnabled(False) self.NextButton.setEnabled(True) try: self.PathLineEdit.setStyleSheet("") except AttributeError: pass self.plugin_path = None def PathLineEdit_textChanged(self, t): self.plugin_path = to_unicode(t) self.setPathIndicators() def setPathIndicators(self): ok = True if not self.plugin_path or (self.plugin_path and os.path.isdir(self.plugin_path)): self.PathLineEdit.setToolTip(self.__tr("You must specify a path to the '%s' file."%self.pluginObj.getFileName() )) ok = False elif os.path.basename(self.plugin_path) != self.pluginObj.getFileName(): self.PathLineEdit.setToolTip(self.__tr("The plugin filename must be '%s'."%self.pluginObj.getFileName())) ok = False if not ok: try: self.PathLineEdit.setStyleSheet("background-color: yellow; ") except AttributeError: pass self.NextButton.setEnabled(False) else: try: self.PathLineEdit.setStyleSheet("") except AttributeError: pass self.NextButton.setEnabled(True) self.PathLineEdit.setToolTip("") def BrowseToolButton_clicked(self): t = to_unicode(self.PathLineEdit.text()) path ="" if not os.path.exists(t): path = QFileDialog.getOpenFileName(self, self.__tr("Select Plug-in File"), #user_conf.workingDirectory(), self.user_settings.working_dir, self.__tr("Plugin Files (*.run)")) if path: self.plugin_path = path[0] self.PathLineEdit.setText(self.plugin_path) #user_conf.setWorkingDirectory(self.plugin_path) self.user_settings.working_dir = self.plugin_path self.user_settings.save() self.setPathIndicators() # # Misc # def displayPage(self, page): self.updateStepText(page) self.StackedWidget.setCurrentIndex(page) def CancelButton_clicked(self): self.close() def NextButton_clicked(self): if self.SkipRadioButton.isChecked(): log.debug("Skipping plug-in installation.") self.close() return beginWaitCursor() try: if self.plugin_path: # User specified Path if not self.plugin_path.startswith('http://'): self.plugin_path = 'file://' + self.plugin_path else: log.info("Checking for network connection...") ok = utils.check_network_connection() if not ok: log.error("Network connection not detected.") endWaitCursor() FailureUI(self, self.__tr("Network connection not detected.")) self.close() return log.info("Downloading plug-in from: %s" % self.plugin_path) status, download_plugin_file, error_str = self.pluginObj.download(self.plugin_path,self.plugin_download_callback) if status in (ERROR_UNABLE_TO_RECV_KEYS, ERROR_DIGITAL_SIGN_NOT_FOUND): endWaitCursor() if QMessageBox.question(self, " ", self.__tr("<b>%s</b><p>Without this, it is not possible to authenticate and validate the plug-in prior to installation.</p>Do you still want to install the plug-in?" %error_str), QMessageBox.Yes | QMessageBox.No, QMessageBox.No) != QMessageBox.Yes: self.pluginObj.deleteInstallationFiles(download_plugin_file) self.close() return elif status != ERROR_SUCCESS: self.pluginObj.deleteInstallationFiles(download_plugin_file) endWaitCursor() FailureUI(self, error_str) self.close() return if not self.pluginObj.run_plugin(download_plugin_file, GUI_MODE): self.pluginObj.deleteInstallationFiles(download_plugin_file) endWaitCursor() FailureUI(self, self.__tr("Plug-in install failed.")) self.close() return cups_devices = device.getSupportedCUPSDevices(['hp']) for dev in cups_devices: mq = device.queryModelByURI(dev) if mq.get('fw-download', False): # Download firmware if needed log.info(log.bold("\nDownloading firmware to device %s..." % dev)) try: d = None try: d = device.Device(dev) except Error: log.error("Error opening device.") endWaitCursor() FailureUI(self, self.__tr("<b>Firmware download to device failed.</b><p>%s</p>"%dev)) continue if d.downloadFirmware(): log.info("Firmware download successful.\n") else: endWaitCursor() FailureUI(self, self.__tr("<b>Firmware download to device failed.</b><p>%s</p>"%dev)) finally: if d is not None: d.close() finally: endWaitCursor() self.pluginObj.deleteInstallationFiles(download_plugin_file) SuccessUI(self, self.__tr("<b>Plug-in installation successful</b>")) self.result = True self.close() def plugin_download_callback(self, c, s, t): pass def plugin_install_callback(self, s): print(s) def updateStepText(self, p): self.StepText.setText(self.__tr("Step %s of %s"%( p+1, PAGE_MAX+1))) def plugin_reason_text(self): try: return self.PLUGIN_REASON_TEXT[self.plugin_reason] except KeyError: return None def __tr(self,s,c = None): return qApp.translate("PluginDialog",s,c)
Name | Type | Size | Permission | Actions |
---|---|---|---|---|
__pycache__ | Folder | 0755 |
|
|
__init__.py | File | 786 B | 0644 |
|
aboutdialog.py | File | 1.7 KB | 0644 |
|
aboutdialog_base.py | File | 8.17 KB | 0644 |
|
aligndialog.py | File | 31.94 KB | 0644 |
|
aligndialog_base.py | File | 24.36 KB | 0644 |
|
cleandialog.py | File | 12.28 KB | 0644 |
|
cleandialog_base.py | File | 11.37 KB | 0644 |
|
colorcaldialog.py | File | 14.36 KB | 0644 |
|
colorcaldialog_base.py | File | 23.15 KB | 0644 |
|
devicesetupdialog.py | File | 8.57 KB | 0644 |
|
devicesetupdialog_base.py | File | 4.48 KB | 0644 |
|
deviceuricombobox.py | File | 5.4 KB | 0644 |
|
devmgr5.py | File | 83.79 KB | 0644 |
|
devmgr5_base.py | File | 23.22 KB | 0644 |
|
devmgr_ext.py | File | 2.51 KB | 0644 |
|
fabgrouptable.py | File | 2.26 KB | 0644 |
|
fabnametable.py | File | 1.2 KB | 0644 |
|
fabwindow.py | File | 23.7 KB | 0644 |
|
fabwindow_base.py | File | 8.61 KB | 0644 |
|
faxsetupdialog.py | File | 8.97 KB | 0644 |
|
faxsetupdialog_base.py | File | 5.33 KB | 0644 |
|
filetable.py | File | 15.45 KB | 0644 |
|
firmwaredialog.py | File | 3 KB | 0644 |
|
firmwaredialog_base.py | File | 3.5 KB | 0644 |
|
infodialog.py | File | 10.22 KB | 0644 |
|
infodialog_base.py | File | 5.67 KB | 0644 |
|
linefeedcaldialog.py | File | 3.52 KB | 0644 |
|
linefeedcaldialog_base.py | File | 2.61 KB | 0644 |
|
loadpapergroupbox.py | File | 3.3 KB | 0644 |
|
makecopiesdialog.py | File | 2.55 KB | 0644 |
|
makecopiesdialog_base.py | File | 2.33 KB | 0644 |
|
mimetypesdialog.py | File | 1.76 KB | 0644 |
|
mimetypesdialog_base.py | File | 4.07 KB | 0644 |
|
nodevicesdialog.py | File | 2.26 KB | 0644 |
|
nodevicesdialog_base.py | File | 5.96 KB | 0644 |
|
plugindiagnose.py | File | 3.03 KB | 0644 |
|
plugindiagnose_base.py | File | 2.93 KB | 0644 |
|
plugindialog.py | File | 12.2 KB | 0644 |
|
plugindialog_base.py | File | 6.61 KB | 0644 |
|
pluginlicensedialog.py | File | 1.34 KB | 0644 |
|
pluginlicensedialog_base.py | File | 4.68 KB | 0644 |
|
pqdiagdialog.py | File | 3.34 KB | 0644 |
|
pqdiagdialog_base.py | File | 2.58 KB | 0644 |
|
printdialog.py | File | 6 KB | 0644 |
|
printdialog_base.py | File | 5.35 KB | 0644 |
|
printernamecombobox.py | File | 5.46 KB | 0644 |
|
printsettings_base.py | File | 210 B | 0644 |
|
printsettingsdialog.py | File | 3.46 KB | 0644 |
|
printsettingsdialog_base.py | File | 2.62 KB | 0644 |
|
printsettingstoolbox.py | File | 79.17 KB | 0644 |
|
printtestpagedialog.py | File | 4.78 KB | 0644 |
|
printtestpagedialog_base.py | File | 4.13 KB | 0644 |
|
queuesconf.py | File | 10.61 KB | 0644 |
|
readonlyradiobutton.py | File | 1.63 KB | 0644 |
|
scandialog.py | File | 85.62 KB | 0644 |
|
sendfaxdialog.py | File | 37.13 KB | 0644 |
|
sendfaxdialog_base.py | File | 23.87 KB | 0644 |
|
settingsdialog.py | File | 4.15 KB | 0644 |
|
settingsdialog_base.py | File | 16.77 KB | 0644 |
|
setupdialog.py | File | 51.93 KB | 0644 |
|
setupdialog_base.py | File | 23.29 KB | 0644 |
|
setupdialog_base5.py | File | 23.17 KB | 0644 |
|
systemtray.py | File | 32.63 KB | 0644 |
|
systrayframe.py | File | 8.2 KB | 0644 |
|
systrayframe_base.py | File | 5.87 KB | 0644 |
|
ui_utils.py | File | 20.76 KB | 0644 |
|
upgradedialog.py | File | 4.59 KB | 0644 |
|
upgradedialog_base.py | File | 3.29 KB | 0644 |
|
wifisetupdialog.py | File | 31.42 KB | 0644 |
|
wifisetupdialog_base.py | File | 39.61 KB | 0644 |
|