- Updated patch for 1.0.x changes:

- Look harder for locale/page size issues in the troubleshooter (trac
    #118).
- Troubleshooter speed improvement (trac #123).
- Localization fixes for authentication dialog (trac #122).
- Character encoding fixes (trac #124).
- Handle model names with more than one set of digits (Ubuntu #251244).
- Catch unable-to-connect error when trying to print a test page (Ubuntu
    #286943).
- Prevent crash when copying PPD options (Ubuntu #285133).
- Use get_cursor for the printer properties treeview (Ubuntu #282634).
- Fix IPP browser when trying to connect to host:port (bug #476396).
- Make sure we're authenticating as the correct user in authconn.
- Prevent traceback when adding printer driven by HPLIP (bug #477107).
- Better display of available local HP fax devices.
This commit is contained in:
Tim Waugh 2008-12-19 10:13:19 +00:00
parent 3a404dfe70
commit 651c459209
2 changed files with 824 additions and 12 deletions

View File

@ -1,8 +1,72 @@
diff --git a/ChangeLog b/ChangeLog diff --git a/ChangeLog b/ChangeLog
index 2851eeb..85c3f3e 100644 index 2851eeb..d02e03d 100644
--- a/ChangeLog --- a/ChangeLog
+++ b/ChangeLog +++ b/ChangeLog
@@ -1,3 +1,44 @@ @@ -1,3 +1,108 @@
+2008-12-19 Tim Waugh <twaugh@redhat.com>
+
+ * PhysicalDevice.py (PhysicalDevice.get_info): The hpfax backend
+ wants to tell us that the device make and model is "HP Fax", so
+ ignore that useless field and use the device-info field instead.
+
+2008-12-19 Tim Waugh <twaugh@redhat.com>
+
+ * system-config-printer.py (NewPrinterGUI.nextNPTab): Prevent
+ traceback when adding a printer driven by HPLIP (bug #477107).
+
+2008-12-16 Tim Waugh <twaugh@redhat.com>
+
+ * Makefile.am (EXTRA_DIST): Ship config.py.in.
+ (DISTCLEANFILES): Clean config.py.
+
+2008-12-15 Tim Waugh <twaugh@redhat.com>
+
+ * monitor.py (Monitor.refresh): Use getPrinters instead of
+ getDests to avoid character encoding problems.
+
+2008-12-15 Tim Waugh <twaugh@redhat.com>
+
+ * system-config-printer.py (NewPrinterGUI.on_btnNPApply_clicked):
+ Convert name of new printer to unicode (trac #124).
+
+2008-12-15 Tim Waugh <twaugh@redhat.com>
+
+ * system-config-printer.py
+ (NewPrinterGUI.browse_ipp_queues_thread): Split port out from host
+ string if required (bug #476396).
+
+2008-12-13 Tim Waugh <twaugh@redhat.com>
+
+ * system-config-printer.py
+ (GUI.on_tvPrinterProperties_cursor_changed): Use get_cursor here
+ (Ubuntu #282634).
+
+2008-12-13 Tim Waugh <twaugh@redhat.com>
+
+ * system-config-printer.py (NewPrinterGUI.on_btnNPApply_clicked):
+ Check we have a real PPD before trying to copy options (Ubuntu
+ #285133).
+
+2008-12-13 Tim Waugh <twaugh@redhat.com>
+
+ * system-config-printer.py (GUI.on_btnPrintTestPage_clicked):
+ Display an error dialog if unable to connect to server (Ubuntu
+ #286943).
+
+2008-12-13 Tim Waugh <twaugh@redhat.com>
+
+ * cupshelpers/ppds.py (PPDs._findBestMatchPPDs): Handle model
+ names with more than one set of digits (Ubuntu #251244).
+
+2008-12-12 Tim Waugh <twaugh@redhat.com>
+
+ * troubleshoot/__init__.py (Troubleshooter.is_moving_backwards):
+ Allow troubleshooter pages to know the direction we're going.
+
+ * troubleshoot/DeviceListed.py (DeviceListed.display): Don't
+ perform expensive operation if we're moving backwards and this
+ page will not be displayed.
+
+2008-12-11 Tim Waugh <twaugh@redhat.com> +2008-12-11 Tim Waugh <twaugh@redhat.com>
+ +
+ * troubleshoot/ErrorLogCheckpoint.py + * troubleshoot/ErrorLogCheckpoint.py
@ -47,6 +111,177 @@ index 2851eeb..85c3f3e 100644
2008-12-01 Tim Waugh <twaugh@redhat.com> 2008-12-01 Tim Waugh <twaugh@redhat.com>
* configure.in: Version 1.0.12. * configure.in: Version 1.0.12.
diff --git a/Makefile.am b/Makefile.am
index cb62cbd..0b229bb 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -20,8 +20,17 @@ EXPORT_MODULES= \
fi
touch .stamp-distutils-in-builddir
+config.py: config.py.in Makefile
+ sed \
+ -e "s|\@prefix\@|$(prefix)|" \
+ -e "s|\@datadir\@|$(datadir)|" \
+ -e "s|\@localedir\@|$(localedir)|" \
+ -e "s|\@VERSION\@|$(VERSION)|" \
+ -e "s|\@PACKAGE\@|$(PACKAGE)|" \
+ $< > $@
+
# Use distutils to build the module.
-all-local: .stamp-distutils-in-builddir
+all-local: .stamp-distutils-in-builddir config.py
$(PYTHON) setup.py build
# Use distutils to install the module.
@@ -179,7 +188,8 @@ EXTRA_DIST=\
print-applet.desktop.in \
intltool-extract.in \
intltool-merge.in \
- intltool-update.in
+ intltool-update.in \
+ config.py.in
desktop_in_files = $(desktop_DATA:.desktop=.desktop.in)
@@ -207,11 +217,11 @@ missing-languages:
fix-glade:
sed -i -e '/invisible_char/d' -e '/toolbar_style/d' *.glade
-run:
+run: config.py
SYSTEM_CONFIG_PRINTER_GLADE=$(top_srcdir) \
python $(top_srcdir)/system-config-printer.py --debug
-run-applet:
+run-applet: config.py
SYSTEM_CONFIG_PRINTER_GLADE=$(top_srcdir) \
python $(top_srcdir)/applet.py --debug
@@ -238,7 +248,8 @@ DISTCLEANFILES=*.pyc *.pyo *~ *.bak \
troubleshoot/*.pyc troubleshoot/*.pyo troubleshoot/*~ \
intltool-extract intltool-merge intltool-update \
*.desktop man/*.1 \
- test-ppd-module.sh pickled-ppds
+ test-ppd-module.sh pickled-ppds \
+ config.py
distclean-local:
rm -rf html
diff --git a/PhysicalDevice.py b/PhysicalDevice.py
index e4930e7..6c3439e 100644
--- a/PhysicalDevice.py
+++ b/PhysicalDevice.py
@@ -70,7 +70,10 @@ class PhysicalDevice:
return self.devices
def get_info (self):
- if self.mfg == '':
+ # If the manufacturer/model is not known, or useless (in the
+ # case of the hpfax backend), show the device-info field
+ # instead.
+ if self.mfg == '' or (self.mfg == "HP" and self.mdl == "Fax"):
return self.devices[0].info
info = "%s %s" % (self.mfg, self.mdl)
diff --git a/authconn.py b/authconn.py
index fce9c0f..9e7db20 100644
--- a/authconn.py
+++ b/authconn.py
@@ -22,20 +22,23 @@ import gtk
from debug import *
_ = lambda x: x
+N_ = lambda x: x
def set_gettext_function (fn):
global _
_ = fn
class AuthDialog(gtk.Dialog):
- AUTH_FIELD={'username': _("Username:"),
- 'password': _("Password:"),
- 'domain': _("Domain:")}
+ AUTH_FIELD={'username': N_("Username:"),
+ 'password': N_("Password:"),
+ 'domain': N_("Domain:")}
- def __init__ (self, title=_("Authentication"), parent=None,
+ def __init__ (self, title=None, parent=None,
flags=gtk.DIALOG_MODAL | gtk.DIALOG_NO_SEPARATOR,
buttons=(gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL,
gtk.STOCK_OK, gtk.RESPONSE_OK),
auth_info_required=['username', 'password']):
+ if title == None:
+ title = _("Authentication")
gtk.Dialog.__init__ (self, title, parent, flags, buttons)
self.auth_info_required = auth_info_required
self.set_default_response (gtk.RESPONSE_OK)
@@ -60,7 +63,7 @@ class AuthDialog(gtk.Dialog):
self.field_entry = []
for i in range (num_fields):
field = auth_info_required[i]
- label = gtk.Label (self.AUTH_FIELD.get (field, field))
+ label = gtk.Label (_(self.AUTH_FIELD.get (field, field)))
label.set_alignment (0, 0.5)
table.attach (label, 0, 1, i, i + 1)
entry = gtk.Entry ()
@@ -154,6 +157,8 @@ class Connection:
fn = getattr (self._connection, fname)
c = self._connection
+ cups.setUser (self._use_user)
+
try:
result = fn.__call__ (*args, **kwds)
diff --git a/config.py.in b/config.py.in
index 3d7ade6..052bb2f 100644
--- a/config.py.in
+++ b/config.py.in
@@ -19,28 +19,9 @@
## Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
prefix="@prefix@"
-datadir="@datarootdir@"
-pkgdatadir="${datadir}/${PACKAGE}"
+datadir="@datadir@"
+localedir="@localedir@"
+pkgdatadir="@datadir@/@PACKAGE@"
VERSION="@VERSION@"
PACKAGE="@PACKAGE@"
DOWNLOADABLE_DRIVER_SUPPORT=False
-
-import os
-class Paths:
- def __init__ (self):
- vars = ['prefix', 'datadir', 'pkgdatadir', 'VERSION', 'PACKAGE']
- for var in vars:
- os.environ[var] = eval (var)
- self.paths = {}
- changed = True
- while changed:
- changed = False
- for var in vars:
- old = self.paths.get (var, None)
- self.paths[var] = os.path.expandvars (os.environ[var])
- os.environ[var] = self.paths[var]
- if old != self.paths[var]:
- changed = True
-
- def get_path (self, var):
- return self.paths[var]
diff --git a/configure.in b/configure.in
index b3e2377..ef8d4e1 100644
--- a/configure.in
+++ b/configure.in
@@ -18,7 +18,6 @@ ALL_LINGUAS="ar as bg bn_IN bn bs ca cs cy da de el en_GB es et fa fi fr gu he h
AC_CONFIG_FILES([
Makefile
po/Makefile.in
-config.py
my-default-printer
system-config-printer
system-config-printer-applet
diff --git a/cupshelpers/cupshelpers.py b/cupshelpers/cupshelpers.py diff --git a/cupshelpers/cupshelpers.py b/cupshelpers/cupshelpers.py
index a19034f..fcf0f2c 100755 index a19034f..fcf0f2c 100755
--- a/cupshelpers/cupshelpers.py --- a/cupshelpers/cupshelpers.py
@ -95,6 +330,74 @@ index a19034f..fcf0f2c 100755
def setOption(self, name, value): def setOption(self, name, value):
""" """
diff --git a/cupshelpers/ppds.py b/cupshelpers/ppds.py
index 6048582..673f0af 100755
--- a/cupshelpers/ppds.py
+++ b/cupshelpers/ppds.py
@@ -694,6 +694,8 @@ class PPDs:
digits_start = i
digits_end = i
digits += 1
+ elif digits_start != -1:
+ break
digits_end += 1
modelnumber = 0
if digits > 0:
diff --git a/jobviewer.py b/jobviewer.py
index 5005305..a247a2e 100644
--- a/jobviewer.py
+++ b/jobviewer.py
@@ -49,7 +49,7 @@ from statereason import StateReason
statereason.set_gettext_function (_)
errordialogs.set_gettext_function (_)
-pkgdata = config.Paths ().get_path ('pkgdatadir')
+pkgdata = config.pkgdatadir
GLADE="applet.glade"
ICON="printer"
SEARCHING_ICON="document-print-preview"
diff --git a/monitor.py b/monitor.py
index 3748d45..43e151f 100644
--- a/monitor.py
+++ b/monitor.py
@@ -581,15 +581,8 @@ class Monitor:
try:
self.printer_state_reasons = collect_printer_state_reasons (c)
- dests = c.getDests ()
- printers = set()
- for (printer, instance) in dests.keys ():
- if printer == None:
- continue
- if instance != None:
- continue
- printers.add (printer)
- self.printers = printers
+ dests = c.getPrinters ()
+ self.printers = set(dests.keys ())
except cups.IPPError, (e, m):
self.watcher.cups_ipp_error (self, e, m)
return
diff --git a/my-default-printer.in b/my-default-printer.in
index 7fa772d..3c55f0e 100755
--- a/my-default-printer.in
+++ b/my-default-printer.in
@@ -1,3 +1,2 @@
#!/bin/sh
-prefix=@prefix@
exec @datarootdir@/@PACKAGE@/my-default-printer.py "$@"
diff --git a/po/POTFILES.in b/po/POTFILES.in
index 7d5766a..897e78a 100644
--- a/po/POTFILES.in
+++ b/po/POTFILES.in
@@ -27,6 +27,7 @@ troubleshoot/DeviceListed.py
troubleshoot/ErrorLogCheckpoint.py
troubleshoot/ErrorLogFetch.py
troubleshoot/ErrorLogParse.py
+troubleshoot/Locale.py
troubleshoot/LocalOrRemote.py
troubleshoot/NetworkCUPSPrinterShared.py
troubleshoot/PrinterStateReasons.py
diff --git a/po/sv.po b/po/sv.po diff --git a/po/sv.po b/po/sv.po
index 5a6b7bc..8fcccab 100644 index 5a6b7bc..8fcccab 100644
--- a/po/sv.po --- a/po/sv.po
@ -4165,11 +4468,70 @@ index 5a6b7bc..8fcccab 100644
#~ msgid "Unknown printer" #~ msgid "Unknown printer"
#~ msgstr "Okänd" #~ msgstr "Okänd"
+ +
diff --git a/system-config-printer-applet.in b/system-config-printer-applet.in
index 22b5f75..a30d4b7 100755
--- a/system-config-printer-applet.in
+++ b/system-config-printer-applet.in
@@ -1,3 +1,2 @@
#!/bin/sh
-prefix=@prefix@
exec @datarootdir@/@PACKAGE@/applet.py "$@"
diff --git a/system-config-printer.in b/system-config-printer.in
index c4ea13d..97f0098 100755
--- a/system-config-printer.in
+++ b/system-config-printer.in
@@ -1,3 +1,2 @@
#!/bin/sh
-prefix=@prefix@
exec @datarootdir@/@PACKAGE@/system-config-printer.py "$@"
diff --git a/system-config-printer.py b/system-config-printer.py diff --git a/system-config-printer.py b/system-config-printer.py
index 349c6f0..5844174 100755 index 349c6f0..c225b95 100755
--- a/system-config-printer.py --- a/system-config-printer.py
+++ b/system-config-printer.py +++ b/system-config-printer.py
@@ -765,6 +765,11 @@ class GUI(GtkGUI, monitor.Watcher): @@ -87,10 +87,13 @@ from gettext import gettext as _
monitor.set_gettext_function (_)
errordialogs.set_gettext_function (_)
contextmenu.set_gettext_function (_)
+authconn.set_gettext_function (_)
import gettext
gettext.textdomain (domain)
-gtk.glade.bindtextdomain (domain)
-pkgdata = config.Paths ().get_path ('pkgdatadir')
+gettext.bindtextdomain (domain, config.localedir)
+gtk.glade.textdomain (domain)
+gtk.glade.bindtextdomain (domain, config.localedir)
+pkgdata = config.pkgdatadir
iconpath = os.path.join (pkgdata, 'icons/')
sys.path.append (pkgdata)
@@ -612,7 +615,7 @@ class GUI(GtkGUI, monitor.Watcher):
model = self.dests_iconview.get_model ()
iter = model.get_iter_first ()
while iter != None:
- name = model.get_value (iter, 2)
+ name = unicode (model.get_value (iter, 2))
if name == configure_printer:
path = model.get_path (iter)
self.dests_iconview.item_activated (path)
@@ -624,7 +627,7 @@ class GUI(GtkGUI, monitor.Watcher):
def dests_iconview_item_activated (self, iconview, path):
model = iconview.get_model ()
iter = model.get_iter (path)
- name = model.get_value (iter, 2)
+ name = unicode (model.get_value (iter, 2))
object = model.get_value (iter, 0)
try:
self.fillPrinterTab (name)
@@ -692,7 +695,7 @@ class GUI(GtkGUI, monitor.Watcher):
model = iconview.get_model ()
iter = model.get_iter (paths[i])
object = model.get_value (iter, 0)
- name = model.get_value (iter, 2)
+ name = unicode (model.get_value (iter, 2))
if object.discovered:
any_discovered = True
if object.enabled:
@@ -765,6 +768,11 @@ class GUI(GtkGUI, monitor.Watcher):
AdvancedServerSettingsDialog (self.cups, dialog) AdvancedServerSettingsDialog (self.cups, dialog)
except: except:
return return
@ -4181,7 +4543,16 @@ index 349c6f0..5844174 100755
else: else:
dialog.hide () dialog.hide ()
@@ -858,6 +863,8 @@ class GUI(GtkGUI, monitor.Watcher): @@ -834,7 +842,7 @@ class GUI(GtkGUI, monitor.Watcher):
model = self.dests_iconview.get_model ()
for path in paths:
iter = model.get_iter (path)
- name = model.get_value (iter, 2)
+ name = unicode (model.get_value (iter, 2))
selected_printers.add (name)
if self.cups:
@@ -858,6 +866,8 @@ class GUI(GtkGUI, monitor.Watcher):
show_IPP_Error(e, m, self.MainWindow) show_IPP_Error(e, m, self.MainWindow)
self.printers = {} self.printers = {}
self.default_printer = None self.default_printer = None
@ -4190,7 +4561,41 @@ index 349c6f0..5844174 100755
else: else:
self.printers = {} self.printers = {}
self.default_printer = None self.default_printer = None
@@ -1750,6 +1757,8 @@ class GUI(GtkGUI, monitor.Watcher): @@ -987,7 +997,7 @@ class GUI(GtkGUI, monitor.Watcher):
# Restore selection of printers.
model = self.dests_iconview.get_model ()
def maybe_select (model, path, iter):
- name = model.get_value (iter, 2)
+ name = unicode (model.get_value (iter, 2))
if name in selected_printers:
self.dests_iconview.select_path (path)
model.foreach (maybe_select)
@@ -1593,9 +1603,12 @@ class GUI(GtkGUI, monitor.Watcher):
def on_tvPrinterProperties_cursor_changed (self, treeview):
# Adjust notebook to reflect selected item.
- (store, iter) = treeview.get_selection ().get_selected ()
- n = store.get_value (iter, 1)
- self.ntbkPrinter.set_current_page (n)
+ (path, column) = treeview.get_cursor ()
+ if path != None:
+ model = treeview.get_model ()
+ iter = model.get_iter (path)
+ n = model.get_value (iter, 1)
+ self.ntbkPrinter.set_current_page (n)
# set default printer
def set_system_or_user_default_printer (self, name):
@@ -1674,6 +1687,8 @@ class GUI(GtkGUI, monitor.Watcher):
show_info_dialog (_("Submitted"),
_("Test page submitted as job %d") % job_id,
parent=self.MainWindow)
+ except RuntimeError, s:
+ show_IPP_Error (None, s, self.MainWindow)
except cups.IPPError, (e, msg):
if (e == cups.IPP_NOT_AUTHORIZED and
self.connect_server != 'localhost' and
@@ -1750,6 +1765,8 @@ class GUI(GtkGUI, monitor.Watcher):
try: try:
self.ppd = printer.getPPD() self.ppd = printer.getPPD()
@ -4199,7 +4604,7 @@ index 349c6f0..5844174 100755
except cups.IPPError, (e, m): except cups.IPPError, (e, m):
# Some IPP error other than IPP_NOT_FOUND. # Some IPP error other than IPP_NOT_FOUND.
show_IPP_Error(e, m, self.MainWindow) show_IPP_Error(e, m, self.MainWindow)
@@ -1988,19 +1997,20 @@ class GUI(GtkGUI, monitor.Watcher): @@ -1988,19 +2005,20 @@ class GUI(GtkGUI, monitor.Watcher):
return return
ppd = self.ppd ppd = self.ppd
ppd.markDefaults() ppd.markDefaults()
@ -4224,7 +4629,150 @@ index 349c6f0..5844174 100755
tab_label = self.lblPInstallOptions tab_label = self.lblPInstallOptions
else: else:
frame = gtk.Frame("<b>%s</b>" % group.text) frame = gtk.Frame("<b>%s</b>" % group.text)
@@ -5110,7 +5120,6 @@ class NewPrinterGUI(GtkGUI): @@ -2147,7 +2165,7 @@ class GUI(GtkGUI, monitor.Watcher):
(path, cell) = tuple
model = self.dests_iconview.get_model ()
iter = model.get_iter (path)
- name = model.get_value (iter, 2)
+ name = unicode (model.get_value (iter, 2))
if not self.is_rename_possible (name):
return
cell.set_property ('editable', True)
@@ -2161,7 +2179,7 @@ class GUI(GtkGUI, monitor.Watcher):
def printer_name_edited (self, cell, path, newname):
model = self.dests_iconview.get_model ()
iter = model.get_iter (path)
- name = model.get_value (iter, 2)
+ name = unicode (model.get_value (iter, 2))
debugprint ("edited: %s -> %s" % (name, newname))
try:
self.rename_printer (name, newname)
@@ -2255,7 +2273,7 @@ class GUI(GtkGUI, monitor.Watcher):
# ..and select the new printer.
def select_new_printer (model, path, iter):
- name = model.get_value (iter, 2)
+ name = unicode (model.get_value (iter, 2))
print name, new_name
if name == new_name:
self.dests_iconview.select_path (path)
@@ -2278,7 +2296,7 @@ class GUI(GtkGUI, monitor.Watcher):
paths = iconview.get_selected_items ()
model = self.dests_iconview.get_model ()
iter = model.get_iter (paths[0])
- name = model.get_value (iter, 2)
+ name = unicode (model.get_value (iter, 2))
self.entCopyName.set_text(name)
self.NewPrinterName.set_transient_for (self.MainWindow)
result = self.NewPrinterName.run()
@@ -2298,7 +2316,7 @@ class GUI(GtkGUI, monitor.Watcher):
def on_entCopyName_changed(self, widget):
# restrict
- text = widget.get_text()
+ text = unicode (widget.get_text())
new_text = text
new_text = new_text.replace("/", "")
new_text = new_text.replace("#", "")
@@ -2337,7 +2355,7 @@ class GUI(GtkGUI, monitor.Watcher):
try:
for i in range (n):
iter = model.get_iter (paths[i])
- name = model.get_value (iter, 2)
+ name = unicode (model.get_value (iter, 2))
self.cups.deletePrinter (name)
except cups.IPPError, (e, msg):
show_IPP_Error(e, msg, self.MainWindow)
@@ -2402,7 +2420,7 @@ class GUI(GtkGUI, monitor.Watcher):
paths = iconview.get_selected_items ()
model = iconview.get_model ()
iter = model.get_iter (paths[0])
- name = model.get_value (iter, 2)
+ name = unicode (model.get_value (iter, 2))
self.set_system_or_user_default_printer (name)
def on_troubleshoot_activate(self, widget):
@@ -2556,7 +2574,7 @@ class GUI(GtkGUI, monitor.Watcher):
def checkNPName(self, name):
if not name: return False
- name = name.lower()
+ name = unicode (name.lower())
for printer in self.printers.values():
if not printer.discovered and printer.name.lower()==name:
return False
@@ -3168,8 +3186,7 @@ class NewPrinterGUI(GtkGUI):
self.auto_make, self.auto_model = None, None
self.device.uri = self.getDeviceURI()
if self.device.type in ["socket", "lpd", "ipp"]:
- self.getNetworkPrinterMakeModel ()
- elif self.device.type == "hp":
+ host = self.getNetworkPrinterMakeModel ()
faxuri = None
if host:
faxuri = self.get_hplip_uri_for_network_printer(host,
@@ -3570,7 +3587,7 @@ class NewPrinterGUI(GtkGUI):
def on_entNPName_changed(self, widget):
# restrict
- text = widget.get_text()
+ text = unicode (widget.get_text())
new_text = text
new_text = new_text.replace("/", "")
new_text = new_text.replace("#", "")
@@ -3659,6 +3676,12 @@ class NewPrinterGUI(GtkGUI):
return uri
def getNetworkPrinterMakeModel(self):
+ """
+ Try to determine the make and model for the currently selected
+ network printer, and store this in the data structure for the
+ printer.
+ Returns the hostname or None.
+ """
device = self.device
# Determine host name/IP
host = None
@@ -3705,6 +3728,8 @@ class NewPrinterGUI(GtkGUI):
device.id = "MFG:" + mk + ";MDL:" + md + ";DES:" + mk + " " + md + ";"
device.id_dict = cupshelpers.parseDeviceID (device.id)
+ return host
+
def fillDeviceTab(self, current_uri=None):
try:
devices = self.fetchDevices()
@@ -4322,6 +4347,7 @@ class NewPrinterGUI(GtkGUI):
thread.start_new_thread(self.browse_ipp_queues_thread, ())
def browse_ipp_queues_thread(self):
+ host = None
gtk.gdk.threads_enter()
try:
store = self.ipp_store
@@ -4340,12 +4366,19 @@ class NewPrinterGUI(GtkGUI):
oldserver = cups.getServer ()
printers = classes = {}
failed = False
+ port = 631
+ if host != None:
+ (host, port) = urllib.splitnport (host, defport=port)
+
try:
try:
- c = cups.Connection (host=host)
+ c = cups.Connection (host=host, port=port)
except TypeError:
# host parameter requires pycups >= 1.9.40.
- cups.setServer (host)
+ cups.setPort (port)
+ if host != None:
+ cups.setServer (host)
+
c = cups.Connection()
printers = c.getPrinters ()
@@ -5110,7 +5143,6 @@ class NewPrinterGUI(GtkGUI):
ppd = self.NPDrivers[nr] ppd = self.NPDrivers[nr]
elif self.rbtnNPPPD.get_active(): elif self.rbtnNPPPD.get_active():
ppd = cups.PPD(self.filechooserPPD.get_filename()) ppd = cups.PPD(self.filechooserPPD.get_filename())
@ -4232,7 +4780,7 @@ index 349c6f0..5844174 100755
else: else:
# PPD of the driver downloaded from OpenPrinting XXX # PPD of the driver downloaded from OpenPrinting XXX
treeview = self.tvNPDownloadableDrivers treeview = self.tvNPDownloadableDrivers
@@ -5132,7 +5141,6 @@ class NewPrinterGUI(GtkGUI): @@ -5132,7 +5164,6 @@ class NewPrinterGUI(GtkGUI):
ppdfile.write(ppdcontent) ppdfile.write(ppdcontent)
ppdfile.close() ppdfile.close()
ppd = cups.PPD(ppdname) ppd = cups.PPD(ppdname)
@ -4240,7 +4788,7 @@ index 349c6f0..5844174 100755
os.unlink(ppdname) os.unlink(ppdname)
except RuntimeError, e: except RuntimeError, e:
@@ -5188,7 +5196,6 @@ class NewPrinterGUI(GtkGUI): @@ -5188,7 +5219,6 @@ class NewPrinterGUI(GtkGUI):
if (ppd != "raw"): if (ppd != "raw"):
f = self.mainapp.cups.getServerPPD(ppd) f = self.mainapp.cups.getServerPPD(ppd)
ppd = cups.PPD(f) ppd = cups.PPD(f)
@ -4248,7 +4796,20 @@ index 349c6f0..5844174 100755
os.unlink(f) os.unlink(f)
except AttributeError: except AttributeError:
nonfatalException() nonfatalException()
@@ -5373,7 +5380,6 @@ class NewPrinterGUI(GtkGUI): @@ -5262,9 +5292,9 @@ class NewPrinterGUI(GtkGUI):
# Create new Printer
def on_btnNPApply_clicked(self, widget):
if self.dialog_mode in ("class", "printer"):
- name = self.entNPName.get_text()
- location = self.entNPLocation.get_text()
- info = self.entNPDescription.get_text()
+ name = unicode (self.entNPName.get_text())
+ location = unicode (self.entNPLocation.get_text())
+ info = unicode (self.entNPDescription.get_text())
else:
name = self.mainapp.printer.name
@@ -5373,7 +5403,6 @@ class NewPrinterGUI(GtkGUI):
try: try:
filename = self.mainapp.cups.getPPD(name) filename = self.mainapp.cups.getPPD(name)
ppd = cups.PPD(filename) ppd = cups.PPD(filename)
@ -4256,6 +4817,88 @@ index 349c6f0..5844174 100755
os.unlink(filename) os.unlink(filename)
except cups.IPPError, (e, msg): except cups.IPPError, (e, msg):
if e == cups.IPP_NOT_FOUND: if e == cups.IPP_NOT_FOUND:
@@ -5383,8 +5412,9 @@ class NewPrinterGUI(GtkGUI):
return
else:
# We have an actual PPD to upload, not just a name.
- if not self.rbtnChangePPDasIs.get_active():
- cupshelpers.copyPPDOptions(self.mainapp.ppd, ppd) # XXX
+ if ((not self.rbtnChangePPDasIs.get_active()) and
+ isinstance (self.mainapp.ppd, cups.PPD)):
+ cupshelpers.copyPPDOptions(self.mainapp.ppd, ppd)
else:
# write Installable Options to ppd
for option in self.options.itervalues():
diff --git a/troubleshoot/DeviceListed.py b/troubleshoot/DeviceListed.py
index 1537ea7..903503a 100644
--- a/troubleshoot/DeviceListed.py
+++ b/troubleshoot/DeviceListed.py
@@ -69,33 +69,38 @@ class DeviceListed(Question):
model.set (iter, 0, _("Not listed"), 1, '', 2, '', 3, None)
devices = {}
- try:
- cups.setServer ('')
- c = answers['_authenticated_connection']
- devices = c.getDevices ()
- devices_list = []
- for uri, device in devices.iteritems ():
- if uri.find (':') == -1:
- continue
-
- if device.get('device-class') != 'direct':
- continue
-
- name = device.get('device-info', _("Unknown"))
- info = device.get('device-make-and-model', _("Unknown"))
- devices_list.append ((name, info, uri, device))
-
- devices_list.sort (lambda x, y: cmp (x[0], y[0]))
- for name, info, uri, device in devices_list:
- iter = model.append (None)
- model.set (iter, 0, name, 1, info, 2, uri, 3, device)
-
- except cups.HTTPError:
- pass
- except cups.IPPError:
- pass
- except RuntimeError:
- pass
+ # Skip device list if this page is hidden and we're skipping
+ # backwards past it.
+ if not (answers['cups_queue_listed'] and
+ self.troubleshooter.is_moving_backwards ()):
+ # Otherwise, fetch devices.
+ try:
+ cups.setServer ('')
+ c = answers['_authenticated_connection']
+ devices = c.getDevices ()
+ devices_list = []
+ for uri, device in devices.iteritems ():
+ if uri.find (':') == -1:
+ continue
+
+ if device.get('device-class') != 'direct':
+ continue
+
+ name = device.get('device-info', _("Unknown"))
+ info = device.get('device-make-and-model', _("Unknown"))
+ devices_list.append ((name, info, uri, device))
+
+ devices_list.sort (lambda x, y: cmp (x[0], y[0]))
+ for name, info, uri, device in devices_list:
+ iter = model.append (None)
+ model.set (iter, 0, name, 1, info, 2, uri, 3, device)
+
+ except cups.HTTPError:
+ pass
+ except cups.IPPError:
+ pass
+ except RuntimeError:
+ pass
if answers['cups_queue_listed']:
try:
diff --git a/troubleshoot/ErrorLogCheckpoint.py b/troubleshoot/ErrorLogCheckpoint.py diff --git a/troubleshoot/ErrorLogCheckpoint.py b/troubleshoot/ErrorLogCheckpoint.py
index 99b00a9..26e862f 100644 index 99b00a9..26e862f 100644
--- a/troubleshoot/ErrorLogCheckpoint.py --- a/troubleshoot/ErrorLogCheckpoint.py
@ -4329,3 +4972,154 @@ index 7dd97f3..4d92602 100644
except cups.IPPError: except cups.IPPError:
pass pass
diff --git a/troubleshoot/Locale.py b/troubleshoot/Locale.py
index 581ab9e..c1f81a2 100644
--- a/troubleshoot/Locale.py
+++ b/troubleshoot/Locale.py
@@ -26,18 +26,38 @@ from base import *
class Locale(Question):
def __init__ (self, troubleshooter):
Question.__init__ (self, troubleshooter, "Locale issues")
- troubleshooter.new_page (gtk.Label (), self)
+ page = self.initial_vbox (_("Incorrect Page Size"),
+ _("The page size for the print job was "
+ "not the printer's default page size. "
+ "If this is not intentional it may cause "
+ "alignment problems."))
- def display (self):
- return False
-
- def collect_answer (self):
- answers = {}
+ table = gtk.Table (2, 2)
+ table.set_row_spacings (6)
+ table.set_col_spacings (6)
+ page.pack_start (table)
+ self.printer_page_size = gtk.Label ()
+ self.printer_page_size.set_alignment (0, 0)
+ self.job_page_size = gtk.Label ()
+ self.job_page_size.set_alignment (0, 0)
+ label = gtk.Label (_("Print job page size:"))
+ label.set_alignment (0, 0)
+ table.attach (label, 0, 1, 0, 1, xoptions=gtk.FILL, yoptions=0)
+ table.attach (self.job_page_size, 1, 2, 0, 1,
+ xoptions=gtk.FILL, yoptions=0)
+ label = gtk.Label (_("Printer page size:"))
+ label.set_alignment (0, 0)
+ table.attach (label, 0, 1, 1, 2, xoptions=gtk.FILL, yoptions=0)
+ table.attach (self.printer_page_size, 1, 2, 1, 2,
+ xoptions=gtk.FILL, yoptions=0)
+ troubleshooter.new_page (page, self)
+ def display (self):
+ self.answers = {}
(messages, encoding) = locale.getlocale (locale.LC_MESSAGES)
(ctype, encoding) = locale.getlocale (locale.LC_CTYPE)
- answers['user_locale_messages'] = messages
- answers['user_locale_ctype'] = ctype
+ self.answers['user_locale_messages'] = messages
+ self.answers['user_locale_ctype'] = ctype
try:
i18n = file ("/etc/sysconfig/i18n").readlines ()
@@ -50,6 +70,43 @@ class Locale(Question):
except:
system_lang = None
- answers['system_locale_lang'] = system_lang
+ self.answers['system_locale_lang'] = system_lang
+
+ printer_page_size = None
+ try:
+ ppd_defs = self.troubleshooter.answers['cups_printer_ppd_defaults']
+ for group, options in ppd_defs.iteritems ():
+ if options.has_key ("PageSize"):
+ printer_page_size = options["PageSize"]
+ break
+
+ except KeyError:
+ try:
+ attrs = self.troubleshooter.answers['remote_cups_queue_attributes']
+ printer_page_size = attrs["media-default"]
+ except KeyError:
+ pass
+
+ try:
+ job_status = self.troubleshooter.answers["test_page_job_status"]
+ except KeyError:
+ job_status = []
+
+ self.answers['printer_page_size'] = printer_page_size
+ if printer_page_size != None:
+ job_page_size = None
+ for (test, jobid, printer, doc, status, attrs) in job_status:
+ if test:
+ if attrs.has_key ("PageSize"):
+ job_page_size = attrs["PageSize"]
+ self.answers['job_page_size'] = job_page_size
+ if job_page_size != printer_page_size:
+ self.printer_page_size.set_text (printer_page_size)
+ self.job_page_size.set_text (job_page_size)
+ return True
+
+ return False
+
+ def collect_answer (self):
+ return self.answers
- return answers
diff --git a/troubleshoot/__init__.py b/troubleshoot/__init__.py
index 85620c0..eff87df 100644
--- a/troubleshoot/__init__.py
+++ b/troubleshoot/__init__.py
@@ -98,6 +98,7 @@ class Troubleshooter:
self.questions = []
self.question_answers = []
self.answers = {}
+ self.moving_backwards = False
main.show_all ()
@@ -148,6 +149,9 @@ class Troubleshooter:
self.set_back_forward_buttons ()
return page
+ def is_moving_backwards (self):
+ return self.moving_backwards
+
def set_back_forward_buttons (self, *args):
page = self.ntbk.get_current_page ()
self.back.set_sensitive (page != 0)
@@ -165,6 +169,7 @@ class Troubleshooter:
self.cancel.show ()
def on_back_clicked (self, widget):
+ self.moving_backwards = True
page = self.ntbk.get_current_page ()
try:
self.questions[page].disconnect_signals ()
@@ -194,6 +199,7 @@ class Troubleshooter:
self._report_traceback ()
self.set_back_forward_buttons ()
+ self.moving_backwards = False
def on_forward_clicked (self, widget):
page = self.ntbk.get_current_page ()
@@ -290,7 +296,6 @@ QUESTIONS = ["Welcome",
"ChoosePrinter",
"CheckPrinterSanity",
"CheckPPDSanity",
- "Locale",
"LocalOrRemote",
"DeviceListed",
@@ -312,6 +317,7 @@ QUESTIONS = ["Welcome",
"ErrorLogFetch",
"PrinterStateReasons",
"ErrorLogParse",
+ "Locale",
"Shrug"]
def run (quitfn=None, parent=None):

View File

@ -7,7 +7,7 @@
Summary: A printer administration tool Summary: A printer administration tool
Name: system-config-printer Name: system-config-printer
Version: 1.0.12 Version: 1.0.12
Release: 5%{?dist} Release: 6%{?dist}
License: GPLv2+ License: GPLv2+
URL: http://cyberelk.net/tim/software/system-config-printer/ URL: http://cyberelk.net/tim/software/system-config-printer/
Group: System Environment/Base Group: System Environment/Base
@ -156,6 +156,24 @@ rm -rf %buildroot
exit 0 exit 0
%changelog %changelog
* Fri Dec 19 2008 Tim Waugh <twaugh@redhat.com> 1.0.12-6
- Updated patch for 1.0.x changes:
- Look harder for locale/page size issues in the troubleshooter
(trac #118).
- Troubleshooter speed improvement (trac #123).
- Localization fixes for authentication dialog (trac #122).
- Character encoding fixes (trac #124).
- Handle model names with more than one set of digits (Ubuntu #251244).
- Catch unable-to-connect error when trying to print a test page
(Ubuntu #286943).
- Prevent crash when copying PPD options (Ubuntu #285133).
- Use get_cursor for the printer properties treeview (Ubuntu #282634).
- Fix IPP browser when trying to connect to host:port (bug #476396).
- Make sure we're authenticating as the correct user in authconn.
- Prevent traceback when adding printer driven by HPLIP
(bug #477107).
- Better display of available local HP fax devices.
* Wed Dec 17 2008 Tim Waugh <twaugh@redhat.com> 1.0.12-5 * Wed Dec 17 2008 Tim Waugh <twaugh@redhat.com> 1.0.12-5
- Added patch for pycups git changes since 1.9.44: - Added patch for pycups git changes since 1.9.44:
- Look for test page file in new location for CUPS 1.4 (bug #476612). - Look for test page file in new location for CUPS 1.4 (bug #476612).