def __init__(self, bus, path, cupsconn):
     bus_name = dbus.service.BusName(CONFIG_BUS, bus=bus)
     dbus.service.Object.__init__(self, bus_name, path)
     self.dialog = newprinter.NewPrinterGUI()
     self.dialog.NewPrinterWindow.set_modal(False)
     self.handles = [
         self.dialog.connect('dialog-canceled', self.on_dialog_canceled),
         self.dialog.connect('printer-added', self.on_printer_added),
         self.dialog.connect('printer-modified', self.on_printer_modified),
         self.dialog.connect('driver-download-checked',
                             self.on_driver_download_checked)
     ]
     self._ppdcache = ppdcache.PPDCache()
     self._cupsconn = cupsconn
     debugprint("+%s" % self)
    def _ppds_ready(self, fetchedppds):
        if not fetchedppds.is_ready():
            # PPDs being reloaded. Wait for next 'ready' signal.
            return

        self._disconnect_signals()
        ppds = fetchedppds.get_ppds()

        try:
            if self.device_id:
                id_dict = cupshelpers.parseDeviceID(self.device_id)
            else:
                id_dict = {}
                (mfg, mdl) = cupshelpers.ppds.ppdMakeModelSplit(
                    self.device_make_and_model)
                id_dict["MFG"] = mfg
                id_dict["MDL"] = mdl
                id_dict["DES"] = ""
                id_dict["CMD"] = []
                self.device_id = "MFG:%s;MDL:%s;" % (mfg, mdl)

            fit = ppds.getPPDNamesFromDeviceID(id_dict["MFG"], id_dict["MDL"],
                                               id_dict["DES"], id_dict["CMD"],
                                               self.device_uri,
                                               self.device_make_and_model)

            ppdnamelist = ppds.orderPPDNamesByPreference(fit.keys(),
                                                         self.installed_files,
                                                         devid=id_dict,
                                                         fit=fit)
            ppdname = ppdnamelist[0]
            status = fit[ppdname]

            try:
                if status != "exact" and not self.download_tried:
                    self.download_tried = True
                    self.dialog = newprinter.NewPrinterGUI()
                    self.dialog.NewPrinterWindow.set_modal(False)
                    self.handles = \
                                   [self.dialog.connect ('dialog-canceled',
                                                         self.on_dialog_canceled),
                                    self.dialog.connect ('driver-download-checked',
                                                         self.on_driver_download_checked)]

                    self.reply_if_fail = [(x, fit[x]) for x in ppdnamelist]
                    if not self.dialog.init('download_driver',
                                            devid=self.device_id):
                        try:
                            g_killtimer.remove_hold()
                        finally:
                            e = RuntimeError("Failed to launch dialog")
                            self.error_handler(r)

                    return
            except:
                # Ignore driver download if packages needed for the GUI are not
                # installed or if no windows can be opened
                pass

            g_killtimer.remove_hold()
            self.reply_handler([(x, fit[x]) for x in ppdnamelist])
        except Exception as e:
            try:
                g_killtimer.remove_hold()
            except:
                pass

            self.error_handler(e)
Esempio n. 3
0
    def _ppds_ready(self, fetchedppds):
        self._disconnect_signals()
        ppds = fetchedppds.get_ppds()

        try:
            if self.device_id:
                id_dict = cupshelpers.parseDeviceID(self.device_id)
            else:
                id_dict = {}
                (mfg, mdl) = cupshelpers.ppds.ppdMakeModelSplit(
                    self.device_make_and_model)
                id_dict["MFG"] = mfg
                id_dict["MDL"] = mdl
                id_dict["DES"] = ""
                id_dict["CMD"] = []
                self.device_id = "MFG:%s;MDL:%s;" % (mfg, mdl)

            fit = ppds.getPPDNamesFromDeviceID(id_dict["MFG"], id_dict["MDL"],
                                               id_dict["DES"], id_dict["CMD"],
                                               self.device_uri,
                                               self.device_make_and_model)

            ppdnamelist = ppds.orderPPDNamesByPreference(fit.keys(),
                                                         self.installed_files,
                                                         devid=id_dict,
                                                         fit=fit)
            ppdname = ppdnamelist[0]
            status = fit[ppdname]

            try:
                if status != "exact" and not self.download_tried:
                    self.download_tried = True
                    self.loop = GObject.MainLoop()
                    self.dialog = newprinter.NewPrinterGUI()
                    self.dialog.NewPrinterWindow.set_modal(False)
                    self.handles = \
                        [self.dialog.connect ('dialog-canceled',
                                              self.on_dialog_canceled),
                         self.dialog.connect ('driver-download-checked',
                                              self.on_driver_download_checked)]
                    if self.dialog.init('download_driver',
                                        devid=self.device_id):
                        self.loop.run()
                    for handle in self.handles:
                        self.dialog.disconnect(handle)
                    if len(self.installed_files) > 0:
                        debugprint(
                            "GetBestDrivers request: Re-fetch PPDs after driver download"
                        )
                        g_ppds = FetchedPPDs(self.cupsconn, self.language)
                        self._signals.append(
                            g_ppds.connect('ready', self._ppds_ready))
                        self._signals.append(
                            g_ppds.connect('error', self._ppds_error))
                        g_ppds.run()
                        return
            except:
                # Ignore driver download if packages needed for the GUI are not
                # installed or if no windows can be opened
                pass
            g_killtimer.remove_hold()
            self.reply_handler(map(lambda x: (x, fit[x]), ppdnamelist))
        except Exception as e:
            try:
                g_killtimer.remove_hold()
            except:
                pass

            self.error_handler(e)