From ec978d13ce7a892826ff577e66f94f0236e3cc28 Mon Sep 17 00:00:00 2001
From: Stefan Fiedler <stefan.fiedler@students.jku.at>
Date: Fri, 17 Nov 2006 09:55:37 +0000
Subject: [PATCH] Stefan Fiedler: 	kdelibs: add two patches that fix
 problems with cups 1.2.x in the 		kcontrol printer module 
 1) don't return an error if printer list is empty 	2) when adding a
 printer, create a valid printer URI (i.e. don't use 	
 /var/run/cups/cups.sock as cups server hostname)

[2006110420351027662] (https://www.rocklinux.net/submaster)



git-svn-id: http://www.rocklinux.org/svn/rock-linux/trunk@8036 c5f82cb5-29bc-0310-9cd0-bff59a50e3bc
---
 ...3.5.5-cups-.1.2.x-empty-printer-list.patch |  38 +++
 ....5.5-cups-.1.2.x-unix-socket-support.patch | 220 ++++++++++++++++++
 2 files changed, 258 insertions(+)
 create mode 100644 package/kde/kdelibs/kde-3.5.5-cups-.1.2.x-empty-printer-list.patch
 create mode 100644 package/kde/kdelibs/kde-3.5.5-cups-.1.2.x-unix-socket-support.patch

diff --git a/package/kde/kdelibs/kde-3.5.5-cups-.1.2.x-empty-printer-list.patch b/package/kde/kdelibs/kde-3.5.5-cups-.1.2.x-empty-printer-list.patch
new file mode 100644
index 000000000..61bc72893
--- /dev/null
+++ b/package/kde/kdelibs/kde-3.5.5-cups-.1.2.x-empty-printer-list.patch
@@ -0,0 +1,38 @@
+This is a hotfix for KDE 3.5.5 with CUPS 1.2.x.
+
+Copied from http://bugs.kde.org/show_bug.cgi?id=115891:
+Empty printer list fix patch 2006-11-01 18:06:33
+
+--- kde.orig/kdeprint/cups/ipprequest.cpp
++++ kde.patched/kdeprint/cups/ipprequest.cpp
+@@ -329,6 +329,10 @@
+ 		dumpRequest(request_, true);
+ 	}
+ 
++	/* No printers found */
++	if ( request_ && request_->request.status.status_code == 0x406 )
++		return true;
++
+ 	if (!request_ || request_->state == IPP_ERROR || (request_->request.status.status_code & 0x0F00))
+ 		return false;
+ 
+--- kde.orig/kdeprint/cups/kmcupsmanager.cpp
++++ kde.patched/kdeprint/cups/kmcupsmanager.cpp
+@@ -61,7 +61,7 @@
+ #define ppdi18n(s)	i18n(QString::fromLocal8Bit(s).utf8())
+ 
+ void extractMaticData(QString& buf, const QString& filename);
+-QString printerURI(KMPrinter *p, bool useExistingURI = false);
++QString printerURI(KMPrinter *p, bool useExistingURI);
+ QString downloadDriver(KMPrinter *p);
+ 
+ static int trials = 5;
+@@ -218,7 +218,7 @@
+ 	QString		uri;
+ 
+ 	req.setOperation(state);
+-	uri = printerURI(p);
++	uri = printerURI(p, true);
+ 	req.addURI(IPP_TAG_OPERATION,"printer-uri",uri);
+ 	if (req.doRequest("/admin/"))
+ 		return true;
diff --git a/package/kde/kdelibs/kde-3.5.5-cups-.1.2.x-unix-socket-support.patch b/package/kde/kdelibs/kde-3.5.5-cups-.1.2.x-unix-socket-support.patch
new file mode 100644
index 000000000..74a47b6c9
--- /dev/null
+++ b/package/kde/kdelibs/kde-3.5.5-cups-.1.2.x-unix-socket-support.patch
@@ -0,0 +1,220 @@
+This is a hotfix for KDE 3.5.5 with CUPS 1.2.x.
+
+Copied from http://bugs.kde.org/show_bug.cgi?id=115891:
+Rework & unify IPP URI generation. Support UNIX socket properly patch 2006-11-01 18:09:53
+
+--- kdelibs-3.5.5a.dfsg.1.orig/kdeprint/cups/cupsinfos.cpp	2006-10-26 19:31:11.000000000 +0300
++++ kdelibs-3.5.5a.dfsg.1/kdeprint/cups/cupsinfos.cpp	2006-10-26 21:29:07.000000000 +0300
+@@ -21,6 +21,7 @@
+ #include "kmfactory.h"
+ #include "kmtimer.h"
+ #include "messagewindow.h"
++#include "ipprequest.h"
+ 
+ #include <kio/passdlg.h>
+ #include <kio/authinfo.h>
+@@ -76,6 +77,11 @@
+     return host_;
+ }
+ 
++QString CupsInfos::ippAssembleURI(const QString& resource) const
++{
++	return IppRequest::assembleURI(host(), port(), resource);
++}
++
+ void CupsInfos::setHost(const QString& s)
+ {
+ 	host_ = s;
+--- kdelibs-3.5.5a.dfsg.1.orig/kdeprint/cups/cupsinfos.h	2006-10-26 19:31:11.000000000 +0300
++++ kdelibs-3.5.5a.dfsg.1/kdeprint/cups/cupsinfos.h	2006-10-26 21:26:26.000000000 +0300
+@@ -34,6 +34,7 @@
+ 	const QString& host() const;
+         QString  hostaddr() const;
+ 	int port() const;
++	QString ippAssembleURI(const QString& resource) const;
+ 	const QString& login() const;
+ 	const QString& password() const;
+ 	const QString& realLogin() const;
+--- kdelibs-3.5.5a.dfsg.1.orig/kdeprint/cups/ipprequest.cpp	2006-10-26 19:31:11.000000000 +0300
++++ kdelibs-3.5.5a.dfsg.1/kdeprint/cups/ipprequest.cpp	2006-10-26 21:33:09.000000000 +0300
+@@ -529,4 +529,48 @@
+ 		attr = attr->next;
+ 	}
+ #endif
++
++
+ }
++
++
++QString IppRequest::assembleURI(const QString& host, int port, const QString& resource)
++{
++	const char* hostname;
++
++	// Replace UNIX socket address with "localhost". ipp URI specification
++	// does not allow UNIX socket addresses in the host portion
++	if (host[0] == '/' || host.isEmpty()) {
++		hostname = "localhost";
++		port = 0;
++	} else {
++		hostname = host.local8Bit();
++	}
++
++	if (port < 0)
++		return QString::null;
++
++#if CUPS_VERSION_MAJOR == 1 && CUPS_VERSION_MINOR >= 2 
++	QCString uri(HTTP_MAX_URI);
++
++	// Use URI assembling function provided by CUPS
++	if (httpAssembleURI(HTTP_URI_CODING_ALL, uri.data(), uri.size(),
++			"ipp", NULL, hostname, port, resource.local8Bit()) == HTTP_URI_OK)
++		return QString(uri);
++	else		
++		return QString::null;
++
++#else
++	// Use our own URI assembling function
++	if (port > 0) 
++		return QString("ipp://%1:%2%3")
++			.arg(hostname)
++			.arg(port)
++			.arg(KURL::encode_string(resource));
++	else
++		return QString("ipp://%1%2")
++			.arg(hostname)
++			.arg(KURL::encode_string(resource));
++#endif
++}
++
+--- kdelibs-3.5.5a.dfsg.1.orig/kdeprint/cups/ipprequest.h	2006-10-26 19:31:11.000000000 +0300
++++ kdelibs-3.5.5a.dfsg.1/kdeprint/cups/ipprequest.h	2006-10-26 21:24:41.000000000 +0300
+@@ -86,6 +86,9 @@
+ 	// debug function
+ 	void dump(int state);
+ 
++	// URI assembling function [static]
++	static QString assembleURI(const QString& host, int port, const QString& resource);
++
+ protected:
+ 	void addString_p(int group, int type, const QString& name, const QString& value);
+ 	void addStringList_p(int group, int type, const QString& name, const QStringList& values);
+--- kdelibs-3.5.5a.dfsg.1.orig/kdeprint/cups/kmcupsjobmanager.cpp	2006-10-26 21:45:23.000000000 +0300
++++ kdelibs-3.5.5a.dfsg.1/kdeprint/cups/kmcupsjobmanager.cpp	2006-10-27 01:33:12.000000000 +0300
+@@ -92,7 +92,7 @@
+ 			case KMJob::Move:
+ 				if (argstr.isEmpty()) return false;
+ 				req.setOperation(CUPS_MOVE_JOB);
+-				uri = QString::fromLatin1("ipp://%1:%2/printers/%3").arg(CupsInfos::self()->host()).arg(CupsInfos::self()->port()).arg(argstr);
++				uri = CupsInfos::self()->ippAssembleURI(QString("/printers/%1").arg(argstr));
+ 				req.addURI(IPP_TAG_OPERATION, "job-printer-uri", uri);
+ 				break;
+ 			default:
+@@ -109,7 +109,6 @@
+ bool KMCupsJobManager::listJobs(const QString& prname, KMJobManager::JobType type, int limit)
+ {
+ 	IppRequest	req;
+-	QString		uri("ipp://%1:%2/%3/%4");
+ 	QStringList	keys;
+ 	CupsInfos	*infos = CupsInfos::self();
+ 
+@@ -143,7 +142,8 @@
+ 		*/
+ 	}
+ 	else
+-		req.addURI(IPP_TAG_OPERATION, "printer-uri", uri.arg(infos->host()).arg(infos->port()).arg(((mp&&mp->isClass())?"classes":"printers")).arg(prname));
++		req.addURI(IPP_TAG_OPERATION, "printer-uri",
++			infos->ippAssembleURI(QString("/%1/%2").arg(((mp&&mp->isClass())?"classes":"printers")).arg(prname)));
+ 
+ 	// other attributes
+ 	req.addKeyword(IPP_TAG_OPERATION, "requested-attributes", keys);
+--- kdelibs-3.5.5a.dfsg.1.orig/kdeprint/cups/kmcupsmanager.cpp	2006-10-26 19:31:11.000000000 +0300
++++ kdelibs-3.5.5a.dfsg.1/kdeprint/cups/kmcupsmanager.cpp	2006-10-26 21:31:12.000000000 +0300
+@@ -138,7 +138,7 @@
+ 		req.setOperation(CUPS_ADD_CLASS);
+ 		QStringList	members = p->members(), uris;
+ 		QString		s;
+-                s = QString::fromLocal8Bit("ipp://%1/printers/").arg(CupsInfos::self()->hostaddr());
++                s = CupsInfos::self()->ippAssembleURI("/printers/");
+ 		for (QStringList::ConstIterator it=members.begin(); it!=members.end(); ++it)
+ 			uris.append(s+(*it));
+ 		req.addURI(IPP_TAG_PRINTER,"member-uris",uris);
+@@ -1024,7 +1024,7 @@
+ 	if (use && !p->uri().isEmpty())
+ 		uri = p->uri().prettyURL();
+ 	else
+-		uri = QString("ipp://%1/%3/%2").arg(CupsInfos::self()->hostaddr()).arg(p->printerName()).arg((p->isClass(false) ? "classes" : "printers"));
++		uri = CupsInfos::self()->ippAssembleURI(QString("/%2/%1").arg(p->printerName()).arg((p->isClass(false) ? "classes" : "printers")));
+ 	return uri;
+ }
+ 
+--- kdelibs-3.5.5a.dfsg.1.orig/kdeprint/cups/kmcupsuimanager.cpp	2006-10-26 19:31:11.000000000 +0300
++++ kdelibs-3.5.5a.dfsg.1/kdeprint/cups/kmcupsuimanager.cpp	2006-10-26 21:34:02.000000000 +0300
+@@ -135,7 +135,7 @@
+ 	QString		uri;
+ 
+ 	req.setOperation(CUPS_GET_DEVICES);
+-	uri = QString::fromLocal8Bit("ipp://%1/printers/").arg(CupsInfos::self()->hostaddr());
++	uri = CupsInfos::self()->ippAssembleURI("/printers/");
+ 	req.addURI(IPP_TAG_OPERATION,"printer-uri",uri);
+ 
+ 	if (req.doRequest("/"))
+--- kdelibs-3.5.5a.dfsg.1.orig/kdeprint/cups/kmwfax.cpp	2006-10-26 19:31:11.000000000 +0300
++++ kdelibs-3.5.5a.dfsg.1/kdeprint/cups/kmwfax.cpp	2006-10-26 21:34:54.000000000 +0300
+@@ -48,7 +48,7 @@
+ 	// initialize
+ 	IppRequest	req;
+ 	req.setOperation(CUPS_GET_DEVICES);
+-	QString	uri = QString::fromLatin1("ipp://%1:%2/printers/").arg(CupsInfos::self()->host()).arg(CupsInfos::self()->port());
++	QString	uri = CupsInfos::self()->ippAssembleURI("/printers/");
+ 	req.addURI(IPP_TAG_OPERATION,"printer-uri",uri);
+ 	if (req.doRequest("/"))
+ 	{
+--- kdelibs-3.5.5a.dfsg.1.orig/kdeprint/cups/kmwippprinter.cpp	2006-10-26 19:31:11.000000000 +0300
++++ kdelibs-3.5.5a.dfsg.1/kdeprint/cups/kmwippprinter.cpp	2006-10-26 21:41:20.000000000 +0300
+@@ -157,7 +157,7 @@
+ 	req.setOperation(IPP_GET_PRINTER_ATTRIBUTES);
+ 	req.setHost(item->text(1));
+ 	req.setPort(item->text(2).toInt());
+-	uri = QString::fromLatin1("ipp://%1:%2/ipp").arg(item->text(1)).arg(item->text(2));
++	uri = IppRequest::assembleURI(item->text(1), item->text(2).toInt(), "/ipp");
+ 	req.addURI(IPP_TAG_OPERATION,"printer-uri",uri);
+ 	keys.append("printer-name");
+ 	keys.append("printer-state");
+@@ -176,7 +176,7 @@
+ 		if (req.uri("printer-uri-supported",value))
+ 		{
+ 			if (value[0] == '/')
+-				value.prepend(QString::fromLatin1("ipp://%1:%2").arg(item->text(1)).arg(item->text(2)));
++				value = IppRequest::assembleURI(item->text(1), item->text(2).toInt(), value);
+ 			m_uri->setText(value);
+ 		}
+ 		if (req.text("printer-make-and-model",value) && !value.isEmpty()) txt.append(i18n("<b>Model</b>: %1<br>").arg(value));
+@@ -203,7 +203,7 @@
+ void KMWIppPrinter::slotIppReport()
+ {
+ 	IppRequest	req;
+-	QString	uri("ipp://%1:%2/ipp");
++	QString		uri;
+ 	QListViewItem	*item = m_list->currentItem();
+ 
+ 	if (item)
+@@ -211,7 +211,7 @@
+ 		req.setOperation(IPP_GET_PRINTER_ATTRIBUTES);
+ 		req.setHost(item->text(1));
+ 		req.setPort(item->text(2).toInt());
+-		uri = uri.arg(item->text(1)).arg(item->text(2));
++		uri = IppRequest::assembleURI(item->text(1), item->text(2).toInt(), "/ipp");
+ 		req.addURI(IPP_TAG_OPERATION, "printer-uri", uri);
+ 		if (req.doRequest("/ipp/"))
+ 		{
+--- kdelibs-3.5.5a.dfsg.1.orig/kdeprint/cups/kmwippselect.cpp	2006-10-26 19:31:11.000000000 +0300
++++ kdelibs-3.5.5a.dfsg.1/kdeprint/cups/kmwippselect.cpp	2006-10-26 21:32:34.000000000 +0300
+@@ -75,7 +75,7 @@
+ 	IppRequest	req;
+ 	QString		uri;
+ 	req.setOperation(CUPS_GET_PRINTERS);
+-	uri = QString::fromLatin1("ipp://%1:%2/printers/").arg(url.host()).arg(url.port());
++	uri = IppRequest::assembleURI(url.host(), url.port(), "/printers/");
+ 	req.addURI(IPP_TAG_OPERATION,"printer-uri",uri);
+ 	req.addKeyword(IPP_TAG_OPERATION,"requested-attributes",QString::fromLatin1("printer-name"));
+ 	if (req.doRequest("/printers/"))