Skip to content

Commit

Permalink
Integrated driver/PPD auto-download completely into system-config-pri…
Browse files Browse the repository at this point in the history
…nter

Due to the third-party (manufacturer) driver manager Jockey being the
discontinued in Ubuntu, the driver download mechanism for downloading
drivers linked by OpenPrinting is now completely integrated in
system-config-printer, re-using as much as possible of the already
existing functionality of downloading single PPD files via
OpenPrinting.

The functionality can be configured to match the policies of Linux
distributions via the following constants in newprinter.py:

    DOWNLOADABLE_ONLYPPD=True
    DOWNLOADABLE_ONLYFREE=True
    DOWNLOADABLE_PKG_ONLYSIGNED=True

The Jockey support in ppdsloader.py is not removed, so that users of
ppdsloader.py who do not use newprinter.py can still use Jockey (e. g.
KDE/Qt-based Kubuntu).
  • Loading branch information
Till Kamppeter authored and twaugh committed Oct 8, 2012
1 parent 59cf369 commit c622110
Show file tree
Hide file tree
Showing 8 changed files with 683 additions and 209 deletions.
2 changes: 2 additions & 0 deletions Makefile.am
Original file line number Diff line number Diff line change
Expand Up @@ -88,6 +88,7 @@ nobase_pkgdata_SCRIPTS= \
pysmb.py \
scp-dbus-service.py \
system-config-printer.py \
install-printerdriver.py \
troubleshoot/__init__.py \
applet.py

Expand Down Expand Up @@ -175,6 +176,7 @@ cupshelpers_DATA=\

bin_SCRIPTS= \
system-config-printer \
install-printerdriver \
system-config-printer-applet \
dbus/scp-dbus-service

Expand Down
1 change: 1 addition & 0 deletions configure.in
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,7 @@ Makefile
po/Makefile.in
system-config-printer
system-config-printer-applet
install-printerdriver
dbus/scp-dbus-service
])
AC_OUTPUT
2 changes: 1 addition & 1 deletion cupshelpers/ppds.py
Original file line number Diff line number Diff line change
Expand Up @@ -499,7 +499,7 @@ def orderPPDNamesByPreference (self, ppdnamelist=[],
for ppdname in ppdnamelist:
(path, slash, ppdfname) = ppdname.rpartition ("/")
if ppdfname in downloadedfnames:
downloadedppdnames.add (ppdname)
downloadedppdnames.append (ppdname)

# Finally, promote the matching ones to the head of the list.
if downloadedppdnames:
Expand Down
3 changes: 3 additions & 0 deletions install-printerdriver.in
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
#!/bin/sh
prefix=@prefix@
exec @datarootdir@/@PACKAGE@/install-printerdriver.py "$@"
92 changes: 92 additions & 0 deletions install-printerdriver.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,92 @@
#!/usr/bin/python

from gi.repository import GLib, PackageKitGlib
import sys

# progress callback
# http://www.packagekit.org/gtk-doc/PkProgress.html
def progress(progress, type, user_data):
if (type.value_name == "PK_PROGRESS_TYPE_PERCENTAGE" and
progress.props.package != None):
sys.stderr.write ("%d\n" % progress.props.percentage)
sys.stderr.flush ()

package = sys.argv[1]
repo = sys.argv[2]
try:
repo_gpg_id = sys.argv[3]
except:
repo_gpg_id = None

# get PackageKit client
pk = PackageKitGlib.Client()

# check if we already have the package installed or available
try:
res = pk.resolve(PackageKitGlib.FilterEnum.NONE, [package],
None, lambda p, t, d: True, None)
except GLib.GError:
# cannot resolve, so we need to install the key and repo
# install repository key
if repo_gpg_id:
try:
res = pk.install_signature(PackageKitGlib.SigTypeEnum.GPG, repo_gpg_id,
'', None, progress, None)
except GLib.GError:
sys.exit(1)
if res.get_exit_code() != PackageKitGlib.ExitEnum.SUCCESS:
sys.exit(1)

# add repository; see
# http://www.packagekit.org/gtk-doc/PackageKit-pk-client-sync.html#pk-client-repo-enable
try:
res = pk.repo_enable(repo, True, None, progress, None)
except GLib.GError:
sys.exit(1)
if res.get_exit_code() != PackageKitGlib.ExitEnum.SUCCESS:
sys.exit(1)

# download/update the indexes
try:
res = pk.refresh_cache(False, None, progress, None)
except GLib.GError:
sys.exit(1)
if res.get_exit_code() != PackageKitGlib.ExitEnum.SUCCESS:
sys.exit(1)

# map package name to PackageKit ID; do not print progress here, it's fast
try:
res = pk.resolve(PackageKitGlib.FilterEnum.NONE, [package],
None, lambda p, t, d: True, None)
except GLib.GError:
sys.exit(1)
if res.get_exit_code() != PackageKitGlib.ExitEnum.SUCCESS:
sys.exit(1)
package_ids = res.get_package_array()
if len(package_ids) <= 0:
sys.exit(1)
package_id = package_ids[0].get_id()

# install the first match, unless already installed
if package_ids[0].get_info() & PackageKitGlib.InfoEnum.INSTALLED == 0:
# install package
try:
res = pk.install_packages(True, [package_id], None, progress, None)
except GLib.GError:
sys.exit(1)
if res.get_exit_code() != PackageKitGlib.ExitEnum.SUCCESS:
sys.exit(1)

# If we reach this point, the requested package is on the system, either
# because we have installed it now or because it was already there

# Return the list of files contained in the package
try:
res = pk.get_files([package_id], None, progress, None)
except GLib.GError:
pass

files = res.get_files_array()
if files:
for f in files[0].get_property('files'):
print f
Loading

0 comments on commit c622110

Please sign in to comment.