File: //usr/share/system-config-printer/OpenPrintingRequest.py
#!/usr/bin/python
## system-config-printer
## Copyright (C) 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014 Red Hat, Inc.
## Authors:
## Tim Waugh <twaugh@redhat.com>
## Till Kamppeter <till.kamppeter@gmail.com>
## 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
# config is generated from config.py.in by configure
import config
import cupshelpers
from debug import *
from gi.repository import GObject
class OpenPrintingRequest(GObject.GObject):
__gsignals__ = {
'finished': (GObject.SignalFlags.RUN_LAST, None,
(
# list of (printerid,name) tuples
GObject.TYPE_PYOBJECT,
# dict of printerid: dict of drivername: dict
# for driver info
GObject.TYPE_PYOBJECT,
)),
'error': (GObject.SignalFlags.RUN_LAST, None,
(
# HTTP status
int,
GObject.TYPE_PYOBJECT,
)),
}
def __init__ (self, **args):
GObject.GObject.__init__ (self)
debugprint ("Starting")
self.openprinting = cupshelpers.openprinting.OpenPrinting (**args)
self._handle = None
debugprint ("+%s" % self)
def __del__ (self):
debugprint ("-%s" % self)
def cancel (self):
debugprint ("%s: cancel()" % self)
if self._handle is not None:
self.openprinting.cancelOperation (self._handle)
self._handle = None
debugprint ("%s -> 'error'" % self)
self.emit ('error', 0, 'canceled')
def searchPrinters (self, searchterm, user_data=None):
debugprint ("%s: searchPrinters()" % self)
self._handle = self.openprinting.searchPrinters (searchterm,
self._printers_got,
user_data)
def _printers_got (self, status, user_data, printers):
self._handle = None
if status != 0:
debugprint ("%s -> 'error'" % self)
self.emit ('error', status, printers)
return
self.downloadable_printers_unchecked = [(x, printers[x])
for x in printers]
self.downloadable_printers = []
self.downloadable_drivers = dict() # by printer id of dict
# Kick off a search for drivers for each model.
if not self._query_next_printer ():
self._drivers_got ()
def _query_next_printer (self):
"""
If there are more printers to query, kick off a query and
return True.
Otherwise return False.
"""
try:
user_data = self.downloadable_printers_unchecked.pop ()
(printer_id, printer_name) = user_data
except IndexError:
debugprint ("%s: All printer driver queries finished" % self)
return False
if config.DOWNLOADABLE_ONLYFREE:
self.openprinting.onlyfree = 1
else:
self.openprinting.onlyfree = 0
options = dict()
if config.DOWNLOADABLE_ONLYPPD:
options['onlyppdfiles'] = '1'
else:
options['onlydownload'] = '1'
options['packagesystem'] = config.packagesystem
debugprint ("%s: Querying drivers for %s" % (self, printer_id))
self._handle = self.openprinting.listDrivers (printer_id,
self._printer_drivers_got,
user_data=user_data,
extra_options=options)
return True
def _printer_drivers_got (self, status, user_data, drivers):
self._handle = None
if status != 0:
debugprint ("%s -> 'error'" % self)
self.emit ('error', status, drivers)
return
if drivers:
debugprint ("%s: - drivers found" % self)
drivers_installable = { }
for driverkey in drivers.keys ():
driver = drivers[driverkey]
if (('ppds' in driver and
len(driver['ppds']) > 0) or
(not config.DOWNLOADABLE_ONLYPPD and
'packages' in driver and
len(driver['packages']) > 0)):
# Driver entry with installable resources (Package or
# PPD), overtake it
drivers_installable[driverkey] = drivers[driverkey]
else:
debugprint ("Not using invalid driver entry %s" %
driverkey)
if len(drivers_installable) > 0:
debugprint ("%s: - drivers with installable resources found" %
self)
(printer_id, printer_name) = user_data
self.downloadable_drivers[printer_id] = drivers_installable
self.downloadable_printers.append (user_data)
if not self._query_next_printer ():
self._drivers_got ()
def _drivers_got (self):
self._handle = None
debugprint ("%s -> 'finished'" % self)
self.emit ('finished',
self.downloadable_printers,
self.downloadable_drivers)
if __name__ == '__main__':
from pprint import pprint
mainloop = GObject.MainLoop ()
set_debugging (True)
cupshelpers.set_debugprint_fn (debugprint)
req = OpenPrintingRequest ()
handlers = []
def done (obj):
for handler in handlers:
obj.disconnect (handler)
GObject.timeout_add_seconds (1, mainloop.quit)
def error (obj, status, err):
print ("Error: %d" % status)
print (repr (err))
done (obj)
def finished (obj, printers, drivers):
pprint (printers)
pprint (drivers)
done (obj)
handlers.append (req.connect ('error', error))
handlers.append (req.connect ('finished', finished))
GObject.idle_add (req.searchPrinters, 'ricoh 8000')
mainloop.run ()
del req