diff --git a/system-config-printer-525e996.patch b/system-config-printer-525e996.patch deleted file mode 100644 index 7b9a8b8..0000000 --- a/system-config-printer-525e996.patch +++ /dev/null @@ -1,2568 +0,0 @@ -diff -up system-config-printer-1.1.10/aclocal.m4.525e996 system-config-printer-1.1.10/aclocal.m4 ---- system-config-printer-1.1.10/aclocal.m4.525e996 2009-07-22 13:54:02.000000000 +0100 -+++ system-config-printer-1.1.10/aclocal.m4 2009-07-26 19:01:45.683356020 +0100 -@@ -1867,6 +1867,162 @@ AC_DEFUN([AM_NLS], - AC_SUBST(USE_NLS) - ]) - -+# pkg.m4 - Macros to locate and utilise pkg-config. -*- Autoconf -*- -+# -+# Copyright © 2004 Scott James Remnant . -+# -+# 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. -+# -+# As a special exception to the GNU General Public License, if you -+# distribute this file as part of a program that contains a -+# configuration script generated by Autoconf, you may include it under -+# the same distribution terms that you use for the rest of that program. -+ -+# PKG_PROG_PKG_CONFIG([MIN-VERSION]) -+# ---------------------------------- -+AC_DEFUN([PKG_PROG_PKG_CONFIG], -+[m4_pattern_forbid([^_?PKG_[A-Z_]+$]) -+m4_pattern_allow([^PKG_CONFIG(_PATH)?$]) -+AC_ARG_VAR([PKG_CONFIG], [path to pkg-config utility])dnl -+if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then -+ AC_PATH_TOOL([PKG_CONFIG], [pkg-config]) -+fi -+if test -n "$PKG_CONFIG"; then -+ _pkg_min_version=m4_default([$1], [0.9.0]) -+ AC_MSG_CHECKING([pkg-config is at least version $_pkg_min_version]) -+ if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then -+ AC_MSG_RESULT([yes]) -+ else -+ AC_MSG_RESULT([no]) -+ PKG_CONFIG="" -+ fi -+ -+fi[]dnl -+])# PKG_PROG_PKG_CONFIG -+ -+# PKG_CHECK_EXISTS(MODULES, [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND]) -+# -+# Check to see whether a particular set of modules exists. Similar -+# to PKG_CHECK_MODULES(), but does not set variables or print errors. -+# -+# -+# Similar to PKG_CHECK_MODULES, make sure that the first instance of -+# this or PKG_CHECK_MODULES is called, or make sure to call -+# PKG_CHECK_EXISTS manually -+# -------------------------------------------------------------- -+AC_DEFUN([PKG_CHECK_EXISTS], -+[AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl -+if test -n "$PKG_CONFIG" && \ -+ AC_RUN_LOG([$PKG_CONFIG --exists --print-errors "$1"]); then -+ m4_ifval([$2], [$2], [:]) -+m4_ifvaln([$3], [else -+ $3])dnl -+fi]) -+ -+ -+# _PKG_CONFIG([VARIABLE], [COMMAND], [MODULES]) -+# --------------------------------------------- -+m4_define([_PKG_CONFIG], -+[if test -n "$$1"; then -+ pkg_cv_[]$1="$$1" -+ elif test -n "$PKG_CONFIG"; then -+ PKG_CHECK_EXISTS([$3], -+ [pkg_cv_[]$1=`$PKG_CONFIG --[]$2 "$3" 2>/dev/null`], -+ [pkg_failed=yes]) -+ else -+ pkg_failed=untried -+fi[]dnl -+])# _PKG_CONFIG -+ -+# _PKG_SHORT_ERRORS_SUPPORTED -+# ----------------------------- -+AC_DEFUN([_PKG_SHORT_ERRORS_SUPPORTED], -+[AC_REQUIRE([PKG_PROG_PKG_CONFIG]) -+if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then -+ _pkg_short_errors_supported=yes -+else -+ _pkg_short_errors_supported=no -+fi[]dnl -+])# _PKG_SHORT_ERRORS_SUPPORTED -+ -+ -+# PKG_CHECK_MODULES(VARIABLE-PREFIX, MODULES, [ACTION-IF-FOUND], -+# [ACTION-IF-NOT-FOUND]) -+# -+# -+# Note that if there is a possibility the first call to -+# PKG_CHECK_MODULES might not happen, you should be sure to include an -+# explicit call to PKG_PROG_PKG_CONFIG in your configure.ac -+# -+# -+# -------------------------------------------------------------- -+AC_DEFUN([PKG_CHECK_MODULES], -+[AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl -+AC_ARG_VAR([$1][_CFLAGS], [C compiler flags for $1, overriding pkg-config])dnl -+AC_ARG_VAR([$1][_LIBS], [linker flags for $1, overriding pkg-config])dnl -+ -+pkg_failed=no -+AC_MSG_CHECKING([for $1]) -+ -+_PKG_CONFIG([$1][_CFLAGS], [cflags], [$2]) -+_PKG_CONFIG([$1][_LIBS], [libs], [$2]) -+ -+m4_define([_PKG_TEXT], [Alternatively, you may set the environment variables $1[]_CFLAGS -+and $1[]_LIBS to avoid the need to call pkg-config. -+See the pkg-config man page for more details.]) -+ -+if test $pkg_failed = yes; then -+ _PKG_SHORT_ERRORS_SUPPORTED -+ if test $_pkg_short_errors_supported = yes; then -+ $1[]_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors "$2" 2>&1` -+ else -+ $1[]_PKG_ERRORS=`$PKG_CONFIG --print-errors "$2" 2>&1` -+ fi -+ # Put the nasty error message in config.log where it belongs -+ echo "$$1[]_PKG_ERRORS" >&AS_MESSAGE_LOG_FD -+ -+ ifelse([$4], , [AC_MSG_ERROR(dnl -+[Package requirements ($2) were not met: -+ -+$$1_PKG_ERRORS -+ -+Consider adjusting the PKG_CONFIG_PATH environment variable if you -+installed software in a non-standard prefix. -+ -+_PKG_TEXT -+])], -+ [AC_MSG_RESULT([no]) -+ $4]) -+elif test $pkg_failed = untried; then -+ ifelse([$4], , [AC_MSG_FAILURE(dnl -+[The pkg-config script could not be found or is too old. Make sure it -+is in your PATH or set the PKG_CONFIG environment variable to the full -+path to pkg-config. -+ -+_PKG_TEXT -+ -+To get pkg-config, see .])], -+ [$4]) -+else -+ $1[]_CFLAGS=$pkg_cv_[]$1[]_CFLAGS -+ $1[]_LIBS=$pkg_cv_[]$1[]_LIBS -+ AC_MSG_RESULT([yes]) -+ ifelse([$3], , :, [$3]) -+fi[]dnl -+])# PKG_CHECK_MODULES -+ - # po.m4 serial 15 (gettext-0.17) - dnl Copyright (C) 1995-2007 Free Software Foundation, Inc. - dnl This file is free software; the Free Software Foundation -diff -up system-config-printer-1.1.10/configure.in.525e996 system-config-printer-1.1.10/configure.in ---- system-config-printer-1.1.10/configure.in.525e996 2009-07-22 13:53:25.000000000 +0100 -+++ system-config-printer-1.1.10/configure.in 2009-07-26 19:01:45.685355364 +0100 -@@ -40,6 +40,9 @@ AC_ARG_WITH(udev-rules, - AM_CONDITIONAL([UDEV_RULES], [test x$with_udev_rules != xno]) - - if test x$with_udev_rules != xno; then -+ PKG_CHECK_MODULES(DBUS_GLIB, [dbus-glib-1 >= 0.76]) -+ AC_SUBST(DBUS_GLIB_CFLAGS) -+ AC_SUBST(DBUS_GLIB_LIBS) - AM_PROG_CC_C_O - fi - -diff -up system-config-printer-1.1.10/cupshelpers/ppds.py.525e996 system-config-printer-1.1.10/cupshelpers/ppds.py ---- system-config-printer-1.1.10/cupshelpers/ppds.py.525e996 2009-07-22 13:22:49.000000000 +0100 -+++ system-config-printer-1.1.10/cupshelpers/ppds.py 2009-07-26 19:01:45.686355890 +0100 -@@ -159,29 +159,32 @@ def ppdMakeModelSplit (ppd_make_and_mode - # HP PPDs give NickNames like: - # *NickName: "HP LaserJet 4 Plus v2013.111 Postscript (recommended)" - # Find the version number. -- v = model.find (" v") -+ modell = model.lower () -+ v = modell.find (" v") - if v != -1 and (model[v + 2].isdigit () or - (model[v + 2] == '.' and - model[v + 3].isdigit ())): - # Truncate at that point. - model = model[:v] -+ modell = modell[:v] - - for suffix in [" hpijs", -- " Foomatic/", -+ " foomatic/", - " - ", - " w/", - " (", -- " PostScript", -- " PS", -- " PS1", -- " PS2", -- " PS3", -- " PXL", -- " series" -+ " postscript", -+ " ps", -+ " ps1", -+ " ps2", -+ " ps3", -+ " pxl", -+ " series", - ","]: -- s = model.find (suffix) -+ s = modell.find (suffix) - if s != -1: - model = model[:s] -+ modell = modell[:s] - - if makel == "hp": - modelnames = {"dj": "DeskJet", -@@ -190,10 +193,10 @@ def ppdMakeModelSplit (ppd_make_and_mode - "color lj": "Color LaserJet", - "ps ": "PhotoSmart", - "hp ": ""} -- modell = model.lower () - for (name, fullname) in modelnames.iteritems (): - if modell.startswith (name): - model = fullname + model[len (name):] -+ modell = model.lower () - - for mfr in [ "Apple", "Canon", "Epson", "Lexmark", "Oki" ]: - if makel == mfr.lower (): -diff -up system-config-printer-1.1.10/Makefile.am.525e996 system-config-printer-1.1.10/Makefile.am ---- system-config-printer-1.1.10/Makefile.am.525e996 2009-07-22 15:11:41.000000000 +0100 -+++ system-config-printer-1.1.10/Makefile.am 2009-07-26 19:01:45.680355779 +0100 -@@ -152,14 +152,65 @@ bin_SCRIPTS=\ - if UDEV_RULES - udevrulesdir=$(sysconfdir)/udev/rules.d - udevrules_DATA=udev/70-printers.rules --udev_udev_configure_printer_SOURCES=\ -- udev/udev-configure-printer.c --udev_udev_configure_printer_LDADD=-lcups -ludev -lusb -+ -+udev_printer_config_daemon_SOURCES= \ -+ udev/printer-config-daemon.c \ -+ udev/printer-config-main.c \ -+ udev/printer-config.h -+udev_printer_config_daemon_DEPENDENCIES= \ -+ udev/printer-config-server-bindings.h -+udev_printer_config_daemon_CPPFLAGS= \ -+ $(DBUS_GLIB_CFLAGS) -+udev_printer_config_daemon_LDADD= \ -+ $(DBUS_GLIB_LIBS) \ -+ -lcups -ludev -lusb -+ -+udev_udev_usb_printer_SOURCES= \ -+ udev/udev-usb-printer.c -+udev_udev_usb_printer_DEPENDENCIES= \ -+ udev/printer-config-client-bindings.h -+udev_udev_usb_printer_CPPFLAGS= \ -+ $(DBUS_GLIB_CFLAGS) -+udev_udev_usb_printer_LDADD= \ -+ $(DBUS_GLIB_LIBS) \ -+ -ludev -lusb - udevhelperdir=/lib/udev - udevhelper_PROGRAMS=\ -- udev/udev-configure-printer --udevhelper_SCRIPTS=\ -+ udev/udev-usb-printer -+ -+udev/printer-config-server-bindings.h: udev/com.redhat.PrinterConfig.xml \ -+ Makefile -+ dbus-binding-tool --prefix=printer_config_daemon \ -+ --mode=glib-server \ -+ --output=$@ $< -+ -+udev/printer-config-client-bindings.h: udev/com.redhat.PrinterConfig.xml \ -+ Makefile -+ dbus-binding-tool --prefix=printer_config_daemon \ -+ --mode=glib-client \ -+ --output=$@ $< -+ -+BUILT_SOURCES= \ -+ udev/printer-config-server-bindings.h \ -+ udev/printer-config-client-bindings.h -+ -+libexec_PROGRAMS=\ -+ udev/printer-config-daemon -+libexec_SCRIPTS=\ - udev/udev-add-printer -+ -+dbusifdir = $(datadir)/dbus-1/interfaces -+dbusif_DATA = udev/com.redhat.PrinterConfig.xml -+ -+servicedir = $(datadir)/dbus-1/system-services -+service_in_files = udev/com.redhat.PrinterConfig.service.in -+service_DATA = $(service_in_files:.service.in=.service) -+ -+$(service_DATA): $(service_in_files) Makefile -+ @sed -e "s,\@libexecdir\@,$(libexecdir)," $< > $@ -+ -+dbusconfdir = $(sysconfdir)/dbus-1/system.d -+dbusconf_DATA = udev/com.redhat.PrinterConfig.conf - endif - - man_MANS= \ -@@ -238,7 +289,10 @@ EXTRA_DIST=\ - intltool-merge.in \ - intltool-update.in \ - config.py.in \ -- udev/70-printers.rules -+ udev/70-printers.rules \ -+ udev/com.redhat.PrinterConfig.xml \ -+ udev/com.redhat.PrinterConfig.service.in \ -+ udev/com.redhat.PrinterConfig.conf - - desktop_in_files = $(desktop_DATA:.desktop=.desktop.in) - -@@ -293,12 +347,17 @@ test-ppd-module.sh: - - TESTS = test-ppd-module.sh - -+CLEANFILES = \ -+ $(BUILT_SOURCES) \ -+ udev/*.o -+ - DISTCLEANFILES=*.pyc *.pyo *~ *.bak \ - troubleshoot/*.pyc troubleshoot/*.pyo troubleshoot/*~ \ - intltool-extract intltool-merge intltool-update \ - *.desktop man/*.1 \ - test-ppd-module.sh pickled-ppds \ -- config.py -+ config.py \ -+ $(service_DATA) - - distclean-local: - rm -rf html -diff -up system-config-printer-1.1.10/system-config-printer.py.525e996 system-config-printer-1.1.10/system-config-printer.py ---- system-config-printer-1.1.10/system-config-printer.py.525e996 2009-07-21 15:16:35.000000000 +0100 -+++ system-config-printer-1.1.10/system-config-printer.py 2009-07-26 19:01:45.690356122 +0100 -@@ -3377,7 +3377,7 @@ class GUI(GtkGUI, monitor.Watcher): - name = name.replace ("#", "-") - if not self.checkNPName (name): - suffix=2 -- while not self.checkNPName (name + str (suffix)): -+ while not self.checkNPName (name + "-" + str (suffix)): - suffix += 1 - if suffix == 100: - break -diff -up system-config-printer-1.1.10/udev/70-printers.rules.525e996 system-config-printer-1.1.10/udev/70-printers.rules ---- system-config-printer-1.1.10/udev/70-printers.rules.525e996 2009-07-22 13:22:49.000000000 +0100 -+++ system-config-printer-1.1.10/udev/70-printers.rules 2009-07-26 19:01:45.698481110 +0100 -@@ -1,7 +1,7 @@ - # Low-level USB device add trigger --ACTION=="add", SUBSYSTEM=="usb", ATTR{bInterfaceClass}=="07", ATTR{bInterfaceSubClass}=="01", RUN+="udev-configure-printer add %p" -+ACTION=="add", SUBSYSTEM=="usb", ATTR{bInterfaceClass}=="07", ATTR{bInterfaceSubClass}=="01", RUN+="udev-usb-printer add %p" - # usblp device add trigger (needed when usblp is already loaded) --ACTION=="add", KERNEL=="lp*", RUN+="udev-configure-printer add %p" -+ACTION=="add", KERNEL=="lp*", RUN+="udev-usb-printer add %p" - - # Low-level USB device remove trigger --ACTION=="remove", SUBSYSTEM=="usb", ENV{ID_USB_INTERFACES}=="*:0701*:*", RUN+="udev-configure-printer remove %p" -+ACTION=="remove", SUBSYSTEM=="usb", ENV{ID_USB_INTERFACES}=="*:0701*:*", RUN+="udev-usb-printer remove %p" -diff -up /dev/null system-config-printer-1.1.10/udev/com.redhat.PrinterConfig.conf ---- /dev/null 2009-07-26 12:31:15.305032486 +0100 -+++ system-config-printer-1.1.10/udev/com.redhat.PrinterConfig.conf 2009-07-26 19:01:45.698481110 +0100 -@@ -0,0 +1,16 @@ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -diff -up /dev/null system-config-printer-1.1.10/udev/com.redhat.PrinterConfig.service.in ---- /dev/null 2009-07-26 12:31:15.305032486 +0100 -+++ system-config-printer-1.1.10/udev/com.redhat.PrinterConfig.service.in 2009-07-26 19:01:45.699481020 +0100 -@@ -0,0 +1,4 @@ -+[D-BUS Service] -+Name=com.redhat.PrinterConfig -+Exec=@libexecdir@/printer-config-daemon -+User=root -diff -up /dev/null system-config-printer-1.1.10/udev/com.redhat.PrinterConfig.xml ---- /dev/null 2009-07-26 12:31:15.305032486 +0100 -+++ system-config-printer-1.1.10/udev/com.redhat.PrinterConfig.xml 2009-07-26 19:01:45.699481020 +0100 -@@ -0,0 +1,71 @@ -+ -+ -+ -+ -+ -+ -+ The PrinterConfig service is available via the -+ system message bus. To access the service, use the -+ com.redhat.PrinterConfig interface -+ on the /com/redhat/PrinterConfig -+ object on the D-Bus system bus service with the well-known -+ name -+ com.redhat.PrinterConfig. -+ -+ It is intended to be used by udev when USB printers -+ are connected and disconnected. -+ -+ -+ -+ -+ -+ -+ -+ -+ The udev devpath of the device with subsystem -+ usb and devtype usb_device referring to the USB printer -+ device. -+ -+ -+ -+ -+ -+ -+ -+ The IEEE 1284 Device ID (not including length -+ field) of the device. -+ -+ -+ -+ -+ -+ -+ This method informs the PrinterConfig service that -+ a USB printer is now connected. -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ The udev devpath of the device with subsystem -+ usb and devtype usb_device referring to the USB printer -+ device. -+ -+ -+ -+ -+ -+ -+ This method informs the PrinterConfig service that -+ a USB printer has been disconnected. -+ -+ -+ -+ -+ -diff -up /dev/null system-config-printer-1.1.10/udev/printer-config-daemon.c ---- /dev/null 2009-07-26 12:31:15.305032486 +0100 -+++ system-config-printer-1.1.10/udev/printer-config-daemon.c 2009-07-26 19:01:45.701480595 +0100 -@@ -0,0 +1,1248 @@ -+/* -*- Mode: C; c-file-style: "gnu" -*- -+ * printer-config-daemon - a D-Bus service for configuring printers -+ * Copyright (C) 2009 Red Hat, Inc. -+ * Author: Tim Waugh -+ * -+ * 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 -+ * -+ */ -+ -+#define LIBUDEV_I_KNOW_THE_API_IS_SUBJECT_TO_CHANGE 1 -+#include "printer-config.h" -+#include "printer-config-server-bindings.h" -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+ -+#define DISABLED_REASON "Unplugged or turned off" -+#define MATCH_ONLY_DISABLED 1 -+#define USB_URI_MAP "/var/run/udev-configure-printer/usb-uris" -+ -+struct children -+{ -+ struct children *next; -+ GPid pid; -+}; -+ -+struct device_uris -+{ -+ size_t n_uris; -+ char **uri; -+}; -+ -+struct usb_uri_map_entry -+{ -+ struct usb_uri_map_entry *next; -+ -+ /* The devpath of the ("usb","usb_device") device. */ -+ char *devpath; -+ -+ /* List of matching device URIs. */ -+ struct device_uris uris; -+}; -+ -+struct usb_uri_map -+{ -+ struct usb_uri_map_entry *entries; -+ -+ /* Open file descriptor for the map, or -1 if it has already been -+ * written. */ -+ int fd; -+}; -+ -+struct device_id -+{ -+ char *full_device_id; -+ char *mfg; -+ char *mdl; -+ char *sern; -+}; -+ -+/* Device URI schemes in decreasing order of preference. */ -+static const char *device_uri_types[] = -+ { -+ "hp", -+ "usb", -+ }; -+ -+static int -+device_uri_type (const char *uri) -+{ -+ int slen = strcspn (uri, ":"); -+ int i; -+ int n = sizeof (device_uri_types) / sizeof (device_uri_types[0]); -+ for (i = 0; i < n; i++) -+ if (!strncmp (uri, device_uri_types[i], slen) && -+ device_uri_types[i][slen] == '\0') -+ break; -+ -+ return i; -+} -+ -+static void -+add_device_uri (struct device_uris *uris, -+ const char *uri) -+{ -+ char *uri_copy = strdup (uri); -+ if (!uri_copy) -+ { -+ syslog (LOG_ERR, "out of memory"); -+ return; -+ } -+ -+ if (uris->n_uris == 0) -+ { -+ uris->uri = malloc (sizeof (char *)); -+ if (uris->uri) -+ { -+ uris->n_uris = 1; -+ uris->uri[0] = uri_copy; -+ } -+ } -+ else -+ { -+ char **old = uris->uri; -+ if (++uris->n_uris < UINT_MAX / sizeof (char *)) -+ { -+ uris->uri = realloc (uris->uri, -+ sizeof (char *) * uris->n_uris); -+ if (uris->uri) -+ uris->uri[uris->n_uris - 1] = uri_copy; -+ else -+ { -+ uris->uri = old; -+ uris->n_uris--; -+ free (uri_copy); -+ } -+ } -+ else -+ { -+ uris->n_uris--; -+ free (uri_copy); -+ } -+ } -+} -+ -+static void -+free_device_uris (struct device_uris *uris) -+{ -+ size_t i; -+ for (i = 0; i < uris->n_uris; i++) -+ free (uris->uri[i]); -+ free (uris->uri); -+} -+ -+static void -+add_usb_uri_mapping (struct usb_uri_map **map, -+ const char *devpath, -+ const struct device_uris *uris) -+{ -+ struct usb_uri_map_entry *entry, **prev; -+ size_t i; -+ prev = &(*map)->entries; -+ while (*prev) -+ prev = &((*prev)->next); -+ -+ entry = malloc (sizeof (struct usb_uri_map_entry)); -+ if (!entry) -+ { -+ syslog (LOG_ERR, "out of memory"); -+ return; -+ } -+ -+ entry->devpath = strdup (devpath); -+ entry->uris.n_uris = uris->n_uris; -+ entry->uris.uri = malloc (sizeof (char *) * uris->n_uris); -+ for (i = 0; i < uris->n_uris; i++) -+ entry->uris.uri[i] = strdup (uris->uri[i]); -+ entry->next = NULL; -+ *prev = entry; -+} -+ -+static struct usb_uri_map * -+read_usb_uri_map (void) -+{ -+ int fd = open (USB_URI_MAP, O_RDWR); -+ struct usb_uri_map *map = NULL; -+ struct flock lock; -+ struct stat st; -+ char *buf, *line; -+ -+ if (fd == -1) -+ { -+ char dir[] = USB_URI_MAP; -+ char *p = strrchr (dir, '/'); -+ if (p) -+ { -+ *p = '\0'; -+ mkdir (dir, 0755); -+ fd = open (USB_URI_MAP, O_RDWR | O_TRUNC | O_CREAT, 0644); -+ if (fd == -1) -+ { -+ syslog (LOG_ERR, "failed to create " USB_URI_MAP); -+ return NULL; -+ } -+ } -+ } -+ -+ map = malloc (sizeof (struct usb_uri_map)); -+ if (!map) -+ { -+ close (fd); -+ syslog (LOG_ERR, "out of memory"); -+ return NULL; -+ } -+ -+ lock.l_type = F_WRLCK; -+ lock.l_whence = SEEK_SET; -+ lock.l_start = 0; -+ lock.l_len = 0; -+ if (fcntl (fd, F_SETLKW, &lock) == -1) -+ { -+ close (fd); -+ free (map); -+ syslog (LOG_ERR, "failed to lock " USB_URI_MAP); -+ return NULL; -+ } -+ -+ map->entries = NULL; -+ map->fd = fd; -+ if (fstat (fd, &st) == -1) -+ { -+ close (fd); -+ free (map); -+ syslog (LOG_ERR, "failed to fstat " USB_URI_MAP " (fd %d)", fd); -+ return NULL; -+ } -+ -+ /* Read the entire file into memory. */ -+ buf = malloc (1 + (sizeof (char) * st.st_size)); -+ if (!buf) -+ { -+ close (fd); -+ free (map); -+ syslog (LOG_ERR, "out of memory"); -+ return NULL; -+ } -+ -+ if (read (fd, buf, st.st_size) < 0) -+ { -+ close (fd); -+ free (map); -+ free (buf); -+ syslog (LOG_ERR, "failed to read " USB_URI_MAP); -+ return NULL; -+ } -+ -+ buf[st.st_size] = '\0'; -+ line = buf; -+ while (line) -+ { -+ char *saveptr = NULL; -+ const char *devpath, *uri; -+ struct device_uris uris; -+ char *nextline = strchr (line, '\n'); -+ if (!nextline) -+ break; -+ -+ *nextline++ = '\0'; -+ if (nextline >= buf + st.st_size) -+ nextline = NULL; -+ -+ devpath = strtok_r (line, "\t", &saveptr); -+ uri = strtok_r (NULL, "\t", &saveptr); -+ if (!devpath || !uri) -+ { -+ syslog (LOG_DEBUG, "Incorrect line in " USB_URI_MAP ": %s", -+ line); -+ continue; -+ } -+ -+ uris.n_uris = 1; -+ uris.uri = malloc (sizeof (char *)); -+ if (uris.uri == NULL) -+ break; -+ -+ uris.uri[0] = strdup (uri); -+ while ((uri = strtok_r (NULL, "\t", &saveptr)) != NULL) -+ add_device_uri (&uris, uri); -+ -+ add_usb_uri_mapping (&map, devpath, &uris); -+ -+ line = nextline; -+ } -+ -+ free (buf); -+ return map; -+} -+ -+static void -+write_usb_uri_map (struct usb_uri_map *map) -+{ -+ struct usb_uri_map_entry *entry; -+ int fd = map->fd; -+ FILE *f; -+ -+ lseek (fd, SEEK_SET, 0); -+ ftruncate (fd, 0); -+ f = fdopen (fd, "w"); -+ if (!f) -+ { -+ syslog (LOG_ERR, "failed to fdopen " USB_URI_MAP " (fd %d)", fd); -+ close (fd); -+ map->fd = -1; -+ return; -+ } -+ -+ for (entry = map->entries; entry; entry = entry->next) -+ { -+ size_t i; -+ fprintf (f, "%s\t%s", entry->devpath, entry->uris.uri[0]); -+ for (i = 1; i < entry->uris.n_uris; i++) -+ fprintf (f, "\t%s", entry->uris.uri[i]); -+ fwrite ("\n", 1, 1, f); -+ } -+ -+ fclose (f); -+ map->fd = -1; -+} -+ -+static void -+free_usb_uri_map (struct usb_uri_map *map) -+{ -+ struct usb_uri_map_entry *entry, *next; -+ for (entry = map->entries; entry; entry = next) -+ { -+ next = entry->next; -+ free (entry->devpath); -+ free_device_uris (&entry->uris); -+ free (entry); -+ } -+ -+ if (map->fd != -1) -+ close (map->fd); -+ -+ free (map); -+} -+ -+static void -+free_device_id (struct device_id *id) -+{ -+ free (id->full_device_id); -+ free (id->mfg); -+ free (id->mdl); -+ free (id->sern); -+} -+ -+static void -+parse_device_id (const char *device_id, -+ struct device_id *id) -+{ -+ char *fieldname; -+ char *start, *end; -+ size_t len; -+ -+ len = strlen (device_id); -+ if (len == 0) -+ return; -+ -+ if (device_id[len - 1] == '\n') -+ len--; -+ -+ id->full_device_id = malloc (len + 1); -+ fieldname = malloc (len + 1); -+ if (!id->full_device_id || !fieldname) -+ { -+ syslog (LOG_ERR, "out of memory"); -+ return; -+ } -+ -+ memcpy (id->full_device_id, device_id, len); -+ id->full_device_id[len] = '\0'; -+ fieldname[0] = '\0'; -+ start = id->full_device_id; -+ while (*start != '\0') -+ { -+ /* New field. */ -+ -+ end = start; -+ while (*end != '\0' && *end != ':') -+ end++; -+ -+ if (*end == '\0') -+ break; -+ -+ len = end - start; -+ memcpy (fieldname, start, len); -+ fieldname[len] = '\0'; -+ -+ start = end + 1; -+ while (*end != '\0' && *end != ';') -+ end++; -+ -+ len = end - start; -+ -+ if (!id->mfg && -+ (!strncasecmp (fieldname, "MANUFACTURER", 12) || -+ !strncasecmp (fieldname, "MFG", 3))) -+ id->mfg = strndup (start, len); -+ else if (!id->mdl && -+ (!strncasecmp (fieldname, "MODEL", 5) || -+ !strncasecmp (fieldname, "MDL", 3))) -+ id->mdl = strndup (start, len); -+ else if (!id->sern && -+ (!strncasecmp (fieldname, "SERIALNUMBER", 12) || -+ !strncasecmp (fieldname, "SERN", 4) || -+ !strncasecmp (fieldname, "SN", 2))) -+ id->sern = strndup (start, len); -+ -+ if (*end != '\0') -+ start = end + 1; -+ } -+ -+ free (fieldname); -+} -+ -+static const char * -+no_password (const char *prompt) -+{ -+ return ""; -+} -+ -+static http_t * -+cups_connection (void) -+{ -+ http_t *cups = NULL; -+ static int first_time = 1; -+ -+ if (first_time) -+ { -+ cupsSetPasswordCB (no_password); -+ first_time = 0; -+ } -+ -+ cups = httpConnectEncrypt ("localhost", 631, -+ HTTP_ENCRYPT_IF_REQUESTED); -+ if (cups == NULL) -+ { -+ /* Don't bother retrying here. Instead, the CUPS initscript -+ should run these commands after cupsd is started: -+ -+ rmmod usblp -+ udevadm trigger --subsystem-match=usb \ -+ --attr-match=bInterfaceClass=07 \ -+ --attr-match=bInterfaceSubClass=01 -+ */ -+ -+ syslog (LOG_DEBUG, "failed to connect to CUPS server; giving up"); -+ return NULL; -+ } -+ -+ return cups; -+} -+ -+static int -+find_matching_device_uris (struct device_id *id, -+ const char *usbserial, -+ struct device_uris *uris, -+ const char *devpath, -+ struct usb_uri_map *map) -+{ -+ http_t *cups; -+ ipp_t *request, *answer; -+ ipp_attribute_t *attr; -+ struct device_uris uris_noserial; -+ struct device_uris all_uris; -+ size_t i, n; -+ const char *exclude_schemes[] = { -+ "beh", -+ "bluetooth", -+ "http", -+ "https", -+ "ipp", -+ "lpd", -+ "ncp", -+ "parallel", -+ "scsi", -+ "smb", -+ "snmp", -+ "socket", -+ }; -+ -+ uris->n_uris = uris_noserial.n_uris = all_uris.n_uris = 0; -+ uris->uri = uris_noserial.uri = all_uris.uri = NULL; -+ -+ /* Leave the bus to settle. */ -+ sleep (1); -+ -+ cups = cups_connection (); -+ request = ippNewRequest (CUPS_GET_DEVICES); -+ ippAddStrings (request, IPP_TAG_OPERATION, IPP_TAG_NAME, "exclude-schemes", -+ sizeof (exclude_schemes) / sizeof(exclude_schemes[0]), -+ NULL, exclude_schemes); -+ -+ answer = cupsDoRequest (cups, request, "/"); -+ httpClose (cups); -+ -+ if (answer == NULL) -+ { -+ syslog (LOG_ERR, "failed to send IPP request %d", -+ request->request.op.operation_id); -+ return 0; -+ } -+ -+ if (answer->request.status.status_code > IPP_OK_CONFLICT) -+ { -+ syslog (LOG_ERR, "IPP request %d failed (%d)", -+ request->request.op.operation_id, -+ answer->request.status.status_code); -+ return 0; -+ } -+ -+ for (attr = answer->attrs; attr; attr = attr->next) -+ { -+ const char *device_uri = NULL; -+ struct device_id this_id; -+ this_id.full_device_id = this_id.mfg = this_id.mdl = this_id.sern = NULL; -+ -+ while (attr && attr->group_tag != IPP_TAG_PRINTER) -+ attr = attr->next; -+ -+ if (!attr) -+ break; -+ -+ for (; attr && attr->group_tag == IPP_TAG_PRINTER; attr = attr->next) -+ { -+ if (attr->value_tag == IPP_TAG_URI && -+ !strcmp (attr->name, "device-uri")) -+ device_uri = attr->values[0].string.text; -+ else if (attr->value_tag == IPP_TAG_TEXT && -+ !strcmp (attr->name, "device-id")) -+ parse_device_id (attr->values[0].string.text, &this_id); -+ } -+ -+ /* Only use device schemes in our preference order for matching -+ * against the IEEE 1284 Device ID. */ -+ -+ for (i = 0; -+ device_uri && -+ i < sizeof (device_uri_types) / sizeof (device_uri_types[0]); -+ i++) -+ { -+ size_t len = strlen (device_uri_types[i]); -+ if (!strncmp (device_uri_types[i], device_uri, len) && -+ device_uri[len] == ':') -+ break; -+ } -+ -+ if (device_uri) -+ add_device_uri (&all_uris, device_uri); -+ -+ if (i == sizeof (device_uri_types) / sizeof (device_uri_types[0])) -+ /* Not what we want to match against. Ignore this one. */ -+ device_uri = NULL; -+ -+ /* Now check the manufacturer and model names. */ -+ if (device_uri && this_id.mfg && this_id.mdl && -+ !strcmp (this_id.mfg, id->mfg) && -+ !strcmp (this_id.mdl, id->mdl)) -+ { -+ /* We've checked everything except the serial numbers. This -+ * is more complicated. Some devices include a serial -+ * number (SERN) field in their IEEE 1284 Device ID. Others -+ * don't -- this was not a mandatory field in the -+ * specification. -+ * -+ * If the device includes SERN field in its, it must match -+ * what the device-id attribute has. -+ * -+ * Otherwise, the only means we have of knowing which device -+ * is meant is the USB serial number. -+ * -+ * CUPS backends may choose to insert the USB serial number -+ * into the SERN field when reporting a device-id attribute. -+ * HPLIP does this, and it seems not to stray too far from -+ * the intent of that field. We accommodate this. -+ * -+ * Alternatively, CUPS backends may include the USB serial -+ * number somewhere in their reported device-uri attributes. -+ * For instance, the CUPS 1.4 usb backend, when compiled -+ * with libusb support, gives device URIs containing the USB -+ * serial number for devices without a SERN field, like -+ * this: usb://HP/DESKJET%20990C?serial=US05M1D20CIJ -+ * -+ * To accommodate this we examine tokens between '?', '=' -+ * and '&' delimiters to check for USB serial number -+ * matches. -+ * -+ * CUPS 1.3, and CUPS 1.4 without libusb support, doesn't do this. -+ * As a result we also need to deal with devices that don't report a -+ * SERN field where the backends that don't add a SERN field from -+ * the USB serial number and also don't include the USB serial -+ * number in the URI. -+ */ -+ -+ int match = 0; -+ if ((id->sern && this_id.sern && !strcmp (id->sern, this_id.sern))) -+ { -+ syslog (LOG_DEBUG, "SERN fields match"); -+ match = 1; -+ } -+ -+ if (!match && usbserial[0] != '\0') -+ { -+ if (!id->sern) -+ { -+ if (this_id.sern && !strcmp (usbserial, this_id.sern)) -+ { -+ syslog (LOG_DEBUG, -+ "SERN field matches USB serial number"); -+ match = 1; -+ } -+ } -+ -+ if (!match) -+ { -+ char *saveptr, *uri = strdup (device_uri); -+ const char *token; -+ const char *sep = "?=&/"; -+ for (token = strtok_r (uri, sep, &saveptr); -+ token; -+ token = strtok_r (NULL, sep, &saveptr)) -+ if (!strcmp (token, usbserial)) -+ { -+ syslog (LOG_DEBUG, "URI contains USB serial number"); -+ match = 1; -+ break; -+ } -+ -+ free (uri); -+ } -+ } -+ -+ if (match) -+ { -+ syslog (LOG_DEBUG, "URI match: %s", device_uri); -+ add_device_uri (uris, device_uri); -+ } -+ else if (!id->sern) -+ { -+ syslog (LOG_DEBUG, "URI matches without serial number: %s", -+ device_uri); -+ add_device_uri (&uris_noserial, device_uri); -+ } -+ else -+ syslog (LOG_DEBUG, "No match: %s", device_uri); -+ } -+ -+ if (!attr) -+ break; -+ } -+ -+ ippDelete (answer); -+ -+ /* Decide what to do about device URIs that did not match a serial -+ * number. The device had no SERN field, and the USB serial number -+ * was nowhere to be found from the device URI or device-id field. -+ * -+ * Device URIs with no reference to serial number can only each ever -+ * work when only one printer of that model is connected. -+ * Accordingly, it is safe to disable queues using such URIs, as we -+ * know the removed/added device is that lone printer. -+ * -+ * When adding queues it is best to avoid URIs that don't -+ * distinguish serial numbers. -+ * -+ * What we'll do, then, is concatenate the list of "non-serial" URIs -+ * onto the end of the list of "serial" URIs. -+ */ -+ -+ if (uris->n_uris == 0 && uris_noserial.n_uris > 0) -+ { -+ syslog (LOG_DEBUG, "No serial number URI matches so using those without"); -+ uris->n_uris = uris_noserial.n_uris; -+ uris->uri = uris_noserial.uri; -+ uris_noserial.n_uris = 0; -+ uris_noserial.uri = NULL; -+ } -+ else if (uris_noserial.n_uris > 0) -+ { -+ char **old = uris->uri; -+ uris->uri = realloc (uris->uri, -+ sizeof (char *) * (uris->n_uris + -+ uris_noserial.n_uris)); -+ if (!uris->uri) -+ uris->uri = old; -+ else -+ { -+ for (i = 0; i < uris_noserial.n_uris; i++) -+ uris->uri[uris->n_uris + i] = uris_noserial.uri[i]; -+ uris->n_uris += uris_noserial.n_uris; -+ } -+ -+ uris_noserial.n_uris = 0; -+ uris_noserial.uri = NULL; -+ } -+ -+ free_device_uris (&uris_noserial); -+ -+ /* Having decided which device URIs match based on IEEE 1284 Device -+ * ID, we now need to look for "paired" URIs for other functions of -+ * a multi-function device. This are the same except for the -+ * scheme. */ -+ -+ n = uris->n_uris; -+ for (i = 0; i < n; i++) -+ { -+ size_t j; -+ char *me = uris->uri[i]; -+ char *my_rest = strchr (me, ':'); -+ size_t my_schemelen; -+ if (!my_rest) -+ continue; -+ -+ my_schemelen = my_rest - me; -+ for (j = 0; j < all_uris.n_uris; j++) -+ { -+ char *twin = all_uris.uri[j]; -+ char *twin_rest = strchr (twin, ':'); -+ size_t twin_schemelen; -+ if (!twin_rest) -+ continue; -+ -+ twin_schemelen = twin_rest - twin; -+ if (my_schemelen == twin_schemelen && -+ !strncmp (me, twin, my_schemelen)) -+ /* This is the one we are looking for the twin of. */ -+ continue; -+ -+ if (!strcmp (my_rest, twin_rest)) -+ { -+ syslog (LOG_DEBUG, "%s twinned with %s", me, twin); -+ add_device_uri (uris, twin); -+ } -+ } -+ } -+ -+ free_device_uris (&all_uris); -+ if (uris->n_uris > 0) -+ { -+ add_usb_uri_mapping (&map, devpath, uris); -+ write_usb_uri_map (map); -+ free_usb_uri_map (map); -+ } -+ -+ return uris->n_uris; -+} -+ -+/* Call a function for each queue with the given device-uri and printer-state. -+ * Returns the number of queues with a matching device-uri. */ -+static size_t -+for_each_matching_queue (struct device_uris *device_uris, -+ int flags, -+ void (*fn) (const char *, void *), -+ void *context) -+{ -+ size_t matched = 0; -+ http_t *cups = cups_connection (); -+ ipp_t *request, *answer; -+ ipp_attribute_t *attr; -+ const char *attributes[] = { -+ "printer-uri-supported", -+ "device-uri", -+ "printer-state", -+ "printer-state-message", -+ }; -+ -+ request = ippNewRequest (CUPS_GET_PRINTERS); -+ ippAddStrings (request, IPP_TAG_OPERATION, IPP_TAG_KEYWORD, -+ "requested-attributes", -+ sizeof (attributes) / sizeof (attributes[0]), -+ NULL, attributes); -+ answer = cupsDoRequest (cups, request, "/"); -+ httpClose (cups); -+ if (answer == NULL) -+ { -+ syslog (LOG_ERR, "failed to send CUPS-Get-Printers request"); -+ return 0; -+ } -+ -+ if (answer->request.status.status_code > IPP_OK_CONFLICT) -+ { -+ if (answer->request.status.status_code == IPP_NOT_FOUND) -+ { -+ /* No printer queues configured. */ -+ ippDelete (answer); -+ return 0; -+ } -+ -+ syslog (LOG_ERR, "CUPS-Get-Printers request failed (%d)", -+ answer->request.status.status_code); -+ return 0; -+ } -+ -+ for (attr = answer->attrs; attr; attr = attr->next) -+ { -+ const char *this_printer_uri = NULL; -+ const char *this_device_uri = NULL; -+ const char *printer_state_message = NULL; -+ int state = 0; -+ size_t i; -+ -+ while (attr && attr->group_tag != IPP_TAG_PRINTER) -+ attr = attr->next; -+ -+ if (!attr) -+ break; -+ -+ for (; attr && attr->group_tag == IPP_TAG_PRINTER; attr = attr->next) -+ { -+ if (attr->value_tag == IPP_TAG_URI) -+ { -+ if (!strcmp (attr->name, "device-uri")) -+ this_device_uri = attr->values[0].string.text; -+ else if (!strcmp (attr->name, "printer-uri-supported")) -+ this_printer_uri = attr->values[0].string.text; -+ } -+ else if (attr->value_tag == IPP_TAG_TEXT && -+ !strcmp (attr->name, "printer-state-message")) -+ printer_state_message = attr->values[0].string.text; -+ else if (attr->value_tag == IPP_TAG_ENUM && -+ !strcmp (attr->name, "printer-state")) -+ state = attr->values[0].integer; -+ } -+ -+ for (i = 0; i < device_uris->n_uris; i++) -+ if (!strcmp (device_uris->uri[i], this_device_uri)) -+ { -+ matched++; -+ if (((flags & MATCH_ONLY_DISABLED) && -+ state == IPP_PRINTER_STOPPED && -+ !strcmp (printer_state_message, DISABLED_REASON)) || -+ (flags & MATCH_ONLY_DISABLED) == 0) -+ { -+ syslog (LOG_DEBUG ,"Queue %s has matching device URI", -+ this_printer_uri); -+ (*fn) (this_printer_uri, context); -+ } -+ } -+ -+ if (!attr) -+ break; -+ } -+ -+ ippDelete (answer); -+ return matched; -+} -+ -+static void -+enable_queue (const char *printer_uri, void *context) -+{ -+ /* Disable it. */ -+ http_t *cups = cups_connection (); -+ ipp_t *request, *answer; -+ request = ippNewRequest (IPP_RESUME_PRINTER); -+ ippAddString (request, IPP_TAG_OPERATION, IPP_TAG_URI, -+ "printer-uri", NULL, printer_uri); -+ answer = cupsDoRequest (cups, request, "/admin/"); -+ if (!answer) -+ { -+ syslog (LOG_ERR, "Failed to send IPP-Resume-Printer request"); -+ httpClose (cups); -+ return; -+ } -+ -+ if (answer->request.status.status_code > IPP_OK_CONFLICT) -+ syslog (LOG_ERR, "IPP-Resume-Printer request failed"); -+ else -+ syslog (LOG_INFO, "Re-enabled printer %s", printer_uri); -+ -+ ippDelete (answer); -+ httpClose (cups); -+} -+ -+static void -+disable_queue (const char *printer_uri, void *context) -+{ -+ /* Disable it. */ -+ http_t *cups = cups_connection (); -+ ipp_t *request, *answer; -+ request = ippNewRequest (IPP_PAUSE_PRINTER); -+ ippAddString (request, IPP_TAG_OPERATION, IPP_TAG_URI, -+ "printer-uri", NULL, printer_uri); -+ ippAddString (request, IPP_TAG_OPERATION, IPP_TAG_TEXT, -+ "printer-state-message", NULL, DISABLED_REASON); -+ answer = cupsDoRequest (cups, request, "/admin/"); -+ if (!answer) -+ { -+ syslog (LOG_ERR, "Failed to send IPP-Pause-Printer request"); -+ httpClose (cups); -+ return; -+ } -+ -+ if (answer->request.status.status_code > IPP_OK_CONFLICT) -+ syslog (LOG_ERR, "IPP-Pause-Printer request failed"); -+ else -+ syslog (LOG_INFO, "Disabled printer %s as the corresponding device " -+ "was unplugged or turned off", printer_uri); -+ -+ ippDelete (answer); -+ httpClose (cups); -+} -+ -+static char * -+syspath_from_devpath (struct udev *udev, const char *devpath) -+{ -+ const char *sys; -+ char *syspath; -+ size_t syslen, devpathlen = strlen (devpath); -+ sys = udev_get_sys_path (udev); -+ syslen = strlen (sys); -+ syspath = malloc (syslen + devpathlen + 1); -+ if (syspath == NULL) -+ return NULL; -+ -+ memcpy (syspath, sys, syslen); -+ memcpy (syspath + syslen, devpath, devpathlen); -+ syspath[syslen + devpathlen] = '\0'; -+ return syspath; -+} -+ -+static void -+reap_child (GPid pid, gint status, gpointer context) -+{ -+ PrinterConfigDaemon *self = context; -+ struct children *child, **prev = &self->children; -+ g_debug ("PID %d has exited", pid); -+ for (child = self->children; child; prev = &child->next, child = child->next) -+ if (child->pid == pid) -+ { -+ *prev = child->next; -+ free (child); -+ g_debug ("self->children is now %p", self->children); -+ break; -+ } -+} -+ -+G_DEFINE_TYPE (PrinterConfigDaemon, printer_config_daemon, G_TYPE_OBJECT) -+ -+static gboolean -+kill_timeout (gpointer context) -+{ -+ PrinterConfigDaemon *self = context; -+ if (self->children == NULL) -+ { -+ g_debug ("Time to go"); -+ main_quit (); -+ return FALSE; -+ } -+ -+ g_debug ("children is %p", self->children); -+ return TRUE; -+} -+ -+static gboolean -+reset_killtimer (PrinterConfigDaemon *self) -+{ -+ if (self->killtimer != 0) -+ { -+ g_debug ("Remove killtimer %d", self->killtimer); -+ g_source_remove (self->killtimer); -+ } -+ -+ self->killtimer = g_timeout_add (1000, kill_timeout, self); -+ g_debug ("Set killtimer %d", self->killtimer); -+ return TRUE; -+} -+ -+static void -+printer_config_daemon_dispose (GObject *gobject) -+{ -+ PrinterConfigDaemon *self = PRINTER_CONFIG_DAEMON (gobject); -+ g_debug ("dispose %p", self); -+ G_OBJECT_CLASS (printer_config_daemon_parent_class)->dispose (gobject); -+} -+ -+static void -+printer_config_daemon_finalize (GObject *gobject) -+{ -+ PrinterConfigDaemon *self = PRINTER_CONFIG_DAEMON (gobject); -+ g_debug ("finalize %p", self); -+ if (self->killtimer != 0) -+ { -+ g_debug ("Remove killtimer %d", self->killtimer); -+ g_source_remove (self->killtimer); -+ } -+ -+ G_OBJECT_CLASS (printer_config_daemon_parent_class)->finalize (gobject); -+} -+ -+static void -+printer_config_daemon_class_init (PrinterConfigDaemonClass *klass) -+{ -+ GError *error = NULL; -+ GObjectClass *gobject_class = G_OBJECT_CLASS (klass); -+ gobject_class->dispose = printer_config_daemon_dispose; -+ gobject_class->finalize = printer_config_daemon_finalize; -+ g_debug ("class init"); -+ klass->connection = dbus_g_bus_get (DBUS_BUS_SYSTEM, &error); -+ if (klass->connection == NULL) -+ { -+ g_warning ("Unable to connect to D-Bus: %s", error->message); -+ g_error_free (error); -+ return; -+ } -+ -+ dbus_g_object_type_install_info(PRINTER_CONFIG_TYPE_DAEMON, -+ &dbus_glib_printer_config_daemon_object_info); -+} -+ -+static void -+printer_config_daemon_init (PrinterConfigDaemon *self) -+{ -+ DBusGProxy *driver_proxy; -+ GError *error = NULL; -+ PrinterConfigDaemonClass *klass = PRINTER_CONFIG_DAEMON_GET_CLASS (self); -+ guint request_ret; -+ -+ dbus_g_connection_register_g_object (klass->connection, -+ "/com/redhat/PrinterConfig", -+ G_OBJECT (self)); -+ driver_proxy = dbus_g_proxy_new_for_name (klass->connection, -+ DBUS_SERVICE_DBUS, -+ DBUS_PATH_DBUS, -+ DBUS_INTERFACE_DBUS); -+ -+ g_debug ("daemon init %p", self); -+ if (!org_freedesktop_DBus_request_name (driver_proxy, -+ "com.redhat.PrinterConfig", -+ 0, &request_ret, -+ &error)) -+ { -+ g_warning ("Unable to register service: %s", error->message); -+ g_error_free (error); -+ } -+ -+ self->children = NULL; -+ g_object_unref (driver_proxy); -+} -+ -+gboolean -+printer_config_daemon_usb_printer_add (PrinterConfigDaemon *self, -+ const char *usb_device_devpath, -+ const char *deviceid, -+ DBusGMethodInvocation *context) -+{ -+ struct device_id id; -+ struct device_uris device_uris; -+ struct usb_uri_map *map; -+ struct usb_uri_map_entry *entry; -+ struct udev *udev; -+ struct udev_device *dev; -+ const char *usbserial; -+ char *syspath; -+ -+ syslog (LOG_DEBUG, "add %s", usb_device_devpath); -+ dbus_g_method_return (context); -+ -+ reset_killtimer (self); -+ udev = udev_new (); -+ if (!udev) -+ { -+ syslog (LOG_ERR, "failed to init libudev"); -+ return FALSE; -+ } -+ -+ map = read_usb_uri_map (); -+ if (!map) -+ return TRUE; -+ -+ for (entry = map->entries; entry; entry = entry->next) -+ if (!strcmp (entry->devpath, usb_device_devpath)) -+ break; -+ -+ if (entry != NULL) -+ /* The map already had an entry so has already been dealt -+ * with. This can happen because there are two "add" -+ * triggers: one for the usb_device device and the other for -+ * the usblp device. We have most likely been triggered by -+ * the usblp device, so the usb_device rule got there before -+ * us and succeeded. -+ * -+ * Pretend we didn't find any device URIs that matched, and -+ * exit. -+ */ -+ return TRUE; -+ -+ id.full_device_id = id.mfg = id.mdl = id.sern = NULL; -+ parse_device_id (deviceid, &id); -+ if (!id.mfg || !id.mdl) -+ { -+ syslog (LOG_ERR, "invalid IEEE 1284 Device ID %s", -+ id.full_device_id); -+ return FALSE; -+ } -+ -+ syspath = syspath_from_devpath (udev, usb_device_devpath); -+ if (!syspath) -+ { -+ syslog (LOG_ERR, "unable to get syspath from devpath"); -+ return FALSE; -+ } -+ -+ dev = udev_device_new_from_syspath (udev, syspath); -+ if (!dev) -+ { -+ udev_device_unref (dev); -+ udev_unref (udev); -+ syslog (LOG_ERR, "unable to access %s", syspath); -+ free (syspath); -+ return TRUE; -+ } -+ -+ free (syspath); -+ usbserial = udev_device_get_sysattr_value (dev, "serial"); -+ syslog (LOG_DEBUG, "MFG:%s MDL:%s SERN:%s serial:%s", id.mfg, id.mdl, -+ id.sern ? id.sern : "-", usbserial ? usbserial : "-"); -+ -+ find_matching_device_uris (&id, usbserial, &device_uris, usb_device_devpath, -+ map); -+ udev_device_unref (dev); -+ udev_unref (udev); -+ if (device_uris.n_uris == 0) -+ { -+ free_device_id (&id); -+ return TRUE; -+ } -+ -+ /* Re-enable any queues we'd previously disabled. */ -+ if (for_each_matching_queue (&device_uris, MATCH_ONLY_DISABLED, -+ enable_queue, NULL) == 0) -+ { -+ size_t i; -+ int type; -+ GPid child_pid; -+ GError *error = NULL; -+ char **argv = malloc (sizeof (char *) * (3 + device_uris.n_uris)); -+ -+ /* No queue is configured for this device yet. -+ Decide on a URI to use. */ -+ type = device_uri_type (device_uris.uri[0]); -+ for (i = 1; i < device_uris.n_uris; i++) -+ { -+ int new_type = device_uri_type (device_uris.uri[i]); -+ if (new_type < type) -+ { -+ char *swap = device_uris.uri[0]; -+ device_uris.uri[0] = device_uris.uri[i]; -+ device_uris.uri[i] = swap; -+ type = new_type; -+ } -+ } -+ -+ argv[0] = "/usr/libexec/udev-add-printer"; -+ argv[1] = id.full_device_id; -+ for (i = 0; i < device_uris.n_uris; i++) -+ argv[i + 2] = device_uris.uri[i]; -+ argv[i + 2] = NULL; -+ -+ syslog (LOG_DEBUG, "About to add queue for %s", argv[2]); -+ if (g_spawn_async ("/", argv, NULL, -+ G_SPAWN_STDOUT_TO_DEV_NULL | -+ G_SPAWN_STDERR_TO_DEV_NULL | -+ G_SPAWN_DO_NOT_REAP_CHILD, -+ NULL, NULL, -+ &child_pid, -+ &error) == FALSE) -+ syslog (LOG_ERR, "Failed to execute %s", argv[0]); -+ else -+ { -+ struct children *child = malloc (sizeof (struct children)); -+ child->next = self->children; -+ child->pid = child_pid; -+ self->children = child; -+ g_child_watch_add (child_pid, reap_child, self); -+ } -+ } -+ -+ free_device_id (&id); -+ free_device_uris (&device_uris); -+ return TRUE; -+} -+ -+gboolean -+printer_config_daemon_usb_printer_remove (PrinterConfigDaemon *self, -+ const char *devpath, -+ DBusGMethodInvocation *context) -+{ -+ struct usb_uri_map *map; -+ struct usb_uri_map_entry *entry, **prev; -+ struct device_uris *uris = NULL; -+ -+ syslog (LOG_DEBUG, "remove %s", devpath); -+ dbus_g_method_return (context); -+ -+ reset_killtimer (self); -+ map = read_usb_uri_map (); -+ if (!map) -+ return TRUE; -+ -+ prev = &map->entries; -+ for (entry = map->entries; entry; entry = entry->next) -+ { -+ if (!strcmp (entry->devpath, devpath)) -+ { -+ uris = &entry->uris; -+ break; -+ } -+ -+ prev = &(entry->next); -+ } -+ -+ if (uris) -+ { -+ /* Find the relevant queues and disable them if they are enabled. */ -+ for_each_matching_queue (uris, 0, disable_queue, NULL); -+ *prev = entry->next; -+ write_usb_uri_map (map); -+ } -+ -+ free_usb_uri_map (map); -+ return TRUE; -+} -+ -+PrinterConfigDaemon * -+printer_config_daemon_new (void) -+{ -+ PrinterConfigDaemon *self; -+ self = PRINTER_CONFIG_DAEMON (g_object_new (PRINTER_CONFIG_TYPE_DAEMON, -+ NULL)); -+ self->children = NULL; -+ self->killtimer = 0; -+ g_debug ("New daemon %p", self); -+ return self; -+} -diff -up /dev/null system-config-printer-1.1.10/udev/printer-config.h ---- /dev/null 2009-07-26 12:31:15.305032486 +0100 -+++ system-config-printer-1.1.10/udev/printer-config.h 2009-07-26 19:01:45.703480670 +0100 -@@ -0,0 +1,76 @@ -+/* -*- Mode: C; c-file-style: "gnu" -*- -+ * printer-config - a D-Bus service for configuring printers -+ * Copyright (C) 2009 Red Hat, Inc. -+ * Author: Tim Waugh -+ * -+ * 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 -+ * -+ */ -+ -+#ifndef PRINTER_CONFIG_H -+#define PRINTER_CONFIG_H -+ -+#include -+#include -+ -+#define PRINTER_CONFIG_TYPE_DAEMON (printer_config_daemon_get_type ()) -+#define PRINTER_CONFIG_DAEMON(obj) \ -+ (G_TYPE_CHECK_INSTANCE_CAST ((obj), \ -+ PRINTER_CONFIG_TYPE_DAEMON, \ -+ PrinterConfigDaemon)) -+#define PRINTER_CONFIG_IS_DAEMON_CLASS(klass) \ -+ (G_TYPE_CHECK_CLASS_CAST ((klass), PRINTER_CONFIG_TYPE_DAEMON, \ -+ PrinterConfigDaemonClass)) -+#define PRINTER_CONFIG_DAEMON_GET_CLASS(obj) \ -+ (G_TYPE_INSTANCE_GET_CLASS ((obj), PRINTER_CONFIG_TYPE_DAEMON, \ -+ PrinterConfigDaemonClass)) -+ -+typedef struct _PrinterConfigDaemon PrinterConfigDaemon; -+typedef struct _PrinterConfigDaemonClass PrinterConfigDaemonClass; -+ -+struct children; -+struct _PrinterConfigDaemon -+{ -+ GObject parent_instance; -+ -+ /* instance members */ -+ struct children *children; -+ guint killtimer; -+}; -+ -+struct _PrinterConfigDaemonClass -+{ -+ GObjectClass parent_class; -+ -+ /* class members */ -+ DBusGConnection *connection; -+}; -+ -+/* used by PRINTER_CONFIG_TYPE_DAEMON */ -+GType printer_config_daemon_get_type (void); -+ -+PrinterConfigDaemon *printer_config_daemon_new (void); -+gboolean printer_config_daemon_usb_printer_add (PrinterConfigDaemon *d, -+ const char *devpath, -+ const char *deviceid, -+ DBusGMethodInvocation *ctx); -+ -+gboolean printer_config_daemon_usb_printer_remove (PrinterConfigDaemon *d, -+ const char *devpath, -+ DBusGMethodInvocation *ctx); -+ -+void main_quit (void); -+ -+#endif /* PRINTER_CONFIG_H */ -diff -up /dev/null system-config-printer-1.1.10/udev/printer-config-main.c ---- /dev/null 2009-07-26 12:31:15.305032486 +0100 -+++ system-config-printer-1.1.10/udev/printer-config-main.c 2009-07-26 19:01:45.702480595 +0100 -@@ -0,0 +1,159 @@ -+/* -*- Mode: C; c-file-style: "gnu" -*- -+ * -+ * Copyright (C) 2007 David Zeuthen -+ * Copyright (C) 2009 Red Hat, Inc. -+ * -+ * 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 St, Fifth Floor, Boston, MA 02110-1301 USA -+ * -+ */ -+ -+#ifdef HAVE_CONFIG_H -+# include "config.h" -+#endif -+ -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+ -+#include -+#include -+ -+#define DBUS_API_SUBJECT_TO_CHANGE -+#include -+#include -+ -+#include "printer-config.h" -+ -+#define NAME_TO_CLAIM "com.redhat.PrinterConfig" -+ -+static gboolean -+acquire_name_on_proxy (DBusGProxy *bus_proxy) -+{ -+ GError *error; -+ guint result; -+ gboolean res; -+ gboolean ret; -+ -+ ret = FALSE; -+ -+ if (bus_proxy == NULL) { -+ goto out; -+ } -+ -+ error = NULL; -+ res = dbus_g_proxy_call (bus_proxy, -+ "RequestName", -+ &error, -+ G_TYPE_STRING, NAME_TO_CLAIM, -+ G_TYPE_UINT, 0, -+ G_TYPE_INVALID, -+ G_TYPE_UINT, &result, -+ G_TYPE_INVALID); -+ if (! res) { -+ if (error != NULL) { -+ g_warning ("Failed to acquire %s: %s", NAME_TO_CLAIM, error->message); -+ g_error_free (error); -+ } else { -+ g_warning ("Failed to acquire %s", NAME_TO_CLAIM); -+ } -+ goto out; -+ } -+ -+ if (result != DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER) { -+ if (error != NULL) { -+ g_warning ("Failed to acquire %s: %s", NAME_TO_CLAIM, error->message); -+ g_error_free (error); -+ } else { -+ g_warning ("Failed to acquire %s", NAME_TO_CLAIM); -+ } -+ goto out; -+ } -+ -+ ret = TRUE; -+ -+ out: -+ return ret; -+} -+ -+static GMainLoop *loop; -+ -+void main_quit (void); -+ -+void -+main_quit (void) -+{ -+ g_main_loop_quit (loop); -+} -+ -+int -+main (int argc, char **argv) -+{ -+ PrinterConfigDaemon *daemon; -+ GError *error; -+ DBusGProxy *bus_proxy; -+ DBusGConnection *bus; -+ int ret = 1; -+ -+ g_type_init (); -+ -+ error = NULL; -+ bus = dbus_g_bus_get (DBUS_BUS_SYSTEM, &error); -+ if (bus == NULL) { -+ g_warning ("Couldn't connect to system bus: %s", error->message); -+ g_error_free (error); -+ goto out; -+ } -+ -+ bus_proxy = dbus_g_proxy_new_for_name (bus, -+ DBUS_SERVICE_DBUS, -+ DBUS_PATH_DBUS, -+ DBUS_INTERFACE_DBUS); -+ if (bus_proxy == NULL) { -+ g_warning ("Could not construct bus_proxy object; bailing out"); -+ goto out; -+ } -+ -+ if (!acquire_name_on_proxy (bus_proxy) ) { -+ g_warning ("Could not acquire name; bailing out"); -+ goto out; -+ } -+ -+ g_debug ("Starting printer-config-daemon version %s", VERSION); -+ -+ daemon = printer_config_daemon_new (); -+ -+ if (daemon == NULL) { -+ goto out; -+ } -+ -+ loop = g_main_loop_new (NULL, FALSE); -+ -+ g_main_loop_run (loop); -+ -+ g_object_unref (daemon); -+ g_main_loop_unref (loop); -+ ret = 0; -+ -+ out: -+ return ret; -+} -diff -up system-config-printer-1.1.10/udev/udev-add-printer.525e996 system-config-printer-1.1.10/udev/udev-add-printer ---- system-config-printer-1.1.10/udev/udev-add-printer.525e996 2009-07-22 13:22:49.000000000 +0100 -+++ system-config-printer-1.1.10/udev/udev-add-printer 2009-07-26 19:01:45.703480670 +0100 -@@ -27,17 +27,28 @@ import sys - import traceback - from syslog import * - --def create_queue (c, name, device_uri, ppdname, info): -+def create_queue (c, printers, name, device_uri, ppdname, info): - # Make sure the name is unique. -- printers = cupshelpers.getPrinters (c) -- names = printers.keys () -- if name in names: -- suffix = 2 -- while (name + "-" + str (suffix)) in names: -+ namel = unicode (name.lower ()) -+ unique = False -+ suffix = 1 -+ while not unique: -+ unique = True -+ for printer in printers.values (): -+ if (not printer.discovered and -+ ((suffix == 1 and printer.name.lower () == namel) or -+ (suffix > 1 and -+ printer.name.lower () == namel + "-" + str (suffix)))): -+ unique = False -+ break -+ -+ if not unique: - suffix += 1 - if suffix == 100: - break -- name += str (suffix) -+ -+ if suffix > 1: -+ name += "-" + str (suffix) - - c.addPrinter (name, - device=device_uri, -@@ -45,14 +56,19 @@ def create_queue (c, name, device_uri, p - info=info, - location=os.uname ()[1]) - cupshelpers.activateNewPrinter (c, name) -+ return name - --def add_queue (device_id, device_uris, is_fax=False): -+def add_queue (device_id, device_uris, fax_basename=False): - """ - Create a CUPS queue. -+ -+ device_id: the IEEE 1284 Device ID of the device to add a queue for. -+ device_uris: device URIs, best first, for this device -+ fax_basename: False if this is not a fax queue, else name prefix - """ - - syslog (LOG_DEBUG, "add_queue: URIs=%s" % device_uris) -- if is_fax: -+ if fax_basename != False: - notification = None - else: - try: -@@ -83,34 +99,22 @@ def add_queue (device_id, device_uris, i - name = name.replace ("/", "-") - name = name.replace ("#", "-") - -- create_queue (c, name, device_uris[0], ppdname, -- "%s %s" % (id_dict["MFG"], id_dict["MDL"])) -+ if fax_basename != False: -+ name = fax_basename + "-" + name - -- if not is_fax: -+ printers = cupshelpers.getPrinters (c) -+ uniquename = create_queue (c, printers, name, device_uris[0], ppdname, -+ "%s %s" % (id_dict["MFG"], id_dict["MDL"])) -+ -+ if fax_basename == False: - # Look for a corresponding fax queue. We can only - # identify these by looking for device URIs that are the - # same as this one but with a different scheme. If we - # find one whose scheme ends in "fax", use that as a fax - # queue. Note that the HPLIP backends do follow this - # pattern (hp and hpfax). -- not_fax_schemes=["beh", -- "bluetooth", -- "http", -- "https", -- "ipp", -- "lpd", -- "parallel", -- "serial", -- "smb", -- "snmp", -- "socket", -- "scsi", -- "usb"] -- devices = c.getDevices (exclude_schemes=not_fax_schemes) -- for uri, device_dict in devices.iteritems (): -- if uri in device_uris: -- continue -- -+ used_uris = map (lambda x: x.device_uri, printers.values ()) -+ for uri in device_uris[1:]: - if uri.find (":") == -1: - continue - -@@ -119,17 +123,34 @@ def add_queue (device_id, device_uris, i - # Now see if the non-scheme parts of the URI match - # any of the URIs we were given. - for each_uri in device_uris: -+ if each_uri == uri: -+ continue - (s, device_uri_rest) = each_uri.split (":", 1) - if rest == device_uri_rest: -+ # This one matches. Check there is not -+ # already a queue using this URI. -+ if uri in used_uris: -+ break -+ -+ try: -+ devices = c.getDevices(include_schemes=[scheme]) -+ except TypeError: -+ # include_schemes requires pycups 1.9.46 -+ devices = c.getDevices () -+ -+ device_dict = devices.get (uri) -+ if device_dict == None: -+ break -+ - add_queue (device_dict.get ("device-id", ""), -- [uri], is_fax=True) -+ [uri], fax_basename=uniquename) - else: - # Not an exact match. -- name = device_uris[0] -+ uniquename = device_uris[0] - - if notification: - try: -- notification.NewPrinter (status, name, id_dict["MFG"], -+ notification.NewPrinter (status, uniquename, id_dict["MFG"], - id_dict["MDL"], id_dict["DES"], - reduce(lambda x, y: x + ',' + y, - id_dict["CMD"])) -diff -up system-config-printer-1.1.10/udev/udev-configure-printer.c.525e996 system-config-printer-1.1.10/udev/udev-configure-printer.c -diff -up /dev/null system-config-printer-1.1.10/udev/udev-usb-printer.c ---- /dev/null 2009-07-26 12:31:15.305032486 +0100 -+++ system-config-printer-1.1.10/udev/udev-usb-printer.c 2009-07-26 19:01:45.711481093 +0100 -@@ -0,0 +1,454 @@ -+/* -*- Mode: C; c-file-style: "gnu" -*- -+ * udev-usb-printer - a udev callout to configure print queues -+ * Copyright (C) 2009 Red Hat, Inc. -+ * Author: Tim Waugh -+ * -+ * 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 -+ * -+ */ -+ -+/* -+ * The protocol for this program is: -+ * -+ * udev-usb-printer add {DEVPATH} -+ * udev-usb-printer remove {DEVPATH} -+ * -+ * where DEVPATH is the path (%p) of the device -+ */ -+ -+#define LIBUDEV_I_KNOW_THE_API_IS_SUBJECT_TO_CHANGE 1 -+ -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+ -+#include "printer-config-client-bindings.h" -+ -+struct device_id -+{ -+ char *full_device_id; -+ char *mfg; -+ char *mdl; -+ char *sern; -+}; -+ -+static void -+free_device_id (struct device_id *id) -+{ -+ free (id->full_device_id); -+ free (id->mfg); -+ free (id->mdl); -+ free (id->sern); -+} -+ -+static void -+parse_device_id (const char *device_id, -+ struct device_id *id) -+{ -+ char *fieldname; -+ char *start, *end; -+ size_t len; -+ -+ len = strlen (device_id); -+ if (len == 0) -+ return; -+ -+ if (device_id[len - 1] == '\n') -+ len--; -+ -+ id->full_device_id = malloc (len + 1); -+ fieldname = malloc (len + 1); -+ if (!id->full_device_id || !fieldname) -+ { -+ syslog (LOG_ERR, "out of memory"); -+ exit (1); -+ } -+ -+ memcpy (id->full_device_id, device_id, len); -+ id->full_device_id[len] = '\0'; -+ fieldname[0] = '\0'; -+ start = id->full_device_id; -+ while (*start != '\0') -+ { -+ /* New field. */ -+ -+ end = start; -+ while (*end != '\0' && *end != ':') -+ end++; -+ -+ if (*end == '\0') -+ break; -+ -+ len = end - start; -+ memcpy (fieldname, start, len); -+ fieldname[len] = '\0'; -+ -+ start = end + 1; -+ while (*end != '\0' && *end != ';') -+ end++; -+ -+ len = end - start; -+ -+ if (!id->mfg && -+ (!strncasecmp (fieldname, "MANUFACTURER", 12) || -+ !strncasecmp (fieldname, "MFG", 3))) -+ id->mfg = strndup (start, len); -+ else if (!id->mdl && -+ (!strncasecmp (fieldname, "MODEL", 5) || -+ !strncasecmp (fieldname, "MDL", 3))) -+ id->mdl = strndup (start, len); -+ else if (!id->sern && -+ (!strncasecmp (fieldname, "SERIALNUMBER", 12) || -+ !strncasecmp (fieldname, "SERN", 4) || -+ !strncasecmp (fieldname, "SN", 2))) -+ id->sern = strndup (start, len); -+ -+ if (*end != '\0') -+ start = end + 1; -+ } -+ -+ free (fieldname); -+} -+ -+static char * -+syspath_from_devpath (struct udev *udev, const char *devpath) -+{ -+ const char *sys; -+ char *syspath; -+ size_t syslen, devpathlen = strlen (devpath); -+ sys = udev_get_sys_path (udev); -+ syslen = strlen (sys); -+ syspath = malloc (syslen + devpathlen + 1); -+ if (syspath == NULL) -+ return NULL; -+ -+ memcpy (syspath, sys, syslen); -+ memcpy (syspath + syslen, devpath, devpathlen); -+ syspath[syslen + devpathlen] = '\0'; -+ return syspath; -+} -+ -+static char * -+device_id_from_devpath (const char *devpath, -+ struct device_id *id, -+ char *usbserial, size_t usbseriallen) -+{ -+ struct udev *udev; -+ struct udev_device *dev, *parent_dev = NULL; -+ const char *idVendorStr, *idProductStr, *serial; -+ char *end; -+ unsigned long idVendor, idProduct; -+ struct usb_bus *bus; -+ struct usb_dev_handle *handle = NULL; -+ char ieee1284_id[1024]; -+ const char *device_id = NULL; -+ char *syspath; -+ int conf = 0, iface = 0; -+ int got = 0; -+ char *usb_device_devpath; -+ -+ id->full_device_id = id->mfg = id->mdl = id->sern = NULL; -+ -+ udev = udev_new (); -+ if (udev == NULL) -+ { -+ syslog (LOG_ERR, "udev_new failed"); -+ exit (1); -+ } -+ -+ syspath = syspath_from_devpath (udev, devpath); -+ if (syspath == NULL) -+ { -+ udev_unref (udev); -+ exit (1); -+ } -+ -+ dev = udev_device_new_from_syspath (udev, syspath); -+ if (dev == NULL) -+ { -+ udev_device_unref (dev); -+ udev_unref (udev); -+ syslog (LOG_ERR, "unable to access %s", syspath); -+ free (syspath); -+ exit (1); -+ } -+ -+ free (syspath); -+ parent_dev = udev_device_get_parent_with_subsystem_devtype (dev, -+ "usb", -+ "usb_device"); -+ if (!parent_dev) -+ { -+ udev_unref (udev); -+ syslog (LOG_ERR, "Failed to get parent"); -+ exit (1); -+ } -+ -+ usb_device_devpath = strdup (udev_device_get_devpath (parent_dev)); -+ syslog (LOG_DEBUG, "parent devpath is %s", usb_device_devpath); -+ -+ serial = udev_device_get_sysattr_value (parent_dev, "serial"); -+ if (serial) -+ { -+ strncpy (usbserial, serial, usbseriallen); -+ usbserial[usbseriallen - 1] = '\0'; -+ } -+ else -+ usbserial[0] = '\0'; -+ -+ /* See if we were triggered by a usblp add event. */ -+ device_id = udev_device_get_sysattr_value (dev, "device/ieee1284_id"); -+ if (device_id) -+ { -+ got = 1; -+ goto got_deviceid; -+ } -+ -+ /* This is a low-level USB device. Use libusb to fetch the Device ID. */ -+ idVendorStr = udev_device_get_sysattr_value (parent_dev, "idVendor"); -+ idProductStr = udev_device_get_sysattr_value (parent_dev, "idProduct"); -+ -+ if (!idVendorStr || !idProductStr) -+ { -+ udev_device_unref (dev); -+ udev_unref (udev); -+ syslog (LOG_ERR, "Missing sysattr %s", -+ idVendorStr ? -+ (idProductStr ? "serial" : "idProduct") : "idVendor"); -+ exit (1); -+ } -+ -+ idVendor = strtoul (idVendorStr, &end, 16); -+ if (end == idVendorStr) -+ { -+ syslog (LOG_ERR, "Invalid idVendor: %s", idVendorStr); -+ exit (1); -+ } -+ -+ idProduct = strtoul (idProductStr, &end, 16); -+ if (end == idProductStr) -+ { -+ syslog (LOG_ERR, "Invalid idProduct: %s", idProductStr); -+ exit (1); -+ } -+ -+ syslog (LOG_DEBUG, "Device vendor/product is %04zX:%04zX", -+ idVendor, idProduct); -+ -+ usb_init (); -+ usb_find_busses (); -+ usb_find_devices (); -+ for (bus = usb_get_busses (); bus && !got; bus = bus->next) -+ { -+ struct usb_device *device; -+ for (device = bus->devices; device && !got; device = device->next) -+ { -+ struct usb_config_descriptor *confptr; -+ if (device->descriptor.idVendor != idVendor || -+ device->descriptor.idProduct != idProduct || -+ !device->config) -+ continue; -+ -+ conf = 0; -+ for (confptr = device->config; -+ conf < device->descriptor.bNumConfigurations && !got; -+ conf++, confptr++) -+ { -+ struct usb_interface *ifaceptr; -+ iface = 0; -+ for (ifaceptr = confptr->interface; -+ iface < confptr->bNumInterfaces && !got; -+ iface++, ifaceptr++) -+ { -+ struct usb_interface_descriptor *altptr; -+ int altset = 0; -+ for (altptr = ifaceptr->altsetting; -+ altset < ifaceptr->num_altsetting && !got; -+ altset++, altptr++) -+ { -+ if (altptr->bInterfaceClass == USB_CLASS_PRINTER && -+ altptr->bInterfaceSubClass == 1) -+ { -+ int n; -+ handle = usb_open (device); -+ if (!handle) -+ { -+ syslog (LOG_DEBUG, "failed to open device"); -+ continue; -+ } -+ -+ n = altptr->bInterfaceNumber; -+ if (usb_claim_interface (handle, n) < 0) -+ { -+ usb_close (handle); -+ handle = NULL; -+ syslog (LOG_DEBUG, "failed to claim interface"); -+ continue; -+ } -+ -+ if (n != 0 && usb_claim_interface (handle, 0) < 0) -+ { -+ usb_close (handle); -+ handle = NULL; -+ syslog (LOG_DEBUG, "failed to claim interface 0"); -+ continue; -+ } -+ -+ n = altptr->bAlternateSetting; -+ if (usb_set_altinterface (handle, n) < 0) -+ { -+ usb_close (handle); -+ handle = NULL; -+ syslog (LOG_DEBUG, "failed set altinterface"); -+ continue; -+ } -+ -+ memset (ieee1284_id, '\0', sizeof (ieee1284_id)); -+ if (usb_control_msg (handle, -+ USB_TYPE_CLASS | -+ USB_ENDPOINT_IN | -+ USB_RECIP_INTERFACE, -+ 0, conf, iface, -+ ieee1284_id, -+ sizeof (ieee1284_id), -+ 5000) < 0) -+ { -+ usb_close (handle); -+ handle = NULL; -+ syslog (LOG_ERR, "Failed to fetch Device ID"); -+ continue; -+ } -+ -+ got = 1; -+ usb_close (handle); -+ break; -+ } -+ } -+ } -+ } -+ } -+ } -+ -+ got_deviceid: -+ if (got) -+ { -+ if (!device_id) -+ device_id = ieee1284_id + 2; -+ parse_device_id (device_id, id); -+ } -+ -+ udev_device_unref (dev); -+ udev_unref (udev); -+ return usb_device_devpath; -+} -+ -+static int -+do_add (DBusGProxy *proxy, const char *devpath) -+{ -+ GError *error = NULL; -+ struct device_id id; -+ char *usb_device_devpath; -+ char usbserial[256]; -+ -+ syslog (LOG_DEBUG, "add %s", devpath); -+ -+ usb_device_devpath = device_id_from_devpath (devpath, &id, -+ usbserial, sizeof (usbserial)); -+ -+ if (!id.mfg || !id.mdl) -+ { -+ syslog (LOG_ERR, "invalid or missing IEEE 1284 Device ID%s%s", -+ id.full_device_id ? " " : "", -+ id.full_device_id ? id.full_device_id : ""); -+ exit (1); -+ } -+ -+ syslog (LOG_DEBUG, "MFG:%s MDL:%s SERN:%s serial:%s", id.mfg, id.mdl, -+ id.sern ? id.sern : "-", usbserial); -+ -+ com_redhat_PrinterConfig_usb_printer_add (proxy, -+ usb_device_devpath, -+ id.full_device_id, -+ &error); -+ free (usb_device_devpath); -+ free_device_id (&id); -+ return 0; -+} -+ -+static int -+do_remove (DBusGProxy *proxy, const char *devpath) -+{ -+ GError *error = NULL; -+ syslog (LOG_DEBUG, "remove %s", devpath); -+ -+ com_redhat_PrinterConfig_usb_printer_remove (proxy, -+ devpath, -+ &error); -+ return 0; -+} -+ -+int -+main (int argc, char **argv) -+{ -+ DBusGConnection *connection; -+ DBusGProxy *proxy; -+ GError *error = NULL; -+ int add; -+ -+ g_type_init (); -+ -+ if (argc != 3 || -+ !((add = !strcmp (argv[1], "add")) || -+ !strcmp (argv[1], "remove"))) -+ { -+ fprintf (stderr, -+ "Syntax: %s add {USB device path}\n" -+ " %s remove {USB device path}\n", -+ argv[0], argv[0]); -+ return 1; -+ } -+ -+ openlog ("udev-usb-printer", 0, LOG_LPR); -+ -+ connection = dbus_g_bus_get (DBUS_BUS_SYSTEM, &error); -+ if (connection == NULL) -+ { -+ syslog (LOG_ERR, "unable to connect to D-Bus: %s", error->message); -+ g_error_free (error); -+ exit (1); -+ } -+ -+ proxy = dbus_g_proxy_new_for_name (connection, -+ "com.redhat.PrinterConfig", -+ "/com/redhat/PrinterConfig", -+ "com.redhat.PrinterConfig"); -+ -+ if (add) -+ do_add (proxy, argv[2]); -+ else -+ do_remove (proxy, argv[2]); -+ -+ g_object_unref (proxy); -+ return 0; -+} diff --git a/system-config-printer-a6cf4d3.patch b/system-config-printer-a6cf4d3.patch new file mode 100644 index 0000000..cfb0395 --- /dev/null +++ b/system-config-printer-a6cf4d3.patch @@ -0,0 +1,6538 @@ +diff -up system-config-printer-1.1.10/aclocal.m4.a6cf4d3 system-config-printer-1.1.10/aclocal.m4 +--- system-config-printer-1.1.10/aclocal.m4.a6cf4d3 2009-07-22 13:54:02.000000000 +0100 ++++ system-config-printer-1.1.10/aclocal.m4 2009-07-31 15:09:03.192962439 +0100 +@@ -1867,6 +1867,162 @@ AC_DEFUN([AM_NLS], + AC_SUBST(USE_NLS) + ]) + ++# pkg.m4 - Macros to locate and utilise pkg-config. -*- Autoconf -*- ++# ++# Copyright © 2004 Scott James Remnant . ++# ++# 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. ++# ++# As a special exception to the GNU General Public License, if you ++# distribute this file as part of a program that contains a ++# configuration script generated by Autoconf, you may include it under ++# the same distribution terms that you use for the rest of that program. ++ ++# PKG_PROG_PKG_CONFIG([MIN-VERSION]) ++# ---------------------------------- ++AC_DEFUN([PKG_PROG_PKG_CONFIG], ++[m4_pattern_forbid([^_?PKG_[A-Z_]+$]) ++m4_pattern_allow([^PKG_CONFIG(_PATH)?$]) ++AC_ARG_VAR([PKG_CONFIG], [path to pkg-config utility])dnl ++if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then ++ AC_PATH_TOOL([PKG_CONFIG], [pkg-config]) ++fi ++if test -n "$PKG_CONFIG"; then ++ _pkg_min_version=m4_default([$1], [0.9.0]) ++ AC_MSG_CHECKING([pkg-config is at least version $_pkg_min_version]) ++ if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then ++ AC_MSG_RESULT([yes]) ++ else ++ AC_MSG_RESULT([no]) ++ PKG_CONFIG="" ++ fi ++ ++fi[]dnl ++])# PKG_PROG_PKG_CONFIG ++ ++# PKG_CHECK_EXISTS(MODULES, [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND]) ++# ++# Check to see whether a particular set of modules exists. Similar ++# to PKG_CHECK_MODULES(), but does not set variables or print errors. ++# ++# ++# Similar to PKG_CHECK_MODULES, make sure that the first instance of ++# this or PKG_CHECK_MODULES is called, or make sure to call ++# PKG_CHECK_EXISTS manually ++# -------------------------------------------------------------- ++AC_DEFUN([PKG_CHECK_EXISTS], ++[AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl ++if test -n "$PKG_CONFIG" && \ ++ AC_RUN_LOG([$PKG_CONFIG --exists --print-errors "$1"]); then ++ m4_ifval([$2], [$2], [:]) ++m4_ifvaln([$3], [else ++ $3])dnl ++fi]) ++ ++ ++# _PKG_CONFIG([VARIABLE], [COMMAND], [MODULES]) ++# --------------------------------------------- ++m4_define([_PKG_CONFIG], ++[if test -n "$$1"; then ++ pkg_cv_[]$1="$$1" ++ elif test -n "$PKG_CONFIG"; then ++ PKG_CHECK_EXISTS([$3], ++ [pkg_cv_[]$1=`$PKG_CONFIG --[]$2 "$3" 2>/dev/null`], ++ [pkg_failed=yes]) ++ else ++ pkg_failed=untried ++fi[]dnl ++])# _PKG_CONFIG ++ ++# _PKG_SHORT_ERRORS_SUPPORTED ++# ----------------------------- ++AC_DEFUN([_PKG_SHORT_ERRORS_SUPPORTED], ++[AC_REQUIRE([PKG_PROG_PKG_CONFIG]) ++if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then ++ _pkg_short_errors_supported=yes ++else ++ _pkg_short_errors_supported=no ++fi[]dnl ++])# _PKG_SHORT_ERRORS_SUPPORTED ++ ++ ++# PKG_CHECK_MODULES(VARIABLE-PREFIX, MODULES, [ACTION-IF-FOUND], ++# [ACTION-IF-NOT-FOUND]) ++# ++# ++# Note that if there is a possibility the first call to ++# PKG_CHECK_MODULES might not happen, you should be sure to include an ++# explicit call to PKG_PROG_PKG_CONFIG in your configure.ac ++# ++# ++# -------------------------------------------------------------- ++AC_DEFUN([PKG_CHECK_MODULES], ++[AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl ++AC_ARG_VAR([$1][_CFLAGS], [C compiler flags for $1, overriding pkg-config])dnl ++AC_ARG_VAR([$1][_LIBS], [linker flags for $1, overriding pkg-config])dnl ++ ++pkg_failed=no ++AC_MSG_CHECKING([for $1]) ++ ++_PKG_CONFIG([$1][_CFLAGS], [cflags], [$2]) ++_PKG_CONFIG([$1][_LIBS], [libs], [$2]) ++ ++m4_define([_PKG_TEXT], [Alternatively, you may set the environment variables $1[]_CFLAGS ++and $1[]_LIBS to avoid the need to call pkg-config. ++See the pkg-config man page for more details.]) ++ ++if test $pkg_failed = yes; then ++ _PKG_SHORT_ERRORS_SUPPORTED ++ if test $_pkg_short_errors_supported = yes; then ++ $1[]_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors "$2" 2>&1` ++ else ++ $1[]_PKG_ERRORS=`$PKG_CONFIG --print-errors "$2" 2>&1` ++ fi ++ # Put the nasty error message in config.log where it belongs ++ echo "$$1[]_PKG_ERRORS" >&AS_MESSAGE_LOG_FD ++ ++ ifelse([$4], , [AC_MSG_ERROR(dnl ++[Package requirements ($2) were not met: ++ ++$$1_PKG_ERRORS ++ ++Consider adjusting the PKG_CONFIG_PATH environment variable if you ++installed software in a non-standard prefix. ++ ++_PKG_TEXT ++])], ++ [AC_MSG_RESULT([no]) ++ $4]) ++elif test $pkg_failed = untried; then ++ ifelse([$4], , [AC_MSG_FAILURE(dnl ++[The pkg-config script could not be found or is too old. Make sure it ++is in your PATH or set the PKG_CONFIG environment variable to the full ++path to pkg-config. ++ ++_PKG_TEXT ++ ++To get pkg-config, see .])], ++ [$4]) ++else ++ $1[]_CFLAGS=$pkg_cv_[]$1[]_CFLAGS ++ $1[]_LIBS=$pkg_cv_[]$1[]_LIBS ++ AC_MSG_RESULT([yes]) ++ ifelse([$3], , :, [$3]) ++fi[]dnl ++])# PKG_CHECK_MODULES ++ + # po.m4 serial 15 (gettext-0.17) + dnl Copyright (C) 1995-2007 Free Software Foundation, Inc. + dnl This file is free software; the Free Software Foundation +diff -up system-config-printer-1.1.10/configure.in.a6cf4d3 system-config-printer-1.1.10/configure.in +--- system-config-printer-1.1.10/configure.in.a6cf4d3 2009-07-22 13:53:25.000000000 +0100 ++++ system-config-printer-1.1.10/configure.in 2009-07-31 15:09:03.194961651 +0100 +@@ -40,6 +40,9 @@ AC_ARG_WITH(udev-rules, + AM_CONDITIONAL([UDEV_RULES], [test x$with_udev_rules != xno]) + + if test x$with_udev_rules != xno; then ++ PKG_CHECK_MODULES(DBUS_GLIB, [dbus-glib-1 >= 0.76]) ++ AC_SUBST(DBUS_GLIB_CFLAGS) ++ AC_SUBST(DBUS_GLIB_LIBS) + AM_PROG_CC_C_O + fi + +diff -up system-config-printer-1.1.10/cupshelpers/ppds.py.a6cf4d3 system-config-printer-1.1.10/cupshelpers/ppds.py +--- system-config-printer-1.1.10/cupshelpers/ppds.py.a6cf4d3 2009-07-22 13:22:49.000000000 +0100 ++++ system-config-printer-1.1.10/cupshelpers/ppds.py 2009-07-31 15:09:03.198961636 +0100 +@@ -113,7 +113,7 @@ def ppdMakeModelSplit (ppd_make_and_mode + model = ppd_make_and_model + + # Handle PPDs provided by Turboprint +- elif l.startswith ("turboprint"): ++ elif l.find ("turboprint") != -1: + t = ppd_make_and_model.find (" TurboPrint") + if t != -1: + ppd_make_and_model = ppd_make_and_model[:t] +@@ -159,29 +159,32 @@ def ppdMakeModelSplit (ppd_make_and_mode + # HP PPDs give NickNames like: + # *NickName: "HP LaserJet 4 Plus v2013.111 Postscript (recommended)" + # Find the version number. +- v = model.find (" v") ++ modell = model.lower () ++ v = modell.find (" v") + if v != -1 and (model[v + 2].isdigit () or + (model[v + 2] == '.' and + model[v + 3].isdigit ())): + # Truncate at that point. + model = model[:v] ++ modell = modell[:v] + + for suffix in [" hpijs", +- " Foomatic/", ++ " foomatic/", + " - ", + " w/", + " (", +- " PostScript", +- " PS", +- " PS1", +- " PS2", +- " PS3", +- " PXL", +- " series" ++ " postscript", ++ " ps", ++ " ps1", ++ " ps2", ++ " ps3", ++ " pxl", ++ " series", + ","]: +- s = model.find (suffix) ++ s = modell.find (suffix) + if s != -1: + model = model[:s] ++ modell = modell[:s] + + if makel == "hp": + modelnames = {"dj": "DeskJet", +@@ -190,10 +193,10 @@ def ppdMakeModelSplit (ppd_make_and_mode + "color lj": "Color LaserJet", + "ps ": "PhotoSmart", + "hp ": ""} +- modell = model.lower () + for (name, fullname) in modelnames.iteritems (): + if modell.startswith (name): + model = fullname + model[len (name):] ++ modell = model.lower () + + for mfr in [ "Apple", "Canon", "Epson", "Lexmark", "Oki" ]: + if makel == mfr.lower (): +diff -up system-config-printer-1.1.10/cupspk.py.a6cf4d3 system-config-printer-1.1.10/cupspk.py +--- system-config-printer-1.1.10/cupspk.py.a6cf4d3 2009-07-21 15:10:03.000000000 +0100 ++++ system-config-printer-1.1.10/cupspk.py 2009-07-31 15:09:03.202962569 +0100 +@@ -719,8 +719,8 @@ class Connection: + settings = {} + if result != None: + for i in result.keys(): +- if type(i) == 'dbus.String': +- settings[i.encode()] = result[i].encode() ++ if type(i) == dbus.String: ++ settings[str(i)] = str(result[i]) + else: + settings[i] = result[i] + +diff -up system-config-printer-1.1.10/jobviewer.py.a6cf4d3 system-config-printer-1.1.10/jobviewer.py +--- system-config-printer-1.1.10/jobviewer.py.a6cf4d3 2009-07-21 15:10:03.000000000 +0100 ++++ system-config-printer-1.1.10/jobviewer.py 2009-07-31 15:09:03.206962505 +0100 +@@ -1351,8 +1351,8 @@ class JobViewer (GtkGUI, monitor.Watcher + elif jobid in self.active_jobs: + self.active_jobs.remove (jobid) + +- self.update_status () + self.update_job (jobid, jobdata) ++ self.update_status () + jobdata = self.jobs[jobid] + + # If the job has finished, let the user know. +@@ -1376,7 +1376,8 @@ class JobViewer (GtkGUI, monitor.Watcher + if (self.trayicon and + (eventname == 'job-stopped' or + (eventname == 'job-state-changed' and +- event['job-state'] == cups.IPP_JOB_STOPPED))and ++ event['job-state'] in [cups.IPP_JOB_STOPPED, ++ cups.IPP_JOB_PENDING])) and + not jobid in self.stopped_job_prompts): + # Why has the job stopped? It might be due to a job error + # of some sort, or it might be that the backend requires +@@ -1386,7 +1387,7 @@ class JobViewer (GtkGUI, monitor.Watcher + # update_job. + may_be_problem = True + jstate = jobdata['job-state'] +- if (jstate in [cups.IPP_JOB_PENDING, cups.IPP_JOB_PROCESSING] or ++ if (jstate == cups.IPP_JOB_PROCESSING or + (jstate == cups.IPP_JOB_HELD and + jobdata['job-hold-until'] == 'auth-info-required')): + # update_job already dealt with this. +@@ -1421,7 +1422,8 @@ class JobViewer (GtkGUI, monitor.Watcher + elif notify_text.find ("filter errors") != -1: + message = _("There was a problem processing document `%s' " + "(job %d).") % (document, jobid) +- elif notify_text.find ("being paused") != -1: ++ elif (notify_text.find ("being paused") != -1 or ++ jstate != cups.IPP_JOB_STOPPED): + may_be_problem = False + else: + # Give up and use the provided message untranslated. +diff -up system-config-printer-1.1.10/Makefile.am.a6cf4d3 system-config-printer-1.1.10/Makefile.am +--- system-config-printer-1.1.10/Makefile.am.a6cf4d3 2009-07-22 15:11:41.000000000 +0100 ++++ system-config-printer-1.1.10/Makefile.am 2009-07-31 15:09:03.189962811 +0100 +@@ -25,10 +25,11 @@ EXPORT_MODULES= \ + dist-hook: mk-ChangeLog + .PHONE: mk-ChangeLog + mk-ChangeLog: +- if test -d .git; then \ +- $(top_srcdir)/gitlog-to-changelog --since=2009-05-01 \ +- > $(distdir)/cl ;\ +- mv -f $(distdir)/cl $(distdir)/ChangeLog ;\ ++ if test -d .git; then \ ++ $(top_srcdir)/gitlog-to-changelog \ ++ --since=2009-05-01 -- --no-merges \ ++ > $(distdir)/cl ; \ ++ mv -f $(distdir)/cl $(distdir)/ChangeLog ; \ + fi + + config.py: config.py.in Makefile +@@ -152,14 +153,65 @@ bin_SCRIPTS=\ + if UDEV_RULES + udevrulesdir=$(sysconfdir)/udev/rules.d + udevrules_DATA=udev/70-printers.rules +-udev_udev_configure_printer_SOURCES=\ +- udev/udev-configure-printer.c +-udev_udev_configure_printer_LDADD=-lcups -ludev -lusb ++ ++udev_printer_config_daemon_SOURCES= \ ++ udev/printer-config-daemon.c \ ++ udev/printer-config-main.c \ ++ udev/printer-config.h ++udev_printer_config_daemon_DEPENDENCIES= \ ++ udev/printer-config-server-bindings.h ++udev_printer_config_daemon_CPPFLAGS= \ ++ $(DBUS_GLIB_CFLAGS) ++udev_printer_config_daemon_LDADD= \ ++ $(DBUS_GLIB_LIBS) \ ++ -lcups -ludev -lusb ++ ++udev_udev_usb_printer_SOURCES= \ ++ udev/udev-usb-printer.c ++udev_udev_usb_printer_DEPENDENCIES= \ ++ udev/printer-config-client-bindings.h ++udev_udev_usb_printer_CPPFLAGS= \ ++ $(DBUS_GLIB_CFLAGS) ++udev_udev_usb_printer_LDADD= \ ++ $(DBUS_GLIB_LIBS) \ ++ -ludev -lusb + udevhelperdir=/lib/udev + udevhelper_PROGRAMS=\ +- udev/udev-configure-printer +-udevhelper_SCRIPTS=\ ++ udev/udev-usb-printer ++ ++udev/printer-config-server-bindings.h: udev/com.redhat.PrinterConfig.xml \ ++ Makefile ++ dbus-binding-tool --prefix=printer_config_daemon \ ++ --mode=glib-server \ ++ --output=$@ $< ++ ++udev/printer-config-client-bindings.h: udev/com.redhat.PrinterConfig.xml \ ++ Makefile ++ dbus-binding-tool --prefix=printer_config_daemon \ ++ --mode=glib-client \ ++ --output=$@ $< ++ ++BUILT_SOURCES= \ ++ udev/printer-config-server-bindings.h \ ++ udev/printer-config-client-bindings.h ++ ++libexec_PROGRAMS=\ ++ udev/printer-config-daemon ++libexec_SCRIPTS=\ + udev/udev-add-printer ++ ++dbusifdir = $(datadir)/dbus-1/interfaces ++dbusif_DATA = udev/com.redhat.PrinterConfig.xml ++ ++servicedir = $(datadir)/dbus-1/system-services ++service_in_files = udev/com.redhat.PrinterConfig.service.in ++service_DATA = $(service_in_files:.service.in=.service) ++ ++$(service_DATA): $(service_in_files) Makefile ++ @sed -e "s,\@libexecdir\@,$(libexecdir)," $< > $@ ++ ++dbusconfdir = $(sysconfdir)/dbus-1/system.d ++dbusconf_DATA = udev/com.redhat.PrinterConfig.conf + endif + + man_MANS= \ +@@ -238,7 +290,10 @@ EXTRA_DIST=\ + intltool-merge.in \ + intltool-update.in \ + config.py.in \ +- udev/70-printers.rules ++ udev/70-printers.rules \ ++ udev/com.redhat.PrinterConfig.xml \ ++ udev/com.redhat.PrinterConfig.service.in \ ++ udev/com.redhat.PrinterConfig.conf + + desktop_in_files = $(desktop_DATA:.desktop=.desktop.in) + +@@ -293,12 +348,17 @@ test-ppd-module.sh: + + TESTS = test-ppd-module.sh + ++CLEANFILES = \ ++ $(BUILT_SOURCES) \ ++ udev/*.o ++ + DISTCLEANFILES=*.pyc *.pyo *~ *.bak \ + troubleshoot/*.pyc troubleshoot/*.pyo troubleshoot/*~ \ + intltool-extract intltool-merge intltool-update \ + *.desktop man/*.1 \ + test-ppd-module.sh pickled-ppds \ +- config.py ++ config.py \ ++ $(service_DATA) + + distclean-local: + rm -rf html +diff -up system-config-printer-1.1.10/PhysicalDevice.py.a6cf4d3 system-config-printer-1.1.10/PhysicalDevice.py +--- system-config-printer-1.1.10/PhysicalDevice.py.a6cf4d3 2009-07-21 15:10:03.000000000 +0100 ++++ system-config-printer-1.1.10/PhysicalDevice.py 2009-07-31 15:09:03.189962811 +0100 +@@ -41,10 +41,12 @@ class PhysicalDevice: + + def _get_host_from_uri (self, uri): + (scheme, rest) = urllib.splittype (uri) +- if scheme == 'hp': ++ if scheme == 'hp' or scheme == 'hpfax': + if rest.startswith ("/net/"): +- (hostport, rest) = urllib.splithost (rest[5:]) +- if hostport == None: ++ (rest, ipparam) = urllib.splitquery (rest[5:]) ++ if ipparam != None and ipparam.startswith("ip="): ++ hostport = ipparam[3:] ++ else: + return None + else: + (hostport, rest) = urllib.splithost (rest) +diff -up system-config-printer-1.1.10/po/el.po.a6cf4d3 system-config-printer-1.1.10/po/el.po +--- system-config-printer-1.1.10/po/el.po.a6cf4d3 2009-07-22 13:25:20.000000000 +0100 ++++ system-config-printer-1.1.10/po/el.po 2009-07-31 15:09:03.236086751 +0100 +@@ -14,7 +14,7 @@ msgstr "" + "Project-Id-Version: el\n" + "Report-Msgid-Bugs-To: https://bugzilla.redhat.com/bugzilla\n" + "POT-Creation-Date: 2009-07-22 13:20+0100\n" +-"PO-Revision-Date: 2009-05-13 01:34+0200\n" ++"PO-Revision-Date: 2009-07-27 00:15+0200\n" + "Last-Translator: nikosCharonitakis \n" + "Language-Team: Greek \n" + "MIME-Version: 1.0\n" +@@ -51,9 +51,7 @@ msgid "Browse Servers" + msgstr "Μετάβαση στον εξυπηρετητή" + + #: ../AdvancedServerSettings.py:93 +-msgid "" +-"Usually print servers broadcast their queues. Specify print servers below " +-"to periodically ask for queues instead." ++msgid "Usually print servers broadcast their queues. Specify print servers below to periodically ask for queues instead." + msgstr "" + + #: ../AdvancedServerSettings.py:214 +@@ -61,11 +59,13 @@ msgstr "" + msgid "Enter IP address" + msgstr "Ο εκτυπωτής προστέθηκε" + +-#: ../authconn.py:35 ../glade/NewPrinterWindow.glade.h:106 ++#: ../authconn.py:35 ++#: ../glade/NewPrinterWindow.glade.h:106 + msgid "Username:" + msgstr "Όνομα χρήστη:" + +-#: ../authconn.py:36 ../glade/NewPrinterWindow.glade.h:75 ++#: ../authconn.py:36 ++#: ../glade/NewPrinterWindow.glade.h:75 + msgid "Password:" + msgstr "Συνθηματικό:" + +@@ -73,7 +73,8 @@ msgstr "Συνθηματικό:" + msgid "Domain:" + msgstr "Τομέας:" + +-#: ../authconn.py:46 ../authconn.py:412 ++#: ../authconn.py:46 ++#: ../authconn.py:412 + msgid "Authentication" + msgstr "Πιστοποίηση" + +@@ -90,7 +91,8 @@ msgstr "" + msgid "You are not authorized to carry out the requested action." + msgstr "Δεν είστε εξουσιοδοτημένος/η να διεκπαιρώσετε αυτήν την εργασία." + +-#: ../authconn.py:213 ../authconn.py:234 ++#: ../authconn.py:213 ++#: ../authconn.py:234 + msgid "Operation canceled" + msgstr "Διαδικασία ακυρώθηκε" + +@@ -99,11 +101,14 @@ msgstr "Διαδικασία ακυρώ + msgid "CUPS server error (%s)" + msgstr "σφάλμα εξυπηρετητή CUPS (%s)" + +-#: ../authconn.py:253 ../errordialogs.py:56 ../errordialogs.py:70 ++#: ../authconn.py:253 ++#: ../errordialogs.py:56 ++#: ../errordialogs.py:70 + msgid "CUPS server error" + msgstr "σφάλμα εξυπηρετητή CUPS" + +-#: ../authconn.py:262 ../errordialogs.py:57 ++#: ../authconn.py:262 ++#: ../errordialogs.py:57 + #: ../troubleshoot/PrintTestPage.py:417 + #, python-format + msgid "There was an error during the CUPS operation: '%s'." +@@ -113,12 +118,16 @@ msgstr "Διαπιστώθηκε σφά + msgid "Retry" + msgstr "Νέα προσπάθεια" + +-#: ../authconn.py:386 ../authconn.py:388 ../errordialogs.py:65 ../pysmb.py:75 ++#: ../authconn.py:386 ++#: ../authconn.py:388 ++#: ../errordialogs.py:65 ++#: ../pysmb.py:75 + #: ../pysmb.py:77 + msgid "Not authorized" + msgstr "Χωρίς εξουσιοδότηση" + +-#: ../authconn.py:389 ../pysmb.py:78 ++#: ../authconn.py:389 ++#: ../pysmb.py:78 + msgid "The password may be incorrect." + msgstr "Το συνθηματικό μπορεί να μην είναι σωστό." + +@@ -128,12 +137,8 @@ msgid "Authentication (%s)" + msgstr "Πιστοποίηση (%s)" + + #: ../errordialogs.py:66 +-msgid "" +-"The password may be incorrect, or the server may be configured to deny " +-"remote administration." +-msgstr "" +-"Το συνθηματικό μπορεί να είναι λανθασμένο ή ο εξυπηρετητής μπορεί να είναι " +-"ρυθμισμένος να αρνείται απομακρυσμένη διαχείριση." ++msgid "The password may be incorrect, or the server may be configured to deny remote administration." ++msgstr "Το συνθηματικό μπορεί να είναι λανθασμένο ή ο εξυπηρετητής μπορεί να είναι ρυθμισμένος να αρνείται απομακρυσμένη διαχείριση." + + #: ../errordialogs.py:72 + msgid "Bad request" +@@ -155,7 +160,8 @@ msgstr "Απαιτείται αναβά + msgid "Server error" + msgstr "Σφάλμα εξυπηρετητή" + +-#: ../errordialogs.py:82 ../system-config-printer.py:1219 ++#: ../errordialogs.py:82 ++#: ../system-config-printer.py:1219 + msgid "Not connected" + msgstr "Χωρίς σύνδεση" + +@@ -177,7 +183,8 @@ msgstr "_Νέα Ομάδα" + msgid "_New Group from Selection" + msgstr "" + +-#: ../GroupsPane.py:98 ../system-config-printer.py:411 ++#: ../GroupsPane.py:98 ++#: ../system-config-printer.py:411 + msgid "_Rename" + msgstr "_Μετονομασία" + +@@ -196,9 +203,7 @@ msgid "Are you sure you want to permanen + msgstr "Είστε σίγουρος/η ότι θέλετε να διαγραφεί μόνιμα το \"%s\";" + + #: ../GroupsPane.py:296 +-msgid "" +-"This will not delete any printer queues from your computer. To delete queues " +-"completely, you must delete them from the 'All Printers' group." ++msgid "This will not delete any printer queues from your computer. To delete queues completely, you must delete them from the 'All Printers' group." + msgstr "" + + #: ../GroupsPane.py:318 +@@ -229,7 +234,8 @@ msgstr "Ε_πανεκτύπωση" + msgid "_Authenticate" + msgstr "_Πιστοποίηση" + +-#: ../jobviewer.py:213 ../troubleshoot/PrintTestPage.py:82 ++#: ../jobviewer.py:213 ++#: ../troubleshoot/PrintTestPage.py:82 + msgid "Job" + msgstr "Εργασία" + +@@ -237,12 +243,15 @@ msgstr "Εργασία" + msgid "User" + msgstr "Χρήστης" + +-#: ../jobviewer.py:215 ../troubleshoot/PrintTestPage.py:86 ++#: ../jobviewer.py:215 ++#: ../troubleshoot/PrintTestPage.py:86 + msgid "Document" + msgstr "Έγγραφο" + +-#: ../jobviewer.py:216 ../my-default-printer.py:153 +-#: ../system-config-printer.py:384 ../system-config-printer.py:1367 ++#: ../jobviewer.py:216 ++#: ../my-default-printer.py:153 ++#: ../system-config-printer.py:384 ++#: ../system-config-printer.py:1367 + #: ../troubleshoot/PrintTestPage.py:84 + msgid "Printer" + msgstr "Εκτυπωτής" +@@ -255,7 +264,8 @@ msgstr "Μέγεθος" + msgid "Time submitted" + msgstr "Ώρα καταχώρησης" + +-#: ../jobviewer.py:219 ../troubleshoot/PrintTestPage.py:87 ++#: ../jobviewer.py:219 ++#: ../troubleshoot/PrintTestPage.py:87 + msgid "Status" + msgstr "Κατάσταση" + +@@ -277,17 +287,26 @@ msgstr "όλες οι εργασίες" + msgid "Document Print Status (%s)" + msgstr "Κατάσταση εκτύπωσης εγγράφου (%s)" + +-#: ../jobviewer.py:395 ../jobviewer.py:460 ../jobviewer.py:461 +-#: ../jobviewer.py:512 ../jobviewer.py:629 ../jobviewer.py:756 +-#: ../jobviewer.py:1232 ../jobviewer.py:1258 ../system-config-printer.py:2555 ++#: ../jobviewer.py:395 ++#: ../jobviewer.py:460 ++#: ../jobviewer.py:461 ++#: ../jobviewer.py:512 ++#: ../jobviewer.py:629 ++#: ../jobviewer.py:756 ++#: ../jobviewer.py:1232 ++#: ../jobviewer.py:1258 ++#: ../system-config-printer.py:2555 + #: ../glade/NewPrinterWindow.glade.h:104 + #: ../troubleshoot/ChooseNetworkPrinter.py:101 + #: ../troubleshoot/ChooseNetworkPrinter.py:102 + #: ../troubleshoot/ChooseNetworkPrinter.py:105 + #: ../troubleshoot/ChooseNetworkPrinter.py:106 +-#: ../troubleshoot/ChoosePrinter.py:87 ../troubleshoot/ChoosePrinter.py:88 +-#: ../troubleshoot/ChoosePrinter.py:91 ../troubleshoot/ChoosePrinter.py:92 +-#: ../troubleshoot/DeviceListed.py:92 ../troubleshoot/DeviceListed.py:93 ++#: ../troubleshoot/ChoosePrinter.py:87 ++#: ../troubleshoot/ChoosePrinter.py:88 ++#: ../troubleshoot/ChoosePrinter.py:91 ++#: ../troubleshoot/ChoosePrinter.py:92 ++#: ../troubleshoot/DeviceListed.py:92 ++#: ../troubleshoot/DeviceListed.py:93 + msgid "Unknown" + msgstr "Άγνωστο" + +@@ -332,7 +351,8 @@ msgstr "%d εβδομάδες πριν" + msgid "Held for authentication" + msgstr "Αναμονή για πιστοποίηση" + +-#: ../jobviewer.py:566 ../troubleshoot/PrintTestPage.py:42 ++#: ../jobviewer.py:566 ++#: ../troubleshoot/PrintTestPage.py:42 + msgid "Held" + msgstr "Σε αναμονή" + +@@ -366,33 +386,40 @@ msgstr "" + msgid "Held until weekend" + msgstr "Σε αναμονή μέχρι:" + +-#: ../jobviewer.py:619 ../troubleshoot/PrintTestPage.py:41 ++#: ../jobviewer.py:619 ++#: ../troubleshoot/PrintTestPage.py:41 + msgid "Pending" + msgstr "Σε αναμονή" + +-#: ../jobviewer.py:620 ../system-config-printer.py:198 ++#: ../jobviewer.py:620 ++#: ../system-config-printer.py:198 + #: ../troubleshoot/PrintTestPage.py:43 + msgid "Processing" + msgstr "Γίνεται επεξεργασία" + +-#: ../jobviewer.py:621 ../system-config-printer.py:200 ++#: ../jobviewer.py:621 ++#: ../system-config-printer.py:200 + #: ../troubleshoot/PrintTestPage.py:44 + msgid "Stopped" + msgstr "Σταματημένος" + +-#: ../jobviewer.py:622 ../troubleshoot/PrintTestPage.py:45 ++#: ../jobviewer.py:622 ++#: ../troubleshoot/PrintTestPage.py:45 + msgid "Canceled" + msgstr "Ακυρώθηκε" + +-#: ../jobviewer.py:623 ../troubleshoot/PrintTestPage.py:46 ++#: ../jobviewer.py:623 ++#: ../troubleshoot/PrintTestPage.py:46 + msgid "Aborted" + msgstr "Εγκαταλήφθηκε" + +-#: ../jobviewer.py:624 ../troubleshoot/PrintTestPage.py:47 ++#: ../jobviewer.py:624 ++#: ../troubleshoot/PrintTestPage.py:47 + msgid "Completed" + msgstr "Ολοκληρώθηκε" + +-#: ../jobviewer.py:697 ../jobviewer.py:786 ++#: ../jobviewer.py:697 ++#: ../jobviewer.py:786 + msgid "authenticating job" + msgstr "πιστοποίηση εργασίας" + +@@ -460,7 +487,8 @@ msgstr "Υπήρξε σφάλμα κατ + msgid "There was a problem printing document `%s' (job %d): `%s'." + msgstr "Υπηήρξε σφάλμα κατά την εκτύπωση του εγγράφου `%s' (job %d): `%s'." + +-#: ../jobviewer.py:1435 ../jobviewer.py:1451 ++#: ../jobviewer.py:1435 ++#: ../jobviewer.py:1451 + msgid "Print Error" + msgstr "Σφάλμα εκτυπωτή" + +@@ -473,19 +501,23 @@ msgstr "" + msgid "The printer called `%s' has been disabled." + msgstr "Ο εκτυπωτής `%s' ακυρώθηκε." + +-#: ../my-default-printer.py:137 ../my-default-printer.desktop.in.h:1 ++#: ../my-default-printer.py:137 ++#: ../my-default-printer.desktop.in.h:1 + msgid "Default Printer" +-msgstr "Προεπιλεγμένος εκτυπωτή" ++msgstr "Προεπιλεγμένος εκτυπωτής" + +-#: ../my-default-printer.py:141 ../my-default-printer.py:177 ++#: ../my-default-printer.py:141 ++#: ../my-default-printer.py:177 + msgid "_Use System Default" + msgstr "Ε_παναφορά στην προεπιλογή συστήματος" + +-#: ../my-default-printer.py:142 ../my-default-printer.py:179 ++#: ../my-default-printer.py:142 ++#: ../my-default-printer.py:179 + msgid "_Set Default" + msgstr "_Προεπιλογή" + +-#: ../my-default-printer.py:158 ../system-config-printer.py:441 ++#: ../my-default-printer.py:158 ++#: ../system-config-printer.py:441 + #: ../troubleshoot/ChooseNetworkPrinter.py:37 + #: ../troubleshoot/ChoosePrinter.py:38 + msgid "Location" +@@ -516,7 +548,8 @@ msgstr "Προεπιλεγμένος ε + msgid "Authenticated" + msgstr "Πιστοποιημένο" + +-#: ../ppdippstr.py:50 ../system-config-printer.py:6133 ++#: ../ppdippstr.py:50 ++#: ../system-config-printer.py:6133 + msgid "None" + msgstr "Κανένας" + +@@ -752,7 +785,8 @@ msgstr "Αδρανής" + msgid "Busy" + msgstr "Απασχολημένος" + +-#: ../system-config-printer.py:390 ../system-config-printer.py:1373 ++#: ../system-config-printer.py:390 ++#: ../system-config-printer.py:1373 + #, fuzzy + msgid "Class" + msgstr "Νέα κλάση(*.ppd[.gz])" +@@ -793,8 +827,10 @@ msgstr "Ενεργό" + msgid "_Shared" + msgstr "_Κοινή χρήση" + +-#: ../system-config-printer.py:439 ../troubleshoot/ChooseNetworkPrinter.py:35 +-#: ../troubleshoot/ChoosePrinter.py:36 ../troubleshoot/DeviceListed.py:36 ++#: ../system-config-printer.py:439 ++#: ../troubleshoot/ChooseNetworkPrinter.py:35 ++#: ../troubleshoot/ChoosePrinter.py:36 ++#: ../troubleshoot/DeviceListed.py:36 + msgid "Name" + msgstr "Όνομα" + +@@ -815,11 +851,13 @@ msgstr "Μήνυμα" + msgid "Problems?" + msgstr "Προβλήματα;" + +-#: ../system-config-printer.py:655 ../system-config-printer.py:657 ++#: ../system-config-printer.py:655 ++#: ../system-config-printer.py:657 + msgid "Members of this class" + msgstr "Μέλη αυτής της κλάσης" + +-#: ../system-config-printer.py:656 ../system-config-printer.py:658 ++#: ../system-config-printer.py:656 ++#: ../system-config-printer.py:658 + msgid "Others" + msgstr "Άλλα" + +@@ -843,7 +881,8 @@ msgstr "Μοντέλο" + msgid "Drivers" + msgstr "Οδηγοί" + +-#: ../system-config-printer.py:664 ../glade/NewPrinterWindow.glade.h:54 ++#: ../system-config-printer.py:664 ++#: ../glade/NewPrinterWindow.glade.h:54 + msgid "Downloadable Drivers" + msgstr "" + +@@ -882,7 +921,8 @@ msgid "Connected to %s" + msgstr "Συνδέθηκε στο %s" + + #. Update our copy of the printer's settings. +-#: ../system-config-printer.py:1257 ../system-config-printer.py:2045 ++#: ../system-config-printer.py:1257 ++#: ../system-config-printer.py:2045 + msgid "obtaining queue details" + msgstr "" + +@@ -899,12 +939,15 @@ msgstr "Νέος εκτυπωτής" + msgid "Network class (discovered)" + msgstr "" + +-#: ../system-config-printer.py:1370 ../system-config-printer.py:5437 +-#: ../system-config-printer.py:5507 ../system-config-printer.py:5509 ++#: ../system-config-printer.py:1370 ++#: ../system-config-printer.py:5437 ++#: ../system-config-printer.py:5507 ++#: ../system-config-printer.py:5509 + msgid "Fax" + msgstr "Φαξ" + +-#: ../system-config-printer.py:1376 ../system-config-printer.py:1382 ++#: ../system-config-printer.py:1376 ++#: ../system-config-printer.py:1382 + #: ../troubleshoot/LocalOrRemote.py:30 + msgid "Network printer" + msgstr "Δίκτυο εκτυπωτή" +@@ -914,7 +957,8 @@ msgstr "Δίκτυο εκτυπωτή" + msgid "Network print share" + msgstr "Νέος εκτυπωτής" + +-#: ../system-config-printer.py:1508 ../glade/ConnectingDialog.glade.h:2 ++#: ../system-config-printer.py:1508 ++#: ../glade/ConnectingDialog.glade.h:2 + #, no-c-format, python-format + msgid "Opening connection to %s" + msgstr "" +@@ -933,9 +977,12 @@ msgstr "Επιλογές εκτυπωτ + msgid "modifying class %s" + msgstr "" + +-#: ../system-config-printer.py:1929 ../system-config-printer.py:3038 +-#: ../system-config-printer.py:3063 ../system-config-printer.py:6421 +-#: ../system-config-printer.py:6433 ../system-config-printer.py:6455 ++#: ../system-config-printer.py:1929 ++#: ../system-config-printer.py:3038 ++#: ../system-config-printer.py:3063 ++#: ../system-config-printer.py:6421 ++#: ../system-config-printer.py:6433 ++#: ../system-config-printer.py:6455 + #, fuzzy, python-format + msgid "modifying printer %s" + msgstr "Προσθήκη εκτυπωτή" +@@ -952,7 +999,8 @@ msgstr "Συνέχεια ούτως ή + #. but we have never fetched the server settings to see whether + #. the server is publishing shared printers. Fetch the settings + #. now so that we can update the "not published" label if necessary. +-#: ../system-config-printer.py:2033 ../system-config-printer.py:3222 ++#: ../system-config-printer.py:2033 ++#: ../system-config-printer.py:3222 + #, fuzzy + msgid "fetching server settings" + msgstr "Βασικές επιλογές οδηγού" +@@ -987,19 +1035,18 @@ msgstr "Επιλογή προεπιλε + msgid "printing test page" + msgstr "Εκτύπωση δοκιμαστικής σελίδας" + +-#: ../system-config-printer.py:2185 ../system-config-printer.py:2220 ++#: ../system-config-printer.py:2185 ++#: ../system-config-printer.py:2220 + msgid "Not possible" + msgstr "Δεν είναι εφικτό" + +-#: ../system-config-printer.py:2186 ../system-config-printer.py:2221 +-msgid "" +-"The remote server did not accept the print job, most likely because the " +-"printer is not shared." +-msgstr "" +-"Ο απομακρυσμένος διακομιστής δε δέχθηκε την εκτύπωση, κατά πάσα πιθανότητα ο " +-"εκτυπωτής δε διατίθεται για κοινή χρήση." ++#: ../system-config-printer.py:2186 ++#: ../system-config-printer.py:2221 ++msgid "The remote server did not accept the print job, most likely because the printer is not shared." ++msgstr "Ο απομακρυσμένος διακομιστής δε δέχθηκε την εκτύπωση, κατά πάσα πιθανότητα ο εκτυπωτής δε διατίθεται για κοινή χρήση." + +-#: ../system-config-printer.py:2198 ../system-config-printer.py:2213 ++#: ../system-config-printer.py:2198 ++#: ../system-config-printer.py:2213 + msgid "Submitted" + msgstr "Καταχωρήθηκε" + +@@ -1020,7 +1067,8 @@ msgstr "Η δοκιμαστική σελ + #. The underlying cupsGetPPD2() function returned NULL without + #. setting an IPP error, so it'll be something like a failed + #. connection. +-#: ../system-config-printer.py:2288 ../system-config-printer.py:2384 ++#: ../system-config-printer.py:2288 ++#: ../system-config-printer.py:2384 + msgid "Error" + msgstr "Σφάλμα" + +@@ -1081,9 +1129,7 @@ msgid "Publish Shared Printers" + msgstr "" + + #: ../system-config-printer.py:3090 +-msgid "" +-"Shared printers are not available to other people unless the 'Publish shared " +-"printers' option is enabled in the server settings." ++msgid "Shared printers are not available to other people unless the 'Publish shared printers' option is enabled in the server settings." + msgstr "" + + #: ../system-config-printer.py:3283 +@@ -1103,12 +1149,8 @@ msgstr "" + + #: ../system-config-printer.py:3309 + #, fuzzy +-msgid "" +-"You may need to adjust the firewall to allow network printing to this " +-"computer." +-msgstr "" +-"Ίσως να χρειαστεί να ρυθμίσετε το τείχος προστασίας για να επιτραπεί στο " +-"δικτυακή εκτύπωση σε αυτόν τον υπολογιστή." ++msgid "You may need to adjust the firewall to allow network printing to this computer." ++msgstr "Ίσως να χρειαστεί να ρυθμίσετε το τείχος προστασίας για να επιτραπεί στο δικτυακή εκτύπωση σε αυτόν τον υπολογιστή." + + #: ../system-config-printer.py:3639 + msgid "Browsing not available (pysmbc not installed)" +@@ -1125,21 +1167,22 @@ msgstr "Σχόλιο" + + #: ../system-config-printer.py:3665 + #, fuzzy +-msgid "" +-"PostScript Printer Description files (*.ppd, *.PPD, *.ppd.gz, *.PPD.gz, *." +-"PPD.GZ)" ++msgid "PostScript Printer Description files (*.ppd, *.PPD, *.ppd.gz, *.PPD.gz, *.PPD.GZ)" + msgstr "Περιγραφή εκτυπωτή PostScript (*.ppd[.gz])" + + #: ../system-config-printer.py:3674 + msgid "All files (*)" + msgstr "Όλα τα αρχεία (*)" + +-#: ../system-config-printer.py:3710 ../system-config-printer.py:5839 +-#: ../system-config-printer.py:5877 ../applet.py:127 ++#: ../system-config-printer.py:3710 ++#: ../system-config-printer.py:5839 ++#: ../system-config-printer.py:5877 ++#: ../applet.py:127 + msgid "Search" + msgstr "Αναζήτηση" + +-#: ../system-config-printer.py:3734 ../system-config-printer.py:3758 ++#: ../system-config-printer.py:3734 ++#: ../system-config-printer.py:3758 + #: ../glade/NewPrinterWindow.glade.h:72 + msgid "New Printer" + msgstr "Νέος εκτυπωτής" +@@ -1156,9 +1199,12 @@ msgstr "Αλλαγή URI συσκευή + msgid "Change Driver" + msgstr "Αλλαγή οδηγού" + +-#: ../system-config-printer.py:3928 ../system-config-printer.py:4007 +-#: ../system-config-printer.py:4321 ../system-config-printer.py:4519 +-#: ../system-config-printer.py:5683 ../system-config-printer.py:5864 ++#: ../system-config-printer.py:3928 ++#: ../system-config-printer.py:4007 ++#: ../system-config-printer.py:4321 ++#: ../system-config-printer.py:4519 ++#: ../system-config-printer.py:5683 ++#: ../system-config-printer.py:5864 + msgid "Searching" + msgstr "Εκτελείται αναζήτηση" + +@@ -1166,11 +1212,13 @@ msgstr "Εκτελείται αναζή + msgid "Searching for downloadable drivers" + msgstr "Εκτελείται αναζήτηση για οδηγούς" + +-#: ../system-config-printer.py:4008 ../system-config-printer.py:4322 ++#: ../system-config-printer.py:4008 ++#: ../system-config-printer.py:4322 + msgid "Searching for drivers" + msgstr "Εκτελείται αναζήτηση για οδηγούς" + +-#: ../system-config-printer.py:4520 ../system-config-printer.py:5684 ++#: ../system-config-printer.py:4520 ++#: ../system-config-printer.py:5684 + msgid "Searching for printers" + msgstr "Εκτελείται αναζήτηση για εκτυπωτές" + +@@ -1192,8 +1240,7 @@ msgstr "" + + #: ../system-config-printer.py:4622 + msgid "" +-"Installing the plugin is optional, it completes or enhances the " +-"functionality\n" ++"Installing the plugin is optional, it completes or enhances the functionality\n" + "of your printer. Without plugin at least basic operations work.\n" + "\n" + msgstr "" +@@ -1265,15 +1312,18 @@ msgstr "Αντιγραφή εκτυπω + msgid "Set up without plugin" + msgstr "" + +-#: ../system-config-printer.py:4671 ../troubleshoot/PrintTestPage.py:118 ++#: ../system-config-printer.py:4671 ++#: ../troubleshoot/PrintTestPage.py:118 + msgid "Yes" + msgstr "Ναι" + +-#: ../system-config-printer.py:4672 ../troubleshoot/PrintTestPage.py:119 ++#: ../system-config-printer.py:4672 ++#: ../troubleshoot/PrintTestPage.py:119 + msgid "No" + msgstr "Όχι" + +-#: ../system-config-printer.py:4841 ../system-config-printer.py:4845 ++#: ../system-config-printer.py:4841 ++#: ../system-config-printer.py:4845 + msgid " (Current)" + msgstr " (Τρέχον)" + +@@ -1303,20 +1353,21 @@ msgid "No Print Shares" + msgstr "Νέος εκτυπωτής" + + #: ../system-config-printer.py:5047 +-msgid "" +-"There were no print shares found. Please check that the Samba service is " +-"marked as trusted in your firewall configuration." ++msgid "There were no print shares found. Please check that the Samba service is marked as trusted in your firewall configuration." + msgstr "" + +-#: ../system-config-printer.py:5308 ../system-config-printer.py:5371 ++#: ../system-config-printer.py:5308 ++#: ../system-config-printer.py:5371 + msgid "Print Share Verified" + msgstr "" + +-#: ../system-config-printer.py:5309 ../system-config-printer.py:5372 ++#: ../system-config-printer.py:5309 ++#: ../system-config-printer.py:5372 + msgid "This print share is accessible." + msgstr "Ο κοινόχρηστος εκτυπωτής είναι προσβάσιμος." + +-#: ../system-config-printer.py:5314 ../system-config-printer.py:5376 ++#: ../system-config-printer.py:5314 ++#: ../system-config-printer.py:5376 + msgid "This print share is not accessible." + msgstr "Ο κοινόχρηστος εκτυπωτής δεν είναι προσβάσιμος." + +@@ -1341,15 +1392,15 @@ msgstr "Σειριακή θύρα" + msgid "USB" + msgstr "USB" + +-#: ../system-config-printer.py:5435 ../system-config-printer.py:5438 ++#: ../system-config-printer.py:5435 ++#: ../system-config-printer.py:5438 + msgid "HP Linux Imaging and Printing (HPLIP)" + msgstr "" + + #: ../system-config-printer.py:5440 + #, fuzzy + msgid "Hardware Abstraction Layer (HAL)" +-msgstr "" +-"Τοπικός εκτυπωτής που ανιχνεύτηκε από το Hardware Abstraction Layer (HAL)." ++msgstr "Τοπικός εκτυπωτής που ανιχνεύτηκε από το Hardware Abstraction Layer (HAL)." + + #: ../system-config-printer.py:5442 + msgid "AppSocket/HP JetDirect" +@@ -1368,7 +1419,8 @@ msgstr "ουρά LPD/LPR" + msgid "Windows Printer via SAMBA" + msgstr "" + +-#: ../system-config-printer.py:5458 ../glade/NewPrinterWindow.glade.h:64 ++#: ../system-config-printer.py:5458 ++#: ../glade/NewPrinterWindow.glade.h:64 + msgid "IPP" + msgstr "IPP" + +@@ -1385,25 +1437,16 @@ msgid "A printer connected to a USB port + msgstr "Ένας εκτυπωτής συνδεδεμένος στη θύρα USB." + + #: ../system-config-printer.py:5546 +-msgid "" +-"HPLIP software driving a printer, or the printer function of a multi-" +-"function device." +-msgstr "" +-"Λογισμικό HPLIP για οδήγηση εκτυπωτή ή η λειτουργία εκτύπωσης μιας πολυ-" +-"λειτουργικής συσκευής." ++msgid "HPLIP software driving a printer, or the printer function of a multi-function device." ++msgstr "Λογισμικό HPLIP για οδήγηση εκτυπωτή ή η λειτουργία εκτύπωσης μιας πολυ-λειτουργικής συσκευής." + + #: ../system-config-printer.py:5549 +-msgid "" +-"HPLIP software driving a fax machine, or the fax function of a multi-" +-"function device." +-msgstr "" +-"Λογισμικό HPLIP για οδήγηση φαξ ή η λειτουργία φαξμιας πολυ-λειτουργικής " +-"συσκευής." ++msgid "HPLIP software driving a fax machine, or the fax function of a multi-function device." ++msgstr "Λογισμικό HPLIP για οδήγηση φαξ ή η λειτουργία φαξμιας πολυ-λειτουργικής συσκευής." + + #: ../system-config-printer.py:5552 + msgid "Local printer detected by the Hardware Abstraction Layer (HAL)." +-msgstr "" +-"Τοπικός εκτυπωτής που ανιχνεύτηκε από το Hardware Abstraction Layer (HAL)." ++msgstr "Τοπικός εκτυπωτής που ανιχνεύτηκε από το Hardware Abstraction Layer (HAL)." + + #: ../system-config-printer.py:5752 + msgid "No printer was found at that address." +@@ -1453,7 +1496,8 @@ msgstr "" + msgid "No support contacts known" + msgstr "" + +-#: ../system-config-printer.py:6181 ../system-config-printer.py:6194 ++#: ../system-config-printer.py:6181 ++#: ../system-config-printer.py:6194 + msgid "Not specified." + msgstr "Μη ορισμένο" + +@@ -1473,9 +1517,7 @@ msgstr "Ο οδηγός '%s' δε μπο + #: ../system-config-printer.py:6245 + #, python-format + msgid "You will need to install the '%s' package in order to use this driver." +-msgstr "" +-"Θα χρειαστεί να εγκαταστήσετε το πακέτο '%s' για να χρησιμοποιήσετε αυτόν " +-"τον οδηγό." ++msgstr "Θα χρειαστεί να εγκαταστήσετε το πακέτο '%s' για να χρησιμοποιήσετε αυτόν τον οδηγό." + + #. This error came from trying to open the PPD file. + #: ../system-config-printer.py:6252 +@@ -1500,7 +1542,8 @@ msgstr "Αποτυχία λήψης PPD. + msgid "fetching PPD" + msgstr "Αλλαγή PPD" + +-#: ../system-config-printer.py:6308 ../system-config-printer.py:6346 ++#: ../system-config-printer.py:6308 ++#: ../system-config-printer.py:6346 + #, fuzzy + msgid "No Installable Options" + msgstr "Επιλογές για εγκατάσταση" +@@ -1518,11 +1561,11 @@ msgstr "Θα θέλατε να εκτυ + msgid "Install driver" + msgstr "Εγκατάσταση οδηγού" + +-#: ../system-config-printer.py:6621 ../troubleshoot/CheckPPDSanity.py:131 ++#: ../system-config-printer.py:6621 ++#: ../troubleshoot/CheckPPDSanity.py:131 + #, python-format + msgid "Printer '%s' requires the %s package but it is not currently installed." +-msgstr "" +-"Ο εκτυπωτής '%s' απαιτεί το πακέτο %s, το οποίο όμως δεν είναι εγκατεστημένο." ++msgstr "Ο εκτυπωτής '%s' απαιτεί το πακέτο %s, το οποίο όμως δεν είναι εγκατεστημένο." + + #: ../system-config-printer.py:6637 + msgid "Missing driver" +@@ -1530,13 +1573,8 @@ msgstr "Λείπει οδηγός" + + #: ../system-config-printer.py:6638 + #, python-format +-msgid "" +-"Printer '%s' requires the '%s' program but it is not currently installed. " +-"Please install it before using this printer." +-msgstr "" +-"Ο εκτυπωτής '%s' απαιτεί το πρόγραμμα %s, το οποίο όμως δεν είναι " +-"εγκατεστημένο. Παρακαλούμε εγκαταστήστε το πριν χρησιμοποιήσετε αυτόν τον " +-"εκτυπωτή." ++msgid "Printer '%s' requires the '%s' program but it is not currently installed. Please install it before using this printer." ++msgstr "Ο εκτυπωτής '%s' απαιτεί το πρόγραμμα %s, το οποίο όμως δεν είναι εγκατεστημένο. Παρακαλούμε εγκαταστήστε το πριν χρησιμοποιήσετε αυτόν τον εκτυπωτή." + + #: ../glade/AboutDialog.glade.h:1 + #, fuzzy +@@ -1550,19 +1588,11 @@ msgstr "Copyright 2006, 2007 Red Hat, In + + #: ../glade/AboutDialog.glade.h:3 + msgid "" +-"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.\n" ++"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.\n" + "\n" +-"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.\n" ++"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.\n" + "\n" +-"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., 675 Mass " +-"Ave, Cambridge, MA 02139, USA." ++"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., 675 Mass Ave, Cambridge, MA 02139, USA." + msgstr "" + + #: ../glade/AboutDialog.glade.h:8 +@@ -1619,7 +1649,8 @@ msgstr "_Εργασία" + msgid "_Refresh" + msgstr "_Ανανέωση" + +-#: ../glade/JobsWindow.glade.h:5 ../glade/PrintersWindow.glade.h:17 ++#: ../glade/JobsWindow.glade.h:5 ++#: ../glade/PrintersWindow.glade.h:17 + msgid "_View" + msgstr "_Προβολή" + +@@ -1823,7 +1854,8 @@ msgstr "" + msgid "Description:" + msgstr "Περιγραφή:" + +-#: ../glade/NewPrinterWindow.glade.h:51 ../troubleshoot/DeviceListed.py:40 ++#: ../glade/NewPrinterWindow.glade.h:51 ++#: ../troubleshoot/DeviceListed.py:40 + msgid "Device URI" + msgstr "URI Συσκευής" + +@@ -1848,8 +1880,7 @@ msgid "Flow Control" + msgstr "Έλεγχος ροής" + + #: ../glade/NewPrinterWindow.glade.h:58 +-msgid "" +-"For the printer you have selected there are drivers available for download." ++msgid "For the printer you have selected there are drivers available for download." + msgstr "" + + #: ../glade/NewPrinterWindow.glade.h:59 +@@ -1923,14 +1954,8 @@ msgstr "Αριθμός θύρας:" + + #: ../glade/NewPrinterWindow.glade.h:79 + #, fuzzy +-msgid "" +-"PostScript Printer Description (PPD) files can often be found on the driver " +-"disk that comes with the printer. For PostScript printers they are often " +-"part of the Windows® driver." +-msgstr "" +-"Αρχεία PostScript Printer Description (PPD) μπορούν να βρεθούν συχνά στο " +-"δίσκο που έρχεται μαζί με τον εκτυπωτή. Για εκτυπωτές PostScript αυτά είναι " +-"συχνά κομμάτι του οδηγού Windows®." ++msgid "PostScript Printer Description (PPD) files can often be found on the driver disk that comes with the printer. For PostScript printers they are often part of the Windows® driver." ++msgstr "Αρχεία PostScript Printer Description (PPD) μπορούν να βρεθούν συχνά στο δίσκο που έρχεται μαζί με τον εκτυπωτή. Για εκτυπωτές PostScript αυτά είναι συχνά κομμάτι του οδηγού Windows®." + + #: ../glade/NewPrinterWindow.glade.h:80 + msgid "Printer model:" +@@ -2003,50 +2028,24 @@ msgid "Text:" + msgstr "Κείμενο:" + + #: ../glade/NewPrinterWindow.glade.h:97 +-msgid "" +-"The foomatic printer database contains various manufacturer provided " +-"PostScript Printer Description (PPD) files and also can generate PPD files " +-"for a large number of (non PostScript) printers. But in general manufacturer " +-"provided PPD files provide better access to the specific features of the " +-"printer." +-msgstr "" +-"Η βάση δεδομένων εκτυπωτή foomatic περιέχει αρχεία Περιγραφής Εκτυπωτή " +-"PostScript (PPD) που παρέχουνται από διάφορους κατασκευαστές και επίσης " +-"μπορούν να δημιουργήσουν αρχεία PPD για ένα μεγάλο αριθμό εκτυπωτών (όχι " +-"PostScript). Αλλά γενικά, αρχεία PPD που προσφέρονται από κατασκευαστές " +-"παρέχουν καλύτερη πρόσβαση στις συγκεκριμένες ιδιότητες του εκτυπωτή." ++msgid "The foomatic printer database contains various manufacturer provided PostScript Printer Description (PPD) files and also can generate PPD files for a large number of (non PostScript) printers. But in general manufacturer provided PPD files provide better access to the specific features of the printer." ++msgstr "Η βάση δεδομένων εκτυπωτή foomatic περιέχει αρχεία Περιγραφής Εκτυπωτή PostScript (PPD) που παρέχουνται από διάφορους κατασκευαστές και επίσης μπορούν να δημιουργήσουν αρχεία PPD για ένα μεγάλο αριθμό εκτυπωτών (όχι PostScript). Αλλά γενικά, αρχεία PPD που προσφέρονται από κατασκευαστές παρέχουν καλύτερη πρόσβαση στις συγκεκριμένες ιδιότητες του εκτυπωτή." + + #: ../glade/NewPrinterWindow.glade.h:98 +-msgid "" +-"These drivers do not come from your operating system supplier and will not " +-"be covered by their commercial support. See the support and license terms " +-"of the driver's supplier." ++msgid "These drivers do not come from your operating system supplier and will not be covered by their commercial support. See the support and license terms of the driver's supplier." + msgstr "" + + #: ../glade/NewPrinterWindow.glade.h:99 +-msgid "" +-"This driver supports additional hardware that may be installed in the " +-"printer." ++msgid "This driver supports additional hardware that may be installed in the printer." + msgstr "" + + #: ../glade/NewPrinterWindow.glade.h:100 +-msgid "" +-"This is done by assuming that options with the same name do have the same " +-"meaning. Settings of options that are not present in the new PPD will be " +-"lost and options only present in the new PPD will be set to default." +-msgstr "" +-"Αυτό πραγματοποιήθηκε δεχόμενοι ότι οι επιλογές με το ίδιο όνομα έχουν " +-"ουσιαστικά και την ίδια ερμηνεία. Ρυθμίσεις επιλογών που δεν υπάρχουν στο " +-"νέο PPD θα χαθούν και μόνο επιλογές που βρίσκονται στο νέο PPD θα τεθούν ως " +-"προεπιλογή." ++msgid "This is done by assuming that options with the same name do have the same meaning. Settings of options that are not present in the new PPD will be lost and options only present in the new PPD will be set to default." ++msgstr "Αυτό πραγματοποιήθηκε δεχόμενοι ότι οι επιλογές με το ίδιο όνομα έχουν ουσιαστικά και την ίδια ερμηνεία. Ρυθμίσεις επιλογών που δεν υπάρχουν στο νέο PPD θα χαθούν και μόνο επιλογές που βρίσκονται στο νέο PPD θα τεθούν ως προεπιλογή." + + #: ../glade/NewPrinterWindow.glade.h:101 +-msgid "" +-"This way all current option settings will be lost. The default settings of " +-"the new PPD will be used. " +-msgstr "" +-"Με αυτόν τον τρόπο οι τρέχουσες επιλογές ρυθμίσεων θα χαθούν. Οι " +-"προεπιλεγμένες ρυθμίσεις για το νέο PPD θα χρησιμοποιηθούν. " ++msgid "This way all current option settings will be lost. The default settings of the new PPD will be used. " ++msgstr "Με αυτόν τον τρόπο οι τρέχουσες επιλογές ρυθμίσεων θα χαθούν. Οι προεπιλεγμένες ρυθμίσεις για το νέο PPD θα χρησιμοποιηθούν. " + + #: ../glade/NewPrinterWindow.glade.h:102 + msgid "Try to copy the option settings over from the old PPD. " +@@ -2061,9 +2060,7 @@ msgid "Use the new PPD (Postscript Print + msgstr "Χρήση των νέων PPD (Περιγραφές Εκτυπωτών Postscript) όπως είναι." + + #: ../glade/NewPrinterWindow.glade.h:107 +-msgid "" +-"With this choice no driver download will be performed. In the next steps a " +-"locally installed driver will be selected." ++msgid "With this choice no driver download will be performed. In the next steps a locally installed driver will be selected." + msgstr "" + + #: ../glade/NewPrinterWindow.glade.h:108 +@@ -2479,14 +2476,8 @@ msgid "Sides:" + msgstr "Πλευρές:" + + #: ../glade/PrinterPropertiesDialog.glade.h:121 +-msgid "" +-"Specify the default job options for this printer. Jobs arriving at this " +-"print server will have these options added if they are not already set by " +-"the application." +-msgstr "" +-"Ορίστε τις προεπιλεγμένες ρυθμίσεις εργασιών για αυτόν τον εκτυπωτή. Οι " +-"εργασίες που θα φτάνουν σε αυτόν τον εξυπηρετητή εκτύπωσης θα διαθέτουν " +-"αυτές τις επιλογές αν δεν έχουν ήδη οριστεί από την εφαρμογή." ++msgid "Specify the default job options for this printer. Jobs arriving at this print server will have these options added if they are not already set by the application." ++msgstr "Ορίστε τις προεπιλεγμένες ρυθμίσεις εργασιών για αυτόν τον εκτυπωτή. Οι εργασίες που θα φτάνουν σε αυτόν τον εξυπηρετητή εκτύπωσης θα διαθέτουν αυτές τις επιλογές αν δεν έχουν ήδη οριστεί από την εφαρμογή." + + #: ../glade/PrinterPropertiesDialog.glade.h:122 + msgid "Starting Banner:" +@@ -2499,9 +2490,7 @@ msgstr "Νέο όνομα εκτυπωτ + + #: ../glade/PrinterPropertiesDialog.glade.h:124 + msgid "To add a new option, enter its name in the box below and click to add." +-msgstr "" +-"Για να προσθέσετε μια νέα επιλογή, εισάγετε το όνομα της στο παρακάτω " +-"πλαίσιο και κάντε κλικ για προσθήκη." ++msgstr "Για να προσθέσετε μια νέα επιλογή, εισάγετε το όνομα της στο παρακάτω πλαίσιο και κάντε κλικ για προσθήκη." + + #: ../glade/PrinterPropertiesDialog.glade.h:125 + msgid "Top margin:" +@@ -2607,9 +2596,7 @@ msgstr "Επίτρεψη απομακρ + #: ../glade/ServerSettingsDialog.glade.h:3 + #, fuzzy + msgid "Allow _users to cancel any job (not just their own)" +-msgstr "" +-"Να επιτρέπεται οι χρήστες να ακυρώνουν οποιαδήποτε εργασία (όχι μόνο τις " +-"δικές τους)" ++msgstr "Να επιτρέπεται οι χρήστες να ακυρώνουν οποιαδήποτε εργασία (όχι μόνο τις δικές τους)" + + #: ../glade/ServerSettingsDialog.glade.h:4 + #, fuzzy +@@ -2632,8 +2619,7 @@ msgstr "" + #: ../glade/ServerSettingsDialog.glade.h:8 + #, fuzzy + msgid "_Publish shared printers connected to this system" +-msgstr "" +-"Κοινή χρήση δημοσιευμένων εκτυπωτών που είναι συνδεδεμένοι σε αυτό το σύστημα" ++msgstr "Κοινή χρήση δημοσιευμένων εκτυπωτών που είναι συνδεδεμένοι σε αυτό το σύστημα" + + #: ../glade/ServerSettingsDialog.glade.h:9 + #, fuzzy +@@ -2756,7 +2742,8 @@ msgstr "Χωρίς σύνδεση;" + msgid "Printer '%s' may not be connected." + msgstr "Ο εκτυπωτής '%s' μπορεί να μην είναι συνδεδεμένος." + +-#: ../statereason.py:105 ../statereason.py:121 ++#: ../statereason.py:105 ++#: ../statereason.py:121 + msgid "Printer error" + msgstr "Σφάλμα εκτυπωτή" + +@@ -2778,11 +2765,13 @@ msgstr "Προειδοποίηση εκ + msgid "Printer '%s': '%s'." + msgstr "Εκτυπωτής '%s':·'%s'." + +-#: ../timedops.py:101 ../timedops.py:169 ++#: ../timedops.py:101 ++#: ../timedops.py:169 + msgid "Please wait" + msgstr "Παρακαλούμε περιμένετε" + +-#: ../timedops.py:107 ../timedops.py:176 ++#: ../timedops.py:107 ++#: ../timedops.py:176 + msgid "Gathering information" + msgstr "Συγκέντρωση πληροφοριών" + +@@ -2796,9 +2785,7 @@ msgid "Printing troubleshooter" + msgstr "" + + #: ../troubleshoot/base.py:33 +-msgid "" +-"To start this tool, select System->Administration->Printing from the main " +-"menu." ++msgid "To start this tool, select System->Administration->Printing from the main menu." + msgstr "" + + #: ../troubleshoot/CheckLocalServerPublishing.py:28 +@@ -2806,18 +2793,15 @@ msgid "Server Not Exporting Printers" + msgstr "" + + #: ../troubleshoot/CheckLocalServerPublishing.py:29 +-msgid "" +-"Although one or more printers are marked as being shared, this print server " +-"is not exporting shared printers to the network." ++msgid "Although one or more printers are marked as being shared, this print server is not exporting shared printers to the network." + msgstr "" + + #: ../troubleshoot/CheckLocalServerPublishing.py:33 +-msgid "" +-"Enable the 'Publish shared printers connected to this system' option in the " +-"server settings using the printing administration tool." ++msgid "Enable the 'Publish shared printers connected to this system' option in the server settings using the printing administration tool." + msgstr "" + +-#: ../troubleshoot/CheckPPDSanity.py:44 ../applet.py:184 ++#: ../troubleshoot/CheckPPDSanity.py:44 ++#: ../applet.py:184 + msgid "Install" + msgstr "Εγκατάσταση" + +@@ -2827,9 +2811,7 @@ msgstr "Άκυρο αρχείο PPD" + + #: ../troubleshoot/CheckPPDSanity.py:106 + #, python-format +-msgid "" +-"The PPD file for printer '%s' does not conform to the specification. " +-"Possible reason follows:" ++msgid "The PPD file for printer '%s' does not conform to the specification. Possible reason follows:" + msgstr "" + + #. Perhaps cupstestppd is not in the path. +@@ -2844,28 +2826,26 @@ msgstr "Λείπει οδηγός εκτ + + #: ../troubleshoot/CheckPPDSanity.py:136 + #, fuzzy, python-format +-msgid "" +-"Printer '%s' requires the '%s' program but it is not currently installed." +-msgstr "" +-"Ο εκτυπωτής '%s' απαιτεί το πακέτο %s, το οποίο όμως δεν είναι εγκατεστημένο." ++msgid "Printer '%s' requires the '%s' program but it is not currently installed." ++msgstr "Ο εκτυπωτής '%s' απαιτεί το πακέτο %s, το οποίο όμως δεν είναι εγκατεστημένο." + + #: ../troubleshoot/ChooseNetworkPrinter.py:29 + msgid "Choose Network Printer" + msgstr "Επιλογή δικτυακού εκτυπωτή" + + #: ../troubleshoot/ChooseNetworkPrinter.py:30 +-msgid "" +-"Please select the network printer you are trying to use from the list below. " +-"If it does not appear in the list, select 'Not listed'." ++msgid "Please select the network printer you are trying to use from the list below. If it does not appear in the list, select 'Not listed'." + msgstr "" + + #: ../troubleshoot/ChooseNetworkPrinter.py:39 +-#: ../troubleshoot/ChoosePrinter.py:40 ../troubleshoot/DeviceListed.py:38 ++#: ../troubleshoot/ChoosePrinter.py:40 ++#: ../troubleshoot/DeviceListed.py:38 + msgid "Information" + msgstr "Πληροφορία" + + #: ../troubleshoot/ChooseNetworkPrinter.py:75 +-#: ../troubleshoot/ChoosePrinter.py:64 ../troubleshoot/DeviceListed.py:70 ++#: ../troubleshoot/ChoosePrinter.py:64 ++#: ../troubleshoot/DeviceListed.py:70 + #, fuzzy + msgid "Not listed" + msgstr "Χωρίς σύνδεση" +@@ -2875,9 +2855,7 @@ msgid "Choose Printer" + msgstr "Επιλογή εκτυπωτή" + + #: ../troubleshoot/ChoosePrinter.py:31 +-msgid "" +-"Please select the printer you are trying to use from the list below. If it " +-"does not appear in the list, select 'Not listed'." ++msgid "Please select the printer you are trying to use from the list below. If it does not appear in the list, select 'Not listed'." + msgstr "" + + #: ../troubleshoot/DeviceListed.py:30 +@@ -2885,9 +2863,7 @@ msgid "Choose Device" + msgstr "Επιλογή συσκευής" + + #: ../troubleshoot/DeviceListed.py:31 +-msgid "" +-"Please select the device you want to use from the list below. If it does not " +-"appear in the list, select 'Not listed'." ++msgid "Please select the device you want to use from the list below. If it does not appear in the list, select 'Not listed'." + msgstr "" + + #: ../troubleshoot/ErrorLogCheckpoint.py:31 +@@ -2895,9 +2871,7 @@ msgid "Debugging" + msgstr "Αποσφαλμάτωση" + + #: ../troubleshoot/ErrorLogCheckpoint.py:32 +-msgid "" +-"I would like to enable debugging output from the CUPS scheduler. This may " +-"cause the scheduler to restart. Click the button below to enable debugging." ++msgid "I would like to enable debugging output from the CUPS scheduler. This may cause the scheduler to restart. Click the button below to enable debugging." + msgstr "" + + #: ../troubleshoot/ErrorLogCheckpoint.py:36 +@@ -2925,9 +2899,7 @@ msgid "Incorrect Page Size" + msgstr "Εσφαλμένο μέγεθος σελίδας" + + #: ../troubleshoot/Locale.py:30 +-msgid "" +-"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." ++msgid "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." + msgstr "" + + #: ../troubleshoot/Locale.py:43 +@@ -2987,13 +2959,8 @@ msgid "Test Page" + msgstr "Δοκιμαστική σελίδα" + + #: ../troubleshoot/PrintTestPage.py:63 +-msgid "" +-"Now print a test page. If you are having problems printing a specific " +-"document, print that document now and mark the print job below." +-msgstr "" +-"Τώρα εκτυπώστε μια δοκιμαστική σελίδα. Εάν έχετε προβλήματα με την εκτύπωση " +-"συγκεκριμένου εγγράφου, εκτυπώστε το έγγραφο αυτό τώρα και σημειώστε την " +-"εργασία εκτύπωσης παρακάτω." ++msgid "Now print a test page. If you are having problems printing a specific document, print that document now and mark the print job below." ++msgstr "Τώρα εκτυπώστε μια δοκιμαστική σελίδα. Εάν έχετε προβλήματα με την εκτύπωση συγκεκριμένου εγγράφου, εκτυπώστε το έγγραφο αυτό τώρα και σημειώστε την εργασία εκτύπωσης παρακάτω." + + #: ../troubleshoot/PrintTestPage.py:75 + msgid "Cancel All Jobs" +@@ -3026,9 +2993,7 @@ msgstr "Η πόρτα είναι ανο + #: ../troubleshoot/QueueNotEnabled.py:58 + #, fuzzy + msgid "This may be due to the printer being disconnected or switched off." +-msgstr "" +-"Αυτό μπορεί να οφείλεται στο ότι ο εκτυπωτής είναι με συνδεδεμένος ή " +-"απενεργοποιημένος." ++msgstr "Αυτό μπορεί να οφείλεται στο ότι ο εκτυπωτής είναι με συνδεδεμένος ή απενεργοποιημένος." + + #: ../troubleshoot/QueueNotEnabled.py:62 + msgid "Queue Not Enabled" +@@ -3040,9 +3005,7 @@ msgid "The queue '%s' is not enabled." + msgstr "Ο κοινόχρηστος εκτυπωτής δεν είναι προσβάσιμος." + + #: ../troubleshoot/QueueNotEnabled.py:71 +-msgid "" +-"To enable it, select the 'Enabled' checkbox in the 'Policies' tab for the " +-"printer in the printer administration tool." ++msgid "To enable it, select the 'Enabled' checkbox in the 'Policies' tab for the printer in the printer administration tool." + msgstr "" + + #: ../troubleshoot/QueueRejectingJobs.py:31 +@@ -3055,9 +3018,7 @@ msgid "The queue '%s' is rejecting jobs. + msgstr "" + + #: ../troubleshoot/QueueRejectingJobs.py:70 +-msgid "" +-"To make the queue accept jobs, select the 'Accepting Jobs' checkbox in the " +-"'Policies' tab for the printer in the printer administration tool." ++msgid "To make the queue accept jobs, select the 'Accepting Jobs' checkbox in the 'Policies' tab for the printer in the printer administration tool." + msgstr "" + + #: ../troubleshoot/RemoteAddress.py:26 +@@ -3065,9 +3026,7 @@ msgid "Remote Address" + msgstr "Απομακρυσμένη διεύθυνση" + + #: ../troubleshoot/RemoteAddress.py:27 +-msgid "" +-"Please enter as many details as you can about the network address of this " +-"printer." ++msgid "Please enter as many details as you can about the network address of this printer." + msgstr "" + + #: ../troubleshoot/RemoteAddress.py:35 +@@ -3084,10 +3043,7 @@ msgid "CUPS Service Stopped" + msgstr "" + + #: ../troubleshoot/SchedulerNotRunning.py:29 +-msgid "" +-"The CUPS print spooler does not appear to be running. To correct this, " +-"choose System->Administration->Services from the main menu and look for the " +-"'cups' service." ++msgid "The CUPS print spooler does not appear to be running. To correct this, choose System->Administration->Services from the main menu and look for the 'cups' service." + msgstr "" + + #: ../troubleshoot/ServerFirewalled.py:26 +@@ -3101,9 +3057,7 @@ msgstr "Διαπιστώθηκε σφά + + #: ../troubleshoot/ServerFirewalled.py:42 + #, python-format +-msgid "" +-"Please check to see if a firewall or router configuration is blocking TCP " +-"port %d on server '%s'." ++msgid "Please check to see if a firewall or router configuration is blocking TCP port %d on server '%s'." + msgstr "" + + #: ../troubleshoot/Shrug.py:26 +@@ -3111,12 +3065,8 @@ msgid "Sorry!" + msgstr "Συγνώμη!" + + #: ../troubleshoot/Shrug.py:27 +-msgid "" +-"I have not been able to work out what the problem is, but I have collected " +-"some useful information to put in a bug report." +-msgstr "" +-"Δεν κατάφερα να αντιληφθώ ποιό είναι το πρόβλημα, αλλά έχω συλλέξει χρήσιμες " +-"πληροφορίες να προσθέσω σε μια αναφορά σφαλμάτων" ++msgid "I have not been able to work out what the problem is, but I have collected some useful information to put in a bug report." ++msgstr "Δεν κατάφερα να αντιληφθώ ποιό είναι το πρόβλημα, αλλά έχω συλλέξει χρήσιμες πληροφορίες να προσθέσω σε μια αναφορά σφαλμάτων" + + #: ../troubleshoot/Shrug.py:32 + msgid "Diagnostic Output (Advanced)" +@@ -3127,9 +3077,7 @@ msgid "Trouble-shooting Printing" + msgstr "" + + #: ../troubleshoot/Welcome.py:45 +-msgid "" +-"In the next few screens I will ask you some questions about your problem " +-"with printing. Based on your answers I will try to suggest a solution." ++msgid "In the next few screens I will ask you some questions about your problem with printing. Based on your answers I will try to suggest a solution." + msgstr "" + + #: ../troubleshoot/Welcome.py:49 +@@ -3138,7 +3086,8 @@ msgstr "Πατήστε 'Εκκίνηση + + #. name is a URI, no queue was generated, because no suitable + #. driver was found +-#: ../applet.py:113 ../applet.py:173 ++#: ../applet.py:113 ++#: ../applet.py:173 + msgid "Missing printer driver" + msgstr "Λείπει οδηγός εκτυπωτή" + +@@ -3170,7 +3119,8 @@ msgstr "" + msgid "`%s' is ready for printing." + msgstr "Ο εκτυπωτής `%s' είναι έτοιμος για εκτύπωση." + +-#: ../applet.py:203 ../applet.py:216 ++#: ../applet.py:203 ++#: ../applet.py:216 + msgid "Print test page" + msgstr "Εκτύπωση δοκιμαστικής σελίδας" + +@@ -3213,7 +3163,6 @@ msgstr "Επιλογή προεπιλε + #, fuzzy + #~ msgid "It is not possible to obtain a list of queues from '%s'." + #~ msgstr "Διαπιστώθηκε σφάλμα κατά τη λειτουργία του εξυπηρετητή CUPS." +- + #~ msgid "Job %d completed" + #~ msgstr "%d ολοκληρώθηκε" + +@@ -3243,28 +3192,20 @@ msgstr "Επιλογή προεπιλε + #, fuzzy + #~ msgid "Authenticate" + #~ msgstr "Πιστοποίηση" +- + #~ msgid "Adding" + #~ msgstr "Προσθήκη" +- + #~ msgid "Adding printer" + #~ msgstr "Προσθήκη εκτυπωτή" +- + #~ msgid "Show _printer status" + #~ msgstr "Εμφάνιση κατάστασης _εκτυπωτή" +- + #~ msgid "Printer status" + #~ msgstr "Κατάσταση εκτυπωτή" +- + #~ msgid "1 hour and 1 minute ago" + #~ msgstr "1 ώρα και 1 λεπτό πριν" +- + #~ msgid "1 hour and %d minutes ago" + #~ msgstr "1 ώρα και %d λεπτά πριν" +- + #~ msgid "%d hours and 1 minute ago" + #~ msgstr "%d ώρες και 1 λεπτό πριν" +- + #~ msgid "%d hours and %d minutes ago" + #~ msgstr "%d ώρες και %d λεπτά πριν" + +@@ -3275,14 +3216,12 @@ msgstr "Επιλογή προεπιλε + #, fuzzy + #~ msgid "Recommended Driver" + #~ msgstr "Προεπιλεγμένος εκτυπωτής" +- + #~ msgid "" + #~ "Connecting to server:\n" + #~ "%s" + #~ msgstr "" + #~ "Σύνδεση στην εξυπηρετητή:\n" + #~ "%s" +- + #~ msgid "" + #~ "Connecting to Server:\n" + #~ "%s\n" +@@ -3297,10 +3236,8 @@ msgstr "Επιλογή προεπιλε + #, fuzzy + #~ msgid "Installed Options" + #~ msgstr "Επιλογές εικόνας" +- + #~ msgid "Printers to be members of this Class" + #~ msgstr "Εκτυπωτές που θα είναι μέλη αυτής της κλάσης" +- + #~ msgid "Select Connection" + #~ msgstr "Επιλογή σύνδεσης" + +@@ -3311,7 +3248,6 @@ msgstr "Επιλογή προεπιλε + #, fuzzy + #~ msgid "_Enabled" + #~ msgstr "Ενεργό" +- + #~ msgid "" + #~ "Apply changes?\n" + #~ "\n" +@@ -3320,10 +3256,8 @@ msgstr "Επιλογή προεπιλε + #~ "Εφαρμογή αλλαγών;\n" + #~ "\n" + #~ "Οποιεσδήποτε αλλαγές έγιναν θα χαθούν εκτός κι αν τις εφαρμόσετε." +- + #~ msgid "_Do not apply" + #~ msgstr "_Χωρίς εφαρμογή" +- + #~ msgid "Verified" + #~ msgstr "Επαληθεύτηκε" + +@@ -3342,17 +3276,14 @@ msgstr "Επιλογή προεπιλε + #, fuzzy + #~ msgid "Local printer" + #~ msgstr "Τοπικος εκτυπωτής" +- + #~ msgid "New Clas_s" + #~ msgstr "Νέα κλά_ση" +- + #~ msgid "New _Printer" + #~ msgstr "_Νέος εκτυπωτής" + + #, fuzzy + #~ msgid "_Disable" + #~ msgstr "_Αρχείο" +- + #~ msgid "_Edit" + #~ msgstr "_Επεξεργασία" + +@@ -3381,10 +3312,8 @@ msgstr "Επιλογή προεπιλε + #~ "May contain any printable characters except \"/\", \"#\", and space.\n" + #~ "Name must be unique on the local machine!" + #~ msgstr "Μπορεί να περιέχει χαρακτήρες εκτός των \"/\", \"#\" και το κενό" +- + #~ msgid "No default printer set." + #~ msgstr "Δεν ορίστηκε προεπιλεγμένος εκτυπωτής." +- + #~ msgid "Cancel Tests" + #~ msgstr "Ακύρωση ελέγχων" + +@@ -3395,7 +3324,6 @@ msgstr "Επιλογή προεπιλε + #, fuzzy + #~ msgid "Make Default" + #~ msgstr "_Προεπιλογή" +- + #~ msgid "User name:" + #~ msgstr "Όνομα χρήστη:" + +@@ -3430,57 +3358,40 @@ msgstr "Επιλογή προεπιλε + #~ msgstr "" + #~ "Ο απομακρυσμένος διακομιστής δε δέχθηκε την εκτύπωση, κατά πάσα " + #~ "πιθανότητα ο εκτυπωτής δε διατίθεται για κοινή χρήση." +- + #~ msgid "Hostname" + #~ msgstr "Όνομα συστήματος" +- + #~ msgid "Printername" + #~ msgstr "Όνομα εκτυπωτή" +- + #~ msgid "Default printer is %s" + #~ msgstr "Ο προεπιλεγμένος εκτυπωτής είναι %s" +- + #~ msgid "Going to create a new class %s." + #~ msgstr "Θα δημιουργηθεί νέα κλάση %s." +- + #~ msgid " PPD " + #~ msgstr " PPD " +- + #~ msgid "Comment about the Printer" + #~ msgstr "Σχόλιο για τον εκτυπωτή" +- + #~ msgid "Information about the PPD" + #~ msgstr "Σχόλιο για το PPD" +- + #~ msgid "About" + #~ msgstr "Περί" +- + #~ msgid "About System-Config-Printer" + #~ msgstr "Περί ρύθμισης εκτυπωτών" +- + #~ msgid "Apply" + #~ msgstr "Εφαρμογή" +- + #~ msgid "Authors" + #~ msgstr "Δημιουργοί" +- + #~ msgid "Class Members" + #~ msgstr "Μέλη κλάσης" +- + #~ msgid "Comments: " + #~ msgstr "Σχόλια: " +- + #~ msgid "Device" + #~ msgstr "Συσκευή" +- + #~ msgid "Driver" + #~ msgstr "Οδηγός" +- + #~ msgid "Make Default Printer" + #~ msgstr "Προεπιλογή εκτυπωτή" +- + #~ msgid "PPD" + #~ msgstr "PPD" +- + #~ msgid "System-Config-Printer %s" + #~ msgstr "Ρύθμιση εκτυπωτών %s" ++ +diff -up system-config-printer-1.1.10/po/it.po.a6cf4d3 system-config-printer-1.1.10/po/it.po +--- system-config-printer-1.1.10/po/it.po.a6cf4d3 2009-07-22 13:25:20.000000000 +0100 ++++ system-config-printer-1.1.10/po/it.po 2009-07-31 15:09:03.241086937 +0100 +@@ -1,21 +1,22 @@ +-# translation of system-config-printer.1.1.x.it.po to Italiano ++# translation of system-config-printer.master.it.po to Italiano + # Copyright (C) 2001 Red Hat, Inc. + # Gabriella Bertilaccio , 2001. + # Bettina De Monti , 2001. + # Valentina Besi , 2001. + # Francesco Valente , 2003, 2004. +-# Francesco Tombolini , 2006, 2007, 2009. ++# Francesco Tombolini , 2006, 2007, 2008, 2009. + # Guido Grazioli , 2008. + # Silvio Pierro , 2009. ++# Daniele Catanesi , 2009. + # + # + msgid "" + msgstr "" + "Project-Id-Version: system-config-printer.master.it\n" + "Report-Msgid-Bugs-To: https://bugzilla.redhat.com/bugzilla\n" +-"POT-Creation-Date: 2009-07-22 13:20+0100\n" +-"PO-Revision-Date: 2009-03-28 13:00+0100\n" +-"Last-Translator: Pierro Silvio \n" ++"POT-Creation-Date: 2009-07-11 16:33+0100\n" ++"PO-Revision-Date: 2009-07-29 06:47+0100\n" ++"Last-Translator: Daniele Catanesi \n" + "Language-Team: Italian\n" + "MIME-Version: 1.0\n" + "Content-Type: text/plain; charset=UTF-8\n" +@@ -47,23 +48,20 @@ msgid "Browse Servers" + msgstr "Sfoglia server" + + #: ../AdvancedServerSettings.py:93 +-msgid "" +-"Usually print servers broadcast their queues. Specify print servers below " +-"to periodically ask for queues instead." +-msgstr "" +-"Generalmente i server di stampa trasmettono le proprie code. Specifica di " +-"seguito i server di stampa in modo da richiedere periodicamente le code di " +-"stampa." ++msgid "Usually print servers broadcast their queues. Specify print servers below to periodically ask for queues instead." ++msgstr "Generalmente i server di stampa trasmettono le proprie code. Specifica di seguito i server di stampa in modo da richiedere periodicamente le code di stampa." + + #: ../AdvancedServerSettings.py:214 + msgid "Enter IP address" + msgstr "Inserire indirizzo IP" + +-#: ../authconn.py:35 ../glade/NewPrinterWindow.glade.h:106 ++#: ../authconn.py:35 ++#: ../glade/NewPrinterWindow.glade.h:107 + msgid "Username:" + msgstr "Nome utente:" + +-#: ../authconn.py:36 ../glade/NewPrinterWindow.glade.h:75 ++#: ../authconn.py:36 ++#: ../glade/NewPrinterWindow.glade.h:76 + msgid "Password:" + msgstr "Password:" + +@@ -71,7 +69,8 @@ msgstr "Password:" + msgid "Domain:" + msgstr "Dominio:" + +-#: ../authconn.py:46 ../authconn.py:412 ++#: ../authconn.py:46 ++#: ../authconn.py:412 + msgid "Authentication" + msgstr "Autenticazione" + +@@ -88,7 +87,8 @@ msgstr "Richiesta non autorizzata (%s)" + msgid "You are not authorized to carry out the requested action." + msgstr "Non si è autorizzati a portare a termine l'azione richiesta." + +-#: ../authconn.py:213 ../authconn.py:234 ++#: ../authconn.py:213 ++#: ../authconn.py:234 + msgid "Operation canceled" + msgstr "Operazione annullata" + +@@ -97,11 +97,14 @@ msgstr "Operazione annullata" + msgid "CUPS server error (%s)" + msgstr "Errore del server CUPS (%s)" + +-#: ../authconn.py:253 ../errordialogs.py:56 ../errordialogs.py:70 ++#: ../authconn.py:253 ++#: ../errordialogs.py:56 ++#: ../errordialogs.py:70 + msgid "CUPS server error" + msgstr "Errore del server CUPS" + +-#: ../authconn.py:262 ../errordialogs.py:57 ++#: ../authconn.py:262 ++#: ../errordialogs.py:57 + #: ../troubleshoot/PrintTestPage.py:417 + #, python-format + msgid "There was an error during the CUPS operation: '%s'." +@@ -111,12 +114,16 @@ msgstr "Si è verificato un errore duran + msgid "Retry" + msgstr "Riprova" + +-#: ../authconn.py:386 ../authconn.py:388 ../errordialogs.py:65 ../pysmb.py:75 ++#: ../authconn.py:386 ++#: ../authconn.py:388 ++#: ../errordialogs.py:65 ++#: ../pysmb.py:75 + #: ../pysmb.py:77 + msgid "Not authorized" + msgstr "Non autorizzato" + +-#: ../authconn.py:389 ../pysmb.py:78 ++#: ../authconn.py:389 ++#: ../pysmb.py:78 + msgid "The password may be incorrect." + msgstr "La password potrebbe non essere corretta." + +@@ -126,12 +133,8 @@ msgid "Authentication (%s)" + msgstr "Autenticazione (%s)" + + #: ../errordialogs.py:66 +-msgid "" +-"The password may be incorrect, or the server may be configured to deny " +-"remote administration." +-msgstr "" +-"La password potrebbe non essere corretta, o il server potrebbe essere " +-"configurato per negare l'amministrazione remota." ++msgid "The password may be incorrect, or the server may be configured to deny remote administration." ++msgstr "La password potrebbe non essere corretta, o il server potrebbe essere configurato per negare l'amministrazione remota." + + #: ../errordialogs.py:72 + msgid "Bad request" +@@ -153,7 +156,8 @@ msgstr "Aggiornamento necessario" + msgid "Server error" + msgstr "Errore del server" + +-#: ../errordialogs.py:82 ../system-config-printer.py:1219 ++#: ../errordialogs.py:82 ++#: ../system-config-printer.py:1241 + msgid "Not connected" + msgstr "Non connesso" + +@@ -175,7 +179,8 @@ msgstr "_Nuovo gruppo" + msgid "_New Group from Selection" + msgstr "_Nuovo gruppo dalla selezione" + +-#: ../GroupsPane.py:98 ../system-config-printer.py:411 ++#: ../GroupsPane.py:98 ++#: ../system-config-printer.py:412 + msgid "_Rename" + msgstr "_Rinomina" + +@@ -186,8 +191,7 @@ msgstr "L'oggetto non può essere rinomi + #: ../GroupsPane.py:171 + #, python-format + msgid "The name \"%s\" is already in use. Please use a different name." +-msgstr "" +-"Il nome \"%s\" è già utilizzato. Si prega di utilizzare un nome differente." ++msgstr "Il nome \"%s\" è già utilizzato. Si prega di utilizzare un nome differente." + + #: ../GroupsPane.py:290 + #, python-format +@@ -195,13 +199,8 @@ msgid "Are you sure you want to permanen + msgstr "Si è certi di voler eliminare permanentemente \"%s\"?" + + #: ../GroupsPane.py:296 +-msgid "" +-"This will not delete any printer queues from your computer. To delete queues " +-"completely, you must delete them from the 'All Printers' group." +-msgstr "" +-"Questo non cancellerà alcuna coda di stampa dal computer in uso. Per " +-"cancellare completamente le code, è necessario eliminarle dal gruppo 'Tutte " +-"le stampanti'." ++msgid "This will not delete any printer queues from your computer. To delete queues completely, you must delete them from the 'All Printers' group." ++msgstr "Questo non cancellerà alcuna coda di stampa dal computer in uso. Per cancellare completamente le code, è necessario eliminarle dal gruppo 'Tutte le stampanti'." + + #: ../GroupsPane.py:318 + msgid "New Group" +@@ -231,7 +230,8 @@ msgstr "Ristam_pa" + msgid "_Authenticate" + msgstr "_Autenticare" + +-#: ../jobviewer.py:213 ../troubleshoot/PrintTestPage.py:82 ++#: ../jobviewer.py:213 ++#: ../troubleshoot/PrintTestPage.py:82 + msgid "Job" + msgstr "Lavoro" + +@@ -239,12 +239,15 @@ msgstr "Lavoro" + msgid "User" + msgstr "Utente" + +-#: ../jobviewer.py:215 ../troubleshoot/PrintTestPage.py:86 ++#: ../jobviewer.py:215 ++#: ../troubleshoot/PrintTestPage.py:86 + msgid "Document" + msgstr "Documento" + +-#: ../jobviewer.py:216 ../my-default-printer.py:153 +-#: ../system-config-printer.py:384 ../system-config-printer.py:1367 ++#: ../jobviewer.py:216 ++#: ../my-default-printer.py:153 ++#: ../system-config-printer.py:385 ++#: ../system-config-printer.py:1389 + #: ../troubleshoot/PrintTestPage.py:84 + msgid "Printer" + msgstr "Stampante" +@@ -257,7 +260,8 @@ msgstr "Dimensione" + msgid "Time submitted" + msgstr "Ora d'invio" + +-#: ../jobviewer.py:219 ../troubleshoot/PrintTestPage.py:87 ++#: ../jobviewer.py:219 ++#: ../troubleshoot/PrintTestPage.py:87 + msgid "Status" + msgstr "Stato" + +@@ -279,17 +283,26 @@ msgstr "tutti i lavori" + msgid "Document Print Status (%s)" + msgstr "Stato di stampa del documento (%s)" + +-#: ../jobviewer.py:395 ../jobviewer.py:460 ../jobviewer.py:461 +-#: ../jobviewer.py:512 ../jobviewer.py:629 ../jobviewer.py:756 +-#: ../jobviewer.py:1232 ../jobviewer.py:1258 ../system-config-printer.py:2555 +-#: ../glade/NewPrinterWindow.glade.h:104 ++#: ../jobviewer.py:395 ++#: ../jobviewer.py:460 ++#: ../jobviewer.py:461 ++#: ../jobviewer.py:512 ++#: ../jobviewer.py:629 ++#: ../jobviewer.py:756 ++#: ../jobviewer.py:1232 ++#: ../jobviewer.py:1258 ++#: ../system-config-printer.py:2577 ++#: ../glade/NewPrinterWindow.glade.h:105 + #: ../troubleshoot/ChooseNetworkPrinter.py:101 + #: ../troubleshoot/ChooseNetworkPrinter.py:102 + #: ../troubleshoot/ChooseNetworkPrinter.py:105 + #: ../troubleshoot/ChooseNetworkPrinter.py:106 +-#: ../troubleshoot/ChoosePrinter.py:87 ../troubleshoot/ChoosePrinter.py:88 +-#: ../troubleshoot/ChoosePrinter.py:91 ../troubleshoot/ChoosePrinter.py:92 +-#: ../troubleshoot/DeviceListed.py:92 ../troubleshoot/DeviceListed.py:93 ++#: ../troubleshoot/ChoosePrinter.py:87 ++#: ../troubleshoot/ChoosePrinter.py:88 ++#: ../troubleshoot/ChoosePrinter.py:91 ++#: ../troubleshoot/ChoosePrinter.py:92 ++#: ../troubleshoot/DeviceListed.py:92 ++#: ../troubleshoot/DeviceListed.py:93 + msgid "Unknown" + msgstr "Sconosciuto" + +@@ -333,7 +346,8 @@ msgstr "%d settimane fa" + msgid "Held for authentication" + msgstr "Sospesa per autenticazione" + +-#: ../jobviewer.py:566 ../troubleshoot/PrintTestPage.py:42 ++#: ../jobviewer.py:566 ++#: ../troubleshoot/PrintTestPage.py:42 + msgid "Held" + msgstr "Mantieni" + +@@ -366,33 +380,40 @@ msgstr "Mantieni fino al terzo tentativo + msgid "Held until weekend" + msgstr "Mantieni fino al fine settimana" + +-#: ../jobviewer.py:619 ../troubleshoot/PrintTestPage.py:41 ++#: ../jobviewer.py:619 ++#: ../troubleshoot/PrintTestPage.py:41 + msgid "Pending" + msgstr "In corso" + +-#: ../jobviewer.py:620 ../system-config-printer.py:198 ++#: ../jobviewer.py:620 ++#: ../system-config-printer.py:198 + #: ../troubleshoot/PrintTestPage.py:43 + msgid "Processing" + msgstr "In elaborazione" + +-#: ../jobviewer.py:621 ../system-config-printer.py:200 ++#: ../jobviewer.py:621 ++#: ../system-config-printer.py:200 + #: ../troubleshoot/PrintTestPage.py:44 + msgid "Stopped" + msgstr "Arrestata" + +-#: ../jobviewer.py:622 ../troubleshoot/PrintTestPage.py:45 ++#: ../jobviewer.py:622 ++#: ../troubleshoot/PrintTestPage.py:45 + msgid "Canceled" + msgstr "Annullata" + +-#: ../jobviewer.py:623 ../troubleshoot/PrintTestPage.py:46 ++#: ../jobviewer.py:623 ++#: ../troubleshoot/PrintTestPage.py:46 + msgid "Aborted" + msgstr "Interrotta" + +-#: ../jobviewer.py:624 ../troubleshoot/PrintTestPage.py:47 ++#: ../jobviewer.py:624 ++#: ../troubleshoot/PrintTestPage.py:47 + msgid "Completed" + msgstr "Completata" + +-#: ../jobviewer.py:697 ../jobviewer.py:786 ++#: ../jobviewer.py:697 ++#: ../jobviewer.py:786 + msgid "authenticating job" + msgstr "Autenticazione lavoro" + +@@ -435,9 +456,8 @@ msgid "%d documents queued" + msgstr "%d documenti nella coda di stampa" + + #: ../jobviewer.py:1259 +-#, fuzzy + msgid "Document printed" +-msgstr "Documento" ++msgstr "Documento stampato" + + #: ../jobviewer.py:1260 + #, python-format +@@ -447,26 +467,21 @@ msgstr "La stampa del documento `%s' è + #: ../jobviewer.py:1419 + #, python-format + msgid "There was a problem sending document `%s' (job %d) to the printer." +-msgstr "" +-"Si è verificato un problema durante l'invio del documento `%s' (lavoro %d) " +-"alla stampante." ++msgstr "Si è verificato un problema durante l'invio del documento `%s' (lavoro %d) alla stampante." + + #: ../jobviewer.py:1422 + #, python-format + msgid "There was a problem processing document `%s' (job %d)." +-msgstr "" +-"Si è verificato un problema durante l'elaborazione del documento `%" +-"s' (lavoro %d)." ++msgstr "Si è verificato un problema durante l'elaborazione del documento `%s' (lavoro %d)." + + #. Give up and use the provided message untranslated. + #: ../jobviewer.py:1428 + #, python-format + msgid "There was a problem printing document `%s' (job %d): `%s'." +-msgstr "" +-"Si è verificato un errore durante la stampa del documento `%s' (lavoro %d): `" +-"%s'." ++msgstr "Si è verificato un errore durante la stampa del documento `%s' (lavoro %d): `%s'." + +-#: ../jobviewer.py:1435 ../jobviewer.py:1451 ++#: ../jobviewer.py:1435 ++#: ../jobviewer.py:1451 + msgid "Print Error" + msgstr "Errore di stampa" + +@@ -479,19 +494,24 @@ msgstr "_Diagnostica" + msgid "The printer called `%s' has been disabled." + msgstr "La stampante chiamata `%s' è stata disabilitata." + +-#: ../my-default-printer.py:137 ../my-default-printer.desktop.in.h:1 ++#: ../my-default-printer.py:137 ++#: ../my-default-printer.desktop.in.h:1 + msgid "Default Printer" + msgstr "Stampante predefinita" + +-#: ../my-default-printer.py:141 ../my-default-printer.py:177 ++#: ../my-default-printer.py:141 ++#: ../my-default-printer.py:177 + msgid "_Use System Default" + msgstr "_Usa valori predefiniti" + +-#: ../my-default-printer.py:142 ../my-default-printer.py:179 ++#: ../my-default-printer.py:142 ++#: ../my-default-printer.py:179 + msgid "_Set Default" + msgstr "Impo_sta predefinita" + +-#: ../my-default-printer.py:158 ../system-config-printer.py:441 ++#: ../my-default-printer.py:158 ++#: ../system-config-printer.py:442 ++#: ../system-config-printer.py:3704 + #: ../troubleshoot/ChooseNetworkPrinter.py:37 + #: ../troubleshoot/ChoosePrinter.py:38 + msgid "Location" +@@ -521,7 +541,8 @@ msgstr "Comportamento predefinito" + msgid "Authenticated" + msgstr "Autenticato" + +-#: ../ppdippstr.py:50 ../system-config-printer.py:6133 ++#: ../ppdippstr.py:50 ++#: ../system-config-printer.py:6287 + msgid "None" + msgstr "Nessuna" + +@@ -736,9 +757,7 @@ msgstr "1200 dpi, foto, cartuccia nero + + + #: ../system-config-printer.py:140 + msgid "To do this, select System->Administration->Firewall from the main menu." +-msgstr "" +-"Per fare questo, selezionare dal menu principale Sistema->Amministrazione-" +-">Firewall." ++msgstr "Per fare questo, selezionare dal menu principale Sistema->Amministrazione->Firewall." + + #: ../system-config-printer.py:197 + msgid "Idle" +@@ -748,111 +767,117 @@ msgstr "In attesa" + msgid "Busy" + msgstr "Occupata" + +-#: ../system-config-printer.py:390 ../system-config-printer.py:1373 ++#: ../system-config-printer.py:391 ++#: ../system-config-printer.py:1395 + msgid "Class" + msgstr "Classe" + +-#: ../system-config-printer.py:417 ++#: ../system-config-printer.py:418 + msgid "Set As De_fault" + msgstr "Imposta come Pr_edefinita" + +-#: ../system-config-printer.py:421 ++#: ../system-config-printer.py:422 + msgid "_Create class" + msgstr "_Crea classe" + +-#: ../system-config-printer.py:423 ++#: ../system-config-printer.py:424 + msgid "View Print _Queue" + msgstr "Visualizza _Coda di Stampa" + +-#: ../system-config-printer.py:425 ++#: ../system-config-printer.py:426 + msgid "_Add to Group" + msgstr "_Aggiungi al gruppo" + +-#: ../system-config-printer.py:427 ++#: ../system-config-printer.py:428 + msgid "Save Results as _Group" + msgstr "Salva i risultati come _Gruppo" + +-#: ../system-config-printer.py:429 ++#: ../system-config-printer.py:430 + msgid "Save Filter as _Search Group" + msgstr "Salva i filtri come _Cerca Gruppo" + +-#: ../system-config-printer.py:433 ++#: ../system-config-printer.py:434 + msgid "E_nabled" + msgstr "A_bilita" + +-#: ../system-config-printer.py:435 ++#: ../system-config-printer.py:436 + msgid "_Shared" + msgstr "_Condivisa" + +-#: ../system-config-printer.py:439 ../troubleshoot/ChooseNetworkPrinter.py:35 +-#: ../troubleshoot/ChoosePrinter.py:36 ../troubleshoot/DeviceListed.py:36 ++#: ../system-config-printer.py:440 ++#: ../troubleshoot/ChooseNetworkPrinter.py:35 ++#: ../troubleshoot/ChoosePrinter.py:36 ++#: ../troubleshoot/DeviceListed.py:36 + msgid "Name" + msgstr "Nome" + +-#: ../system-config-printer.py:440 ++#: ../system-config-printer.py:441 + msgid "Description" + msgstr "Descrizione" + +-#: ../system-config-printer.py:442 ++#: ../system-config-printer.py:443 + msgid "Manufacturer / Model" + msgstr "Produttore / Modello" + + #. Printer state reasons list +-#: ../system-config-printer.py:517 ++#: ../system-config-printer.py:518 + msgid "Message" + msgstr "Messaggio" + +-#: ../system-config-printer.py:552 ++#: ../system-config-printer.py:553 + msgid "Problems?" + msgstr "Problemi?" + +-#: ../system-config-printer.py:655 ../system-config-printer.py:657 ++#: ../system-config-printer.py:656 ++#: ../system-config-printer.py:658 + msgid "Members of this class" + msgstr "Appartenenti a questa classe" + +-#: ../system-config-printer.py:656 ../system-config-printer.py:658 ++#: ../system-config-printer.py:657 ++#: ../system-config-printer.py:659 + msgid "Others" + msgstr "Altre" + +-#: ../system-config-printer.py:659 ++#: ../system-config-printer.py:660 + msgid "Devices" + msgstr "Dispositivi" + +-#: ../system-config-printer.py:660 ++#: ../system-config-printer.py:661 + msgid "Connections" + msgstr "Connessioni" + +-#: ../system-config-printer.py:661 ++#: ../system-config-printer.py:662 + msgid "Makes" + msgstr "Produttori" + +-#: ../system-config-printer.py:662 ++#: ../system-config-printer.py:663 + msgid "Models" + msgstr "Modelli" + +-#: ../system-config-printer.py:663 ++#: ../system-config-printer.py:664 + msgid "Drivers" + msgstr "Driver" + +-#: ../system-config-printer.py:664 ../glade/NewPrinterWindow.glade.h:54 ++#: ../system-config-printer.py:665 ++#: ../glade/NewPrinterWindow.glade.h:54 + msgid "Downloadable Drivers" + msgstr "Driver disponibili per il download" + +-#: ../system-config-printer.py:665 ++#: ../system-config-printer.py:666 + msgid "Users" + msgstr "Utenti" + +-#: ../system-config-printer.py:700 ++#: ../system-config-printer.py:701 + msgid "Automatic rotation" + msgstr "Rotazione automatica" + +-#: ../system-config-printer.py:986 ++#: ../system-config-printer.py:1008 + #, python-format + msgid "Printer Properties - '%s' on %s" + msgstr "Proprietà stampante - '%s' su %s" + + #. The Conflict button was pressed. +-#: ../system-config-printer.py:994 ++#: ../system-config-printer.py:1016 + msgid "" + "There are conflicting options.\n" + "Changes can only be applied after\n" +@@ -862,78 +887,86 @@ msgstr "" + "I cambiamenti possono essere applicati solo\n" + "dopo la risoluzione dei conflitti." + +-#: ../system-config-printer.py:1213 ++#: ../system-config-printer.py:1235 + #, python-format + msgid "Printer configuration - %s" + msgstr "Configurazione stampante - %s" + +-#: ../system-config-printer.py:1217 ++#: ../system-config-printer.py:1239 + #, python-format + msgid "Connected to %s" + msgstr "Connesso a %s" + + #. Update our copy of the printer's settings. +-#: ../system-config-printer.py:1257 ../system-config-printer.py:2045 ++#: ../system-config-printer.py:1279 ++#: ../system-config-printer.py:2067 + msgid "obtaining queue details" + msgstr "recupero dettagli coda" + +-#: ../system-config-printer.py:1295 ++#: ../system-config-printer.py:1317 + msgid "Remove from Group" + msgstr "Rimuovere dal Gruppo" + +-#: ../system-config-printer.py:1361 ++#: ../system-config-printer.py:1383 + msgid "Network printer (discovered)" + msgstr "Stampante di rete (scoperta)" + +-#: ../system-config-printer.py:1364 ++#: ../system-config-printer.py:1386 + msgid "Network class (discovered)" + msgstr "Classe di rete (scoperta)" + +-#: ../system-config-printer.py:1370 ../system-config-printer.py:5437 +-#: ../system-config-printer.py:5507 ../system-config-printer.py:5509 ++#: ../system-config-printer.py:1392 ++#: ../system-config-printer.py:5591 ++#: ../system-config-printer.py:5661 ++#: ../system-config-printer.py:5663 + msgid "Fax" + msgstr "Fax" + +-#: ../system-config-printer.py:1376 ../system-config-printer.py:1382 ++#: ../system-config-printer.py:1398 ++#: ../system-config-printer.py:1404 + #: ../troubleshoot/LocalOrRemote.py:30 + msgid "Network printer" + msgstr "Stampante di rete" + +-#: ../system-config-printer.py:1379 ++#: ../system-config-printer.py:1401 + msgid "Network print share" + msgstr "Condivisione di stampa di rete" + +-#: ../system-config-printer.py:1508 ../glade/ConnectingDialog.glade.h:2 ++#: ../system-config-printer.py:1530 ++#: ../glade/ConnectingDialog.glade.h:2 + #, no-c-format, python-format + msgid "Opening connection to %s" + msgstr "Apertura connessione a %s" + +-#: ../system-config-printer.py:1890 ++#: ../system-config-printer.py:1912 + msgid "Installable Options" + msgstr "Opzioni installabili" + +-#: ../system-config-printer.py:1891 ++#: ../system-config-printer.py:1913 + #: ../glade/PrinterPropertiesDialog.glade.h:109 + msgid "Printer Options" + msgstr "Opzioni stampante" + +-#: ../system-config-printer.py:1927 ++#: ../system-config-printer.py:1949 + #, python-format + msgid "modifying class %s" + msgstr "modifica classe %s" + +-#: ../system-config-printer.py:1929 ../system-config-printer.py:3038 +-#: ../system-config-printer.py:3063 ../system-config-printer.py:6421 +-#: ../system-config-printer.py:6433 ../system-config-printer.py:6455 ++#: ../system-config-printer.py:1951 ++#: ../system-config-printer.py:3060 ++#: ../system-config-printer.py:3085 ++#: ../system-config-printer.py:6575 ++#: ../system-config-printer.py:6587 ++#: ../system-config-printer.py:6609 + #, python-format + msgid "modifying printer %s" + msgstr "modifica stampante %s" + +-#: ../system-config-printer.py:1944 ++#: ../system-config-printer.py:1966 + msgid "This will delete this class!" + msgstr "Questa classe verrà cancellata!" + +-#: ../system-config-printer.py:1945 ++#: ../system-config-printer.py:1967 + msgid "Proceed anyway?" + msgstr "Procedere comunque?" + +@@ -941,65 +974,65 @@ msgstr "Procedere comunque?" + #. but we have never fetched the server settings to see whether + #. the server is publishing shared printers. Fetch the settings + #. now so that we can update the "not published" label if necessary. +-#: ../system-config-printer.py:2033 ../system-config-printer.py:3222 ++#: ../system-config-printer.py:2055 ++#: ../system-config-printer.py:3244 + msgid "fetching server settings" + msgstr "recupero impostazioni del server" + +-#: ../system-config-printer.py:2103 ++#: ../system-config-printer.py:2125 + msgid "Set Default Printer" + msgstr "Imposta stampante predefinita" + +-#: ../system-config-printer.py:2105 ++#: ../system-config-printer.py:2127 + msgid "Do you want to set this as the system-wide default printer?" +-msgstr "" +-"Si desidera impostare la stampante come predefinita per l'intero sistema?" ++msgstr "Si desidera impostare la stampante come predefinita per l'intero sistema?" + +-#: ../system-config-printer.py:2107 ++#: ../system-config-printer.py:2129 + msgid "Set as the _system-wide default printer" + msgstr "Imposta come stampante predefinita per l'intero _sistema" + +-#: ../system-config-printer.py:2109 ++#: ../system-config-printer.py:2131 + msgid "_Clear my personal default setting" + msgstr "_Resetta le impostazioni predefinite personali" + +-#: ../system-config-printer.py:2110 ++#: ../system-config-printer.py:2132 + msgid "Set as my _personal default printer" + msgstr "Imposta come stampante predefinita _personale" + +-#: ../system-config-printer.py:2115 ++#: ../system-config-printer.py:2137 + msgid "setting default printer" + msgstr "impostazione stampante predefinita" + +-#: ../system-config-printer.py:2172 ++#: ../system-config-printer.py:2194 + msgid "printing test page" + msgstr "stampa pagina di prova" + +-#: ../system-config-printer.py:2185 ../system-config-printer.py:2220 ++#: ../system-config-printer.py:2207 ++#: ../system-config-printer.py:2242 ++#: ../system-config-printer.py:5481 + msgid "Not possible" + msgstr "Impossibile" + +-#: ../system-config-printer.py:2186 ../system-config-printer.py:2221 +-msgid "" +-"The remote server did not accept the print job, most likely because the " +-"printer is not shared." +-msgstr "" +-"Il server remoto non accetta il lavoro di stampa, molto probabilmente perché " +-"la stampante non è condivisa." ++#: ../system-config-printer.py:2208 ++#: ../system-config-printer.py:2243 ++msgid "The remote server did not accept the print job, most likely because the printer is not shared." ++msgstr "Il server remoto non accetta il lavoro di stampa, molto probabilmente perché la stampante non è condivisa." + +-#: ../system-config-printer.py:2198 ../system-config-printer.py:2213 ++#: ../system-config-printer.py:2220 ++#: ../system-config-printer.py:2235 + msgid "Submitted" + msgstr "Inviato" + +-#: ../system-config-printer.py:2199 ++#: ../system-config-printer.py:2221 + #, python-format + msgid "Test page submitted as job %d" + msgstr "Pagina di prova inviata come lavoro %d" + +-#: ../system-config-printer.py:2206 ++#: ../system-config-printer.py:2228 + msgid "sending maintenance command" + msgstr "invio comando di manutenzione" + +-#: ../system-config-printer.py:2214 ++#: ../system-config-printer.py:2236 + #, python-format + msgid "Maintenance command submitted as job %d" + msgstr "Comando di manutenzione inviato come lavoro %d" +@@ -1007,74 +1040,70 @@ msgstr "Comando di manutenzione inviato + #. The underlying cupsGetPPD2() function returned NULL without + #. setting an IPP error, so it'll be something like a failed + #. connection. +-#: ../system-config-printer.py:2288 ../system-config-printer.py:2384 ++#: ../system-config-printer.py:2310 ++#: ../system-config-printer.py:2406 + msgid "Error" + msgstr "Errore" + +-#: ../system-config-printer.py:2289 ++#: ../system-config-printer.py:2311 + msgid "There was a problem connecting to the CUPS server." + msgstr "Si è verificato un problema durante la connessione al server CUPS." + +-#: ../system-config-printer.py:2385 ++#: ../system-config-printer.py:2407 + #, python-format + msgid "Option '%s' has value '%s' and cannot be edited." + msgstr "L'opzione '%s' con valore '%s' non può essere modificata." + +-#: ../system-config-printer.py:2475 ++#: ../system-config-printer.py:2497 + msgid "Marker levels are not reported for this printer." + msgstr "Gli indicatori di livello non sono disponibili per questa stampante." + +-#: ../system-config-printer.py:2774 ++#: ../system-config-printer.py:2796 + msgid "Cannot Rename" + msgstr "Impossibile rinominare" + +-#: ../system-config-printer.py:2775 ++#: ../system-config-printer.py:2797 + msgid "There are queued jobs." + msgstr "Ci sono dei lavori nelle code di stampa." + +-#: ../system-config-printer.py:2841 ++#: ../system-config-printer.py:2863 + msgid "renaming printer" + msgstr "rinomina stampante" + + #. for classes make sure all members + #. will get added +-#: ../system-config-printer.py:2926 ++#: ../system-config-printer.py:2948 + msgid "copying printer" + msgstr "copia stampante" + +-#: ../system-config-printer.py:2990 ++#: ../system-config-printer.py:3012 + #, python-format + msgid "Really delete class '%s'?" + msgstr "Si vuole realmente eliminare la classe '%s'?" + +-#: ../system-config-printer.py:2992 ++#: ../system-config-printer.py:3014 + #, python-format + msgid "Really delete printer '%s'?" + msgstr "Si vuole realmente eliminare la stampante '%s'?" + +-#: ../system-config-printer.py:2994 ++#: ../system-config-printer.py:3016 + msgid "Really delete selected destinations?" + msgstr "Si desidera realmente eliminare le destinazioni selezionate?" + +-#: ../system-config-printer.py:3015 ++#: ../system-config-printer.py:3037 + #, python-format + msgid "deleting printer %s" + msgstr "cancellazione stampante %s" + +-#: ../system-config-printer.py:3089 ++#: ../system-config-printer.py:3111 + msgid "Publish Shared Printers" + msgstr "Pubblica stampanti condivise" + +-#: ../system-config-printer.py:3090 +-msgid "" +-"Shared printers are not available to other people unless the 'Publish shared " +-"printers' option is enabled in the server settings." +-msgstr "" +-"Le stampanti condivise non sono disponibili ad altri utenti, a meno che non " +-"sia stata abilitata l'opzione 'Pubblica stampanti condivise' nelle " +-"impostazioni del server." ++#: ../system-config-printer.py:3112 ++msgid "Shared printers are not available to other people unless the 'Publish shared printers' option is enabled in the server settings." ++msgstr "Le stampanti condivise non sono disponibili ad altri utenti, a meno che non sia stata abilitata l'opzione 'Pubblica stampanti condivise' nelle impostazioni del server." + +-#: ../system-config-printer.py:3283 ++#: ../system-config-printer.py:3305 + msgid "modifying server settings" + msgstr "modifica impostazioni del server" + +@@ -1084,346 +1113,362 @@ msgstr "modifica impostazioni del server + #. be unblocked. Unfortunately, this is not yet possible + #. (bug #440469). However, we can display a dialog to suggest + #. that now might be a good time to review the firewall settings. +-#: ../system-config-printer.py:3308 ++#: ../system-config-printer.py:3330 + msgid "Review Firewall" + msgstr "Ricontrolla il firewall" + +-#: ../system-config-printer.py:3309 +-msgid "" +-"You may need to adjust the firewall to allow network printing to this " +-"computer." +-msgstr "" +-"Potrebbe essere necessario modificare il firewall per abilitare la stampa di " +-"rete su questo computer." ++#: ../system-config-printer.py:3331 ++msgid "You may need to adjust the firewall to allow network printing to this computer." ++msgstr "Potrebbe essere necessario modificare il firewall per abilitare la stampa di rete su questo computer." + +-#: ../system-config-printer.py:3639 ++#: ../system-config-printer.py:3667 + msgid "Browsing not available (pysmbc not installed)" + msgstr "Esplorazione non disponibile (pysmbc non installato)" + + #. SMB list columns +-#: ../system-config-printer.py:3645 ++#: ../system-config-printer.py:3673 + msgid "Share" + msgstr "Condivisione" + +-#: ../system-config-printer.py:3651 ++#: ../system-config-printer.py:3679 + msgid "Comment" + msgstr "Commento" + +-#: ../system-config-printer.py:3665 +-msgid "" +-"PostScript Printer Description files (*.ppd, *.PPD, *.ppd.gz, *.PPD.gz, *." +-"PPD.GZ)" +-msgstr "" +-"Descrizione stampante PostScript (*.ppd, *.PPD, *.ppd.gz, *.PPD.gz, *.PPD.GZ)" ++#. IPP list columns ++#: ../system-config-printer.py:3698 ++msgid "Queue" ++msgstr "Coda" ++ ++#: ../system-config-printer.py:3712 ++msgid "PostScript Printer Description files (*.ppd, *.PPD, *.ppd.gz, *.PPD.gz, *.PPD.GZ)" ++msgstr "Descrizione stampante PostScript (*.ppd, *.PPD, *.ppd.gz, *.PPD.gz, *.PPD.GZ)" + +-#: ../system-config-printer.py:3674 ++#: ../system-config-printer.py:3721 + msgid "All files (*)" + msgstr "Tutti i file (*)" + +-#: ../system-config-printer.py:3710 ../system-config-printer.py:5839 +-#: ../system-config-printer.py:5877 ../applet.py:127 ++#: ../system-config-printer.py:3757 ++#: ../system-config-printer.py:5993 ++#: ../system-config-printer.py:6031 ++#: ../applet.py:127 + msgid "Search" + msgstr "Cerca" + +-#: ../system-config-printer.py:3734 ../system-config-printer.py:3758 +-#: ../glade/NewPrinterWindow.glade.h:72 ++#: ../system-config-printer.py:3781 ++#: ../system-config-printer.py:3805 ++#: ../glade/NewPrinterWindow.glade.h:73 + msgid "New Printer" + msgstr "Nuova stampante" + +-#: ../system-config-printer.py:3745 ++#: ../system-config-printer.py:3792 + msgid "New Class" + msgstr "Nuova classe" + +-#: ../system-config-printer.py:3750 ++#: ../system-config-printer.py:3797 + msgid "Change Device URI" + msgstr "Cambia URI del dispositivo" + +-#: ../system-config-printer.py:3756 ++#: ../system-config-printer.py:3803 + msgid "Change Driver" + msgstr "Cambia driver" + +-#: ../system-config-printer.py:3928 ../system-config-printer.py:4007 +-#: ../system-config-printer.py:4321 ../system-config-printer.py:4519 +-#: ../system-config-printer.py:5683 ../system-config-printer.py:5864 ++#: ../system-config-printer.py:3972 ++#: ../system-config-printer.py:4049 ++#: ../system-config-printer.py:4359 ++#: ../system-config-printer.py:4557 ++#: ../system-config-printer.py:5837 ++#: ../system-config-printer.py:6018 + msgid "Searching" + msgstr "Ricerca in corso" + +-#: ../system-config-printer.py:3929 ++#: ../system-config-printer.py:3973 + msgid "Searching for downloadable drivers" + msgstr "Ricerca driver scaricabili in corso" + +-#: ../system-config-printer.py:4008 ../system-config-printer.py:4322 ++#: ../system-config-printer.py:4050 ++#: ../system-config-printer.py:4360 + msgid "Searching for drivers" + msgstr "Ricerca driver in corso" + +-#: ../system-config-printer.py:4520 ../system-config-printer.py:5684 ++#: ../system-config-printer.py:4558 ++#: ../system-config-printer.py:5838 + msgid "Searching for printers" + msgstr "Ricerca stampanti in corso" + +-#: ../system-config-printer.py:4529 ++#: ../system-config-printer.py:4567 + msgid "fetching device list" + msgstr "recupero elenco dispositivi" + + #. Tell the user why he needs the plugin +-#: ../system-config-printer.py:4616 ++#: ../system-config-printer.py:4652 + msgid "For this printer a proprietary driver plugin from HP is available.\n" +-msgstr "" +-"Per questa stampante è disponibile un driver plugin proprietario da HP.\n" ++msgstr "Per questa stampante è disponibile un driver plugin proprietario da HP.\n" + +-#: ../system-config-printer.py:4619 ++#: ../system-config-printer.py:4655 + msgid "" + "The installation of the plugin is required for your printer to work.\n" + "\n" + msgstr "" +-"L'installazione del plugin è necessaria per il funzionamento della " +-"stampante.\n" ++"L'installazione del plugin è necessaria per il funzionamento della stampante.\n" + "\n" + +-#: ../system-config-printer.py:4622 ++#: ../system-config-printer.py:4658 + msgid "" +-"Installing the plugin is optional, it completes or enhances the " +-"functionality\n" ++"Installing the plugin is optional, it completes or enhances the functionality\n" + "of your printer. Without plugin at least basic operations work.\n" + "\n" + msgstr "" +-"L'installazione del plugin è opzionale, esso completa o evolve le " +-"funzionalità\n" ++"L'installazione del plugin è opzionale, esso completa o evolve le funzionalità\n" + "della stampante. Senza il plugin funzioneranno solo le operazioni basilari.\n" + "\n" + +-#: ../system-config-printer.py:4626 ++#: ../system-config-printer.py:4662 + msgid "The plugin provides the following features:\n" + msgstr "Il plugin fornisce le seguenti caratteristiche:\n" + +-#: ../system-config-printer.py:4629 ++#: ../system-config-printer.py:4665 + msgid " - Printing support\n" + msgstr " - Supporto per la stampa\n" + +-#: ../system-config-printer.py:4632 ++#: ../system-config-printer.py:4668 + msgid " - Faster printing\n" + msgstr " - Stampa più rapida\n" + +-#: ../system-config-printer.py:4635 ++#: ../system-config-printer.py:4671 + msgid " - Better printout quality\n" + msgstr " - Miglior qualità della stampa\n" + +-#: ../system-config-printer.py:4638 ++#: ../system-config-printer.py:4674 + msgid " - Extra printing features\n" + msgstr " - Caratteristiche di stampa avanzate\n" + +-#: ../system-config-printer.py:4641 ++#: ../system-config-printer.py:4677 + msgid " - Scanning support\n" + msgstr " - Supporto per la scansione\n" + +-#: ../system-config-printer.py:4644 ++#: ../system-config-printer.py:4680 + msgid " - Faster scanning\n" + msgstr " - Scansione più veloce\n" + +-#: ../system-config-printer.py:4647 ++#: ../system-config-printer.py:4683 + msgid " - Better scanning image quality\n" + msgstr " - Migliore qualità dell'immagine scansita\n" + +-#: ../system-config-printer.py:4650 ++#: ../system-config-printer.py:4686 + msgid " - Faxing support\n" + msgstr " - Supporto per i fax\n" + +-#: ../system-config-printer.py:4653 ++#: ../system-config-printer.py:4689 + msgid " - Extra fax features\n" + msgstr " - Caratteristiche fax avanzate\n" + +-#: ../system-config-printer.py:4656 ++#: ../system-config-printer.py:4692 + msgid " - Better Input/Output support\n" + msgstr " - Miglior supporto Input/Output\n" + +-#: ../system-config-printer.py:4659 ++#: ../system-config-printer.py:4695 + msgid " - Extra user interface features\n" + msgstr " - Caratteristiche avanzate nell'interfaccia utente\n" + +-#: ../system-config-printer.py:4662 ++#: ../system-config-printer.py:4698 + msgid " - Other extra features\n" + msgstr " - Altre caratteristiche avanzate\n" + +-#: ../system-config-printer.py:4667 ++#: ../system-config-printer.py:4703 + msgid "Install plugin" + msgstr "Installa plugin" + +-#: ../system-config-printer.py:4668 ++#: ../system-config-printer.py:4704 + msgid "Do not set up printer" + msgstr "Non impostare la stampante" + +-#: ../system-config-printer.py:4669 ++#: ../system-config-printer.py:4705 + msgid "Set up without plugin" + msgstr "Imposta senza plugin" + +-#: ../system-config-printer.py:4671 ../troubleshoot/PrintTestPage.py:118 ++#: ../system-config-printer.py:4707 ++#: ../troubleshoot/PrintTestPage.py:118 + msgid "Yes" + msgstr "Si" + +-#: ../system-config-printer.py:4672 ../troubleshoot/PrintTestPage.py:119 ++#: ../system-config-printer.py:4708 ++#: ../troubleshoot/PrintTestPage.py:119 + msgid "No" + msgstr "No" + +-#: ../system-config-printer.py:4841 ../system-config-printer.py:4845 ++#: ../system-config-printer.py:4878 ++#: ../system-config-printer.py:4882 + msgid " (Current)" + msgstr " (Attuale)" + +-#: ../system-config-printer.py:4898 ++#: ../system-config-printer.py:4935 + msgid "Other" + msgstr "Altro" + + #. device-info + #. PhysicalDevice obj + #. Separator? +-#: ../system-config-printer.py:4914 ++#: ../system-config-printer.py:4951 + msgid "Network Printer" + msgstr "Stampante di rete" + +-#: ../system-config-printer.py:4918 ++#: ../system-config-printer.py:4955 + msgid "Find Network Printer" + msgstr "Trova una stampante di rete" + +-#: ../system-config-printer.py:4991 ++#: ../system-config-printer.py:5028 ++#: ../system-config-printer.py:5433 + msgid "Scanning..." + msgstr "Scansione in corso..." + +-#: ../system-config-printer.py:5046 ++#: ../system-config-printer.py:5083 + msgid "No Print Shares" + msgstr "Nessuna condivisione di stampa" + +-#: ../system-config-printer.py:5047 +-msgid "" +-"There were no print shares found. Please check that the Samba service is " +-"marked as trusted in your firewall configuration." +-msgstr "" +-"Nessuna condivisione di stampa trovata. Controllare che il servizio Samba " +-"sia stato contrassegnato come fidato nella configurazione del firewall." ++#: ../system-config-printer.py:5084 ++msgid "There were no print shares found. Please check that the Samba service is marked as trusted in your firewall configuration." ++msgstr "Nessuna condivisione di stampa trovata. Controllare che il servizio Samba sia stato contrassegnato come fidato nella configurazione del firewall." + +-#: ../system-config-printer.py:5308 ../system-config-printer.py:5371 ++#: ../system-config-printer.py:5345 ++#: ../system-config-printer.py:5414 + msgid "Print Share Verified" + msgstr "Condivisione di stampa verificata" + +-#: ../system-config-printer.py:5309 ../system-config-printer.py:5372 ++#: ../system-config-printer.py:5346 ++#: ../system-config-printer.py:5415 + msgid "This print share is accessible." + msgstr "Questa stampante condivisa è accessibile." + +-#: ../system-config-printer.py:5314 ../system-config-printer.py:5376 ++#: ../system-config-printer.py:5351 ++#: ../system-config-printer.py:5419 + msgid "This print share is not accessible." + msgstr "Questa stampante condivisa è inaccessibile." + +-#: ../system-config-printer.py:5317 ++#: ../system-config-printer.py:5354 + msgid "Print Share Inaccessible" + msgstr "Condivisione di stampa non accessibile" + +-#: ../system-config-printer.py:5375 ++#: ../system-config-printer.py:5418 + msgid "Inaccessible" + msgstr "Inaccessibile" + +-#: ../system-config-printer.py:5429 ++#: ../system-config-printer.py:5482 ++#, python-format ++msgid "It is not possible to obtain a list of queues from '%s'." ++msgstr "Non è possibile ottenere l'elenco delle code di stampa da '%s'." ++ ++#: ../system-config-printer.py:5484 ++msgid "Obtaining a list of queues is a CUPS extension to IPP. Network printers do not support it." ++msgstr "L'ottenimento di un elenco di code di stampa è una estensione CUPS per IPP. Le stampanti di rete non lo supportano." ++ ++#: ../system-config-printer.py:5487 ++msgid "No queues" ++msgstr "Nessuna coda di stampa" ++ ++#: ../system-config-printer.py:5488 ++msgid "There are no queues available." ++msgstr "Non ci sono code di stampa disponibili." ++ ++#: ../system-config-printer.py:5583 + msgid "Parallel Port" + msgstr "Porta parallela" + +-#: ../system-config-printer.py:5431 ++#: ../system-config-printer.py:5585 + msgid "Serial Port" + msgstr "Porta seriale" + +-#: ../system-config-printer.py:5433 ++#: ../system-config-printer.py:5587 + msgid "USB" + msgstr "USB" + +-#: ../system-config-printer.py:5435 ../system-config-printer.py:5438 ++#: ../system-config-printer.py:5589 ++#: ../system-config-printer.py:5592 + msgid "HP Linux Imaging and Printing (HPLIP)" + msgstr "HP Linux Imaging and Printing (HPLIP)" + +-#: ../system-config-printer.py:5440 ++#: ../system-config-printer.py:5594 + msgid "Hardware Abstraction Layer (HAL)" + msgstr "Hardware Abstraction Layer (HAL)" + +-#: ../system-config-printer.py:5442 ++#: ../system-config-printer.py:5596 + msgid "AppSocket/HP JetDirect" + msgstr "AppSocket/HP JetDirect" + +-#: ../system-config-printer.py:5451 ++#: ../system-config-printer.py:5605 + #, python-format + msgid "LPD/LPR queue '%s'" + msgstr "Coda LPD/LPR '%s'" + +-#: ../system-config-printer.py:5453 ++#: ../system-config-printer.py:5607 + msgid "LPD/LPR queue" + msgstr "Coda LPD/LPR" + +-#: ../system-config-printer.py:5456 ++#: ../system-config-printer.py:5610 + msgid "Windows Printer via SAMBA" + msgstr "Stampante Windows via SAMBA" + +-#: ../system-config-printer.py:5458 ../glade/NewPrinterWindow.glade.h:64 ++#: ../system-config-printer.py:5612 ++#: ../glade/NewPrinterWindow.glade.h:65 + msgid "IPP" + msgstr "IPP" + +-#: ../system-config-printer.py:5460 ++#: ../system-config-printer.py:5614 + msgid "HTTP" + msgstr "HTTP" + +-#: ../system-config-printer.py:5542 ++#: ../system-config-printer.py:5696 + msgid "A printer connected to the parallel port." + msgstr "Una stampante connessa alla porta parallela." + +-#: ../system-config-printer.py:5544 ++#: ../system-config-printer.py:5698 + msgid "A printer connected to a USB port." + msgstr "Una stampante connessa ad una porta USB." + +-#: ../system-config-printer.py:5546 +-msgid "" +-"HPLIP software driving a printer, or the printer function of a multi-" +-"function device." +-msgstr "" +-"Il software HPLIP gestisce una stampante, o le funzioni di stampa di una " +-"periferica multi-funzionale." +- +-#: ../system-config-printer.py:5549 +-msgid "" +-"HPLIP software driving a fax machine, or the fax function of a multi-" +-"function device." +-msgstr "" +-"Il software HPLIP gestisce una macchina fax, o le funzionalità fax di una " +-"periferica multi-funzionale." ++#: ../system-config-printer.py:5700 ++msgid "HPLIP software driving a printer, or the printer function of a multi-function device." ++msgstr "Il software HPLIP gestisce una stampante, o le funzioni di stampa di una periferica multi-funzionale." ++ ++#: ../system-config-printer.py:5703 ++msgid "HPLIP software driving a fax machine, or the fax function of a multi-function device." ++msgstr "Il software HPLIP gestisce una macchina fax, o le funzionalità fax di una periferica multi-funzionale." + +-#: ../system-config-printer.py:5552 ++#: ../system-config-printer.py:5706 + msgid "Local printer detected by the Hardware Abstraction Layer (HAL)." + msgstr "Stampante locale individuata dall'Hardware Abstraction Layer (HAL)." + +-#: ../system-config-printer.py:5752 ++#: ../system-config-printer.py:5906 + msgid "No printer was found at that address." + msgstr "A quell'indirizzo non è stata trovata nessuna stampante." + +-#: ../system-config-printer.py:5889 ++#: ../system-config-printer.py:6043 + msgid "-- Select from search results --" + msgstr "-- Scegliere dai risultati della ricerca --" + +-#: ../system-config-printer.py:5891 ++#: ../system-config-printer.py:6045 + msgid "-- No matches found --" + msgstr "-- Nessun risultato --" + +-#: ../system-config-printer.py:6077 ++#: ../system-config-printer.py:6231 + msgid " (recommended)" + msgstr " (raccomandato)" + +-#: ../system-config-printer.py:6091 ++#: ../system-config-printer.py:6245 + msgid "This PPD is generated by foomatic." + msgstr "Questo PPD è generato da foomatic." + +-#: ../system-config-printer.py:6115 ++#: ../system-config-printer.py:6269 + msgid "OpenPrinting" + msgstr "OpenPrinting" + +-#: ../system-config-printer.py:6126 ++#: ../system-config-printer.py:6280 + msgid "Distributable" + msgstr "Distribuibile" + +-#: ../system-config-printer.py:6167 ++#: ../system-config-printer.py:6321 + msgid ", " + msgstr ", " + +-#: ../system-config-printer.py:6172 ++#: ../system-config-printer.py:6326 + #, python-format + msgid "" + "\n" +@@ -1432,20 +1477,21 @@ msgstr "" + "\n" + "(%s)" + +-#: ../system-config-printer.py:6177 ++#: ../system-config-printer.py:6331 + msgid "No support contacts known" + msgstr "Nessun contatto di supporto conosciuto" + +-#: ../system-config-printer.py:6181 ../system-config-printer.py:6194 ++#: ../system-config-printer.py:6335 ++#: ../system-config-printer.py:6348 + msgid "Not specified." + msgstr "Non specificata." + + #. Foomatic database problem of some sort. +-#: ../system-config-printer.py:6234 ++#: ../system-config-printer.py:6388 + msgid "Database error" + msgstr "Errore del database" + +-#: ../system-config-printer.py:6235 ++#: ../system-config-printer.py:6389 + #, python-format + msgid "The '%s' driver cannot be used with printer '%s %s'." + msgstr "Il driver '%s' non può essere utilizzato con la stampante '%s %s'." +@@ -1453,68 +1499,65 @@ msgstr "Il driver '%s' non può essere u + #. This printer references some XML that is not + #. installed by default. Point the user at the + #. package they need to install. +-#: ../system-config-printer.py:6245 ++#: ../system-config-printer.py:6399 + #, python-format + msgid "You will need to install the '%s' package in order to use this driver." +-msgstr "" +-"Per poter utilizzare questo driver occorre installare il pacchetto '%s'." ++msgstr "Per poter utilizzare questo driver occorre installare il pacchetto '%s'." + + #. This error came from trying to open the PPD file. +-#: ../system-config-printer.py:6252 ++#: ../system-config-printer.py:6406 + msgid "PPD error" + msgstr "Errore del file PPD" + +-#: ../system-config-printer.py:6254 ++#: ../system-config-printer.py:6408 + msgid "Failed to read PPD file. Possible reason follows:" + msgstr "Lettura file PPD fallita. Seguono possibili ragioni:" + + #. Failed to get PPD downloaded from OpenPrinting XXX +-#: ../system-config-printer.py:6271 ++#: ../system-config-printer.py:6425 + msgid "Downloadable drivers" + msgstr "Driver disponibili per il download" + +-#: ../system-config-printer.py:6272 ++#: ../system-config-printer.py:6426 + msgid "Failed to download PPD." + msgstr "Errore nel download di PPD." + +-#: ../system-config-printer.py:6279 ++#: ../system-config-printer.py:6433 + msgid "fetching PPD" + msgstr "recupero PPD" + +-#: ../system-config-printer.py:6308 ../system-config-printer.py:6346 ++#: ../system-config-printer.py:6462 ++#: ../system-config-printer.py:6500 + msgid "No Installable Options" + msgstr "Nessuna opzione installabile" + +-#: ../system-config-printer.py:6394 ++#: ../system-config-printer.py:6548 + #, python-format + msgid "adding printer %s" + msgstr "aggiunta stampante %s" + +-#: ../system-config-printer.py:6567 ++#: ../system-config-printer.py:6721 + msgid "Would you like to print a test page?" + msgstr "Si desidera stampare una pagina di prova?" + +-#: ../system-config-printer.py:6620 ++#: ../system-config-printer.py:6774 + msgid "Install driver" + msgstr "Installazione driver" + +-#: ../system-config-printer.py:6621 ../troubleshoot/CheckPPDSanity.py:131 ++#: ../system-config-printer.py:6775 ++#: ../troubleshoot/CheckPPDSanity.py:131 + #, python-format + msgid "Printer '%s' requires the %s package but it is not currently installed." + msgstr "La stampante '%s' necessita dell'installazione del pacchetto %s." + +-#: ../system-config-printer.py:6637 ++#: ../system-config-printer.py:6791 + msgid "Missing driver" + msgstr "Driver mancante" + +-#: ../system-config-printer.py:6638 ++#: ../system-config-printer.py:6792 + #, python-format +-msgid "" +-"Printer '%s' requires the '%s' program but it is not currently installed. " +-"Please install it before using this printer." +-msgstr "" +-"La stampante '%s' ha bisogno del pacchetto '%s' non ancora installato. Vi " +-"preghiamo di installarlo prima di utilizzare la stampante." ++msgid "Printer '%s' requires the '%s' program but it is not currently installed. Please install it before using this printer." ++msgstr "La stampante '%s' ha bisogno del pacchetto '%s' non ancora installato. Vi preghiamo di installarlo prima di utilizzare la stampante." + + #: ../glade/AboutDialog.glade.h:1 + msgid "A CUPS configuration tool." +@@ -1526,33 +1569,17 @@ msgstr "Copyright © 2006-2008 Red Hat, + + #: ../glade/AboutDialog.glade.h:3 + msgid "" +-"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.\n" ++"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.\n" + "\n" +-"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.\n" ++"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.\n" + "\n" +-"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., 675 Mass " +-"Ave, Cambridge, MA 02139, USA." ++"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., 675 Mass Ave, Cambridge, MA 02139, USA." + msgstr "" +-"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.\n" ++"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.\n" + "\n" +-"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.\n" ++"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.\n" + "\n" +-"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., 675 Mass " +-"Ave, Cambridge, MA 02139, USA." ++"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., 675 Mass Ave, Cambridge, MA 02139, USA." + + #: ../glade/AboutDialog.glade.h:8 + msgid "system-config-printer" +@@ -1584,8 +1611,7 @@ msgstr "Cifratura richi_esta" + + #: ../glade/ConnectingDialog.glade.h:3 + msgid "Connecting to CUPS server" +-msgstr "" +-"Connessione al server CUPS" ++msgstr "Connessione al server CUPS" + + #: ../glade/ConnectingDialog.glade.h:4 + msgid "Connecting to CUPS server" +@@ -1595,6 +1621,10 @@ msgstr "Connessione al server CUPS" + msgid "_Install" + msgstr "_Installa" + ++#: ../glade/IPPBrowseDialog.glade.h:1 ++msgid "IPP Browser" ++msgstr "Browser IPP" ++ + #: ../glade/JobsWindow.glade.h:1 + msgid "Show _completed jobs" + msgstr "Mostra lavori _completati" +@@ -1611,7 +1641,8 @@ msgstr "_Lavoro" + msgid "_Refresh" + msgstr "Aggio_rna" + +-#: ../glade/JobsWindow.glade.h:5 ../glade/PrintersWindow.glade.h:17 ++#: ../glade/JobsWindow.glade.h:5 ++#: ../glade/PrintersWindow.glade.h:17 + msgid "_View" + msgstr "_Mostra" + +@@ -1693,8 +1724,7 @@ msgstr "smb://[workgroup/]server[:por + + #: ../glade/NewPrinterWindow.glade.h:18 + msgid "Choose Class Members" +-msgstr "" +-"Scegliere i membri della classe" ++msgstr "Scegliere i membri della classe" + + #: ../glade/NewPrinterWindow.glade.h:19 + msgid "Choose Driver" +@@ -1799,7 +1829,8 @@ msgstr "" + msgid "Description:" + msgstr "Descrizione:" + +-#: ../glade/NewPrinterWindow.glade.h:51 ../troubleshoot/DeviceListed.py:40 ++#: ../glade/NewPrinterWindow.glade.h:51 ++#: ../troubleshoot/DeviceListed.py:40 + msgid "Device URI" + msgstr "URI dispositivo" + +@@ -1820,248 +1851,211 @@ msgid "Empty" + msgstr "Vuota" + + #: ../glade/NewPrinterWindow.glade.h:57 ++msgid "Find _Queue..." ++msgstr "Cerca _Coda di stampa..." ++ ++#: ../glade/NewPrinterWindow.glade.h:58 + msgid "Flow Control" + msgstr "Controllo di flusso" + +-#: ../glade/NewPrinterWindow.glade.h:58 +-msgid "" +-"For the printer you have selected there are drivers available for download." ++#: ../glade/NewPrinterWindow.glade.h:59 ++msgid "For the printer you have selected there are drivers available for download." + msgstr "Driver per la stampante scelta disponibili per il download." + +-#: ../glade/NewPrinterWindow.glade.h:59 ++#: ../glade/NewPrinterWindow.glade.h:60 + msgid "Free software" + msgstr "Software libero" + +-#: ../glade/NewPrinterWindow.glade.h:60 ++#: ../glade/NewPrinterWindow.glade.h:61 + msgid "Graphics:" + msgstr "Grafica:" + +-#: ../glade/NewPrinterWindow.glade.h:61 ++#: ../glade/NewPrinterWindow.glade.h:62 + msgid "Host:" + msgstr "Host:" + +-#: ../glade/NewPrinterWindow.glade.h:62 ++#: ../glade/NewPrinterWindow.glade.h:63 + msgid "Human-readable description such as \"HP LaserJet with Duplexer\"" + msgstr "Descrizione umanamente leggibile, tipo \"HP LaserJet con Duplexer\"" + +-#: ../glade/NewPrinterWindow.glade.h:63 ++#: ../glade/NewPrinterWindow.glade.h:64 + msgid "Human-readable location such as \"Lab 1\"" + msgstr "Locazione umanamente leggibile, tipo \"Laboratorio 1\"" + +-#: ../glade/NewPrinterWindow.glade.h:65 ++#: ../glade/NewPrinterWindow.glade.h:66 + msgid "LPD" + msgstr "LPD" + +-#: ../glade/NewPrinterWindow.glade.h:66 ++#: ../glade/NewPrinterWindow.glade.h:67 + msgid "License:" + msgstr "Licenza:" + +-#: ../glade/NewPrinterWindow.glade.h:67 ++#: ../glade/NewPrinterWindow.glade.h:68 + msgid "Line art:" + msgstr "Line art:" + +-#: ../glade/NewPrinterWindow.glade.h:68 ++#: ../glade/NewPrinterWindow.glade.h:69 + msgid "Local Driver" + msgstr "Driver locale" + +-#: ../glade/NewPrinterWindow.glade.h:69 ++#: ../glade/NewPrinterWindow.glade.h:70 + msgid "Make and model:" + msgstr "Marca e modello:" + +-#: ../glade/NewPrinterWindow.glade.h:70 ++#: ../glade/NewPrinterWindow.glade.h:71 + msgid "Manufacturer" + msgstr "Produttore" + +-#: ../glade/NewPrinterWindow.glade.h:71 ++#: ../glade/NewPrinterWindow.glade.h:72 + msgid "Network" + msgstr "Rete" + +-#: ../glade/NewPrinterWindow.glade.h:73 ++#: ../glade/NewPrinterWindow.glade.h:74 + msgid "No, I do not accept this license" + msgstr "No, non accetto questa licenza" + +-#: ../glade/NewPrinterWindow.glade.h:74 ++#: ../glade/NewPrinterWindow.glade.h:75 + msgid "Parity" + msgstr "Parità" + +-#: ../glade/NewPrinterWindow.glade.h:76 ++#: ../glade/NewPrinterWindow.glade.h:77 + msgid "Patented algorithms" + msgstr "Algoritmi proprietari" + +-#: ../glade/NewPrinterWindow.glade.h:77 ++#: ../glade/NewPrinterWindow.glade.h:78 + msgid "Photo:" + msgstr "Foto:" + +-#: ../glade/NewPrinterWindow.glade.h:78 ++#: ../glade/NewPrinterWindow.glade.h:79 + msgid "Port number:" + msgstr "Numero di porta:" + +-#: ../glade/NewPrinterWindow.glade.h:79 +-msgid "" +-"PostScript Printer Description (PPD) files can often be found on the driver " +-"disk that comes with the printer. For PostScript printers they are often " +-"part of the Windows® driver." +-msgstr "" +-"I file PostScript Printer Description (PPD) possono essere spesso trovati " +-"sul disco driver venduto assieme alla stampante. Per le stampanti PostScript " +-"essi sono spesso parte del driver Windows®." +- + #: ../glade/NewPrinterWindow.glade.h:80 ++msgid "PostScript Printer Description (PPD) files can often be found on the driver disk that comes with the printer. For PostScript printers they are often part of the Windows® driver." ++msgstr "I file PostScript Printer Description (PPD) possono essere spesso trovati sul disco driver venduto assieme alla stampante. Per le stampanti PostScript essi sono spesso parte del driver Windows®." ++ ++#: ../glade/NewPrinterWindow.glade.h:81 + msgid "Printer model:" + msgstr "Modello stampante:" + +-#: ../glade/NewPrinterWindow.glade.h:81 ++#: ../glade/NewPrinterWindow.glade.h:82 + msgid "Probe" + msgstr "Esamina" + +-#: ../glade/NewPrinterWindow.glade.h:82 ++#: ../glade/NewPrinterWindow.glade.h:83 + msgid "Prompt user if authentication is required" + msgstr "Indica all'utente se è necessaria l'autenticazione" + +-#: ../glade/NewPrinterWindow.glade.h:83 ++#: ../glade/NewPrinterWindow.glade.h:84 + msgid "Provide PPD file" + msgstr "Specifica un file PPD" + +-#: ../glade/NewPrinterWindow.glade.h:84 ++#: ../glade/NewPrinterWindow.glade.h:85 + msgid "Queue:" + msgstr "Coda:" + +-#: ../glade/NewPrinterWindow.glade.h:85 ++#: ../glade/NewPrinterWindow.glade.h:86 + msgid "SCSI" + msgstr "SCSI" + +-#: ../glade/NewPrinterWindow.glade.h:86 ++#: ../glade/NewPrinterWindow.glade.h:87 + msgid "SMB" + msgstr "SMB" + +-#: ../glade/NewPrinterWindow.glade.h:87 ++#: ../glade/NewPrinterWindow.glade.h:88 + msgid "Search for a printer driver to download" + msgstr "Cerca un driver di stampa da scaricare" + +-#: ../glade/NewPrinterWindow.glade.h:88 ++#: ../glade/NewPrinterWindow.glade.h:89 + msgid "Searching..." + msgstr "Ricerca in corso..." + +-#: ../glade/NewPrinterWindow.glade.h:89 ++#: ../glade/NewPrinterWindow.glade.h:90 + msgid "Select A File" + msgstr "Selezionare un file" + +-#: ../glade/NewPrinterWindow.glade.h:90 ++#: ../glade/NewPrinterWindow.glade.h:91 + msgid "Select printer from database" + msgstr "Selezionare stampante dal database" + +-#: ../glade/NewPrinterWindow.glade.h:91 ++#: ../glade/NewPrinterWindow.glade.h:92 + msgid "Serial" + msgstr "Seriale" + +-#: ../glade/NewPrinterWindow.glade.h:92 ++#: ../glade/NewPrinterWindow.glade.h:93 + msgid "Set authentication details now" + msgstr "Imposta ora le informazioni sull'autenticazione" + +-#: ../glade/NewPrinterWindow.glade.h:93 ++#: ../glade/NewPrinterWindow.glade.h:94 + msgid "Short name for this printer such as \"laserjet\"" + msgstr "Nome abbreviato per questa stampante, ad esempio \"laserjet\"" + +-#: ../glade/NewPrinterWindow.glade.h:94 ++#: ../glade/NewPrinterWindow.glade.h:95 + msgid "Supplier:" + msgstr "Fornito da:" + +-#: ../glade/NewPrinterWindow.glade.h:95 ++#: ../glade/NewPrinterWindow.glade.h:96 + msgid "Support:" + msgstr "Supporto:" + +-#: ../glade/NewPrinterWindow.glade.h:96 ++#: ../glade/NewPrinterWindow.glade.h:97 + msgid "Text:" + msgstr "Testo:" + +-#: ../glade/NewPrinterWindow.glade.h:97 +-msgid "" +-"The foomatic printer database contains various manufacturer provided " +-"PostScript Printer Description (PPD) files and also can generate PPD files " +-"for a large number of (non PostScript) printers. But in general manufacturer " +-"provided PPD files provide better access to the specific features of the " +-"printer." +-msgstr "" +-"Il database di stampanti foomatic contiene vari file PostScript Printer " +-"Description (PPD) forniti dai produttori di stampanti e può generare file " +-"PPD per un gran numero di stampanti non PostScript. In generale i file PPD " +-"forniti dai produttori forniscono un miglior accesso alle caratteristiche " +-"specifiche della stampante." +- + #: ../glade/NewPrinterWindow.glade.h:98 +-msgid "" +-"These drivers do not come from your operating system supplier and will not " +-"be covered by their commercial support. See the support and license terms " +-"of the driver's supplier." +-msgstr "" +-"Questi driver non vengono forniti dal produttore del sistema operativo e non " +-"sono coperti da alcuna garanzia. Per maggiori informazioni consultare i " +-"termini d'uso e la licenza utente del produttore." ++msgid "The foomatic printer database contains various manufacturer provided PostScript Printer Description (PPD) files and also can generate PPD files for a large number of (non PostScript) printers. But in general manufacturer provided PPD files provide better access to the specific features of the printer." ++msgstr "Il database di stampanti foomatic contiene vari file PostScript Printer Description (PPD) forniti dai produttori di stampanti e può generare file PPD per un gran numero di stampanti non PostScript. In generale i file PPD forniti dai produttori forniscono un miglior accesso alle caratteristiche specifiche della stampante." + + #: ../glade/NewPrinterWindow.glade.h:99 +-msgid "" +-"This driver supports additional hardware that may be installed in the " +-"printer." +-msgstr "" +-"Questo driver supporta hardware aggiuntivo eventualmente installato nella " +-"stampante." ++msgid "These drivers do not come from your operating system supplier and will not be covered by their commercial support. See the support and license terms of the driver's supplier." ++msgstr "Questi driver non vengono forniti dal produttore del sistema operativo e non sono coperti da alcuna garanzia. Per maggiori informazioni consultare i termini d'uso e la licenza utente del produttore." + + #: ../glade/NewPrinterWindow.glade.h:100 +-msgid "" +-"This is done by assuming that options with the same name do have the same " +-"meaning. Settings of options that are not present in the new PPD will be " +-"lost and options only present in the new PPD will be set to default." +-msgstr "" +-"Si assume che le opzioni con lo stesso nome abbiano lo stesso significato. " +-"Le impostazioni non presenti nel nuovo PPD saranno perse mentre le opzioni " +-"presenti solamente nel nuovo PPD saranno impostate come predefinite." ++msgid "This driver supports additional hardware that may be installed in the printer." ++msgstr "Questo driver supporta hardware aggiuntivo eventualmente installato nella stampante." + + #: ../glade/NewPrinterWindow.glade.h:101 +-msgid "" +-"This way all current option settings will be lost. The default settings of " +-"the new PPD will be used. " +-msgstr "" +-"In questo modo tutte le vecchie impostazioni saranno perse. Verranno usate " +-"le impostazioni predefinite del nuovo PPD. " ++msgid "This is done by assuming that options with the same name do have the same meaning. Settings of options that are not present in the new PPD will be lost and options only present in the new PPD will be set to default." ++msgstr "Si assume che le opzioni con lo stesso nome abbiano lo stesso significato. Le impostazioni non presenti nel nuovo PPD saranno perse mentre le opzioni presenti solamente nel nuovo PPD saranno impostate come predefinite." + + #: ../glade/NewPrinterWindow.glade.h:102 ++msgid "This way all current option settings will be lost. The default settings of the new PPD will be used. " ++msgstr "In questo modo tutte le vecchie impostazioni saranno perse. Verranno usate le impostazioni predefinite del nuovo PPD. " ++ ++#: ../glade/NewPrinterWindow.glade.h:103 + msgid "Try to copy the option settings over from the old PPD. " + msgstr "Tentativo di copia delle impostazioni dal vecchio PPD. " + +-#: ../glade/NewPrinterWindow.glade.h:103 ++#: ../glade/NewPrinterWindow.glade.h:104 + msgid "URI:" + msgstr "URI:" + +-#: ../glade/NewPrinterWindow.glade.h:105 ++#: ../glade/NewPrinterWindow.glade.h:106 + msgid "Use the new PPD (Postscript Printer Description) as is." + msgstr "Usa il nuovo PPD (Postscript Printer Description) così com'è." + +-#: ../glade/NewPrinterWindow.glade.h:107 +-msgid "" +-"With this choice no driver download will be performed. In the next steps a " +-"locally installed driver will be selected." +-msgstr "" +-"Scegliendo questa opzione non verranno scaricati driver. Nel passo " +-"successivo verrà richiesta la selezione di un driver installato in locale." +- + #: ../glade/NewPrinterWindow.glade.h:108 ++msgid "With this choice no driver download will be performed. In the next steps a locally installed driver will be selected." ++msgstr "Scegliendo questa opzione non verranno scaricati driver. Nel passo successivo verrà richiesta la selezione di un driver installato in locale." ++ ++#: ../glade/NewPrinterWindow.glade.h:109 + msgid "Yes, I accept this license" + msgstr "Si, accetto questa licenza" + +-#: ../glade/NewPrinterWindow.glade.h:109 ++#: ../glade/NewPrinterWindow.glade.h:110 + msgid "_Search" + msgstr "_Cerca" + +-#: ../glade/NewPrinterWindow.glade.h:110 ++#: ../glade/NewPrinterWindow.glade.h:111 + msgid "_Verify..." + msgstr "_Verifica..." + +-#: ../glade/NewPrinterWindow.glade.h:111 ++#: ../glade/NewPrinterWindow.glade.h:112 + #: ../glade/PrinterPropertiesDialog.glade.h:128 + msgid "move left" + msgstr "sposta a sinistra" + +-#: ../glade/NewPrinterWindow.glade.h:112 ++#: ../glade/NewPrinterWindow.glade.h:113 + #: ../glade/PrinterPropertiesDialog.glade.h:129 + msgid "move right" + msgstr "sposta a destra" +@@ -2453,14 +2447,8 @@ msgid "Sides:" + msgstr "Fronte-retro:" + + #: ../glade/PrinterPropertiesDialog.glade.h:121 +-msgid "" +-"Specify the default job options for this printer. Jobs arriving at this " +-"print server will have these options added if they are not already set by " +-"the application." +-msgstr "" +-"Specificare le opzioni predefinite dei lavori per questa stampante. Ai " +-"lavori accettati da questo server di stampa saranno aggiunte queste opzioni " +-"se non sono già state impostate dall'applicazione." ++msgid "Specify the default job options for this printer. Jobs arriving at this print server will have these options added if they are not already set by the application." ++msgstr "Specificare le opzioni predefinite dei lavori per questa stampante. Ai lavori accettati da questo server di stampa saranno aggiunte queste opzioni se non sono già state impostate dall'applicazione." + + #: ../glade/PrinterPropertiesDialog.glade.h:122 + msgid "Starting Banner:" +@@ -2472,9 +2460,7 @@ msgstr "Non ci sono messaggi di stato pe + + #: ../glade/PrinterPropertiesDialog.glade.h:124 + msgid "To add a new option, enter its name in the box below and click to add." +-msgstr "" +-"Per aggiungere nuove opzioni, immettere il loro nome nella casella " +-"sottostante e cliccare per aggiungerle." ++msgstr "Per aggiungere nuove opzioni, immettere il loro nome nella casella sottostante e cliccare per aggiungerle." + + #: ../glade/PrinterPropertiesDialog.glade.h:125 + msgid "Top margin:" +@@ -2590,7 +2576,7 @@ msgstr "Salva le informazioni di debug p + + #: ../glade/ServerSettingsDialog.glade.h:7 + msgid "_Advanced..." +-msgstr "" ++msgstr "_Avanzate..." + + #: ../glade/ServerSettingsDialog.glade.h:8 + msgid "_Publish shared printers connected to this system" +@@ -2714,7 +2700,8 @@ msgstr "Non connesso?" + msgid "Printer '%s' may not be connected." + msgstr "La stampante '%s' potrebbe non essere connessa." + +-#: ../statereason.py:105 ../statereason.py:121 ++#: ../statereason.py:105 ++#: ../statereason.py:121 + msgid "Printer error" + msgstr "Errore della stampante" + +@@ -2736,15 +2723,17 @@ msgstr "Avviso stampante" + msgid "Printer '%s': '%s'." + msgstr "Stampante '%s': '%s'." + +-#: ../timedops.py:101 ../timedops.py:169 ++#: ../timedops.py:101 ++#: ../timedops.py:169 + msgid "Please wait" + msgstr "Operazione in corso" + +-#: ../timedops.py:107 ../timedops.py:176 ++#: ../timedops.py:107 ++#: ../timedops.py:176 + msgid "Gathering information" + msgstr "Recupero informazioni" + +-#: ../ToolbarSearchEntry.py:69 ++#: ../ToolbarSearchEntry.py:73 + msgid "_Filter:" + msgstr "_Filtro:" + +@@ -2753,35 +2742,23 @@ msgid "Printing troubleshooter" + msgstr "Risoluzione problemi di stampa" + + #: ../troubleshoot/base.py:33 +-msgid "" +-"To start this tool, select System->Administration->Printing from the main " +-"menu." +-msgstr "" +-"Per eseguire questo programma, lanciare Sistema->Amministrazione->Stampa dal " +-"menu principale." ++msgid "To start this tool, select System->Administration->Printing from the main menu." ++msgstr "Per eseguire questo programma, lanciare Sistema->Amministrazione->Stampa dal menu principale." + + #: ../troubleshoot/CheckLocalServerPublishing.py:28 + msgid "Server Not Exporting Printers" + msgstr "Il server non esporta stampanti condivise" + + #: ../troubleshoot/CheckLocalServerPublishing.py:29 +-msgid "" +-"Although one or more printers are marked as being shared, this print server " +-"is not exporting shared printers to the network." +-msgstr "" +-"Anche se alcune stampanti sono contrassegnate come condivise, questo server " +-"di stampa non esporta queste stampanti sulla rete." ++msgid "Although one or more printers are marked as being shared, this print server is not exporting shared printers to the network." ++msgstr "Anche se alcune stampanti sono contrassegnate come condivise, questo server di stampa non esporta queste stampanti sulla rete." + + #: ../troubleshoot/CheckLocalServerPublishing.py:33 +-msgid "" +-"Enable the 'Publish shared printers connected to this system' option in the " +-"server settings using the printing administration tool." +-msgstr "" +-"Abilitare l'opzione 'Pubblicare le stampanti condivise collegate a questo " +-"sistema' nelle impostazioni del server usando lo strumento di " +-"amministrazione della stampa." ++msgid "Enable the 'Publish shared printers connected to this system' option in the server settings using the printing administration tool." ++msgstr "Abilitare l'opzione 'Pubblicare le stampanti condivise collegate a questo sistema' nelle impostazioni del server usando lo strumento di amministrazione della stampa." + +-#: ../troubleshoot/CheckPPDSanity.py:44 ../applet.py:184 ++#: ../troubleshoot/CheckPPDSanity.py:44 ++#: ../applet.py:184 + msgid "Install" + msgstr "Installazione" + +@@ -2791,12 +2768,8 @@ msgstr "File PPD non valido" + + #: ../troubleshoot/CheckPPDSanity.py:106 + #, python-format +-msgid "" +-"The PPD file for printer '%s' does not conform to the specification. " +-"Possible reason follows:" +-msgstr "" +-"Il file PPD per la stampante '%s' non è conforme alle specifiche. Seguono " +-"le possibili ragioni:" ++msgid "The PPD file for printer '%s' does not conform to the specification. Possible reason follows:" ++msgstr "Il file PPD per la stampante '%s' non è conforme alle specifiche. Seguono le possibili ragioni:" + + #. Perhaps cupstestppd is not in the path. + #: ../troubleshoot/CheckPPDSanity.py:112 +@@ -2810,30 +2783,26 @@ msgstr "Driver di stampa mancante" + + #: ../troubleshoot/CheckPPDSanity.py:136 + #, python-format +-msgid "" +-"Printer '%s' requires the '%s' program but it is not currently installed." +-msgstr "" +-"La stampante '%s' necessita del programma '%s' che non risulta installato." ++msgid "Printer '%s' requires the '%s' program but it is not currently installed." ++msgstr "La stampante '%s' necessita del programma '%s' che non risulta installato." + + #: ../troubleshoot/ChooseNetworkPrinter.py:29 + msgid "Choose Network Printer" + msgstr "Selezionare stampante di rete" + + #: ../troubleshoot/ChooseNetworkPrinter.py:30 +-msgid "" +-"Please select the network printer you are trying to use from the list below. " +-"If it does not appear in the list, select 'Not listed'." +-msgstr "" +-"Selezionare la stampante di rete che si intende usare dalla seguente lista." +-"Se non è compresa nella lista, selezionare 'Non in elenco'." ++msgid "Please select the network printer you are trying to use from the list below. If it does not appear in the list, select 'Not listed'." ++msgstr "Selezionare la stampante di rete che si intende usare dalla seguente lista.Se non è compresa nella lista, selezionare 'Non in elenco'." + + #: ../troubleshoot/ChooseNetworkPrinter.py:39 +-#: ../troubleshoot/ChoosePrinter.py:40 ../troubleshoot/DeviceListed.py:38 ++#: ../troubleshoot/ChoosePrinter.py:40 ++#: ../troubleshoot/DeviceListed.py:38 + msgid "Information" + msgstr "Informazioni" + + #: ../troubleshoot/ChooseNetworkPrinter.py:75 +-#: ../troubleshoot/ChoosePrinter.py:64 ../troubleshoot/DeviceListed.py:70 ++#: ../troubleshoot/ChoosePrinter.py:64 ++#: ../troubleshoot/DeviceListed.py:70 + msgid "Not listed" + msgstr "Non in elenco" + +@@ -2842,37 +2811,24 @@ msgid "Choose Printer" + msgstr "Selezionare stampante" + + #: ../troubleshoot/ChoosePrinter.py:31 +-msgid "" +-"Please select the printer you are trying to use from the list below. If it " +-"does not appear in the list, select 'Not listed'." +-msgstr "" +-"Selezionare la stampante che si intende usare dalla seguente lista.Se non è " +-"compresa nella lista, selezionare 'Non in elenco'." ++msgid "Please select the printer you are trying to use from the list below. If it does not appear in the list, select 'Not listed'." ++msgstr "Selezionare la stampante che si intende usare dalla seguente lista.Se non è compresa nella lista, selezionare 'Non in elenco'." + + #: ../troubleshoot/DeviceListed.py:30 + msgid "Choose Device" + msgstr "Selezionare Dispositivo" + + #: ../troubleshoot/DeviceListed.py:31 +-msgid "" +-"Please select the device you want to use from the list below. If it does not " +-"appear in the list, select 'Not listed'." +-msgstr "" +-"Selezionare il dispositivo che si intende usare dalla seguente lista. Se non " +-"è compreso nella lista, selezionare 'Non in elenco'." ++msgid "Please select the device you want to use from the list below. If it does not appear in the list, select 'Not listed'." ++msgstr "Selezionare il dispositivo che si intende usare dalla seguente lista. Se non è compreso nella lista, selezionare 'Non in elenco'." + + #: ../troubleshoot/ErrorLogCheckpoint.py:31 + msgid "Debugging" + msgstr "Debug" + + #: ../troubleshoot/ErrorLogCheckpoint.py:32 +-msgid "" +-"I would like to enable debugging output from the CUPS scheduler. This may " +-"cause the scheduler to restart. Click the button below to enable debugging." +-msgstr "" +-"Sarebbe opportuno abilitare il debug del servizio CUPS. Ciò " +-"potrebbecomportare il riavvio del servizio. Se si desidera abilitare il " +-"debug cliccare il pulsante seguente." ++msgid "I would like to enable debugging output from the CUPS scheduler. This may cause the scheduler to restart. Click the button below to enable debugging." ++msgstr "Sarebbe opportuno abilitare il debug del servizio CUPS. Ciò potrebbecomportare il riavvio del servizio. Se si desidera abilitare il debug cliccare il pulsante seguente." + + #: ../troubleshoot/ErrorLogCheckpoint.py:36 + msgid "Enable Debugging" +@@ -2899,13 +2855,8 @@ msgid "Incorrect Page Size" + msgstr "Dimensione pagina non corretta" + + #: ../troubleshoot/Locale.py:30 +-msgid "" +-"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." +-msgstr "" +-"La dimensione della pagina per il lavoro in stampa non corrisponde alla " +-"dimensione predefinita per la stampante. Se ciò non è intenzionale potrebbe " +-"causare dei problemi di allineamento." ++msgid "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." ++msgstr "La dimensione della pagina per il lavoro in stampa non corrisponde alla dimensione predefinita per la stampante. Se ciò non è intenzionale potrebbe causare dei problemi di allineamento." + + #: ../troubleshoot/Locale.py:43 + msgid "Print job page size:" +@@ -2961,13 +2912,8 @@ msgid "Test Page" + msgstr "Pagina di prova" + + #: ../troubleshoot/PrintTestPage.py:63 +-msgid "" +-"Now print a test page. If you are having problems printing a specific " +-"document, print that document now and mark the print job below." +-msgstr "" +-"Eseguire la stampa di una pagina di prova. Se si sono verificati problemi " +-"nella stampa di uno specifico documento, stamparlo ora e selezionarlo " +-"nell'elenco seguente." ++msgid "Now print a test page. If you are having problems printing a specific document, print that document now and mark the print job below." ++msgstr "Eseguire la stampa di una pagina di prova. Se si sono verificati problemi nella stampa di uno specifico documento, stamparlo ora e selezionarlo nell'elenco seguente." + + #: ../troubleshoot/PrintTestPage.py:75 + msgid "Cancel All Jobs" +@@ -3010,12 +2956,8 @@ msgid "The queue '%s' is not enabled." + msgstr "La coda di stampa '%s' non è abilitata." + + #: ../troubleshoot/QueueNotEnabled.py:71 +-msgid "" +-"To enable it, select the 'Enabled' checkbox in the 'Policies' tab for the " +-"printer in the printer administration tool." +-msgstr "" +-"Per abilitare la coda di stampa, selezionare 'Abilitata' nella scheda " +-"'Politica' dello strumento di amministrazione della stampa." ++msgid "To enable it, select the 'Enabled' checkbox in the 'Policies' tab for the printer in the printer administration tool." ++msgstr "Per abilitare la coda di stampa, selezionare 'Abilitata' nella scheda 'Politica' dello strumento di amministrazione della stampa." + + #: ../troubleshoot/QueueRejectingJobs.py:31 + msgid "Queue Rejecting Jobs" +@@ -3027,25 +2969,16 @@ msgid "The queue '%s' is rejecting jobs. + msgstr "La coda di stampa '%s' non accetta lavori." + + #: ../troubleshoot/QueueRejectingJobs.py:70 +-msgid "" +-"To make the queue accept jobs, select the 'Accepting Jobs' checkbox in the " +-"'Policies' tab for the printer in the printer administration tool." +-msgstr "" +-"Per abilitare l'accettazione dei lavori di stampa, selezionare 'Accetta " +-"lavori' nella scheda 'Politica' dello strumento di amministrazione della " +-"stampa." ++msgid "To make the queue accept jobs, select the 'Accepting Jobs' checkbox in the 'Policies' tab for the printer in the printer administration tool." ++msgstr "Per abilitare l'accettazione dei lavori di stampa, selezionare 'Accetta lavori' nella scheda 'Politica' dello strumento di amministrazione della stampa." + + #: ../troubleshoot/RemoteAddress.py:26 + msgid "Remote Address" + msgstr "Indirizzo remoto" + + #: ../troubleshoot/RemoteAddress.py:27 +-msgid "" +-"Please enter as many details as you can about the network address of this " +-"printer." +-msgstr "" +-"Inserire tutte le informazioni che si conoscono sull'indirizzo di rete di " +-"questa stampante." ++msgid "Please enter as many details as you can about the network address of this printer." ++msgstr "Inserire tutte le informazioni che si conoscono sull'indirizzo di rete di questa stampante." + + #: ../troubleshoot/RemoteAddress.py:35 + msgid "Server name:" +@@ -3060,14 +2993,8 @@ msgid "CUPS Service Stopped" + msgstr "Servizio CUPS arrestato" + + #: ../troubleshoot/SchedulerNotRunning.py:29 +-msgid "" +-"The CUPS print spooler does not appear to be running. To correct this, " +-"choose System->Administration->Services from the main menu and look for the " +-"'cups' service." +-msgstr "" +-"Il servizio di stampa CUPS non sembra in esecuzione. Per correggere questa " +-"situazione, lanciare Sistema->Amministrazione->Servizi dal menu principale e " +-"controllare il servizio 'cups'." ++msgid "The CUPS print spooler does not appear to be running. To correct this, choose System->Administration->Services from the main menu and look for the 'cups' service." ++msgstr "Il servizio di stampa CUPS non sembra in esecuzione. Per correggere questa situazione, lanciare Sistema->Amministrazione->Servizi dal menu principale e controllare il servizio 'cups'." + + #: ../troubleshoot/ServerFirewalled.py:26 + msgid "Check Server Firewall" +@@ -3079,24 +3006,16 @@ msgstr "Si è verificato un problema nel + + #: ../troubleshoot/ServerFirewalled.py:42 + #, python-format +-msgid "" +-"Please check to see if a firewall or router configuration is blocking TCP " +-"port %d on server '%s'." +-msgstr "" +-"Controllare che la configurazione del firewall o del router non impedisca la " +-"connessione alla porta %d sul server '%s'." ++msgid "Please check to see if a firewall or router configuration is blocking TCP port %d on server '%s'." ++msgstr "Controllare che la configurazione del firewall o del router non impedisca la connessione alla porta %d sul server '%s'." + + #: ../troubleshoot/Shrug.py:26 + msgid "Sorry!" + msgstr "Spiacente!" + + #: ../troubleshoot/Shrug.py:27 +-msgid "" +-"I have not been able to work out what the problem is, but I have collected " +-"some useful information to put in a bug report." +-msgstr "" +-"Non è stato possibile identificare il problema di stampa; tuttavia sono " +-"stati rilevati sufficienti dati per compilare un bug report." ++msgid "I have not been able to work out what the problem is, but I have collected some useful information to put in a bug report." ++msgstr "Non è stato possibile identificare il problema di stampa; tuttavia sono stati rilevati sufficienti dati per compilare un bug report." + + #: ../troubleshoot/Shrug.py:32 + msgid "Diagnostic Output (Advanced)" +@@ -3107,13 +3026,8 @@ msgid "Trouble-shooting Printing" + msgstr "Risoluzione dei problemi di stampa" + + #: ../troubleshoot/Welcome.py:45 +-msgid "" +-"In the next few screens I will ask you some questions about your problem " +-"with printing. Based on your answers I will try to suggest a solution." +-msgstr "" +-"Nelle schermate seguenti verranno poste alcune domande riguardo i problemi " +-"di stampa che si sono verificati. Basandosi sulle risposte verranno " +-"consigliate possibili soluzioni al problema." ++msgid "In the next few screens I will ask you some questions about your problem with printing. Based on your answers I will try to suggest a solution." ++msgstr "Nelle schermate seguenti verranno poste alcune domande riguardo i problemi di stampa che si sono verificati. Basandosi sulle risposte verranno consigliate possibili soluzioni al problema." + + #: ../troubleshoot/Welcome.py:49 + msgid "Click 'Forward' to begin." +@@ -3121,7 +3035,8 @@ msgstr "Cliccare 'Avanti' per iniziare." + + #. name is a URI, no queue was generated, because no suitable + #. driver was found +-#: ../applet.py:113 ../applet.py:173 ++#: ../applet.py:113 ++#: ../applet.py:173 + msgid "Missing printer driver" + msgstr "Driver di stampa mancante" + +@@ -3152,7 +3067,8 @@ msgstr "`%s' richiede l'installazione de + msgid "`%s' is ready for printing." + msgstr "`%s' è pronta per la stampa." + +-#: ../applet.py:203 ../applet.py:216 ++#: ../applet.py:203 ++#: ../applet.py:216 + msgid "Print test page" + msgstr "Stampa pagina di prova" + +@@ -3189,31 +3105,6 @@ msgstr "Gestione lavori di stampa" + msgid "Select default printer" + msgstr "Seleziona stampante predefinita" + +-#~ msgid "Queue" +-#~ msgstr "Coda" +- +-#~ msgid "It is not possible to obtain a list of queues from '%s'." +-#~ msgstr "Non è possibile ottenere l'elenco delle code di stampa da '%s'." +- +-#~ msgid "" +-#~ "Obtaining a list of queues is a CUPS extension to IPP. Network printers " +-#~ "do not support it." +-#~ msgstr "" +-#~ "L'ottenimento di un elenco di code di stampa è una estensione CUPS per " +-#~ "IPP. Le stampanti di rete non lo supportano." +- +-#~ msgid "No queues" +-#~ msgstr "Nessuna coda di stampa" +- +-#~ msgid "There are no queues available." +-#~ msgstr "Non ci sono code di stampa disponibili." +- +-#~ msgid "IPP Browser" +-#~ msgstr "Browser IPP" +- +-#~ msgid "Find _Queue..." +-#~ msgstr "Cerca _Coda di stampa..." +- + #~ msgid "Job %d completed" + #~ msgstr "Lavoro %d completato" + +@@ -3224,51 +3115,37 @@ msgstr "Seleziona stampante predefinita" + #, fuzzy + #~ msgid "Not Found" + #~ msgstr "Non trovato" +- + #~ msgid "" + #~ "This printer supports both printing and sending faxes. Which " + #~ "functionality should be used for this queue?" + #~ msgstr "" + #~ "Questa stampante supporta la stampa e l'invio di fax. Quale funzionalità " + #~ "deve essere utilizzata per questa coda di stampa?" +- + #~ msgid "" + #~ "Printer `%s' requires the %s package but it is not currently installed." + #~ msgstr "La stampante `%s' il pacchetto %s ma attualmente non è installato." +- + #~ msgid "Authentication Required" + #~ msgstr "Autenticazione necessaria" +- + #~ msgid "Job requires authentication to proceed." + #~ msgstr "Il lavoro necessita di una autenticazione per procedere." +- + #~ msgid "Authenticate" + #~ msgstr "Autenticare" +- + #~ msgid "Adding" + #~ msgstr "Creazione in corso" +- + #~ msgid "Adding printer" + #~ msgstr "Aggiunta stampante in corso" +- + #~ msgid "Show _printer status" + #~ msgstr "Mostra lo status della stam_pante" +- + #~ msgid "Printer status" + #~ msgstr "Stato stampante" +- + #~ msgid "1 hour and 1 minute ago" + #~ msgstr "1 ora ed 1 minuto fa" +- + #~ msgid "1 hour and %d minutes ago" + #~ msgstr "1 ora e %d minuti fa" +- + #~ msgid "%d hours and 1 minute ago" + #~ msgstr "%d ore ed 1 minuto fa" +- + #~ msgid "%d hours and %d minutes ago" + #~ msgstr "%d ore e %d minuti fa" +- + #~ msgid "" + #~ "I would like to disable debugging output from the CUPS scheduler. This " + #~ "may cause the scheduler to restart. Click the button below to disable " +@@ -3277,44 +3154,35 @@ msgstr "Seleziona stampante predefinita" + #~ "Sarebbe opportuno disabilitare il debug del servizio CUPS. Ciò potrebbe " + #~ "comportare il riavvio del servizio. Se si desidera disabilitare il debug " + #~ "cliccare il pulsante seguente." +- + #~ msgid "Disable Debugging" + #~ msgstr "Disattivare Debug" +- + #~ msgid "Debug logging disabled." + #~ msgstr "Debug disabilitato." +- + #~ msgid " (" + #~ msgstr " (" +- + #~ msgid "Recommended Driver" + #~ msgstr "Driver raccomandati" +- + #~ msgid "" + #~ "Connecting to server:\n" + #~ "%s" + #~ msgstr "" + #~ "Connessione al server: \n" + #~ "%s" +- + #~ msgid "Connecting" + #~ msgstr "Connessione in corso" +- + #~ msgid "" + #~ "Connecting to Server:\n" + #~ "%s\n" + #~ msgstr "" + #~ "Connessione al server:\n" + #~ "%s\n" +- + #~ msgid "" + #~ "Create a class from the selected printers (for failover or load-balancing)" + #~ msgstr "" + #~ "Crea una classe dalle stampanti selezionate (per failover o per il " + #~ "bilanciamento del carico)" +- + #~ msgid "Set As Default" + #~ msgstr "Imposta come Predefinita" +- + #~ msgid "_Enabled" + #~ msgstr "_Abilitata" ++ +diff -up system-config-printer-1.1.10/system-config-printer.py.a6cf4d3 system-config-printer-1.1.10/system-config-printer.py +--- system-config-printer-1.1.10/system-config-printer.py.a6cf4d3 2009-07-21 15:16:35.000000000 +0100 ++++ system-config-printer-1.1.10/system-config-printer.py 2009-07-31 15:09:03.249087941 +0100 +@@ -152,8 +152,6 @@ def validDeviceURI (uri): + (scheme, rest) = urllib.splittype (uri) + if scheme == None or scheme == '': + return False +- if rest == None or rest.strip ('/') == '': +- return False + return True + + def CUPS_server_hostname (): +@@ -3377,7 +3375,7 @@ class GUI(GtkGUI, monitor.Watcher): + name = name.replace ("#", "-") + if not self.checkNPName (name): + suffix=2 +- while not self.checkNPName (name + str (suffix)): ++ while not self.checkNPName (name + "-" + str (suffix)): + suffix += 1 + if suffix == 100: + break +@@ -4569,6 +4567,7 @@ class NewPrinterGUI(GtkGUI): + plugin_needed = -1 + plugin_reason = -1 + fw_download = -1 ++ hpmodel = None + hplip_version = None + for line in stdout.split ("\n"): + if line.find ("plugin ") >= 0: +@@ -4586,31 +4585,54 @@ class NewPrinterGUI(GtkGUI): + fw_download = 1 + elif line.find ("False") >= 0: + fw_download = 0 ++ elif line.find ("model") >= 0: ++ res = re.search ("^\s*model\s*(\S+)\s*$", line) ++ if res: ++ resg = res.groups() ++ hpmodel = resg[0] + elif line.find ("HP Linux Imaging and Printing") >= 0: + res = re.search ("(\d+\.\d+\.\d+\w*)", line) + if res: + resg = res.groups() + hplip_version = resg[0] +- if plugin_needed >= 0 and plugin_reason >= 0 and fw_download >= 0: ++ if plugin_needed >= 0 and plugin_reason >= 0 and \ ++ fw_download >= 0 and hpmodel != None: + break +- if plugin_needed <= 0 or not hplip_version: ++ if plugin_needed <= 0 or not hplip_version or not hpmodel: + return True # assume plugin not required + # Check whether the plugin is already installed +- if glob.glob("/usr/share/hplip/data/plugin/*%s*plugin*" % +- hplip_version): +- if hplip_version.startswith("2"): +- try: +- f = open('/etc/hp/hplip.conf', 'r') +- for line in f: +- if line.strip ().startswith("plugin") and \ +- line.strip ().endswith("1"): ++ if hplip_version.startswith("3"): ++ os.environ["hp_model"] = hpmodel; ++ cmd = 'LC_ALL=C hp-mkuri -c' ++ debugprint (uri + ": " + hpmodel) ++ try: ++ p = subprocess.Popen (cmd, shell=True, ++ stdin=file("/dev/null"), ++ stdout=subprocess.PIPE, ++ stderr=subprocess.PIPE) ++ (stdout, stderr) = p.communicate () ++ if p.returncode < 2: ++ return True # plugin installed or not required ++ except: ++ # Problem executing command. ++ return True # assume plugin not required ++ else: ++ if glob.glob("/usr/share/hplip/data/plugin/*%s*plugin*" % ++ hplip_version): ++ if hplip_version.startswith("2"): ++ try: ++ f = open('/etc/hp/hplip.conf', 'r') ++ for line in f: ++ if line.strip ().startswith("plugin") and \ ++ line.strip ().endswith("1"): ++ f.close() ++ return True + f.close() +- return True +- f.close() +- except: +- pass +- else: +- return True ++ except: ++ pass ++ else: ++ return True ++ + # Tell the user why he needs the plugin + text = \ + _("For this printer a proprietary driver plugin from HP is available.\n") +@@ -4710,7 +4732,7 @@ class NewPrinterGUI(GtkGUI): + + def get_hpfax_device_id(self, faxuri): + os.environ["URI"] = faxuri +- cmd = 'LC_ALL=C DISPLAY= hp-info -d"${URI}"' ++ cmd = 'LC_ALL=C DISPLAY= hp-info -x -i -d"${URI}"' + debugprint (faxuri + ": " + cmd) + try: + p = subprocess.Popen (cmd, shell=True, +@@ -5757,27 +5779,28 @@ class NewPrinterGUI(GtkGUI): + + def getDeviceURI(self): + type = self.device.type +- if type == "socket": # DirectJet ++ page = self.new_printer_device_tabs.get (type, 1) ++ device = type ++ if page == 0: ++ # The "no options page". We already have the URI. ++ device = self.device.uri ++ elif type == "socket": # DirectJet + host = self.entNPTDirectJetHostname.get_text() + port = self.entNPTDirectJetPort.get_text() +- device = "socket://" + host +- if host and port: +- device = device + ':' + port ++ if host: ++ device += "://" + host ++ if port: ++ device += ":" + port + elif type in ("ipp", "http", "https"): # IPP + if self.lblIPPURI.get_property('visible'): + device = self.lblIPPURI.get_text() +- else: +- device = "ipp" + elif type == "lpd": # LPD + host = self.cmbentNPTLpdHost.get_active_text() + printer = self.cmbentNPTLpdQueue.get_active_text() +- device = "lpd://" + host +- if printer: +- device = device + "/" + printer +- elif type == "parallel": # Parallel +- device = self.device.uri +- elif type == "scsi": # SCSII +- device = "" ++ if host: ++ device += "://" + host ++ if printer: ++ device += "/" + printer + elif type == "serial": # Serial + options = [] + for widget, name, optionvalues in ( +@@ -5808,9 +5831,8 @@ class NewPrinterGUI(GtkGUI): + password = self.entSMBPassword.get_text () + uri = SMBURI (group=group, host=host, share=share, + user=user, password=password).get_uri () +- device = "smb://" + uri +- elif not self.device.is_class: +- device = self.device.uri ++ if uri: ++ device += "://" + uri + else: + device = self.entNPTDevice.get_text() + return device +diff -up system-config-printer-1.1.10/udev/70-printers.rules.a6cf4d3 system-config-printer-1.1.10/udev/70-printers.rules +--- system-config-printer-1.1.10/udev/70-printers.rules.a6cf4d3 2009-07-22 13:22:49.000000000 +0100 ++++ system-config-printer-1.1.10/udev/70-printers.rules 2009-07-31 15:09:03.255962050 +0100 +@@ -1,7 +1,7 @@ + # Low-level USB device add trigger +-ACTION=="add", SUBSYSTEM=="usb", ATTR{bInterfaceClass}=="07", ATTR{bInterfaceSubClass}=="01", RUN+="udev-configure-printer add %p" ++ACTION=="add", SUBSYSTEM=="usb", ATTR{bInterfaceClass}=="07", ATTR{bInterfaceSubClass}=="01", RUN+="udev-usb-printer add %p" + # usblp device add trigger (needed when usblp is already loaded) +-ACTION=="add", KERNEL=="lp*", RUN+="udev-configure-printer add %p" ++ACTION=="add", KERNEL=="lp*", RUN+="udev-usb-printer add %p" + + # Low-level USB device remove trigger +-ACTION=="remove", SUBSYSTEM=="usb", ENV{ID_USB_INTERFACES}=="*:0701*:*", RUN+="udev-configure-printer remove %p" ++ACTION=="remove", SUBSYSTEM=="usb", ENV{ID_USB_INTERFACES}=="*:0701*:*", RUN+="udev-usb-printer remove %p" +diff -up /dev/null system-config-printer-1.1.10/udev/com.redhat.PrinterConfig.conf +--- /dev/null 2009-07-31 14:10:14.275001833 +0100 ++++ system-config-printer-1.1.10/udev/com.redhat.PrinterConfig.conf 2009-07-31 15:09:03.258961590 +0100 +@@ -0,0 +1,16 @@ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +diff -up /dev/null system-config-printer-1.1.10/udev/com.redhat.PrinterConfig.service.in +--- /dev/null 2009-07-31 14:10:14.275001833 +0100 ++++ system-config-printer-1.1.10/udev/com.redhat.PrinterConfig.service.in 2009-07-31 15:09:03.261961727 +0100 +@@ -0,0 +1,4 @@ ++[D-BUS Service] ++Name=com.redhat.PrinterConfig ++Exec=@libexecdir@/printer-config-daemon ++User=root +diff -up /dev/null system-config-printer-1.1.10/udev/com.redhat.PrinterConfig.xml +--- /dev/null 2009-07-31 14:10:14.275001833 +0100 ++++ system-config-printer-1.1.10/udev/com.redhat.PrinterConfig.xml 2009-07-31 15:09:03.265086823 +0100 +@@ -0,0 +1,71 @@ ++ ++ ++ ++ ++ ++ ++ The PrinterConfig service is available via the ++ system message bus. To access the service, use the ++ com.redhat.PrinterConfig interface ++ on the /com/redhat/PrinterConfig ++ object on the D-Bus system bus service with the well-known ++ name ++ com.redhat.PrinterConfig. ++ ++ It is intended to be used by udev when USB printers ++ are connected and disconnected. ++ ++ ++ ++ ++ ++ ++ ++ ++ The udev devpath of the device with subsystem ++ usb and devtype usb_device referring to the USB printer ++ device. ++ ++ ++ ++ ++ ++ ++ ++ The IEEE 1284 Device ID (not including length ++ field) of the device. ++ ++ ++ ++ ++ ++ ++ This method informs the PrinterConfig service that ++ a USB printer is now connected. ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ The udev devpath of the device with subsystem ++ usb and devtype usb_device referring to the USB printer ++ device. ++ ++ ++ ++ ++ ++ ++ This method informs the PrinterConfig service that ++ a USB printer has been disconnected. ++ ++ ++ ++ ++ +diff -up /dev/null system-config-printer-1.1.10/udev/printer-config-daemon.c +--- /dev/null 2009-07-31 14:10:14.275001833 +0100 ++++ system-config-printer-1.1.10/udev/printer-config-daemon.c 2009-07-31 15:09:03.268961586 +0100 +@@ -0,0 +1,1248 @@ ++/* -*- Mode: C; c-file-style: "gnu" -*- ++ * printer-config-daemon - a D-Bus service for configuring printers ++ * Copyright (C) 2009 Red Hat, Inc. ++ * Author: Tim Waugh ++ * ++ * 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 ++ * ++ */ ++ ++#define LIBUDEV_I_KNOW_THE_API_IS_SUBJECT_TO_CHANGE 1 ++#include "printer-config.h" ++#include "printer-config-server-bindings.h" ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#define DISABLED_REASON "Unplugged or turned off" ++#define MATCH_ONLY_DISABLED 1 ++#define USB_URI_MAP "/var/run/udev-configure-printer/usb-uris" ++ ++struct children ++{ ++ struct children *next; ++ GPid pid; ++}; ++ ++struct device_uris ++{ ++ size_t n_uris; ++ char **uri; ++}; ++ ++struct usb_uri_map_entry ++{ ++ struct usb_uri_map_entry *next; ++ ++ /* The devpath of the ("usb","usb_device") device. */ ++ char *devpath; ++ ++ /* List of matching device URIs. */ ++ struct device_uris uris; ++}; ++ ++struct usb_uri_map ++{ ++ struct usb_uri_map_entry *entries; ++ ++ /* Open file descriptor for the map, or -1 if it has already been ++ * written. */ ++ int fd; ++}; ++ ++struct device_id ++{ ++ char *full_device_id; ++ char *mfg; ++ char *mdl; ++ char *sern; ++}; ++ ++/* Device URI schemes in decreasing order of preference. */ ++static const char *device_uri_types[] = ++ { ++ "hp", ++ "usb", ++ }; ++ ++static int ++device_uri_type (const char *uri) ++{ ++ int slen = strcspn (uri, ":"); ++ int i; ++ int n = sizeof (device_uri_types) / sizeof (device_uri_types[0]); ++ for (i = 0; i < n; i++) ++ if (!strncmp (uri, device_uri_types[i], slen) && ++ device_uri_types[i][slen] == '\0') ++ break; ++ ++ return i; ++} ++ ++static void ++add_device_uri (struct device_uris *uris, ++ const char *uri) ++{ ++ char *uri_copy = strdup (uri); ++ if (!uri_copy) ++ { ++ syslog (LOG_ERR, "out of memory"); ++ return; ++ } ++ ++ if (uris->n_uris == 0) ++ { ++ uris->uri = malloc (sizeof (char *)); ++ if (uris->uri) ++ { ++ uris->n_uris = 1; ++ uris->uri[0] = uri_copy; ++ } ++ } ++ else ++ { ++ char **old = uris->uri; ++ if (++uris->n_uris < UINT_MAX / sizeof (char *)) ++ { ++ uris->uri = realloc (uris->uri, ++ sizeof (char *) * uris->n_uris); ++ if (uris->uri) ++ uris->uri[uris->n_uris - 1] = uri_copy; ++ else ++ { ++ uris->uri = old; ++ uris->n_uris--; ++ free (uri_copy); ++ } ++ } ++ else ++ { ++ uris->n_uris--; ++ free (uri_copy); ++ } ++ } ++} ++ ++static void ++free_device_uris (struct device_uris *uris) ++{ ++ size_t i; ++ for (i = 0; i < uris->n_uris; i++) ++ free (uris->uri[i]); ++ free (uris->uri); ++} ++ ++static void ++add_usb_uri_mapping (struct usb_uri_map **map, ++ const char *devpath, ++ const struct device_uris *uris) ++{ ++ struct usb_uri_map_entry *entry, **prev; ++ size_t i; ++ prev = &(*map)->entries; ++ while (*prev) ++ prev = &((*prev)->next); ++ ++ entry = malloc (sizeof (struct usb_uri_map_entry)); ++ if (!entry) ++ { ++ syslog (LOG_ERR, "out of memory"); ++ return; ++ } ++ ++ entry->devpath = strdup (devpath); ++ entry->uris.n_uris = uris->n_uris; ++ entry->uris.uri = malloc (sizeof (char *) * uris->n_uris); ++ for (i = 0; i < uris->n_uris; i++) ++ entry->uris.uri[i] = strdup (uris->uri[i]); ++ entry->next = NULL; ++ *prev = entry; ++} ++ ++static struct usb_uri_map * ++read_usb_uri_map (void) ++{ ++ int fd = open (USB_URI_MAP, O_RDWR); ++ struct usb_uri_map *map = NULL; ++ struct flock lock; ++ struct stat st; ++ char *buf, *line; ++ ++ if (fd == -1) ++ { ++ char dir[] = USB_URI_MAP; ++ char *p = strrchr (dir, '/'); ++ if (p) ++ { ++ *p = '\0'; ++ mkdir (dir, 0755); ++ fd = open (USB_URI_MAP, O_RDWR | O_TRUNC | O_CREAT, 0644); ++ if (fd == -1) ++ { ++ syslog (LOG_ERR, "failed to create " USB_URI_MAP); ++ return NULL; ++ } ++ } ++ } ++ ++ map = malloc (sizeof (struct usb_uri_map)); ++ if (!map) ++ { ++ close (fd); ++ syslog (LOG_ERR, "out of memory"); ++ return NULL; ++ } ++ ++ lock.l_type = F_WRLCK; ++ lock.l_whence = SEEK_SET; ++ lock.l_start = 0; ++ lock.l_len = 0; ++ if (fcntl (fd, F_SETLKW, &lock) == -1) ++ { ++ close (fd); ++ free (map); ++ syslog (LOG_ERR, "failed to lock " USB_URI_MAP); ++ return NULL; ++ } ++ ++ map->entries = NULL; ++ map->fd = fd; ++ if (fstat (fd, &st) == -1) ++ { ++ close (fd); ++ free (map); ++ syslog (LOG_ERR, "failed to fstat " USB_URI_MAP " (fd %d)", fd); ++ return NULL; ++ } ++ ++ /* Read the entire file into memory. */ ++ buf = malloc (1 + (sizeof (char) * st.st_size)); ++ if (!buf) ++ { ++ close (fd); ++ free (map); ++ syslog (LOG_ERR, "out of memory"); ++ return NULL; ++ } ++ ++ if (read (fd, buf, st.st_size) < 0) ++ { ++ close (fd); ++ free (map); ++ free (buf); ++ syslog (LOG_ERR, "failed to read " USB_URI_MAP); ++ return NULL; ++ } ++ ++ buf[st.st_size] = '\0'; ++ line = buf; ++ while (line) ++ { ++ char *saveptr = NULL; ++ const char *devpath, *uri; ++ struct device_uris uris; ++ char *nextline = strchr (line, '\n'); ++ if (!nextline) ++ break; ++ ++ *nextline++ = '\0'; ++ if (nextline >= buf + st.st_size) ++ nextline = NULL; ++ ++ devpath = strtok_r (line, "\t", &saveptr); ++ uri = strtok_r (NULL, "\t", &saveptr); ++ if (!devpath || !uri) ++ { ++ syslog (LOG_DEBUG, "Incorrect line in " USB_URI_MAP ": %s", ++ line); ++ continue; ++ } ++ ++ uris.n_uris = 1; ++ uris.uri = malloc (sizeof (char *)); ++ if (uris.uri == NULL) ++ break; ++ ++ uris.uri[0] = strdup (uri); ++ while ((uri = strtok_r (NULL, "\t", &saveptr)) != NULL) ++ add_device_uri (&uris, uri); ++ ++ add_usb_uri_mapping (&map, devpath, &uris); ++ ++ line = nextline; ++ } ++ ++ free (buf); ++ return map; ++} ++ ++static void ++write_usb_uri_map (struct usb_uri_map *map) ++{ ++ struct usb_uri_map_entry *entry; ++ int fd = map->fd; ++ FILE *f; ++ ++ lseek (fd, SEEK_SET, 0); ++ ftruncate (fd, 0); ++ f = fdopen (fd, "w"); ++ if (!f) ++ { ++ syslog (LOG_ERR, "failed to fdopen " USB_URI_MAP " (fd %d)", fd); ++ close (fd); ++ map->fd = -1; ++ return; ++ } ++ ++ for (entry = map->entries; entry; entry = entry->next) ++ { ++ size_t i; ++ fprintf (f, "%s\t%s", entry->devpath, entry->uris.uri[0]); ++ for (i = 1; i < entry->uris.n_uris; i++) ++ fprintf (f, "\t%s", entry->uris.uri[i]); ++ fwrite ("\n", 1, 1, f); ++ } ++ ++ fclose (f); ++ map->fd = -1; ++} ++ ++static void ++free_usb_uri_map (struct usb_uri_map *map) ++{ ++ struct usb_uri_map_entry *entry, *next; ++ for (entry = map->entries; entry; entry = next) ++ { ++ next = entry->next; ++ free (entry->devpath); ++ free_device_uris (&entry->uris); ++ free (entry); ++ } ++ ++ if (map->fd != -1) ++ close (map->fd); ++ ++ free (map); ++} ++ ++static void ++free_device_id (struct device_id *id) ++{ ++ free (id->full_device_id); ++ free (id->mfg); ++ free (id->mdl); ++ free (id->sern); ++} ++ ++static void ++parse_device_id (const char *device_id, ++ struct device_id *id) ++{ ++ char *fieldname; ++ char *start, *end; ++ size_t len; ++ ++ len = strlen (device_id); ++ if (len == 0) ++ return; ++ ++ if (device_id[len - 1] == '\n') ++ len--; ++ ++ id->full_device_id = malloc (len + 1); ++ fieldname = malloc (len + 1); ++ if (!id->full_device_id || !fieldname) ++ { ++ syslog (LOG_ERR, "out of memory"); ++ return; ++ } ++ ++ memcpy (id->full_device_id, device_id, len); ++ id->full_device_id[len] = '\0'; ++ fieldname[0] = '\0'; ++ start = id->full_device_id; ++ while (*start != '\0') ++ { ++ /* New field. */ ++ ++ end = start; ++ while (*end != '\0' && *end != ':') ++ end++; ++ ++ if (*end == '\0') ++ break; ++ ++ len = end - start; ++ memcpy (fieldname, start, len); ++ fieldname[len] = '\0'; ++ ++ start = end + 1; ++ while (*end != '\0' && *end != ';') ++ end++; ++ ++ len = end - start; ++ ++ if (!id->mfg && ++ (!strncasecmp (fieldname, "MANUFACTURER", 12) || ++ !strncasecmp (fieldname, "MFG", 3))) ++ id->mfg = strndup (start, len); ++ else if (!id->mdl && ++ (!strncasecmp (fieldname, "MODEL", 5) || ++ !strncasecmp (fieldname, "MDL", 3))) ++ id->mdl = strndup (start, len); ++ else if (!id->sern && ++ (!strncasecmp (fieldname, "SERIALNUMBER", 12) || ++ !strncasecmp (fieldname, "SERN", 4) || ++ !strncasecmp (fieldname, "SN", 2))) ++ id->sern = strndup (start, len); ++ ++ if (*end != '\0') ++ start = end + 1; ++ } ++ ++ free (fieldname); ++} ++ ++static const char * ++no_password (const char *prompt) ++{ ++ return ""; ++} ++ ++static http_t * ++cups_connection (void) ++{ ++ http_t *cups = NULL; ++ static int first_time = 1; ++ ++ if (first_time) ++ { ++ cupsSetPasswordCB (no_password); ++ first_time = 0; ++ } ++ ++ cups = httpConnectEncrypt ("localhost", 631, ++ HTTP_ENCRYPT_IF_REQUESTED); ++ if (cups == NULL) ++ { ++ /* Don't bother retrying here. Instead, the CUPS initscript ++ should run these commands after cupsd is started: ++ ++ rmmod usblp ++ udevadm trigger --subsystem-match=usb \ ++ --attr-match=bInterfaceClass=07 \ ++ --attr-match=bInterfaceSubClass=01 ++ */ ++ ++ syslog (LOG_DEBUG, "failed to connect to CUPS server; giving up"); ++ return NULL; ++ } ++ ++ return cups; ++} ++ ++static int ++find_matching_device_uris (struct device_id *id, ++ const char *usbserial, ++ struct device_uris *uris, ++ const char *devpath, ++ struct usb_uri_map *map) ++{ ++ http_t *cups; ++ ipp_t *request, *answer; ++ ipp_attribute_t *attr; ++ struct device_uris uris_noserial; ++ struct device_uris all_uris; ++ size_t i, n; ++ const char *exclude_schemes[] = { ++ "beh", ++ "bluetooth", ++ "http", ++ "https", ++ "ipp", ++ "lpd", ++ "ncp", ++ "parallel", ++ "scsi", ++ "smb", ++ "snmp", ++ "socket", ++ }; ++ ++ uris->n_uris = uris_noserial.n_uris = all_uris.n_uris = 0; ++ uris->uri = uris_noserial.uri = all_uris.uri = NULL; ++ ++ /* Leave the bus to settle. */ ++ sleep (1); ++ ++ cups = cups_connection (); ++ request = ippNewRequest (CUPS_GET_DEVICES); ++ ippAddStrings (request, IPP_TAG_OPERATION, IPP_TAG_NAME, "exclude-schemes", ++ sizeof (exclude_schemes) / sizeof(exclude_schemes[0]), ++ NULL, exclude_schemes); ++ ++ answer = cupsDoRequest (cups, request, "/"); ++ httpClose (cups); ++ ++ if (answer == NULL) ++ { ++ syslog (LOG_ERR, "failed to send IPP request %d", ++ request->request.op.operation_id); ++ return 0; ++ } ++ ++ if (answer->request.status.status_code > IPP_OK_CONFLICT) ++ { ++ syslog (LOG_ERR, "IPP request %d failed (%d)", ++ request->request.op.operation_id, ++ answer->request.status.status_code); ++ return 0; ++ } ++ ++ for (attr = answer->attrs; attr; attr = attr->next) ++ { ++ const char *device_uri = NULL; ++ struct device_id this_id; ++ this_id.full_device_id = this_id.mfg = this_id.mdl = this_id.sern = NULL; ++ ++ while (attr && attr->group_tag != IPP_TAG_PRINTER) ++ attr = attr->next; ++ ++ if (!attr) ++ break; ++ ++ for (; attr && attr->group_tag == IPP_TAG_PRINTER; attr = attr->next) ++ { ++ if (attr->value_tag == IPP_TAG_URI && ++ !strcmp (attr->name, "device-uri")) ++ device_uri = attr->values[0].string.text; ++ else if (attr->value_tag == IPP_TAG_TEXT && ++ !strcmp (attr->name, "device-id")) ++ parse_device_id (attr->values[0].string.text, &this_id); ++ } ++ ++ /* Only use device schemes in our preference order for matching ++ * against the IEEE 1284 Device ID. */ ++ ++ for (i = 0; ++ device_uri && ++ i < sizeof (device_uri_types) / sizeof (device_uri_types[0]); ++ i++) ++ { ++ size_t len = strlen (device_uri_types[i]); ++ if (!strncmp (device_uri_types[i], device_uri, len) && ++ device_uri[len] == ':') ++ break; ++ } ++ ++ if (device_uri) ++ add_device_uri (&all_uris, device_uri); ++ ++ if (i == sizeof (device_uri_types) / sizeof (device_uri_types[0])) ++ /* Not what we want to match against. Ignore this one. */ ++ device_uri = NULL; ++ ++ /* Now check the manufacturer and model names. */ ++ if (device_uri && this_id.mfg && this_id.mdl && ++ !strcmp (this_id.mfg, id->mfg) && ++ !strcmp (this_id.mdl, id->mdl)) ++ { ++ /* We've checked everything except the serial numbers. This ++ * is more complicated. Some devices include a serial ++ * number (SERN) field in their IEEE 1284 Device ID. Others ++ * don't -- this was not a mandatory field in the ++ * specification. ++ * ++ * If the device includes SERN field in its, it must match ++ * what the device-id attribute has. ++ * ++ * Otherwise, the only means we have of knowing which device ++ * is meant is the USB serial number. ++ * ++ * CUPS backends may choose to insert the USB serial number ++ * into the SERN field when reporting a device-id attribute. ++ * HPLIP does this, and it seems not to stray too far from ++ * the intent of that field. We accommodate this. ++ * ++ * Alternatively, CUPS backends may include the USB serial ++ * number somewhere in their reported device-uri attributes. ++ * For instance, the CUPS 1.4 usb backend, when compiled ++ * with libusb support, gives device URIs containing the USB ++ * serial number for devices without a SERN field, like ++ * this: usb://HP/DESKJET%20990C?serial=US05M1D20CIJ ++ * ++ * To accommodate this we examine tokens between '?', '=' ++ * and '&' delimiters to check for USB serial number ++ * matches. ++ * ++ * CUPS 1.3, and CUPS 1.4 without libusb support, doesn't do this. ++ * As a result we also need to deal with devices that don't report a ++ * SERN field where the backends that don't add a SERN field from ++ * the USB serial number and also don't include the USB serial ++ * number in the URI. ++ */ ++ ++ int match = 0; ++ if ((id->sern && this_id.sern && !strcmp (id->sern, this_id.sern))) ++ { ++ syslog (LOG_DEBUG, "SERN fields match"); ++ match = 1; ++ } ++ ++ if (!match && usbserial[0] != '\0') ++ { ++ if (!id->sern) ++ { ++ if (this_id.sern && !strcmp (usbserial, this_id.sern)) ++ { ++ syslog (LOG_DEBUG, ++ "SERN field matches USB serial number"); ++ match = 1; ++ } ++ } ++ ++ if (!match) ++ { ++ char *saveptr, *uri = strdup (device_uri); ++ const char *token; ++ const char *sep = "?=&/"; ++ for (token = strtok_r (uri, sep, &saveptr); ++ token; ++ token = strtok_r (NULL, sep, &saveptr)) ++ if (!strcmp (token, usbserial)) ++ { ++ syslog (LOG_DEBUG, "URI contains USB serial number"); ++ match = 1; ++ break; ++ } ++ ++ free (uri); ++ } ++ } ++ ++ if (match) ++ { ++ syslog (LOG_DEBUG, "URI match: %s", device_uri); ++ add_device_uri (uris, device_uri); ++ } ++ else if (!id->sern) ++ { ++ syslog (LOG_DEBUG, "URI matches without serial number: %s", ++ device_uri); ++ add_device_uri (&uris_noserial, device_uri); ++ } ++ else ++ syslog (LOG_DEBUG, "No match: %s", device_uri); ++ } ++ ++ if (!attr) ++ break; ++ } ++ ++ ippDelete (answer); ++ ++ /* Decide what to do about device URIs that did not match a serial ++ * number. The device had no SERN field, and the USB serial number ++ * was nowhere to be found from the device URI or device-id field. ++ * ++ * Device URIs with no reference to serial number can only each ever ++ * work when only one printer of that model is connected. ++ * Accordingly, it is safe to disable queues using such URIs, as we ++ * know the removed/added device is that lone printer. ++ * ++ * When adding queues it is best to avoid URIs that don't ++ * distinguish serial numbers. ++ * ++ * What we'll do, then, is concatenate the list of "non-serial" URIs ++ * onto the end of the list of "serial" URIs. ++ */ ++ ++ if (uris->n_uris == 0 && uris_noserial.n_uris > 0) ++ { ++ syslog (LOG_DEBUG, "No serial number URI matches so using those without"); ++ uris->n_uris = uris_noserial.n_uris; ++ uris->uri = uris_noserial.uri; ++ uris_noserial.n_uris = 0; ++ uris_noserial.uri = NULL; ++ } ++ else if (uris_noserial.n_uris > 0) ++ { ++ char **old = uris->uri; ++ uris->uri = realloc (uris->uri, ++ sizeof (char *) * (uris->n_uris + ++ uris_noserial.n_uris)); ++ if (!uris->uri) ++ uris->uri = old; ++ else ++ { ++ for (i = 0; i < uris_noserial.n_uris; i++) ++ uris->uri[uris->n_uris + i] = uris_noserial.uri[i]; ++ uris->n_uris += uris_noserial.n_uris; ++ } ++ ++ uris_noserial.n_uris = 0; ++ uris_noserial.uri = NULL; ++ } ++ ++ free_device_uris (&uris_noserial); ++ ++ /* Having decided which device URIs match based on IEEE 1284 Device ++ * ID, we now need to look for "paired" URIs for other functions of ++ * a multi-function device. This are the same except for the ++ * scheme. */ ++ ++ n = uris->n_uris; ++ for (i = 0; i < n; i++) ++ { ++ size_t j; ++ char *me = uris->uri[i]; ++ char *my_rest = strchr (me, ':'); ++ size_t my_schemelen; ++ if (!my_rest) ++ continue; ++ ++ my_schemelen = my_rest - me; ++ for (j = 0; j < all_uris.n_uris; j++) ++ { ++ char *twin = all_uris.uri[j]; ++ char *twin_rest = strchr (twin, ':'); ++ size_t twin_schemelen; ++ if (!twin_rest) ++ continue; ++ ++ twin_schemelen = twin_rest - twin; ++ if (my_schemelen == twin_schemelen && ++ !strncmp (me, twin, my_schemelen)) ++ /* This is the one we are looking for the twin of. */ ++ continue; ++ ++ if (!strcmp (my_rest, twin_rest)) ++ { ++ syslog (LOG_DEBUG, "%s twinned with %s", me, twin); ++ add_device_uri (uris, twin); ++ } ++ } ++ } ++ ++ free_device_uris (&all_uris); ++ if (uris->n_uris > 0) ++ { ++ add_usb_uri_mapping (&map, devpath, uris); ++ write_usb_uri_map (map); ++ free_usb_uri_map (map); ++ } ++ ++ return uris->n_uris; ++} ++ ++/* Call a function for each queue with the given device-uri and printer-state. ++ * Returns the number of queues with a matching device-uri. */ ++static size_t ++for_each_matching_queue (struct device_uris *device_uris, ++ int flags, ++ void (*fn) (const char *, void *), ++ void *context) ++{ ++ size_t matched = 0; ++ http_t *cups = cups_connection (); ++ ipp_t *request, *answer; ++ ipp_attribute_t *attr; ++ const char *attributes[] = { ++ "printer-uri-supported", ++ "device-uri", ++ "printer-state", ++ "printer-state-message", ++ }; ++ ++ request = ippNewRequest (CUPS_GET_PRINTERS); ++ ippAddStrings (request, IPP_TAG_OPERATION, IPP_TAG_KEYWORD, ++ "requested-attributes", ++ sizeof (attributes) / sizeof (attributes[0]), ++ NULL, attributes); ++ answer = cupsDoRequest (cups, request, "/"); ++ httpClose (cups); ++ if (answer == NULL) ++ { ++ syslog (LOG_ERR, "failed to send CUPS-Get-Printers request"); ++ return 0; ++ } ++ ++ if (answer->request.status.status_code > IPP_OK_CONFLICT) ++ { ++ if (answer->request.status.status_code == IPP_NOT_FOUND) ++ { ++ /* No printer queues configured. */ ++ ippDelete (answer); ++ return 0; ++ } ++ ++ syslog (LOG_ERR, "CUPS-Get-Printers request failed (%d)", ++ answer->request.status.status_code); ++ return 0; ++ } ++ ++ for (attr = answer->attrs; attr; attr = attr->next) ++ { ++ const char *this_printer_uri = NULL; ++ const char *this_device_uri = NULL; ++ const char *printer_state_message = NULL; ++ int state = 0; ++ size_t i; ++ ++ while (attr && attr->group_tag != IPP_TAG_PRINTER) ++ attr = attr->next; ++ ++ if (!attr) ++ break; ++ ++ for (; attr && attr->group_tag == IPP_TAG_PRINTER; attr = attr->next) ++ { ++ if (attr->value_tag == IPP_TAG_URI) ++ { ++ if (!strcmp (attr->name, "device-uri")) ++ this_device_uri = attr->values[0].string.text; ++ else if (!strcmp (attr->name, "printer-uri-supported")) ++ this_printer_uri = attr->values[0].string.text; ++ } ++ else if (attr->value_tag == IPP_TAG_TEXT && ++ !strcmp (attr->name, "printer-state-message")) ++ printer_state_message = attr->values[0].string.text; ++ else if (attr->value_tag == IPP_TAG_ENUM && ++ !strcmp (attr->name, "printer-state")) ++ state = attr->values[0].integer; ++ } ++ ++ for (i = 0; i < device_uris->n_uris; i++) ++ if (!strcmp (device_uris->uri[i], this_device_uri)) ++ { ++ matched++; ++ if (((flags & MATCH_ONLY_DISABLED) && ++ state == IPP_PRINTER_STOPPED && ++ !strcmp (printer_state_message, DISABLED_REASON)) || ++ (flags & MATCH_ONLY_DISABLED) == 0) ++ { ++ syslog (LOG_DEBUG ,"Queue %s has matching device URI", ++ this_printer_uri); ++ (*fn) (this_printer_uri, context); ++ } ++ } ++ ++ if (!attr) ++ break; ++ } ++ ++ ippDelete (answer); ++ return matched; ++} ++ ++static void ++enable_queue (const char *printer_uri, void *context) ++{ ++ /* Disable it. */ ++ http_t *cups = cups_connection (); ++ ipp_t *request, *answer; ++ request = ippNewRequest (IPP_RESUME_PRINTER); ++ ippAddString (request, IPP_TAG_OPERATION, IPP_TAG_URI, ++ "printer-uri", NULL, printer_uri); ++ answer = cupsDoRequest (cups, request, "/admin/"); ++ if (!answer) ++ { ++ syslog (LOG_ERR, "Failed to send IPP-Resume-Printer request"); ++ httpClose (cups); ++ return; ++ } ++ ++ if (answer->request.status.status_code > IPP_OK_CONFLICT) ++ syslog (LOG_ERR, "IPP-Resume-Printer request failed"); ++ else ++ syslog (LOG_INFO, "Re-enabled printer %s", printer_uri); ++ ++ ippDelete (answer); ++ httpClose (cups); ++} ++ ++static void ++disable_queue (const char *printer_uri, void *context) ++{ ++ /* Disable it. */ ++ http_t *cups = cups_connection (); ++ ipp_t *request, *answer; ++ request = ippNewRequest (IPP_PAUSE_PRINTER); ++ ippAddString (request, IPP_TAG_OPERATION, IPP_TAG_URI, ++ "printer-uri", NULL, printer_uri); ++ ippAddString (request, IPP_TAG_OPERATION, IPP_TAG_TEXT, ++ "printer-state-message", NULL, DISABLED_REASON); ++ answer = cupsDoRequest (cups, request, "/admin/"); ++ if (!answer) ++ { ++ syslog (LOG_ERR, "Failed to send IPP-Pause-Printer request"); ++ httpClose (cups); ++ return; ++ } ++ ++ if (answer->request.status.status_code > IPP_OK_CONFLICT) ++ syslog (LOG_ERR, "IPP-Pause-Printer request failed"); ++ else ++ syslog (LOG_INFO, "Disabled printer %s as the corresponding device " ++ "was unplugged or turned off", printer_uri); ++ ++ ippDelete (answer); ++ httpClose (cups); ++} ++ ++static char * ++syspath_from_devpath (struct udev *udev, const char *devpath) ++{ ++ const char *sys; ++ char *syspath; ++ size_t syslen, devpathlen = strlen (devpath); ++ sys = udev_get_sys_path (udev); ++ syslen = strlen (sys); ++ syspath = malloc (syslen + devpathlen + 1); ++ if (syspath == NULL) ++ return NULL; ++ ++ memcpy (syspath, sys, syslen); ++ memcpy (syspath + syslen, devpath, devpathlen); ++ syspath[syslen + devpathlen] = '\0'; ++ return syspath; ++} ++ ++static void ++reap_child (GPid pid, gint status, gpointer context) ++{ ++ PrinterConfigDaemon *self = context; ++ struct children *child, **prev = &self->children; ++ g_debug ("PID %d has exited", pid); ++ for (child = self->children; child; prev = &child->next, child = child->next) ++ if (child->pid == pid) ++ { ++ *prev = child->next; ++ free (child); ++ g_debug ("self->children is now %p", self->children); ++ break; ++ } ++} ++ ++G_DEFINE_TYPE (PrinterConfigDaemon, printer_config_daemon, G_TYPE_OBJECT) ++ ++static gboolean ++kill_timeout (gpointer context) ++{ ++ PrinterConfigDaemon *self = context; ++ if (self->children == NULL) ++ { ++ g_debug ("Time to go"); ++ main_quit (); ++ return FALSE; ++ } ++ ++ g_debug ("children is %p", self->children); ++ return TRUE; ++} ++ ++static gboolean ++reset_killtimer (PrinterConfigDaemon *self) ++{ ++ if (self->killtimer != 0) ++ { ++ g_debug ("Remove killtimer %d", self->killtimer); ++ g_source_remove (self->killtimer); ++ } ++ ++ self->killtimer = g_timeout_add (1000, kill_timeout, self); ++ g_debug ("Set killtimer %d", self->killtimer); ++ return TRUE; ++} ++ ++static void ++printer_config_daemon_dispose (GObject *gobject) ++{ ++ PrinterConfigDaemon *self = PRINTER_CONFIG_DAEMON (gobject); ++ g_debug ("dispose %p", self); ++ G_OBJECT_CLASS (printer_config_daemon_parent_class)->dispose (gobject); ++} ++ ++static void ++printer_config_daemon_finalize (GObject *gobject) ++{ ++ PrinterConfigDaemon *self = PRINTER_CONFIG_DAEMON (gobject); ++ g_debug ("finalize %p", self); ++ if (self->killtimer != 0) ++ { ++ g_debug ("Remove killtimer %d", self->killtimer); ++ g_source_remove (self->killtimer); ++ } ++ ++ G_OBJECT_CLASS (printer_config_daemon_parent_class)->finalize (gobject); ++} ++ ++static void ++printer_config_daemon_class_init (PrinterConfigDaemonClass *klass) ++{ ++ GError *error = NULL; ++ GObjectClass *gobject_class = G_OBJECT_CLASS (klass); ++ gobject_class->dispose = printer_config_daemon_dispose; ++ gobject_class->finalize = printer_config_daemon_finalize; ++ g_debug ("class init"); ++ klass->connection = dbus_g_bus_get (DBUS_BUS_SYSTEM, &error); ++ if (klass->connection == NULL) ++ { ++ g_warning ("Unable to connect to D-Bus: %s", error->message); ++ g_error_free (error); ++ return; ++ } ++ ++ dbus_g_object_type_install_info(PRINTER_CONFIG_TYPE_DAEMON, ++ &dbus_glib_printer_config_daemon_object_info); ++} ++ ++static void ++printer_config_daemon_init (PrinterConfigDaemon *self) ++{ ++ DBusGProxy *driver_proxy; ++ GError *error = NULL; ++ PrinterConfigDaemonClass *klass = PRINTER_CONFIG_DAEMON_GET_CLASS (self); ++ guint request_ret; ++ ++ dbus_g_connection_register_g_object (klass->connection, ++ "/com/redhat/PrinterConfig", ++ G_OBJECT (self)); ++ driver_proxy = dbus_g_proxy_new_for_name (klass->connection, ++ DBUS_SERVICE_DBUS, ++ DBUS_PATH_DBUS, ++ DBUS_INTERFACE_DBUS); ++ ++ g_debug ("daemon init %p", self); ++ if (!org_freedesktop_DBus_request_name (driver_proxy, ++ "com.redhat.PrinterConfig", ++ 0, &request_ret, ++ &error)) ++ { ++ g_warning ("Unable to register service: %s", error->message); ++ g_error_free (error); ++ } ++ ++ self->children = NULL; ++ g_object_unref (driver_proxy); ++} ++ ++gboolean ++printer_config_daemon_usb_printer_add (PrinterConfigDaemon *self, ++ const char *usb_device_devpath, ++ const char *deviceid, ++ DBusGMethodInvocation *context) ++{ ++ struct device_id id; ++ struct device_uris device_uris; ++ struct usb_uri_map *map; ++ struct usb_uri_map_entry *entry; ++ struct udev *udev; ++ struct udev_device *dev; ++ const char *usbserial; ++ char *syspath; ++ ++ syslog (LOG_DEBUG, "add %s", usb_device_devpath); ++ dbus_g_method_return (context); ++ ++ reset_killtimer (self); ++ udev = udev_new (); ++ if (!udev) ++ { ++ syslog (LOG_ERR, "failed to init libudev"); ++ return FALSE; ++ } ++ ++ map = read_usb_uri_map (); ++ if (!map) ++ return TRUE; ++ ++ for (entry = map->entries; entry; entry = entry->next) ++ if (!strcmp (entry->devpath, usb_device_devpath)) ++ break; ++ ++ if (entry != NULL) ++ /* The map already had an entry so has already been dealt ++ * with. This can happen because there are two "add" ++ * triggers: one for the usb_device device and the other for ++ * the usblp device. We have most likely been triggered by ++ * the usblp device, so the usb_device rule got there before ++ * us and succeeded. ++ * ++ * Pretend we didn't find any device URIs that matched, and ++ * exit. ++ */ ++ return TRUE; ++ ++ id.full_device_id = id.mfg = id.mdl = id.sern = NULL; ++ parse_device_id (deviceid, &id); ++ if (!id.mfg || !id.mdl) ++ { ++ syslog (LOG_ERR, "invalid IEEE 1284 Device ID %s", ++ id.full_device_id); ++ return FALSE; ++ } ++ ++ syspath = syspath_from_devpath (udev, usb_device_devpath); ++ if (!syspath) ++ { ++ syslog (LOG_ERR, "unable to get syspath from devpath"); ++ return FALSE; ++ } ++ ++ dev = udev_device_new_from_syspath (udev, syspath); ++ if (!dev) ++ { ++ udev_device_unref (dev); ++ udev_unref (udev); ++ syslog (LOG_ERR, "unable to access %s", syspath); ++ free (syspath); ++ return TRUE; ++ } ++ ++ free (syspath); ++ usbserial = udev_device_get_sysattr_value (dev, "serial"); ++ syslog (LOG_DEBUG, "MFG:%s MDL:%s SERN:%s serial:%s", id.mfg, id.mdl, ++ id.sern ? id.sern : "-", usbserial ? usbserial : "-"); ++ ++ find_matching_device_uris (&id, usbserial, &device_uris, usb_device_devpath, ++ map); ++ udev_device_unref (dev); ++ udev_unref (udev); ++ if (device_uris.n_uris == 0) ++ { ++ free_device_id (&id); ++ return TRUE; ++ } ++ ++ /* Re-enable any queues we'd previously disabled. */ ++ if (for_each_matching_queue (&device_uris, MATCH_ONLY_DISABLED, ++ enable_queue, NULL) == 0) ++ { ++ size_t i; ++ int type; ++ GPid child_pid; ++ GError *error = NULL; ++ char **argv = malloc (sizeof (char *) * (3 + device_uris.n_uris)); ++ ++ /* No queue is configured for this device yet. ++ Decide on a URI to use. */ ++ type = device_uri_type (device_uris.uri[0]); ++ for (i = 1; i < device_uris.n_uris; i++) ++ { ++ int new_type = device_uri_type (device_uris.uri[i]); ++ if (new_type < type) ++ { ++ char *swap = device_uris.uri[0]; ++ device_uris.uri[0] = device_uris.uri[i]; ++ device_uris.uri[i] = swap; ++ type = new_type; ++ } ++ } ++ ++ argv[0] = "/usr/libexec/udev-add-printer"; ++ argv[1] = id.full_device_id; ++ for (i = 0; i < device_uris.n_uris; i++) ++ argv[i + 2] = device_uris.uri[i]; ++ argv[i + 2] = NULL; ++ ++ syslog (LOG_DEBUG, "About to add queue for %s", argv[2]); ++ if (g_spawn_async ("/", argv, NULL, ++ G_SPAWN_STDOUT_TO_DEV_NULL | ++ G_SPAWN_STDERR_TO_DEV_NULL | ++ G_SPAWN_DO_NOT_REAP_CHILD, ++ NULL, NULL, ++ &child_pid, ++ &error) == FALSE) ++ syslog (LOG_ERR, "Failed to execute %s", argv[0]); ++ else ++ { ++ struct children *child = malloc (sizeof (struct children)); ++ child->next = self->children; ++ child->pid = child_pid; ++ self->children = child; ++ g_child_watch_add (child_pid, reap_child, self); ++ } ++ } ++ ++ free_device_id (&id); ++ free_device_uris (&device_uris); ++ return TRUE; ++} ++ ++gboolean ++printer_config_daemon_usb_printer_remove (PrinterConfigDaemon *self, ++ const char *devpath, ++ DBusGMethodInvocation *context) ++{ ++ struct usb_uri_map *map; ++ struct usb_uri_map_entry *entry, **prev; ++ struct device_uris *uris = NULL; ++ ++ syslog (LOG_DEBUG, "remove %s", devpath); ++ dbus_g_method_return (context); ++ ++ reset_killtimer (self); ++ map = read_usb_uri_map (); ++ if (!map) ++ return TRUE; ++ ++ prev = &map->entries; ++ for (entry = map->entries; entry; entry = entry->next) ++ { ++ if (!strcmp (entry->devpath, devpath)) ++ { ++ uris = &entry->uris; ++ break; ++ } ++ ++ prev = &(entry->next); ++ } ++ ++ if (uris) ++ { ++ /* Find the relevant queues and disable them if they are enabled. */ ++ for_each_matching_queue (uris, 0, disable_queue, NULL); ++ *prev = entry->next; ++ write_usb_uri_map (map); ++ } ++ ++ free_usb_uri_map (map); ++ return TRUE; ++} ++ ++PrinterConfigDaemon * ++printer_config_daemon_new (void) ++{ ++ PrinterConfigDaemon *self; ++ self = PRINTER_CONFIG_DAEMON (g_object_new (PRINTER_CONFIG_TYPE_DAEMON, ++ NULL)); ++ self->children = NULL; ++ self->killtimer = 0; ++ g_debug ("New daemon %p", self); ++ return self; ++} +diff -up /dev/null system-config-printer-1.1.10/udev/printer-config.h +--- /dev/null 2009-07-31 14:10:14.275001833 +0100 ++++ system-config-printer-1.1.10/udev/printer-config.h 2009-07-31 15:09:03.276086247 +0100 +@@ -0,0 +1,76 @@ ++/* -*- Mode: C; c-file-style: "gnu" -*- ++ * printer-config - a D-Bus service for configuring printers ++ * Copyright (C) 2009 Red Hat, Inc. ++ * Author: Tim Waugh ++ * ++ * 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 ++ * ++ */ ++ ++#ifndef PRINTER_CONFIG_H ++#define PRINTER_CONFIG_H ++ ++#include ++#include ++ ++#define PRINTER_CONFIG_TYPE_DAEMON (printer_config_daemon_get_type ()) ++#define PRINTER_CONFIG_DAEMON(obj) \ ++ (G_TYPE_CHECK_INSTANCE_CAST ((obj), \ ++ PRINTER_CONFIG_TYPE_DAEMON, \ ++ PrinterConfigDaemon)) ++#define PRINTER_CONFIG_IS_DAEMON_CLASS(klass) \ ++ (G_TYPE_CHECK_CLASS_CAST ((klass), PRINTER_CONFIG_TYPE_DAEMON, \ ++ PrinterConfigDaemonClass)) ++#define PRINTER_CONFIG_DAEMON_GET_CLASS(obj) \ ++ (G_TYPE_INSTANCE_GET_CLASS ((obj), PRINTER_CONFIG_TYPE_DAEMON, \ ++ PrinterConfigDaemonClass)) ++ ++typedef struct _PrinterConfigDaemon PrinterConfigDaemon; ++typedef struct _PrinterConfigDaemonClass PrinterConfigDaemonClass; ++ ++struct children; ++struct _PrinterConfigDaemon ++{ ++ GObject parent_instance; ++ ++ /* instance members */ ++ struct children *children; ++ guint killtimer; ++}; ++ ++struct _PrinterConfigDaemonClass ++{ ++ GObjectClass parent_class; ++ ++ /* class members */ ++ DBusGConnection *connection; ++}; ++ ++/* used by PRINTER_CONFIG_TYPE_DAEMON */ ++GType printer_config_daemon_get_type (void); ++ ++PrinterConfigDaemon *printer_config_daemon_new (void); ++gboolean printer_config_daemon_usb_printer_add (PrinterConfigDaemon *d, ++ const char *devpath, ++ const char *deviceid, ++ DBusGMethodInvocation *ctx); ++ ++gboolean printer_config_daemon_usb_printer_remove (PrinterConfigDaemon *d, ++ const char *devpath, ++ DBusGMethodInvocation *ctx); ++ ++void main_quit (void); ++ ++#endif /* PRINTER_CONFIG_H */ +diff -up /dev/null system-config-printer-1.1.10/udev/printer-config-main.c +--- /dev/null 2009-07-31 14:10:14.275001833 +0100 ++++ system-config-printer-1.1.10/udev/printer-config-main.c 2009-07-31 15:09:03.272086821 +0100 +@@ -0,0 +1,159 @@ ++/* -*- Mode: C; c-file-style: "gnu" -*- ++ * ++ * Copyright (C) 2007 David Zeuthen ++ * Copyright (C) 2009 Red Hat, Inc. ++ * ++ * 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 St, Fifth Floor, Boston, MA 02110-1301 USA ++ * ++ */ ++ ++#ifdef HAVE_CONFIG_H ++# include "config.h" ++#endif ++ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#include ++#include ++ ++#define DBUS_API_SUBJECT_TO_CHANGE ++#include ++#include ++ ++#include "printer-config.h" ++ ++#define NAME_TO_CLAIM "com.redhat.PrinterConfig" ++ ++static gboolean ++acquire_name_on_proxy (DBusGProxy *bus_proxy) ++{ ++ GError *error; ++ guint result; ++ gboolean res; ++ gboolean ret; ++ ++ ret = FALSE; ++ ++ if (bus_proxy == NULL) { ++ goto out; ++ } ++ ++ error = NULL; ++ res = dbus_g_proxy_call (bus_proxy, ++ "RequestName", ++ &error, ++ G_TYPE_STRING, NAME_TO_CLAIM, ++ G_TYPE_UINT, 0, ++ G_TYPE_INVALID, ++ G_TYPE_UINT, &result, ++ G_TYPE_INVALID); ++ if (! res) { ++ if (error != NULL) { ++ g_warning ("Failed to acquire %s: %s", NAME_TO_CLAIM, error->message); ++ g_error_free (error); ++ } else { ++ g_warning ("Failed to acquire %s", NAME_TO_CLAIM); ++ } ++ goto out; ++ } ++ ++ if (result != DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER) { ++ if (error != NULL) { ++ g_warning ("Failed to acquire %s: %s", NAME_TO_CLAIM, error->message); ++ g_error_free (error); ++ } else { ++ g_warning ("Failed to acquire %s", NAME_TO_CLAIM); ++ } ++ goto out; ++ } ++ ++ ret = TRUE; ++ ++ out: ++ return ret; ++} ++ ++static GMainLoop *loop; ++ ++void main_quit (void); ++ ++void ++main_quit (void) ++{ ++ g_main_loop_quit (loop); ++} ++ ++int ++main (int argc, char **argv) ++{ ++ PrinterConfigDaemon *daemon; ++ GError *error; ++ DBusGProxy *bus_proxy; ++ DBusGConnection *bus; ++ int ret = 1; ++ ++ g_type_init (); ++ ++ error = NULL; ++ bus = dbus_g_bus_get (DBUS_BUS_SYSTEM, &error); ++ if (bus == NULL) { ++ g_warning ("Couldn't connect to system bus: %s", error->message); ++ g_error_free (error); ++ goto out; ++ } ++ ++ bus_proxy = dbus_g_proxy_new_for_name (bus, ++ DBUS_SERVICE_DBUS, ++ DBUS_PATH_DBUS, ++ DBUS_INTERFACE_DBUS); ++ if (bus_proxy == NULL) { ++ g_warning ("Could not construct bus_proxy object; bailing out"); ++ goto out; ++ } ++ ++ if (!acquire_name_on_proxy (bus_proxy) ) { ++ g_warning ("Could not acquire name; bailing out"); ++ goto out; ++ } ++ ++ g_debug ("Starting printer-config-daemon version %s", VERSION); ++ ++ daemon = printer_config_daemon_new (); ++ ++ if (daemon == NULL) { ++ goto out; ++ } ++ ++ loop = g_main_loop_new (NULL, FALSE); ++ ++ g_main_loop_run (loop); ++ ++ g_object_unref (daemon); ++ g_main_loop_unref (loop); ++ ret = 0; ++ ++ out: ++ return ret; ++} +diff -up system-config-printer-1.1.10/udev/udev-add-printer.a6cf4d3 system-config-printer-1.1.10/udev/udev-add-printer +--- system-config-printer-1.1.10/udev/udev-add-printer.a6cf4d3 2009-07-22 13:22:49.000000000 +0100 ++++ system-config-printer-1.1.10/udev/udev-add-printer 2009-07-31 15:09:03.279086560 +0100 +@@ -27,17 +27,28 @@ import sys + import traceback + from syslog import * + +-def create_queue (c, name, device_uri, ppdname, info): ++def create_queue (c, printers, name, device_uri, ppdname, info): + # Make sure the name is unique. +- printers = cupshelpers.getPrinters (c) +- names = printers.keys () +- if name in names: +- suffix = 2 +- while (name + "-" + str (suffix)) in names: ++ namel = unicode (name.lower ()) ++ unique = False ++ suffix = 1 ++ while not unique: ++ unique = True ++ for printer in printers.values (): ++ if (not printer.discovered and ++ ((suffix == 1 and printer.name.lower () == namel) or ++ (suffix > 1 and ++ printer.name.lower () == namel + "-" + str (suffix)))): ++ unique = False ++ break ++ ++ if not unique: + suffix += 1 + if suffix == 100: + break +- name += str (suffix) ++ ++ if suffix > 1: ++ name += "-" + str (suffix) + + c.addPrinter (name, + device=device_uri, +@@ -45,14 +56,19 @@ def create_queue (c, name, device_uri, p + info=info, + location=os.uname ()[1]) + cupshelpers.activateNewPrinter (c, name) ++ return name + +-def add_queue (device_id, device_uris, is_fax=False): ++def add_queue (device_id, device_uris, fax_basename=False): + """ + Create a CUPS queue. ++ ++ device_id: the IEEE 1284 Device ID of the device to add a queue for. ++ device_uris: device URIs, best first, for this device ++ fax_basename: False if this is not a fax queue, else name prefix + """ + + syslog (LOG_DEBUG, "add_queue: URIs=%s" % device_uris) +- if is_fax: ++ if fax_basename != False: + notification = None + else: + try: +@@ -83,34 +99,22 @@ def add_queue (device_id, device_uris, i + name = name.replace ("/", "-") + name = name.replace ("#", "-") + +- create_queue (c, name, device_uris[0], ppdname, +- "%s %s" % (id_dict["MFG"], id_dict["MDL"])) ++ if fax_basename != False: ++ name = fax_basename + "-" + name + +- if not is_fax: ++ printers = cupshelpers.getPrinters (c) ++ uniquename = create_queue (c, printers, name, device_uris[0], ppdname, ++ "%s %s" % (id_dict["MFG"], id_dict["MDL"])) ++ ++ if fax_basename == False: + # Look for a corresponding fax queue. We can only + # identify these by looking for device URIs that are the + # same as this one but with a different scheme. If we + # find one whose scheme ends in "fax", use that as a fax + # queue. Note that the HPLIP backends do follow this + # pattern (hp and hpfax). +- not_fax_schemes=["beh", +- "bluetooth", +- "http", +- "https", +- "ipp", +- "lpd", +- "parallel", +- "serial", +- "smb", +- "snmp", +- "socket", +- "scsi", +- "usb"] +- devices = c.getDevices (exclude_schemes=not_fax_schemes) +- for uri, device_dict in devices.iteritems (): +- if uri in device_uris: +- continue +- ++ used_uris = map (lambda x: x.device_uri, printers.values ()) ++ for uri in device_uris[1:]: + if uri.find (":") == -1: + continue + +@@ -119,17 +123,34 @@ def add_queue (device_id, device_uris, i + # Now see if the non-scheme parts of the URI match + # any of the URIs we were given. + for each_uri in device_uris: ++ if each_uri == uri: ++ continue + (s, device_uri_rest) = each_uri.split (":", 1) + if rest == device_uri_rest: ++ # This one matches. Check there is not ++ # already a queue using this URI. ++ if uri in used_uris: ++ break ++ ++ try: ++ devices = c.getDevices(include_schemes=[scheme]) ++ except TypeError: ++ # include_schemes requires pycups 1.9.46 ++ devices = c.getDevices () ++ ++ device_dict = devices.get (uri) ++ if device_dict == None: ++ break ++ + add_queue (device_dict.get ("device-id", ""), +- [uri], is_fax=True) ++ [uri], fax_basename=uniquename) + else: + # Not an exact match. +- name = device_uris[0] ++ uniquename = device_uris[0] + + if notification: + try: +- notification.NewPrinter (status, name, id_dict["MFG"], ++ notification.NewPrinter (status, uniquename, id_dict["MFG"], + id_dict["MDL"], id_dict["DES"], + reduce(lambda x, y: x + ',' + y, + id_dict["CMD"])) +diff -up system-config-printer-1.1.10/udev/udev-configure-printer.c.a6cf4d3 system-config-printer-1.1.10/udev/udev-configure-printer.c +diff -up /dev/null system-config-printer-1.1.10/udev/udev-usb-printer.c +--- /dev/null 2009-07-31 14:10:14.275001833 +0100 ++++ system-config-printer-1.1.10/udev/udev-usb-printer.c 2009-07-31 15:09:03.283086733 +0100 +@@ -0,0 +1,454 @@ ++/* -*- Mode: C; c-file-style: "gnu" -*- ++ * udev-usb-printer - a udev callout to configure print queues ++ * Copyright (C) 2009 Red Hat, Inc. ++ * Author: Tim Waugh ++ * ++ * 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 ++ * ++ */ ++ ++/* ++ * The protocol for this program is: ++ * ++ * udev-usb-printer add {DEVPATH} ++ * udev-usb-printer remove {DEVPATH} ++ * ++ * where DEVPATH is the path (%p) of the device ++ */ ++ ++#define LIBUDEV_I_KNOW_THE_API_IS_SUBJECT_TO_CHANGE 1 ++ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#include "printer-config-client-bindings.h" ++ ++struct device_id ++{ ++ char *full_device_id; ++ char *mfg; ++ char *mdl; ++ char *sern; ++}; ++ ++static void ++free_device_id (struct device_id *id) ++{ ++ free (id->full_device_id); ++ free (id->mfg); ++ free (id->mdl); ++ free (id->sern); ++} ++ ++static void ++parse_device_id (const char *device_id, ++ struct device_id *id) ++{ ++ char *fieldname; ++ char *start, *end; ++ size_t len; ++ ++ len = strlen (device_id); ++ if (len == 0) ++ return; ++ ++ if (device_id[len - 1] == '\n') ++ len--; ++ ++ id->full_device_id = malloc (len + 1); ++ fieldname = malloc (len + 1); ++ if (!id->full_device_id || !fieldname) ++ { ++ syslog (LOG_ERR, "out of memory"); ++ exit (1); ++ } ++ ++ memcpy (id->full_device_id, device_id, len); ++ id->full_device_id[len] = '\0'; ++ fieldname[0] = '\0'; ++ start = id->full_device_id; ++ while (*start != '\0') ++ { ++ /* New field. */ ++ ++ end = start; ++ while (*end != '\0' && *end != ':') ++ end++; ++ ++ if (*end == '\0') ++ break; ++ ++ len = end - start; ++ memcpy (fieldname, start, len); ++ fieldname[len] = '\0'; ++ ++ start = end + 1; ++ while (*end != '\0' && *end != ';') ++ end++; ++ ++ len = end - start; ++ ++ if (!id->mfg && ++ (!strncasecmp (fieldname, "MANUFACTURER", 12) || ++ !strncasecmp (fieldname, "MFG", 3))) ++ id->mfg = strndup (start, len); ++ else if (!id->mdl && ++ (!strncasecmp (fieldname, "MODEL", 5) || ++ !strncasecmp (fieldname, "MDL", 3))) ++ id->mdl = strndup (start, len); ++ else if (!id->sern && ++ (!strncasecmp (fieldname, "SERIALNUMBER", 12) || ++ !strncasecmp (fieldname, "SERN", 4) || ++ !strncasecmp (fieldname, "SN", 2))) ++ id->sern = strndup (start, len); ++ ++ if (*end != '\0') ++ start = end + 1; ++ } ++ ++ free (fieldname); ++} ++ ++static char * ++syspath_from_devpath (struct udev *udev, const char *devpath) ++{ ++ const char *sys; ++ char *syspath; ++ size_t syslen, devpathlen = strlen (devpath); ++ sys = udev_get_sys_path (udev); ++ syslen = strlen (sys); ++ syspath = malloc (syslen + devpathlen + 1); ++ if (syspath == NULL) ++ return NULL; ++ ++ memcpy (syspath, sys, syslen); ++ memcpy (syspath + syslen, devpath, devpathlen); ++ syspath[syslen + devpathlen] = '\0'; ++ return syspath; ++} ++ ++static char * ++device_id_from_devpath (const char *devpath, ++ struct device_id *id, ++ char *usbserial, size_t usbseriallen) ++{ ++ struct udev *udev; ++ struct udev_device *dev, *parent_dev = NULL; ++ const char *idVendorStr, *idProductStr, *serial; ++ char *end; ++ unsigned long idVendor, idProduct; ++ struct usb_bus *bus; ++ struct usb_dev_handle *handle = NULL; ++ char ieee1284_id[1024]; ++ const char *device_id = NULL; ++ char *syspath; ++ int conf = 0, iface = 0; ++ int got = 0; ++ char *usb_device_devpath; ++ ++ id->full_device_id = id->mfg = id->mdl = id->sern = NULL; ++ ++ udev = udev_new (); ++ if (udev == NULL) ++ { ++ syslog (LOG_ERR, "udev_new failed"); ++ exit (1); ++ } ++ ++ syspath = syspath_from_devpath (udev, devpath); ++ if (syspath == NULL) ++ { ++ udev_unref (udev); ++ exit (1); ++ } ++ ++ dev = udev_device_new_from_syspath (udev, syspath); ++ if (dev == NULL) ++ { ++ udev_device_unref (dev); ++ udev_unref (udev); ++ syslog (LOG_ERR, "unable to access %s", syspath); ++ free (syspath); ++ exit (1); ++ } ++ ++ free (syspath); ++ parent_dev = udev_device_get_parent_with_subsystem_devtype (dev, ++ "usb", ++ "usb_device"); ++ if (!parent_dev) ++ { ++ udev_unref (udev); ++ syslog (LOG_ERR, "Failed to get parent"); ++ exit (1); ++ } ++ ++ usb_device_devpath = strdup (udev_device_get_devpath (parent_dev)); ++ syslog (LOG_DEBUG, "parent devpath is %s", usb_device_devpath); ++ ++ serial = udev_device_get_sysattr_value (parent_dev, "serial"); ++ if (serial) ++ { ++ strncpy (usbserial, serial, usbseriallen); ++ usbserial[usbseriallen - 1] = '\0'; ++ } ++ else ++ usbserial[0] = '\0'; ++ ++ /* See if we were triggered by a usblp add event. */ ++ device_id = udev_device_get_sysattr_value (dev, "device/ieee1284_id"); ++ if (device_id) ++ { ++ got = 1; ++ goto got_deviceid; ++ } ++ ++ /* This is a low-level USB device. Use libusb to fetch the Device ID. */ ++ idVendorStr = udev_device_get_sysattr_value (parent_dev, "idVendor"); ++ idProductStr = udev_device_get_sysattr_value (parent_dev, "idProduct"); ++ ++ if (!idVendorStr || !idProductStr) ++ { ++ udev_device_unref (dev); ++ udev_unref (udev); ++ syslog (LOG_ERR, "Missing sysattr %s", ++ idVendorStr ? ++ (idProductStr ? "serial" : "idProduct") : "idVendor"); ++ exit (1); ++ } ++ ++ idVendor = strtoul (idVendorStr, &end, 16); ++ if (end == idVendorStr) ++ { ++ syslog (LOG_ERR, "Invalid idVendor: %s", idVendorStr); ++ exit (1); ++ } ++ ++ idProduct = strtoul (idProductStr, &end, 16); ++ if (end == idProductStr) ++ { ++ syslog (LOG_ERR, "Invalid idProduct: %s", idProductStr); ++ exit (1); ++ } ++ ++ syslog (LOG_DEBUG, "Device vendor/product is %04zX:%04zX", ++ idVendor, idProduct); ++ ++ usb_init (); ++ usb_find_busses (); ++ usb_find_devices (); ++ for (bus = usb_get_busses (); bus && !got; bus = bus->next) ++ { ++ struct usb_device *device; ++ for (device = bus->devices; device && !got; device = device->next) ++ { ++ struct usb_config_descriptor *confptr; ++ if (device->descriptor.idVendor != idVendor || ++ device->descriptor.idProduct != idProduct || ++ !device->config) ++ continue; ++ ++ conf = 0; ++ for (confptr = device->config; ++ conf < device->descriptor.bNumConfigurations && !got; ++ conf++, confptr++) ++ { ++ struct usb_interface *ifaceptr; ++ iface = 0; ++ for (ifaceptr = confptr->interface; ++ iface < confptr->bNumInterfaces && !got; ++ iface++, ifaceptr++) ++ { ++ struct usb_interface_descriptor *altptr; ++ int altset = 0; ++ for (altptr = ifaceptr->altsetting; ++ altset < ifaceptr->num_altsetting && !got; ++ altset++, altptr++) ++ { ++ if (altptr->bInterfaceClass == USB_CLASS_PRINTER && ++ altptr->bInterfaceSubClass == 1) ++ { ++ int n; ++ handle = usb_open (device); ++ if (!handle) ++ { ++ syslog (LOG_DEBUG, "failed to open device"); ++ continue; ++ } ++ ++ n = altptr->bInterfaceNumber; ++ if (usb_claim_interface (handle, n) < 0) ++ { ++ usb_close (handle); ++ handle = NULL; ++ syslog (LOG_DEBUG, "failed to claim interface"); ++ continue; ++ } ++ ++ if (n != 0 && usb_claim_interface (handle, 0) < 0) ++ { ++ usb_close (handle); ++ handle = NULL; ++ syslog (LOG_DEBUG, "failed to claim interface 0"); ++ continue; ++ } ++ ++ n = altptr->bAlternateSetting; ++ if (usb_set_altinterface (handle, n) < 0) ++ { ++ usb_close (handle); ++ handle = NULL; ++ syslog (LOG_DEBUG, "failed set altinterface"); ++ continue; ++ } ++ ++ memset (ieee1284_id, '\0', sizeof (ieee1284_id)); ++ if (usb_control_msg (handle, ++ USB_TYPE_CLASS | ++ USB_ENDPOINT_IN | ++ USB_RECIP_INTERFACE, ++ 0, conf, iface, ++ ieee1284_id, ++ sizeof (ieee1284_id), ++ 5000) < 0) ++ { ++ usb_close (handle); ++ handle = NULL; ++ syslog (LOG_ERR, "Failed to fetch Device ID"); ++ continue; ++ } ++ ++ got = 1; ++ usb_close (handle); ++ break; ++ } ++ } ++ } ++ } ++ } ++ } ++ ++ got_deviceid: ++ if (got) ++ { ++ if (!device_id) ++ device_id = ieee1284_id + 2; ++ parse_device_id (device_id, id); ++ } ++ ++ udev_device_unref (dev); ++ udev_unref (udev); ++ return usb_device_devpath; ++} ++ ++static int ++do_add (DBusGProxy *proxy, const char *devpath) ++{ ++ GError *error = NULL; ++ struct device_id id; ++ char *usb_device_devpath; ++ char usbserial[256]; ++ ++ syslog (LOG_DEBUG, "add %s", devpath); ++ ++ usb_device_devpath = device_id_from_devpath (devpath, &id, ++ usbserial, sizeof (usbserial)); ++ ++ if (!id.mfg || !id.mdl) ++ { ++ syslog (LOG_ERR, "invalid or missing IEEE 1284 Device ID%s%s", ++ id.full_device_id ? " " : "", ++ id.full_device_id ? id.full_device_id : ""); ++ exit (1); ++ } ++ ++ syslog (LOG_DEBUG, "MFG:%s MDL:%s SERN:%s serial:%s", id.mfg, id.mdl, ++ id.sern ? id.sern : "-", usbserial); ++ ++ com_redhat_PrinterConfig_usb_printer_add (proxy, ++ usb_device_devpath, ++ id.full_device_id, ++ &error); ++ free (usb_device_devpath); ++ free_device_id (&id); ++ return 0; ++} ++ ++static int ++do_remove (DBusGProxy *proxy, const char *devpath) ++{ ++ GError *error = NULL; ++ syslog (LOG_DEBUG, "remove %s", devpath); ++ ++ com_redhat_PrinterConfig_usb_printer_remove (proxy, ++ devpath, ++ &error); ++ return 0; ++} ++ ++int ++main (int argc, char **argv) ++{ ++ DBusGConnection *connection; ++ DBusGProxy *proxy; ++ GError *error = NULL; ++ int add; ++ ++ g_type_init (); ++ ++ if (argc != 3 || ++ !((add = !strcmp (argv[1], "add")) || ++ !strcmp (argv[1], "remove"))) ++ { ++ fprintf (stderr, ++ "Syntax: %s add {USB device path}\n" ++ " %s remove {USB device path}\n", ++ argv[0], argv[0]); ++ return 1; ++ } ++ ++ openlog ("udev-usb-printer", 0, LOG_LPR); ++ ++ connection = dbus_g_bus_get (DBUS_BUS_SYSTEM, &error); ++ if (connection == NULL) ++ { ++ syslog (LOG_ERR, "unable to connect to D-Bus: %s", error->message); ++ g_error_free (error); ++ exit (1); ++ } ++ ++ proxy = dbus_g_proxy_new_for_name (connection, ++ "com.redhat.PrinterConfig", ++ "/com/redhat/PrinterConfig", ++ "com.redhat.PrinterConfig"); ++ ++ if (add) ++ do_add (proxy, argv[2]); ++ else ++ do_remove (proxy, argv[2]); ++ ++ g_object_unref (proxy); ++ return 0; ++} diff --git a/system-config-printer-getdevices.patch b/system-config-printer-getdevices.patch new file mode 100644 index 0000000..9e358a1 --- /dev/null +++ b/system-config-printer-getdevices.patch @@ -0,0 +1,58 @@ +diff -up system-config-printer-1.1.10/cupspk.py.getdevices system-config-printer-1.1.10/cupspk.py +--- system-config-printer-1.1.10/cupspk.py.getdevices 2009-07-31 15:11:10.285962319 +0100 ++++ system-config-printer-1.1.10/cupspk.py 2009-07-31 15:11:23.732961871 +0100 +@@ -300,7 +300,53 @@ class Connection: + # getPPDs + # getServerPPD + # getDocument +-# getDevices ++ ++ ++ def getDevices(self, *args, **kwds): ++ use_pycups = False ++ pk_args = () ++ ++ result = self._call_with_pk_and_fallback(use_pycups, ++ 'DevicesGet', pk_args, ++ self._connection.getDevices, ++ *args, **kwds) ++ ++ result_str = {} ++ if result != None: ++ for i in result.keys(): ++ if type(i) == dbus.String: ++ result_str[str(i)] = str(result[i]) ++ else: ++ result_str[i] = result[i] ++ ++ # cups-pk-helper returns all devices in one dictionary. ++ # Keys of different devices are distinguished by ':n' postfix. ++ ++ devices = {} ++ n = 0 ++ postfix = ':' + str (n) ++ device_keys = [x for x in result_str.keys() if x.endswith(postfix)] ++ while len (device_keys) > 0: ++ ++ device_uri = None ++ device_dict = {} ++ for i in device_keys: ++ key = i[:len(i)-len(postfix)] ++ if key != 'device-uri': ++ device_dict[key] = result_str[i] ++ else: ++ device_uri = result_str[i] ++ ++ if device_uri != None: ++ devices[device_uri] = device_dict ++ ++ n += 1 ++ postfix = ':' + str (n) ++ device_keys = [x for x in result_str.keys() if x.endswith(postfix)] ++ ++ return devices ++ ++ + # getJobs + # getJobAttributes + diff --git a/system-config-printer.spec b/system-config-printer.spec index d7e04b8..56175f5 100644 --- a/system-config-printer.spec +++ b/system-config-printer.spec @@ -7,14 +7,15 @@ Summary: A printer administration tool Name: system-config-printer Version: 1.1.10 -Release: 6%{?dist} +Release: 7%{?dist} License: GPLv2+ URL: http://cyberelk.net/tim/software/system-config-printer/ Group: System Environment/Base Source0: http://cyberelk.net/tim/data/system-config-printer/1.1/system-config-printer-%{version}.tar.bz2 Source1: http://cyberelk.net/tim/data/pycups/pycups-%{pycups_version}.tar.bz2 Source2: http://cyberelk.net/tim/data/pysmbc/pysmbc-%{pysmbc_version}.tar.bz2 -Patch1: system-config-printer-525e996.patch +Patch1: system-config-printer-a6cf4d3.patch +Patch2: system-config-printer-getdevices.patch BuildRequires: cups-devel >= 1.2 BuildRequires: python-devel >= 2.4 @@ -79,7 +80,8 @@ printers. %prep %setup -q -a 1 -a 2 -%patch1 -p1 -b .525e996 +%patch1 -p1 -b .a6cf4d3 +%patch2 -p1 -b .getdevices automake --copy --add-missing autoconf @@ -194,6 +196,10 @@ rm -rf %buildroot exit 0 %changelog +* Fri Jul 31 2009 Tim Waugh 1.1.10-7 +- Sync with 1.1.x. +- Added patch for cupspk DevicesGet method call. + * Mon Jul 27 2009 Matthias Clasen 1.1.10-6 - Drop no-longer-used python-sexy dep