summaryrefslogtreecommitdiffstats
path: root/kdeprint/cups/cupsdconf2
diff options
context:
space:
mode:
Diffstat (limited to 'kdeprint/cups/cupsdconf2')
-rw-r--r--kdeprint/cups/cupsdconf2/Makefile.am35
-rw-r--r--kdeprint/cups/cupsdconf2/addressdialog.cpp89
-rw-r--r--kdeprint/cups/cupsdconf2/addressdialog.h42
-rw-r--r--kdeprint/cups/cupsdconf2/browsedialog.cpp150
-rw-r--r--kdeprint/cups/cupsdconf2/browsedialog.h49
-rw-r--r--kdeprint/cups/cupsdconf2/cups-util.c556
-rw-r--r--kdeprint/cups/cupsdconf2/cups-util.h26
-rw-r--r--kdeprint/cups/cupsdconf2/cups_logo.pngbin0 -> 1487 bytes
-rw-r--r--kdeprint/cups/cupsdconf2/cupsd.conf.template977
-rw-r--r--kdeprint/cups/cupsdconf2/cupsdbrowsingpage.cpp210
-rw-r--r--kdeprint/cups/cupsdconf2/cupsdbrowsingpage.h55
-rw-r--r--kdeprint/cups/cupsdconf2/cupsdcomment.cpp136
-rw-r--r--kdeprint/cups/cupsdconf2/cupsdcomment.h55
-rw-r--r--kdeprint/cups/cupsdconf2/cupsdcomment.pl61
-rw-r--r--kdeprint/cups/cupsdconf2/cupsdconf.cpp884
-rw-r--r--kdeprint/cups/cupsdconf2/cupsdconf.h181
-rw-r--r--kdeprint/cups/cupsdconf2/cupsddialog.cpp360
-rw-r--r--kdeprint/cups/cupsdconf2/cupsddialog.h58
-rw-r--r--kdeprint/cups/cupsdconf2/cupsddirpage.cpp109
-rw-r--r--kdeprint/cups/cupsdconf2/cupsddirpage.h47
-rw-r--r--kdeprint/cups/cupsdconf2/cupsdfilterpage.cpp94
-rw-r--r--kdeprint/cups/cupsdconf2/cupsdfilterpage.h45
-rw-r--r--kdeprint/cups/cupsdconf2/cupsdjobspage.cpp123
-rw-r--r--kdeprint/cups/cupsdconf2/cupsdjobspage.h47
-rw-r--r--kdeprint/cups/cupsdconf2/cupsdlogpage.cpp111
-rw-r--r--kdeprint/cups/cupsdconf2/cupsdlogpage.h44
-rw-r--r--kdeprint/cups/cupsdconf2/cupsdnetworkpage.cpp159
-rw-r--r--kdeprint/cups/cupsdconf2/cupsdnetworkpage.h55
-rw-r--r--kdeprint/cups/cupsdconf2/cupsdpage.cpp32
-rw-r--r--kdeprint/cups/cupsdconf2/cupsdpage.h54
-rw-r--r--kdeprint/cups/cupsdconf2/cupsdsecuritypage.cpp168
-rw-r--r--kdeprint/cups/cupsdconf2/cupsdsecuritypage.h56
-rw-r--r--kdeprint/cups/cupsdconf2/cupsdserverpage.cpp181
-rw-r--r--kdeprint/cups/cupsdconf2/cupsdserverpage.h49
-rw-r--r--kdeprint/cups/cupsdconf2/cupsdsplash.cpp73
-rw-r--r--kdeprint/cups/cupsdconf2/cupsdsplash.h35
-rw-r--r--kdeprint/cups/cupsdconf2/editlist.cpp124
-rw-r--r--kdeprint/cups/cupsdconf2/editlist.h60
-rw-r--r--kdeprint/cups/cupsdconf2/kde_logo.pngbin0 -> 15177 bytes
-rw-r--r--kdeprint/cups/cupsdconf2/locationdialog.cpp222
-rw-r--r--kdeprint/cups/cupsdconf2/locationdialog.h58
-rw-r--r--kdeprint/cups/cupsdconf2/main.cpp48
-rw-r--r--kdeprint/cups/cupsdconf2/portdialog.cpp118
-rw-r--r--kdeprint/cups/cupsdconf2/portdialog.h46
-rw-r--r--kdeprint/cups/cupsdconf2/qdirlineedit.cpp73
-rw-r--r--kdeprint/cups/cupsdconf2/qdirlineedit.h49
-rw-r--r--kdeprint/cups/cupsdconf2/qdirmultilineedit.cpp109
-rw-r--r--kdeprint/cups/cupsdconf2/qdirmultilineedit.h53
-rw-r--r--kdeprint/cups/cupsdconf2/sizewidget.cpp83
-rw-r--r--kdeprint/cups/cupsdconf2/sizewidget.h43
50 files changed, 6492 insertions, 0 deletions
diff --git a/kdeprint/cups/cupsdconf2/Makefile.am b/kdeprint/cups/cupsdconf2/Makefile.am
new file mode 100644
index 000000000..84c68ae98
--- /dev/null
+++ b/kdeprint/cups/cupsdconf2/Makefile.am
@@ -0,0 +1,35 @@
+#$Id$
+
+INCLUDES= -I$(top_srcdir) -I$(top_srcdir)/kio -I$(top_srcdir)/kfile $(all_includes)
+
+bin_PROGRAMS =
+lib_LTLIBRARIES =
+kdeinit_LTLIBRARIES = cupsdconf.la
+
+# library creation
+cupsdconf_la_SOURCES = cupsdconf.cpp cupsddialog.cpp cupsdpage.cpp cupsdcomment.cpp cupsdsplash.cpp \
+ cupsdserverpage.cpp cupsdlogpage.cpp cupsdjobspage.cpp cupsdfilterpage.cpp \
+ qdirlineedit.cpp cupsddirpage.cpp portdialog.cpp cupsdnetworkpage.cpp \
+ editlist.cpp cupsdbrowsingpage.cpp browsedialog.cpp cupsdsecuritypage.cpp \
+ locationdialog.cpp addressdialog.cpp cups-util.c \
+ qdirmultilineedit.cpp sizewidget.cpp main.cpp
+cupsdconf_la_METASOURCES = AUTO
+cupsdconf_la_LDFLAGS = -avoid-version -module $(all_libraries) $(KDE_RPATH)
+cupsdconf_la_LIBADD = $(LIB_KIO) $(LIB_CUPS)
+
+noinst_HEADERS = cupsdconf.h cupsdpage.h cupsddialog.h cupsdcomment.h cupsdsplash.h \
+ cupsdserverpage.h cupsdlogpage.h cupsdjobspage.h cupsdfilterpage.h \
+ qdirlineedit.h cupsddirpage.h portdialog.h cupsdnetworkpage.h \
+ editlist.h cupsdbrowsingpage.h browsedialog.h cupsdsecuritypage.h \
+ locationdialog.h addressdialog.h cups-util.h qdirmultilineedit.h \
+ sizewidget.h
+
+# Data
+cupsdconfdata_DATA = kde_logo.png cups_logo.png cupsd.conf.template
+cupsdconfdatadir = $(kde_datadir)/kdeprint
+
+# Translations
+messages:
+ perl cupsdcomment.pl < cupsd.conf.template > cupsd.conf.template.cpp
+ $(XGETTEXT) *.cpp -o $(podir)/cupsdconf.pot
+ rm -f cupsd.conf.template.cpp
diff --git a/kdeprint/cups/cupsdconf2/addressdialog.cpp b/kdeprint/cups/cupsdconf2/addressdialog.cpp
new file mode 100644
index 000000000..b7472c5a4
--- /dev/null
+++ b/kdeprint/cups/cupsdconf2/addressdialog.cpp
@@ -0,0 +1,89 @@
+/*
+ * This file is part of the KDE libraries
+ * Copyright (c) 2001 Michael Goffioul <[email protected]>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License version 2 as published by the Free Software Foundation.
+ *
+ * This library 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
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB. If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ **/
+
+#include "addressdialog.h"
+
+#include <qcombobox.h>
+#include <qlineedit.h>
+#include <qlabel.h>
+#include <qlayout.h>
+
+#include <klocale.h>
+
+AddressDialog::AddressDialog(QWidget *parent, const char *name)
+ : KDialogBase(Swallow, i18n("ACL Address"), Ok|Cancel, Ok, parent, name, true, true)
+{
+ QWidget *w = new QWidget(this);
+ type_ = new QComboBox(w);
+ address_ = new QLineEdit(w);
+
+ type_->insertItem(i18n("Allow"));
+ type_->insertItem(i18n("Deny"));
+
+ QLabel *l1 = new QLabel(i18n("Type:"), w);
+ QLabel *l2 = new QLabel(i18n("Address:"), w);
+
+ QGridLayout *m1 = new QGridLayout(w, 2, 2, 0, 5);
+ m1->setColStretch(1, 1);
+ m1->addWidget(l1, 0, 0, Qt::AlignRight);
+ m1->addWidget(l2, 1, 0, Qt::AlignRight);
+ m1->addWidget(type_, 0, 1);
+ m1->addWidget(address_, 1, 1);
+
+ setMainWidget(w);
+ resize(300, 100);
+}
+
+QString AddressDialog::addressString()
+{
+ QString s;
+ if (type_->currentItem() == 0)
+ s.append("Allow ");
+ else
+ s.append("Deny ");
+ if (address_->text().isEmpty())
+ s.append("All");
+ else
+ s.append(address_->text());
+ return s;
+}
+
+QString AddressDialog::newAddress(QWidget *parent)
+{
+ AddressDialog dlg(parent);
+ if (dlg.exec())
+ return dlg.addressString();
+ else
+ return QString::null;
+}
+
+QString AddressDialog::editAddress(const QString& addr, QWidget *parent)
+{
+ AddressDialog dlg(parent);
+ int p = addr.find(' ');
+ if (p != -1)
+ {
+ dlg.type_->setCurrentItem(addr.left(p).lower() == "deny" ? 1 : 0);
+ dlg.address_->setText(addr.mid(p+1));
+ }
+ if (dlg.exec())
+ return dlg.addressString();
+ else
+ return QString::null;
+}
diff --git a/kdeprint/cups/cupsdconf2/addressdialog.h b/kdeprint/cups/cupsdconf2/addressdialog.h
new file mode 100644
index 000000000..4560dd72b
--- /dev/null
+++ b/kdeprint/cups/cupsdconf2/addressdialog.h
@@ -0,0 +1,42 @@
+/*
+ * This file is part of the KDE libraries
+ * Copyright (c) 2001 Michael Goffioul <[email protected]>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License version 2 as published by the Free Software Foundation.
+ *
+ * This library 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
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB. If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ **/
+
+#ifndef ADDRESSDIALOG_H
+#define ADDRESSDIALOG_H
+
+#include <kdialogbase.h>
+
+class QComboBox;
+class QLineEdit;
+
+class AddressDialog : public KDialogBase
+{
+public:
+ AddressDialog(QWidget *parent = 0, const char *name = 0);
+
+ QString addressString();
+ static QString newAddress(QWidget *parent = 0);
+ static QString editAddress(const QString& s, QWidget *parent = 0);
+
+private:
+ QComboBox *type_;
+ QLineEdit *address_;
+};
+
+#endif
diff --git a/kdeprint/cups/cupsdconf2/browsedialog.cpp b/kdeprint/cups/cupsdconf2/browsedialog.cpp
new file mode 100644
index 000000000..846ea41a5
--- /dev/null
+++ b/kdeprint/cups/cupsdconf2/browsedialog.cpp
@@ -0,0 +1,150 @@
+/*
+ * This file is part of the KDE libraries
+ * Copyright (c) 2001 Michael Goffioul <[email protected]>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License version 2 as published by the Free Software Foundation.
+ *
+ * This library 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
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB. If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ **/
+
+#include "browsedialog.h"
+#include "cupsdconf.h"
+
+#include <qlineedit.h>
+#include <qpushbutton.h>
+#include <qcombobox.h>
+#include <qlabel.h>
+#include <qlayout.h>
+#include <qwhatsthis.h>
+#include <qregexp.h>
+
+#include <klocale.h>
+
+BrowseDialog::BrowseDialog(QWidget *parent, const char *name)
+ : KDialogBase(parent, name, true, QString::null, Ok|Cancel, Ok, true)
+{
+ QWidget *dummy = new QWidget(this);
+ setMainWidget(dummy);
+ type_ = new QComboBox(dummy);
+ from_ = new QLineEdit(dummy);
+ to_ = new QLineEdit(dummy);
+ type_->insertItem(i18n("Send"));
+ type_->insertItem(i18n("Allow"));
+ type_->insertItem(i18n("Deny"));
+ type_->insertItem(i18n("Relay"));
+ type_->insertItem(i18n("Poll"));
+
+ QLabel *l1 = new QLabel(i18n("Type:"), dummy);
+ QLabel *l2 = new QLabel(i18n("From:"), dummy);
+ QLabel *l3 = new QLabel(i18n("To:"), dummy);
+
+ QGridLayout *m1 = new QGridLayout(dummy, 3, 2, 0, 5);
+ m1->addWidget(l1, 0, 0, Qt::AlignRight);
+ m1->addWidget(l2, 1, 0, Qt::AlignRight);
+ m1->addWidget(l3, 2, 0, Qt::AlignRight);
+ m1->addWidget(type_, 0, 1);
+ m1->addWidget(from_, 1, 1);
+ m1->addWidget(to_, 2, 1);
+
+ connect(type_, SIGNAL(activated(int)), SLOT(slotTypeChanged(int)));
+ slotTypeChanged(type_->currentItem());
+
+ setCaption(i18n("Browse Address"));
+ resize(250, 100);
+}
+
+QString BrowseDialog::addressString()
+{
+ QString s;
+ switch (type_->currentItem())
+ {
+ case 0:
+ s.append("Send");
+ break;
+ case 1:
+ s.append("Allow");
+ break;
+ case 2:
+ s.append("Deny");
+ break;
+ case 3:
+ s.append("Relay");
+ break;
+ case 4:
+ s.append("Poll");
+ break;
+ }
+ if (from_->isEnabled())
+ s.append(" ").append(from_->text());
+ if (to_->isEnabled())
+ s.append(" ").append(to_->text());
+ return s;
+}
+
+void BrowseDialog::setInfos(CupsdConf *conf)
+{
+ QWhatsThis::add(type_, conf->comments_.toolTip("browsetype"));
+}
+
+QString BrowseDialog::newAddress(QWidget *parent, CupsdConf *conf)
+{
+ BrowseDialog dlg(parent);
+ dlg.setInfos(conf);
+ if (dlg.exec())
+ {
+ return dlg.addressString();
+ }
+ return QString::null;
+}
+
+QString BrowseDialog::editAddress(const QString& s, QWidget *parent, CupsdConf *conf)
+{
+ BrowseDialog dlg(parent);
+ dlg.setInfos(conf);
+ QStringList l = QStringList::split(QRegExp("\\s"), s, false);
+ if (l.count() > 1)
+ {
+ if (l[0] == "Send") dlg.type_->setCurrentItem(0);
+ else if (l[0] == "Allow") dlg.type_->setCurrentItem(1);
+ else if (l[0] == "Deny") dlg.type_->setCurrentItem(2);
+ else if (l[0] == "Relay") dlg.type_->setCurrentItem(3);
+ else if (l[0] == "Poll") dlg.type_->setCurrentItem(4);
+ dlg.slotTypeChanged(dlg.type_->currentItem());
+ int index(1);
+ if (dlg.from_->isEnabled())
+ dlg.from_->setText(l[index++]);
+ if (dlg.to_->isEnabled())
+ dlg.to_->setText(l[index]);
+ }
+ if (dlg.exec())
+ {
+ return dlg.addressString();
+ }
+ return QString::null;
+}
+
+void BrowseDialog::slotTypeChanged(int index)
+{
+ bool useFrom(true), useTo(true);
+ switch (index)
+ {
+ case 0: useFrom = false; break;
+ case 1:
+ case 4:
+ case 2: useTo = false; break;
+ }
+ from_->setEnabled(useFrom);
+ to_->setEnabled(useTo);
+}
+
+#include "browsedialog.moc"
diff --git a/kdeprint/cups/cupsdconf2/browsedialog.h b/kdeprint/cups/cupsdconf2/browsedialog.h
new file mode 100644
index 000000000..ac5be55b7
--- /dev/null
+++ b/kdeprint/cups/cupsdconf2/browsedialog.h
@@ -0,0 +1,49 @@
+/*
+ * This file is part of the KDE libraries
+ * Copyright (c) 2001 Michael Goffioul <[email protected]>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License version 2 as published by the Free Software Foundation.
+ *
+ * This library 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
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB. If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ **/
+
+#ifndef BROWSEDIALOG_H
+#define BROWSEDIALOG_H
+
+#include <kdialogbase.h>
+
+class QLineEdit;
+class QComboBox;
+struct CupsdConf;
+
+class BrowseDialog : public KDialogBase
+{
+ Q_OBJECT
+
+public:
+ BrowseDialog(QWidget *parent = 0, const char *name = 0);
+
+ QString addressString();
+ void setInfos(CupsdConf*);
+ static QString newAddress(QWidget *parent = 0, CupsdConf *conf = 0);
+ static QString editAddress(const QString& s, QWidget *parent = 0, CupsdConf *conf = 0);
+
+protected slots:
+ void slotTypeChanged(int);
+
+private:
+ QComboBox *type_;
+ QLineEdit *from_, *to_;
+};
+
+#endif
diff --git a/kdeprint/cups/cupsdconf2/cups-util.c b/kdeprint/cups/cupsdconf2/cups-util.c
new file mode 100644
index 000000000..cb6ddcf92
--- /dev/null
+++ b/kdeprint/cups/cupsdconf2/cups-util.c
@@ -0,0 +1,556 @@
+#include <cups/ipp.h>
+#include <cups/http.h>
+#include <cups/cups.h>
+#include <stdlib.h>
+#include <fcntl.h>
+#include <sys/stat.h>
+#include <unistd.h>
+
+#define CUPS_SERVERROOT "/etc/cups"
+static http_t *cups_server;
+static ipp_status_t last_error;
+static char authstring[HTTP_MAX_VALUE];
+static char pwdstring[33];
+static int cups_local_auth(http_t *http);
+
+const char* cupsGetConf( void );
+int cupsPutConf( const char* );
+
+const char * /* O - Filename for PPD file */
+cupsGetConf(void)
+{
+ int fd; /* PPD file */
+ int bytes; /* Number of bytes read */
+ char buffer[8192]; /* Buffer for file */
+ char resource[HTTP_MAX_URI]; /* Resource name */
+ const char *password; /* Password string */
+ char realm[HTTP_MAX_VALUE], /* realm="xyz" string */
+ nonce[HTTP_MAX_VALUE], /* nonce="xyz" string */
+ plain[255], /* Plaintext username:password */
+ encode[512]; /* Encoded username:password */
+ http_status_t status; /* HTTP status from server */
+ char prompt[1024]; /* Prompt string */
+ int digest_tries; /* Number of tries with Digest */
+ static char filename[HTTP_MAX_URI]; /* Local filename */
+#if CUPS_VERSION_MAJOR - 0 <= 1 && CUPS_VERSION_MINOR - 0 < 2
+ const char *fqdn = 0;
+#else
+ char fqdn[ HTTP_MAX_URI ]; /* Server name buffer */
+#endif
+
+
+ /*
+ * Connect to the correct server as needed...
+ */
+
+ if ((cups_server = httpConnectEncrypt(cupsServer(), ippPort(),
+ cupsEncryption())) == NULL)
+ {
+ last_error = IPP_SERVICE_UNAVAILABLE;
+ return (NULL);
+ }
+
+ /*
+ * Get a temp file...
+ */
+
+ if ((fd = cupsTempFd(filename, sizeof(filename))) < 0)
+ {
+ /*
+ * Can't open file; close the server connection and return NULL...
+ */
+
+ httpFlush(cups_server);
+ httpClose(cups_server);
+ cups_server = NULL;
+ return (NULL);
+ }
+
+ /*
+ * And send a request to the HTTP server...
+ */
+
+ snprintf(resource, sizeof(resource), "/admin/conf/cupsd.conf");
+
+ digest_tries = 0;
+
+ do
+ {
+ httpClearFields(cups_server);
+ httpSetField(cups_server, HTTP_FIELD_HOST, cupsServer());
+ httpSetField(cups_server, HTTP_FIELD_AUTHORIZATION, authstring);
+
+ if (httpGet(cups_server, resource))
+ {
+ if (httpReconnect(cups_server))
+ {
+ status = HTTP_ERROR;
+ break;
+ }
+ else
+ {
+ status = HTTP_UNAUTHORIZED;
+ continue;
+ }
+ }
+
+ while ((status = httpUpdate(cups_server)) == HTTP_CONTINUE);
+
+ if (status == HTTP_UNAUTHORIZED)
+ {
+ const char *www_authenticate;
+ fprintf(stderr,"cupsGetConf: unauthorized...\n");
+
+ /*
+ * Flush any error message...
+ */
+
+ httpFlush(cups_server);
+
+ /*
+ * See if we can do local authentication...
+ */
+
+ if (cups_local_auth(cups_server))
+ continue;
+
+ /*
+ * See if we should retry the current digest password...
+ */
+
+#if CUPS_VERSION_MAJOR - 0 <= 1 && CUPS_VERSION_MINOR - 0 < 2
+ www_authenticate = cups_server->fields[HTTP_FIELD_WWW_AUTHENTICATE];
+#else
+ www_authenticate = httpGetField( cups_server, HTTP_FIELD_WWW_AUTHENTICATE );
+#endif
+ if (strncmp(www_authenticate, "Basic", 5) == 0 ||
+ digest_tries > 1 || !pwdstring[0])
+ {
+ /*
+ * Nope - get a password from the user...
+ */
+#if CUPS_VERSION_MAJOR - 0 <= 1 && CUPS_VERSION_MINOR - 0 < 2
+ fqdn = cups_server->hostname;
+#else
+ httpGetHostname( cups_server, fqdn, sizeof( fqdn ) );
+#endif
+
+ snprintf(prompt, sizeof(prompt), "Password for %s on %s? ", cupsUser(), fqdn );
+
+ if ((password = cupsGetPassword(prompt)) == NULL)
+ break;
+ if (!password[0])
+ break;
+
+ strncpy(pwdstring, password, sizeof(pwdstring) - 1);
+ pwdstring[sizeof(pwdstring) - 1] = '\0';
+
+ digest_tries = 0;
+ }
+ else
+ digest_tries ++;
+
+ /*
+ * Got a password; encode it for the server...
+ */
+
+#if CUPS_VERSION_MAJOR - 0 <= 1 && CUPS_VERSION_MINOR - 0 < 2
+ www_authenticate = cups_server->fields[HTTP_FIELD_WWW_AUTHENTICATE];
+#else
+ www_authenticate = httpGetField( cups_server, HTTP_FIELD_WWW_AUTHENTICATE );
+#endif
+ if (strncmp(www_authenticate, "Basic", 5) == 0)
+ {
+ /*
+ * Basic authentication...
+ */
+
+ snprintf(plain, sizeof(plain), "%s:%s", cupsUser(), pwdstring);
+#if CUPS_VERSION_MAJOR == 1 && CUPS_VERSION_MINOR >= 2
+ httpEncode64_2(encode, sizeof(encode), plain, sizeof(plain));
+#else
+ httpEncode64(encode, plain);
+#endif
+ snprintf(authstring, sizeof(authstring), "Basic %s", encode);
+ }
+ else
+ {
+ /*
+ * Digest authentication...
+ */
+
+ httpGetSubField(cups_server, HTTP_FIELD_WWW_AUTHENTICATE, "realm", realm);
+ httpGetSubField(cups_server, HTTP_FIELD_WWW_AUTHENTICATE, "nonce", nonce);
+
+ httpMD5(cupsUser(), realm, pwdstring, encode);
+ httpMD5Final(nonce, "GET", resource, encode);
+ snprintf(authstring, sizeof(authstring),
+ "Digest username=\"%s\", realm=\"%s\", nonce=\"%s\", "
+ "response=\"%s\"", cupsUser(), realm, nonce, encode);
+ }
+
+ continue;
+ }
+#ifdef HAVE_LIBSSL
+ else if (status == HTTP_UPGRADE_REQUIRED)
+ {
+ /*
+ * Flush any error message...
+ */
+
+ httpFlush(cups_server);
+
+ /*
+ * Upgrade with encryption...
+ */
+
+ httpEncryption(cups_server, HTTP_ENCRYPT_REQUIRED);
+
+ /*
+ * Try again, this time with encryption enabled...
+ */
+
+ continue;
+ }
+#endif /* HAVE_LIBSSL */
+ }
+ while (status == HTTP_UNAUTHORIZED || status == HTTP_UPGRADE_REQUIRED);
+
+ /*
+ * See if we actually got the file or an error...
+ */
+
+ if (status != HTTP_OK)
+ {
+ close(fd);
+ unlink(filename);
+ httpFlush(cups_server);
+ httpClose(cups_server);
+ cups_server = NULL;
+ return (NULL);
+ }
+
+ /*
+ * OK, we need to copy the file...
+ */
+
+ while ((bytes =
+#if CUPS_VERSION_MAJOR - 0 <= 1 && CUPS_VERSION_MINOR - 0 < 2
+ httpRead
+#else
+ httpRead2
+#endif
+ (cups_server, buffer, sizeof(buffer))) > 0)
+ {
+ write(fd, buffer, bytes);
+ }
+
+ close(fd);
+
+ return (filename);
+}
+
+int /* O - Status of operation */
+cupsPutConf(const char *name) /* I - Name of the config file to send */
+{
+ int fd; /* PPD file */
+ int bytes; /* Number of bytes read */
+ char buffer[8192]; /* Buffer for file */
+ char resource[HTTP_MAX_URI]; /* Resource name */
+ const char *password; /* Password string */
+ char realm[HTTP_MAX_VALUE], /* realm="xyz" string */
+ nonce[HTTP_MAX_VALUE], /* nonce="xyz" string */
+ plain[255], /* Plaintext username:password */
+ encode[512]; /* Encoded username:password */
+ http_status_t status; /* HTTP status from server */
+ char prompt[1024]; /* Prompt string */
+ int digest_tries; /* Number of tries with Digest */
+#if CUPS_VERSION_MAJOR - 0 <= 1 && CUPS_VERSION_MINOR - 0 < 2
+ const char *fqdn = 0;
+#else
+ char fqdn[ HTTP_MAX_URI ]; /* Server name buffer */
+#endif
+
+ if (name == NULL)
+ return 0;
+
+ /*
+ * Connect to the correct server as needed...
+ */
+
+ if ((cups_server = httpConnectEncrypt(cupsServer(), ippPort(),
+ cupsEncryption())) == NULL)
+ {
+ last_error = IPP_SERVICE_UNAVAILABLE;
+ return 0;
+ }
+
+ /*
+ * Open the local config file...
+ */
+
+ if ((fd = open(name, O_RDONLY)) < 0)
+ {
+ /*
+ * Can't open file; close the server connection and return NULL...
+ */
+
+ httpFlush(cups_server);
+ httpClose(cups_server);
+ cups_server = NULL;
+ return 0;
+ }
+
+ /*
+ * And send a request to the HTTP server...
+ */
+
+ strncpy(resource, "/admin/conf/cupsd.conf", sizeof(resource));
+
+ digest_tries = 0;
+
+ do
+ {
+ httpClearFields(cups_server);
+ httpSetField(cups_server, HTTP_FIELD_HOST, cupsServer());
+ httpSetField(cups_server, HTTP_FIELD_AUTHORIZATION, authstring);
+ httpSetField(cups_server, HTTP_FIELD_TRANSFER_ENCODING, "chunked");
+
+ if (httpPut(cups_server, resource))
+ {
+ if (httpReconnect(cups_server))
+ {
+ status = HTTP_ERROR;
+ break;
+ }
+ else
+ {
+ status = HTTP_UNAUTHORIZED;
+ continue;
+ }
+ }
+
+ /* send the file now */
+ lseek(fd, 0, SEEK_SET);
+ status = HTTP_CONTINUE;
+ while ((bytes = read(fd, buffer, sizeof(buffer))) > 0)
+ if (httpCheck(cups_server))
+ {
+ if ((status = httpUpdate(cups_server)) != HTTP_CONTINUE)
+ break;
+ }
+ else
+#if CUPS_VERSION_MAJOR - 0 <= 1 && CUPS_VERSION_MINOR - 0 < 2
+ httpWrite
+#else
+ httpWrite2
+#endif
+ (cups_server, buffer, bytes);
+
+ if (status == HTTP_CONTINUE)
+ {
+#if CUPS_VERSION_MAJOR - 0 <= 1 && CUPS_VERSION_MINOR - 0 < 2
+ httpWrite
+#else
+ httpWrite2
+#endif
+ (cups_server, buffer, 0);
+ while ((status = httpUpdate(cups_server)) == HTTP_CONTINUE);
+ }
+
+ if (status == HTTP_UNAUTHORIZED)
+ {
+ const char *www_authenticate;
+ fprintf(stderr,"cupsPutConf: unauthorized...");
+
+ /*
+ * Flush any error message...
+ */
+
+ httpFlush(cups_server);
+
+ /*
+ * See if we can do local authentication...
+ */
+
+ if (cups_local_auth(cups_server))
+ continue;
+
+ /*
+ * See if we should retry the current digest password...
+ */
+
+#if CUPS_VERSION_MAJOR - 0 <= 1 && CUPS_VERSION_MINOR - 0 < 2
+ www_authenticate = cups_server->fields[HTTP_FIELD_WWW_AUTHENTICATE];
+#else
+ www_authenticate = httpGetField( cups_server, HTTP_FIELD_WWW_AUTHENTICATE );
+#endif
+ if (strncmp(www_authenticate, "Basic", 5) == 0 ||
+ digest_tries > 1 || !pwdstring[0])
+ {
+ /*
+ * Nope - get a password from the user...
+ */
+
+
+#if CUPS_VERSION_MAJOR - 0 <= 1 && CUPS_VERSION_MINOR - 0 < 2
+ fqdn = cups_server->hostname;
+#else
+ httpGetHostname( cups_server, fqdn, sizeof( fqdn ) );
+#endif
+ snprintf(prompt, sizeof(prompt), "Password for %s on %s? ", cupsUser(), fqdn );
+
+ if ((password = cupsGetPassword(prompt)) == NULL)
+ break;
+ if (!password[0])
+ break;
+
+ strncpy(pwdstring, password, sizeof(pwdstring) - 1);
+ pwdstring[sizeof(pwdstring) - 1] = '\0';
+
+ digest_tries = 0;
+ }
+ else
+ digest_tries ++;
+
+ /*
+ * Got a password; encode it for the server...
+ */
+
+#if CUPS_VERSION_MAJOR - 0 <= 1 && CUPS_VERSION_MINOR - 0 < 2
+ www_authenticate = cups_server->fields[HTTP_FIELD_WWW_AUTHENTICATE];
+#else
+ www_authenticate = httpGetField( cups_server, HTTP_FIELD_WWW_AUTHENTICATE );
+#endif
+ if (strncmp(www_authenticate, "Basic", 5) == 0)
+ {
+ /*
+ * Basic authentication...
+ */
+
+ snprintf(plain, sizeof(plain), "%s:%s", cupsUser(), pwdstring);
+#if CUPS_VERSION_MAJOR == 1 && CUPS_VERSION_MINOR >= 2
+ httpEncode64_2(encode, sizeof(encode), plain, sizeof(plain));
+#else
+ httpEncode64(encode, plain);
+#endif
+ snprintf(authstring, sizeof(authstring), "Basic %s", encode);
+ }
+ else
+ {
+ /*
+ * Digest authentication...
+ */
+
+ httpGetSubField(cups_server, HTTP_FIELD_WWW_AUTHENTICATE, "realm", realm);
+ httpGetSubField(cups_server, HTTP_FIELD_WWW_AUTHENTICATE, "nonce", nonce);
+
+ httpMD5(cupsUser(), realm, pwdstring, encode);
+ httpMD5Final(nonce, "GET", resource, encode);
+ snprintf(authstring, sizeof(authstring),
+ "Digest username=\"%s\", realm=\"%s\", nonce=\"%s\", "
+ "response=\"%s\"", cupsUser(), realm, nonce, encode);
+ }
+
+ continue;
+ }
+#ifdef HAVE_LIBSSL
+ else if (status == HTTP_UPGRADE_REQUIRED)
+ {
+ /*
+ * Flush any error message...
+ */
+
+ httpFlush(cups_server);
+
+ /*
+ * Upgrade with encryption...
+ */
+
+ httpEncryption(cups_server, HTTP_ENCRYPT_REQUIRED);
+
+ /*
+ * Try again, this time with encryption enabled...
+ */
+
+ continue;
+ }
+#endif /* HAVE_LIBSSL */
+ }
+ while (status == HTTP_UNAUTHORIZED || status == HTTP_UPGRADE_REQUIRED);
+
+ /*
+ * See if we actually got the file or an error...
+ */
+
+ if (status != HTTP_CREATED)
+ {
+ httpFlush(cups_server);
+ httpClose(cups_server);
+ cups_server = NULL;
+ close(fd);
+ return 0;
+ }
+
+ close(fd);
+
+ return 1;
+}
+
+static int /* O - 1 if available, 0 if not */
+cups_local_auth(http_t *http) /* I - Connection */
+{
+ int pid; /* Current process ID */
+ FILE *fp; /* Certificate file */
+ char filename[1024], /* Certificate filename */
+ certificate[33];/* Certificate string */
+ const char *root; /* Server root directory */
+
+
+ /*
+ * See if we are accessing localhost...
+ the struct has changed in newer versions - PiggZ ([email protected])
+ */
+#if CUPS_VERSION_MAJOR == 1 && CUPS_VERSION_MINOR >= 2
+ if (!httpAddrLocalhost(http))
+#else
+ if (ntohl(*(int*)&http->hostaddr.sin_addr) != 0x7f000001 &&
+ strcasecmp(http->hostname, "localhost") != 0)
+#endif
+ return (0);
+
+ /*
+ * Try opening a certificate file for this PID. If that fails,
+ * try the root certificate...
+ */
+
+ if ((root = getenv("CUPS_SERVERROOT")) == NULL)
+ root = CUPS_SERVERROOT;
+
+ pid = getpid();
+ snprintf(filename, sizeof(filename), "%s/certs/%d", root, pid);
+ if ((fp = fopen(filename, "r")) == NULL && pid > 0)
+ {
+ snprintf(filename, sizeof(filename), "%s/certs/0", root);
+ fp = fopen(filename, "r");
+ }
+
+ if (fp == NULL)
+ return (0);
+
+ /*
+ * Read the certificate from the file...
+ */
+
+ fgets(certificate, sizeof(certificate), fp);
+ fclose(fp);
+
+ /*
+ * Set the authorization string and return...
+ */
+
+ snprintf(authstring, sizeof(authstring), "Local %s", certificate);
+
+ return (1);
+}
+
diff --git a/kdeprint/cups/cupsdconf2/cups-util.h b/kdeprint/cups/cupsdconf2/cups-util.h
new file mode 100644
index 000000000..1daf4050e
--- /dev/null
+++ b/kdeprint/cups/cupsdconf2/cups-util.h
@@ -0,0 +1,26 @@
+/*
+ * This file is part of the KDE libraries
+ * Copyright (c) 2001 Michael Goffioul <[email protected]>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License version 2 as published by the Free Software Foundation.
+ *
+ * This library 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
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB. If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ **/
+
+#ifndef CUPS_UTIL_H
+#define CUPS_UTIL_H
+
+const char* cupsGetConf(void);
+int cupsPutConf(const char *filename);
+
+#endif
diff --git a/kdeprint/cups/cupsdconf2/cups_logo.png b/kdeprint/cups/cupsdconf2/cups_logo.png
new file mode 100644
index 000000000..e6f9b5919
--- /dev/null
+++ b/kdeprint/cups/cupsdconf2/cups_logo.png
Binary files differ
diff --git a/kdeprint/cups/cupsdconf2/cupsd.conf.template b/kdeprint/cups/cupsdconf2/cupsd.conf.template
new file mode 100644
index 000000000..c91f0dfa3
--- /dev/null
+++ b/kdeprint/cups/cupsdconf2/cupsd.conf.template
@@ -0,0 +1,977 @@
+%%header
+# CUPS configuration file, generated by CUPS configuration tool.
+# This tool is part of KDEPrint, the printing framework for KDE
+# since version 2.2.2 and is used by the CUPS supporting module
+# in KDEPrint. The predecessors to KDEPrint in former KDE releases
+# were KUPS and QtCUPS; they are deprecated and no longer maintained.
+#
+# Author: Michael Goffioul <[email protected]>
+#
+# Web site: http://printing.kde.org/
+#
+########################################################################
+# #
+# This is the CUPS configuration file. If you are familiar with #
+# Apache or any of the other popular web servers, we've followed the #
+# same format. Any configuration variable used here has the same #
+# semantics as the corresponding variable in Apache. If we need #
+# different functionality then a different name is used to avoid #
+# confusion... #
+# #
+########################################################################
+@@
+
+%%servername
+# <b>Server name (ServerName)</b>
+# <p>
+# The hostname of your server, as advertised to the world.
+# By default CUPS will use the hostname of the system.</p>
+# <p>
+# To set the default server used by clients, see the client.conf file.</p>
+# <p>
+# <i>ex</i>: myhost.domain.com</p>
+$$
+#ServerName myhost.domain.com
+@@
+
+%%serveradmin
+# <b>Server administrator (ServerAdmin)</b>
+# <p>
+# The email address to send all complaints or problems to.
+# By default CUPS will use "root@hostname".</p>
+# <p>
+# <i>ex</i>: [email protected]</p>
+$$
+#ServerAdmin [email protected]
+@@
+
+%%accesslog
+# <b>Access log (AccessLog)</b>
+# <p>
+# The access log file; if this does not start with a leading /
+# then it is assumed to be relative to ServerRoot. By default set to
+# "/var/log/cups/access_log".</p>
+# <p>
+# You can also use the special name <b>syslog</b> to send the output to the
+# syslog file or daemon.</p>
+# <p>
+# <i>ex</i>: /var/log/cups/access_log</p>
+$$
+#AccessLog /var/log/cups/access_log
+@@
+
+%%datadir
+# <b>Data directory (DataDir)</b>
+# <p>
+# The root directory for the CUPS data files.
+# By default /usr/share/cups.</p>
+# <p>
+# <i>ex</i>: /usr/share/cups</p>
+$$
+#DataDir /usr/share/cups
+@@
+
+%%defaultcharset
+# <b>Default character set (DefaultCharset)</b>
+# <p>
+# The default character set to use. If not specified,
+# defaults to utf-8. Note that this can also be overridden in
+# HTML documents...</p>
+# <p>
+# <i>ex</i>: utf-8</p>
+$$
+#DefaultCharset utf-8
+@@
+
+%%defaultlanguage
+# <b>Default language (DefaultLanguage)</b>
+# <p>
+# The default language if not specified by the browser.
+# If not specified, the current locale is used.</p>
+# <p>
+# <i>ex</i>: en</p>
+$$
+#DefaultLanguage en
+@@
+
+%%documentroot
+# <b>Document directory (DocumentRoot)</b>
+# <p>
+# The root directory for HTTP documents that are served.
+# By default the compiled-in directory.</p>
+# <p>
+# <i>ex</i>: /usr/share/cups/doc</p>
+$$
+#DocumentRoot /usr/share/cups/doc
+@@
+
+%%errorlog
+# <b>Error log (ErrorLog)</b>
+# <p>
+# The error log file; if this does not start with a leading /
+# then it is assumed to be relative to ServerRoot. By default set to
+# "/var/log/cups/error_log".</p>
+# <p>
+# You can also use the special name <b>syslog</b> to send the output to the
+# syslog file or daemon.</p>
+# <p>
+# <i>ex</i>: /var/log/cups/error_log</p>
+$$
+#ErrorLog /var/log/cups/error_log
+@@
+
+%%fontpath
+# <b>Font path (FontPath)</b>
+# <p>
+# The path to locate all font files (currently only for pstoraster).
+# By default /usr/share/cups/fonts.</p>
+# <p>
+# <i>ex</i>: /usr/share/cups/fonts</p>
+$$
+#FontPath /usr/share/cups/fonts
+@@
+
+%%loglevel
+# <b>Log level (LogLevel)</b>
+# <p>
+# Controls the number of messages logged to the ErrorLog
+# file and can be one of the following:</p>
+# <ul type=circle>
+# <li><i>debug2</i>: Log everything.</li>
+# <li><i>debug</i>: Log almost everything.</li>
+# <li><i>info</i>: Log all requests and state changes.</li>
+# <li><i>warn</i>: Log errors and warnings.</li>
+# <li><i>error</i>: Log only errors.</li>
+# <li><i>none</i>: Log nothing.</li>
+# </ul><p>
+# <i>ex</i>: info</p>
+$$
+#LogLevel info
+@@
+
+%%maxlogsize
+# <b>Max log size (MaxLogSize)</b>
+# <p>
+# Controls the maximum size of each log file before they are
+# rotated. Defaults to 1048576 (1MB). Set to 0 to disable log rotating.</p>
+# <p>
+# <i>ex</i>: 1048576</p>
+$$
+#MaxLogSize 0
+@@
+
+%%pagelog
+# <b>Page log (PageLog)</b>
+# <p>
+# The page log file; if this does not start with a leading /
+# then it is assumed to be relative to ServerRoot. By default set to
+# "/var/log/cups/page_log".</p>
+# <p>
+# You can also use the special name <b>syslog</b> to send the output to the
+# syslog file or daemon.</p>
+# <p>
+# <i>ex</i>: /var/log/cups/page_log</p>
+$$
+#PageLog /var/log/cups/page_log
+@@
+
+%%preservejobhistory
+# <b>Preserve job history (PreserveJobHistory)</b>
+# <p>
+# Whether or not to preserve the job history after a
+# job is completed, canceled, or stopped. Default is Yes.</p>
+# <p>
+# <i>ex</i>: Yes</p>
+$$
+#PreserveJobHistory Yes
+@@
+
+%%preservejobfiles
+# <b>Preserve job files (PreserveJobFiles)</b>
+# <p>
+# Whether or not to preserve the job files after a
+# job is completed, canceled, or stopped. Default is No.</p>
+# <p>
+# <i>ex</i>: No</p>
+$$
+#PreserveJobFiles No
+@@
+
+%%printcap
+# <b>Printcap file (Printcap)</b>
+# <p>
+# The name of the printcap file. Default is no filename.
+# Leave blank to disable printcap file generation.</p>
+# <p>
+# <i>ex</i>: /etc/printcap</p>
+$$
+#Printcap /etc/printcap
+@@
+
+%%requestroot
+# <b>Request directory (RequestRoot)</b>
+# <p>
+# The directory where request files are stored.
+# By default /var/spool/cups.</p>
+# <p>
+# <i>ex</i>: /var/spool/cups</p>
+$$
+#RequestRoot /var/spool/cups
+@@
+
+%%remoteroot
+# <b>Remote root user (RemoteRoot)</b>
+# <p>
+# The name of the user assigned to unauthenticated accesses
+# from remote systems. By default "remroot".</p>
+# <p>
+# <i>ex</i>: remroot</p>
+$$
+#RemoteRoot remroot
+@@
+
+%%serverbin
+# <b>Server binaries (ServerBin)</b>
+# <p>
+# The root directory for the scheduler executables.
+# By default /usr/lib/cups or /usr/lib32/cups (IRIX 6.5).</p>
+# <p>
+# <i>ex</i>: /usr/lib/cups</p>
+$$
+#ServerBin /usr/lib/cups
+@@
+
+%%serverroot
+# <b>Server files (ServerRoot)</b>
+# <p>
+# The root directory for the scheduler.
+# By default /etc/cups.</p>
+# <p>
+# <i>ex</i>: /etc/cups</p>
+$$
+#ServerRoot /etc/cups
+@@
+
+%%user
+# <b>User (User)</b>
+# <p>
+# The user the server runs under. Normally this
+# must be <b>lp</b>, however you can configure things for another user
+# as needed.</p>
+# <p>
+# Note: the server must be run initially as root to support the
+# default IPP port of 631. It changes users whenever an external
+# program is run...</p>
+# <p>
+# <i>ex</i>: lp</p>
+$$
+#User lp
+@@
+
+%%group
+# <b>Group (Group)</b>
+# <p>
+# The group the server runs under. Normally this
+# must be <b>sys</b>, however you can configure things for another
+# group as needed.</p>
+# <p>
+# <i>ex</i>: sys</p>
+$$
+#Group sys
+@@
+
+%%ripcache
+# <b>RIP cache (RIPCache)</b>
+# <p>
+# The amount of memory that each RIP should use to cache
+# bitmaps. The value can be any real number followed by "k" for
+# kilobytes, "m" for megabytes, "g" for gigabytes, or "t" for tiles
+# (1 tile = 256x256 pixels). Defaults to "8m" (8 megabytes).</p>
+# <p>
+# <i>ex</i>: 8m</p>
+$$
+#RIPCache 8m
+@@
+
+%%tempdir
+# <b>Temporary files (TempDir)</b>
+# <p>
+# The directory to put temporary files in. This directory must be
+# writable by the user defined above! Defaults to "/var/spool/cups/tmp" or
+# the value of the TMPDIR environment variable.</p>
+# <p>
+# <i>ex</i>: /var/spool/cups/tmp</p>
+$$
+#TempDir /var/spool/cups/tmp
+@@
+
+%%filterlimit
+# <b>Filter limit (FilterLimit)</b>
+# <p>
+# Sets the maximum cost of all job filters that can be run
+# at the same time. A limit of 0 means no limit. A typical job may need
+# a filter limit of at least 200; limits less than the minimum required
+# by a job force a single job to be printed at any time.</p>
+# <p>
+# The default limit is 0 (unlimited).</p>
+# <p>
+# <i>ex</i>: 200</p>
+$$
+#FilterLimit 0
+@@
+
+%%listen
+# <b>Listen to (Port/Listen)</b>
+# <p>
+# Ports/addresses that are listened to. The default port 631 is reserved
+# for the Internet Printing Protocol (IPP) and is what is used here.</p>
+# <p>
+# You can have multiple Port/Listen lines to listen to more than one
+# port or address, or to restrict access.</p>
+# <p>
+# Note: Unfortunately, most web browsers don't support TLS or HTTP Upgrades
+# for encryption. If you want to support web-based encryption you will
+# probably need to listen on port 443 (the "HTTPS" port...).</p>
+# <p>
+# <i>ex</i>: 631, myhost:80, 1.2.3.4:631</p>
+$$
+# Port 80
+# Port 631
+# Listen hostname
+# Listen hostname:80
+# Listen hostname:631
+# Listen 1.2.3.4
+# Listen 1.2.3.4:631
+#
+#Port 631
+@@
+
+%%hostnamelookups
+# <b>Hostname lookups (HostNameLookups)</b>
+# <p>
+# Whether or not to do lookups on IP addresses to get a
+# fully-qualified hostname. This defaults to Off for performance reasons...</p>
+# <p>
+# <i>ex</i>: On</p>
+$$
+#HostNameLookups On
+@@
+
+%%keepalive
+# <b>Keep alive (KeepAlive)</b>
+# <p>
+# Whether or not to support the Keep-Alive connection
+# option. Default is on.</p>
+# <p>
+# <i>ex</i>: On</p>
+$$
+#KeepAlive On
+@@
+
+%%keepalivetimeout
+# <b>Keep-alive timeout (KeepAliveTimeout)</b>
+# <p>
+# The timeout (in seconds) before Keep-Alive connections are
+# automatically closed. Default is 60 seconds.</p>
+# <p>
+# <i>ex</i>: 60</p>
+$$
+#KeepAliveTimeout 60
+@@
+
+%%maxclients
+# <b>Max clients (MaxClients)</b>
+# <p>
+# Controls the maximum number of simultaneous clients that
+# will be handled. Defaults to 100.</p>
+# <p>
+# <i>ex</i>: 100</p>
+$$
+#MaxClients 100
+@@
+
+%%maxrequestsize
+# <b>Max request size (MaxRequestSize)</b>
+# <p>
+# Controls the maximum size of HTTP requests and print files.
+# Set to 0 to disable this feature (defaults to 0).</p>
+# <p>
+# <i>ex</i>: 0</p>
+$$
+#MaxRequestSize 0
+@@
+
+%%timeout
+# <b>Client timeout (Timeout)</b>
+# <p>
+# The timeout (in seconds) before requests time out. Default is 300 seconds.</p>
+# <p>
+# <i>ex</i>: 300</p>
+$$
+#Timeout 300
+@@
+
+%%browsing
+# <b>Use browsing (Browsing)</b>
+# <p>
+# Whether or not to <b>listen</b> to printer
+# information from other CUPS servers.
+# </p>
+# <p>
+# Enabled by default.
+# </p>
+# <p>
+# Note: to enable the <b>sending</b> of browsing
+# information from this CUPS server to the LAN,
+# specify a valid <i>BrowseAddress</i>.
+# </p>
+# <p>
+# <i>ex</i>: On</p>
+$$
+#Browsing On
+@@
+
+%%browseshortnames
+# <b>Use short names (BrowseShortNames)</b>
+# <p>
+# Whether or not to use "short" names for remote printers
+# when possible (e.g. "printer" instead of "printer@host"). Enabled by
+# default.</p>
+# <p>
+# <i>ex</i>: Yes</p>
+$$
+#BrowseShortNames Yes
+@@
+
+%%browseaddress
+# <b>Browse addresses (BrowseAddress)</b>
+# <p>
+# Specifies a broadcast address to be used. By
+# default browsing information is broadcast to all active interfaces.</p>
+# <p>
+# Note: HP-UX 10.20 and earlier do not properly handle broadcast unless
+# you have a Class A, B, C, or D netmask (i.e. no CIDR support).</p>
+# <p>
+# <i>ex</i>: x.y.z.255, x.y.255.255</p>
+$$
+#BrowseAddress x.y.z.255
+#BrowseAddress x.y.255.255
+#BrowseAddress x.255.255.255
+@@
+
+%%browseallow
+# <b>Browse allow/deny (BrowseAllow/BrowseDeny)</b>
+# <p>
+# <u>BrowseAllow</u>: specifies an address mask to allow for incoming browser
+# packets. The default is to allow packets from all addresses.</p>
+# <p>
+# <u>BrowseDeny</u>: specifies an address mask to deny for incoming browser
+# packets. The default is to deny packets from no addresses.</p>
+# <p>
+# Both "BrowseAllow" and "BrowseDeny" accept the following notations for
+# addresses:</p>
+# <pre>
+# All
+# None
+# *.domain.com
+# .domain.com
+# host.domain.com
+# nnn.*
+# nnn.nnn.*
+# nnn.nnn.nnn.*
+# nnn.nnn.nnn.nnn
+# nnn.nnn.nnn.nnn/mm
+# nnn.nnn.nnn.nnn/mmm.mmm.mmm.mmm
+# </pre><p>
+# The hostname/domainname restrictions only work if you have turned hostname
+# lookups on!</p>
+$$
+#BrowseAllow address
+#BrowseDeny address
+@@
+
+%%browseinterval
+# <b>Browse interval (BrowseInterval)</b>
+# <p>
+# The time between browsing updates in seconds. Default
+# is 30 seconds.</p>
+# <p>
+# Note that browsing information is sent whenever a printer's state changes
+# as well, so this represents the maximum time between updates.</p>
+# <p>
+# Set this to 0 to disable outgoing broadcasts so your local printers are
+# not advertised but you can still see printers on other hosts.</p>
+# <p>
+# <i>ex</i>: 30</p>
+$$
+#BrowseInterval 30
+@@
+
+%%browseorder
+# <b>Browse order (BrowseOrder)</b>
+# <p>
+# Specifies the order of BrowseAllow/BrowseDeny comparisons.</p>
+# <p>
+# <i>ex</i>: allow,deny</p>
+$$
+#BrowseOrder allow,deny
+#BrowseOrder deny,allow
+@@
+
+%%browsepoll
+# <b>Browse poll (BrowsePoll)</b>
+# <p>
+# Poll the named server(s) for printers.</p>
+# <p>
+# <i>ex</i>: myhost:631</p>
+$$
+#BrowsePoll address:port
+@@
+
+%%browseport
+# <b>Browse port (BrowsePort)</b>
+# <p>
+# The port used for UDP broadcasts. By default this is
+# the IPP port; if you change this you need to do it on all servers.
+# Only one BrowsePort is recognized.</p>
+# <p>
+# <i>ex</i>: 631</p>
+$$
+#BrowsePort 631
+@@
+
+%%browserelay
+# <b>Browse relay (BrowseRelay)</b>
+# <p>
+# Relay browser packets from one address/network to another.</p>
+# <p>
+# <i>ex</i>: src-address dest-address</p>
+$$
+#BrowseRelay source-address destination-address
+@@
+
+%%browsetimeout
+# <b>Browse timeout (BrowseTimeout)</b>
+# <p>
+# The timeout (in seconds) for network printers - if we don't
+# get an update within this time the printer will be removed
+# from the printer list. This number definitely should not be
+# less the BrowseInterval value for obvious reasons. Defaults
+# to 300 seconds.</p>
+# <p>
+# <i>ex</i>: 300</p>
+$$
+#BrowseTimeout 300
+@@
+
+%%implicitclasses
+# <b>Implicit classes (ImplicitClasses)</b>
+# <p>
+# Whether or not to use implicit classes.</p>
+# <p>
+# Printer classes can be specified explicitly in the classes.conf
+# file, implicitly based upon the printers available on the LAN, or
+# both.</p>
+# <p>
+# When ImplicitClasses is On, printers on the LAN with the same name
+# (e.g. Acme-LaserPrint-1000) will be put into a class with the same
+# name. This allows you to setup multiple redundant queues on a LAN
+# without a lot of administrative difficulties. If a user sends a
+# job to Acme-LaserPrint-1000, the job will go to the first available
+# queue.</p>
+# <p>
+# Enabled by default.</p>
+$$
+#ImplicitClasses Off
+@@
+
+%%systemgroup
+# <b>System group (SystemGroup)</b>
+# <p>
+# The group name for "System" (printer administration)
+# access. The default varies depending on the operating system, but
+# will be <b>sys</b>, <b>system</b>, or <b>root</b> (checked for in that order).</p>
+# <p>
+# <i>ex</i>: sys</p>
+$$
+#SystemGroup sys
+@@
+
+%%servercertificate
+# <b>Encryption certificate (ServerCertificate)</b>
+# <p>
+# The file to read containing the server's certificate.
+# Defaults to "/etc/cups/ssl/server.crt".</p>
+# <p>
+# <i>ex</i>: /etc/cups/ssl/server.crt</p>
+$$
+#ServerCertificate /etc/cups/ssl/server.crt
+@@
+
+%%serverkey
+# <b>Encryption key (ServerKey)</b>
+# <p>
+# The file to read containing the server's key.
+# Defaults to "/etc/cups/ssl/server.key".</p>
+# <p>
+# <i>ex</i>: /etc/cups/ssl/server.key</p>
+$$
+#ServerKey /etc/cups/ssl/server.key
+@@
+
+%%locations
+# Access permissions
+#
+# Access permissions for each directory served by the scheduler.
+# Locations are relative to DocumentRoot...
+#
+# AuthType: the authorization to use:
+#
+# None - Perform no authentication
+# Basic - Perform authentication using the HTTP Basic method.
+# Digest - Perform authentication using the HTTP Digest method.
+#
+# (Note: local certificate authentication can be substituted by
+# the client for Basic or Digest when connecting to the
+# localhost interface)
+#
+# AuthClass: the authorization class; currently only Anonymous, User,
+# System (valid user belonging to group SystemGroup), and Group
+# (valid user belonging to the specified group) are supported.
+#
+# AuthGroupName: the group name for "Group" authorization.
+#
+# Order: the order of Allow/Deny processing.
+#
+# Allow: allows access from the specified hostname, domain, IP address, or
+# network.
+#
+# Deny: denies access from the specified hostname, domain, IP address, or
+# network.
+#
+# Both "Allow" and "Deny" accept the following notations for addresses:
+#
+# All
+# None
+# *.domain.com
+# .domain.com
+# host.domain.com
+# nnn.*
+# nnn.nnn.*
+# nnn.nnn.nnn.*
+# nnn.nnn.nnn.nnn
+# nnn.nnn.nnn.nnn/mm
+# nnn.nnn.nnn.nnn/mmm.mmm.mmm.mmm
+#
+# The host and domain address require that you enable hostname lookups
+# with "HostNameLookups On" above.
+#
+# Encryption: whether or not to use encryption; this depends on having
+# the OpenSSL library linked into the CUPS library and scheduler.
+#
+# Possible values:
+#
+# Always - Always use encryption (SSL)
+# Never - Never use encryption
+# Required - Use TLS encryption upgrade
+# IfRequested - Use encryption if the server requests it
+#
+# The default value is "IfRequested".
+$$
+#<Location [resource_name]>
+#
+# You may wish to limit access to printers and classes, either with Allow
+# and Deny lines, or by requiring a username and password.
+#
+#
+## Anonymous access (default)
+#AuthType None
+#
+## Require a username and password (Basic authentication)
+#AuthType Basic
+#AuthClass User
+#
+## Require a username and password (Digest/MD5 authentication)
+#AuthType Digest
+#AuthClass User
+#
+## Restrict access to local domain
+#Order Deny,Allow
+#Deny From All
+#Allow From .mydomain.com
+#
+## Use encryption if requested
+#Encryption IfRequested
+#</Location>
+@@
+
+%%authtype
+# <b>Authentication (AuthType)</b>
+# <p>
+# The authorization to use:<p>
+# <ul type=circle>
+# <li><i>None</i> - Perform no authentication.</li>
+# <li><i>Basic</i> - Perform authentication using the HTTP Basic method.</li>
+# <li><i>Digest</i> - Perform authentication using the HTTP Digest method.</li>
+# </ul><p>
+# Note: local certificate authentication can be substituted by
+# the client for <i>Basic</i> or <i>Digest</i> when connecting to the
+# localhost interface.</p>
+@@
+
+%%authclass
+# <b>Class (AuthClass)</b>
+# <p>
+# The authorization class; currently only <i>Anonymous</i>, <i>User</i>,
+# <i>System</i> (valid user belonging to group SystemGroup), and <i>Group</i>
+# (valid user belonging to the specified group) are supported.</p>
+@@
+
+%%authname
+# <p>The user/group names allowed to access the resource. The format is a
+# comma separated list.</p>
+@@
+
+%%satisfy
+# <b>Satisfy (Satisfy)</b>
+# <p>
+# This directive controls whether all specified conditions must
+# be satisfied to allow access to the resource. If set to "all",
+# then all authentication and access control conditions must be
+# satisfied to allow access.
+# </p>
+# <p>
+# Setting Satisfy to "any" allows a user to gain access if the
+# authentication <i>or</i> access control requirements are satisfied.
+# For example, you might require authentication for remote access,
+# but allow local access without authentication.
+# </p>
+# <p>
+# The default is "all".
+# </p>
+@@
+
+%%authgroupname
+# <b>Authentication group name (AuthGroupName)</b>
+# <p>
+# The group name for <i>Group</i> authorization.</p>
+@@
+
+%%order
+# <b>ACL order (Order)</b>
+# <p>
+# The order of Allow/Deny processing.</p>
+@@
+
+%%allow
+# <b>Allow</b>
+# <p>
+# Allows access from the specified hostname, domain, IP address, or
+# network. Possible values are:</p>
+# <pre>
+# All
+# None
+# *.domain.com
+# .domain.com
+# host.domain.com
+# nnn.*
+# nnn.nnn.*
+# nnn.nnn.nnn.*
+# nnn.nnn.nnn.nnn
+# nnn.nnn.nnn.nnn/mm
+# nnn.nnn.nnn.nnn/mmm.mmm.mmm.mmm
+# </pre><p>
+# The host and domain address require that you enable hostname lookups
+# with "HostNameLookups On" above.</p>
+@@
+
+%%allowdeny
+# <b>ACL addresses (Allow/Deny)</b>
+# <p>
+# Allows/Denies access from the specified hostname, domain, IP address, or
+# network. Possible values are:</p>
+# <pre>
+# All
+# None
+# *.domain.com
+# .domain.com
+# host.domain.com
+# nnn.*
+# nnn.nnn.*
+# nnn.nnn.nnn.*
+# nnn.nnn.nnn.nnn
+# nnn.nnn.nnn.nnn/mm
+# nnn.nnn.nnn.nnn/mmm.mmm.mmm.mmm
+# </pre><p>
+# The host and domain address require that you enable hostname lookups
+# with "HostNameLookups On" above.</p>
+@@
+
+%%encryption
+# <b>Encryption (Encryption)</b>
+# <p>
+# Whether or not to use encryption; this depends on having
+# the OpenSSL library linked into the CUPS library and scheduler.</p>
+# <p>
+# Possible values:</p>
+# <ul type=circle>
+# <li><i>Always</i> - Always use encryption (SSL)</li>
+# <li><i>Never</i> - Never use encryption</li>
+# <li><i>Required</i> - Use TLS encryption upgrade</li>
+# <li><i>IfRequested</i> - Use encryption if the server requests it</li>
+# </ul><p>
+# The default value is "IfRequested".</p>
+@@
+
+%%locationsshort
+# <b>Access permissions</b>
+# <p>
+# Access permissions for each directory served by the scheduler.
+# Locations are relative to DocumentRoot...</p>
+@@
+
+%%autopurgejobs
+# <b>Auto purge jobs (AutoPurgeJobs)</b>
+# <p>
+# Automatically purge jobs when not needed for quotas.
+# Default is No.</p>
+$$
+#AutoPurgeJobs No
+@@
+
+%%browseprotocols
+# <b>Browse protocols (BrowseProtocols)</b>
+# <p>
+# Which protocols to use for browsing. Can be
+# any of the following separated by whitespace and/or commas:</p>
+# <ul type=circle>
+# <li><i>all</i> - Use all supported protocols.</li>
+# <li><i>cups</i> - Use the CUPS browse protocol.</li>
+# <li><i>slp</i> - Use the SLPv2 protocol.</li>
+# </ul><p>
+# The default is <b>cups</b>.</p>
+# <p>
+# Note: If you choose to use SLPv2, it is <b>strongly</b> recommended that
+# you have at least one SLP Directory Agent (DA) on your
+# network. Otherwise, browse updates can take several seconds,
+# during which the scheduler will not response to client
+# requests.</p>
+$$
+#BrowseProtocols cups
+@@
+
+%%classification
+# <b>Classification (Classification)</b>
+# <p>
+# The classification level of the server. If set, this
+# classification is displayed on all pages, and raw printing is disabled.
+# The default is the empty string.</p>
+# <p>
+# <i>ex</i>: confidential
+$$
+#Classification classified
+@@
+
+%%classifyoverride
+# <b>Allow overrides (ClassifyOverride)</b>
+# <p>
+# Whether to allow users to override the classification
+# on printouts. If enabled, users can limit banner pages to before or
+# after the job, and can change the classification of a job, but cannot
+# completely eliminate the classification or banners.</p>
+# <p>
+# The default is off.</p>
+$$
+#ClassifyOverride off
+@@
+
+%%hideimplicitmembers
+# <b>Hide implicit members (HideImplicitMembers)</b>
+# <p>
+# Whether or not to show the members of an
+# implicit class.</p>
+# <p>
+# When HideImplicitMembers is On, any remote printers that are
+# part of an implicit class are hidden from the user, who will
+# then only see a single queue even though many queues will be
+# supporting the implicit class.</p>
+# <p>
+# Enabled by default.</p>
+$$
+#HideImplicitMembers On
+@@
+
+%%implicitanyclasses
+# <b>Use &quot;any&quot; classes (ImplicitAnyClasses)</b>
+# <p>
+# Whether or not to create <b>AnyPrinter</b> implicit
+# classes.</p>
+# <p>
+# When ImplicitAnyClasses is On and a local queue of the same name
+# exists, e.g. "printer", "printer@server1", "printer@server1", then
+# an implicit class called "Anyprinter" is created instead.</p>
+# <p>
+# When ImplicitAnyClasses is Off, implicit classes are not created
+# when there is a local queue of the same name.</p>
+# <p>
+# Disabled by default.</p>
+$$
+#ImplicitAnyCLasses Off
+@@
+
+%%maxjobs
+# <b>Max jobs (MaxJobs)</b>
+# <p>
+# Maximum number of jobs to keep in memory (active and completed).
+# Default is 0 (no limit).</p>
+$$
+#MaxJobs 0
+@@
+
+%%maxjobsperuser
+# <b>Max jobs per user (MaxJobsPerUser)</b>
+# <p>
+# The MaxJobsPerUser directive controls the maximum number of <i>active</i>
+# jobs that are allowed for each user. Once a user reaches the limit, new
+# jobs will be rejected until one of the active jobs is completed, stopped,
+# aborted, or canceled.</p>
+# <p>
+# Setting the maximum to 0 disables this functionality.
+# Default is 0 (no limit).
+# </p>
+$$
+#MaxJobsPerUser 0
+@@
+
+%%maxjobsperprinter
+# <b>Max jobs per printer (MaxJobsPerPrinter)</b>
+# <p>
+# The MaxJobsPerPrinter directive controls the maximum number of <i>active</i>
+# jobs that are allowed for each printer or class. Once a printer or class
+# reaches the limit, new jobs will be rejected until one of the active jobs
+# is completed, stopped, aborted, or canceled.</p>
+# <p>
+# Setting the maximum to 0 disables this functionality.
+# Default is 0 (no limit).
+# </p>
+$$
+#MaxJobsPerPrinter 0
+@@
+
+%%port
+# <b>Port</b>
+# <p>
+# The port value that the CUPS daemon is listening to. Default is 631.</p>
+@@
+
+%%address
+# <b>Address</b>
+# <p>
+# The address that the CUPS daemon is listening at. Leave it empty or use
+# an asterisk (*) to specify a port value on the entire subnetwork.</p>
+@@
+
+%%usessl
+# <p>Check this box if you want to use SSL encryption with this address/port.
+# </p>
+@@
diff --git a/kdeprint/cups/cupsdconf2/cupsdbrowsingpage.cpp b/kdeprint/cups/cupsdconf2/cupsdbrowsingpage.cpp
new file mode 100644
index 000000000..a61742458
--- /dev/null
+++ b/kdeprint/cups/cupsdconf2/cupsdbrowsingpage.cpp
@@ -0,0 +1,210 @@
+/*
+ * This file is part of the KDE libraries
+ * Copyright (c) 2001 Michael Goffioul <[email protected]>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License version 2 as published by the Free Software Foundation.
+ *
+ * This library 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
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB. If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ **/
+
+#include "cupsdbrowsingpage.h"
+#include "cupsdconf.h"
+#include "editlist.h"
+#include "browsedialog.h"
+
+#include <qlabel.h>
+#include <qlayout.h>
+#include <qcheckbox.h>
+#include <qcombobox.h>
+#include <qwhatsthis.h>
+
+#include <klocale.h>
+#include <knuminput.h>
+
+CupsdBrowsingPage::CupsdBrowsingPage(QWidget *parent, const char *name)
+ : CupsdPage(parent, name)
+{
+ setPageLabel(i18n("Browsing"));
+ setHeader(i18n("Browsing Settings"));
+ setPixmap("kdeprint_printer_remote");
+
+ browseinterval_ = new KIntNumInput(this);
+ browseport_ = new KIntNumInput(this);
+ browsetimeout_ = new KIntNumInput(this);
+ browsing_ = new QCheckBox(i18n("Use browsing"), this);
+ cups_ = new QCheckBox("CUPS", this);
+ slp_ = new QCheckBox("SLP", this);
+ browseaddresses_ = new EditList(this);
+ browseorder_ = new QComboBox(this);
+ useimplicitclasses_ = new QCheckBox(i18n("Implicit classes"), this);
+ hideimplicitmembers_ = new QCheckBox(i18n("Hide implicit members"), this);
+ useshortnames_ = new QCheckBox(i18n("Use short names"), this);
+ useanyclasses_ = new QCheckBox(i18n("Use \"any\" classes"), this);
+
+ browseorder_->insertItem(i18n("Allow, Deny"));
+ browseorder_->insertItem(i18n("Deny, Allow"));
+
+ browseport_->setRange(0, 9999, 1, true);
+ browseport_->setSteps(1, 5);
+ browseinterval_->setRange(0, 10000, 1, true);
+ browseinterval_->setSteps(1, 10);
+ browseinterval_->setSuffix(i18n(" sec"));
+ browsetimeout_->setRange(0, 10000, 1, true);
+ browsetimeout_->setSteps(1, 10);
+ browsetimeout_->setSuffix(i18n(" sec"));
+
+ QLabel *l1 = new QLabel(i18n("Browse port:"), this);
+ QLabel *l2 = new QLabel(i18n("Browse interval:"), this);
+ QLabel *l3 = new QLabel(i18n("Browse timeout:"), this);
+ QLabel *l4 = new QLabel(i18n("Browse addresses:"), this);
+ QLabel *l5 = new QLabel(i18n("Browse order:"), this);
+ QLabel *l6 = new QLabel(i18n("Browse options:"), this);
+
+ QGridLayout *m1 = new QGridLayout(this, 8, 2, 10, 7);
+ m1->setRowStretch(7, 1);
+ m1->setColStretch(1, 1);
+ QHBoxLayout *m2 = new QHBoxLayout(0, 0, 10);
+ m1->addMultiCellLayout(m2, 0, 0, 0, 1);
+ m2->addWidget(browsing_);
+ m2->addWidget(cups_);
+ m2->addWidget(slp_);
+ m2->addStretch(1);
+ m1->addWidget(l1, 1, 0, Qt::AlignRight);
+ m1->addWidget(l2, 2, 0, Qt::AlignRight);
+ m1->addWidget(l3, 3, 0, Qt::AlignRight);
+ m1->addWidget(l4, 4, 0, Qt::AlignRight|Qt::AlignTop);
+ m1->addWidget(l5, 5, 0, Qt::AlignRight);
+ m1->addWidget(l6, 6, 0, Qt::AlignRight|Qt::AlignTop);
+ m1->addWidget(browseport_, 1, 1);
+ m1->addWidget(browseinterval_, 2, 1);
+ m1->addWidget(browsetimeout_, 3, 1);
+ m1->addWidget(browseaddresses_, 4, 1);
+ m1->addWidget(browseorder_, 5, 1);
+ QGridLayout *m3 = new QGridLayout(0, 2, 2, 0, 5);
+ m1->addLayout(m3, 6, 1);
+ m3->addWidget(useimplicitclasses_, 0, 0);
+ m3->addWidget(useanyclasses_, 0, 1);
+ m3->addWidget(hideimplicitmembers_, 1, 0);
+ m3->addWidget(useshortnames_, 1, 1);
+
+ connect(browsing_, SIGNAL(toggled(bool)), cups_, SLOT(setEnabled(bool)));
+ connect(browsing_, SIGNAL(toggled(bool)), slp_, SLOT(setEnabled(bool)));
+ connect(browsing_, SIGNAL(toggled(bool)), browseport_, SLOT(setEnabled(bool)));
+ connect(browsing_, SIGNAL(toggled(bool)), browseinterval_, SLOT(setEnabled(bool)));
+ connect(browsing_, SIGNAL(toggled(bool)), browsetimeout_, SLOT(setEnabled(bool)));
+ connect(browsing_, SIGNAL(toggled(bool)), browseaddresses_, SLOT(setEnabled(bool)));
+ connect(browsing_, SIGNAL(toggled(bool)), browseorder_, SLOT(setEnabled(bool)));
+ connect(browsing_, SIGNAL(toggled(bool)), useimplicitclasses_, SLOT(setEnabled(bool)));
+ connect(browsing_, SIGNAL(toggled(bool)), useanyclasses_, SLOT(setEnabled(bool)));
+ connect(browsing_, SIGNAL(toggled(bool)), hideimplicitmembers_, SLOT(setEnabled(bool)));
+ connect(browsing_, SIGNAL(toggled(bool)), useshortnames_, SLOT(setEnabled(bool)));
+
+ connect(browsing_, SIGNAL(toggled(bool)), l1, SLOT(setEnabled(bool)));
+ connect(browsing_, SIGNAL(toggled(bool)), l2, SLOT(setEnabled(bool)));
+ connect(browsing_, SIGNAL(toggled(bool)), l3, SLOT(setEnabled(bool)));
+ connect(browsing_, SIGNAL(toggled(bool)), l4, SLOT(setEnabled(bool)));
+ connect(browsing_, SIGNAL(toggled(bool)), l5, SLOT(setEnabled(bool)));
+ connect(browsing_, SIGNAL(toggled(bool)), l6, SLOT(setEnabled(bool)));
+
+ connect(browseaddresses_, SIGNAL(add()), SLOT(slotAdd()));
+ connect(browseaddresses_, SIGNAL(edit(int)), SLOT(slotEdit(int)));
+ connect(browseaddresses_, SIGNAL(defaultList()), SLOT(slotDefaultList()));
+ connect(browseinterval_, SIGNAL(valueChanged(int)), SLOT(intervalChanged(int)));
+ browsing_->setChecked(true);
+}
+
+bool CupsdBrowsingPage::loadConfig(CupsdConf *conf, QString&)
+{
+ conf_ = conf;
+ browsing_->setChecked(conf_->browsing_);
+ cups_->setChecked(conf_->browseprotocols_.findIndex("CUPS") != -1);
+ slp_->setChecked(conf_->browseprotocols_.findIndex("SLP") != -1);
+ browseport_->setValue(conf_->browseport_);
+ browseinterval_->setValue(conf_->browseinterval_);
+ browsetimeout_->setValue(conf_->browsetimeout_);
+ browseaddresses_->insertItems(conf_->browseaddresses_);
+ browseorder_->setCurrentItem(conf_->browseorder_);
+ useimplicitclasses_->setChecked(conf_->useimplicitclasses_);
+ useanyclasses_->setChecked(conf_->useanyclasses_);
+ hideimplicitmembers_->setChecked(conf_->hideimplicitmembers_);
+ useshortnames_->setChecked(conf_->useshortnames_);
+
+ return true;
+}
+
+bool CupsdBrowsingPage::saveConfig(CupsdConf *conf, QString&)
+{
+ conf->browsing_ = browsing_->isChecked();
+ QStringList l;
+ if (cups_->isChecked()) l << "CUPS";
+ if (slp_->isChecked()) l << "SLP";
+ conf->browseprotocols_ = l;
+ conf->browseport_ = browseport_->value();
+ conf->browseinterval_ = browseinterval_->value();
+ conf->browsetimeout_ = browsetimeout_->value();
+ conf->browseaddresses_ = browseaddresses_->items();
+ conf->browseorder_ = browseorder_->currentItem();
+ conf->useimplicitclasses_ = useimplicitclasses_->isChecked();
+ conf->useanyclasses_ = useanyclasses_->isChecked();
+ conf->hideimplicitmembers_ = hideimplicitmembers_->isChecked();
+ conf->useshortnames_ = useshortnames_->isChecked();
+
+ return true;
+}
+
+void CupsdBrowsingPage::setInfos(CupsdConf *conf)
+{
+ QWhatsThis::add(browsing_, conf->comments_.toolTip("browsing"));
+ QWhatsThis::add(cups_, conf->comments_.toolTip("browseprotocols"));
+ QWhatsThis::add(slp_, conf->comments_.toolTip("browseprotocols"));
+ QWhatsThis::add(browseinterval_, conf->comments_.toolTip("browseinterval"));
+ QWhatsThis::add(browseport_, conf->comments_.toolTip("browseport"));
+ QWhatsThis::add(browsetimeout_, conf->comments_.toolTip("browsetimeout"));
+ QWhatsThis::add(browseaddresses_, conf->comments_.toolTip("browseaddresses"));
+ QWhatsThis::add(browseorder_, conf->comments_.toolTip("browseorder"));
+ QWhatsThis::add(useimplicitclasses_, conf->comments_.toolTip("implicitclasses"));
+ QWhatsThis::add(useanyclasses_, conf->comments_.toolTip("implicitanyclasses"));
+ QWhatsThis::add(hideimplicitmembers_, conf->comments_.toolTip("hideimplicitmembers"));
+ QWhatsThis::add(useshortnames_, conf->comments_.toolTip("browseshortnames"));
+}
+
+void CupsdBrowsingPage::slotAdd()
+{
+ QString s = BrowseDialog::newAddress(this, conf_);
+ if (!s.isEmpty())
+ browseaddresses_->insertItem(s);
+}
+
+void CupsdBrowsingPage::slotEdit(int index)
+{
+ QString s = browseaddresses_->text(index);
+ s = BrowseDialog::editAddress(s, this, conf_);
+ if (!s.isEmpty())
+ browseaddresses_->setText(index, s);
+}
+
+void CupsdBrowsingPage::slotDefaultList()
+{
+ browseaddresses_->clear();
+ QStringList l;
+ l << "Send 255.255.255.255";
+ browseaddresses_->insertItems(l);
+}
+
+void CupsdBrowsingPage::intervalChanged(int val)
+{
+ browsetimeout_->setRange(val, 10000, 1, true);
+ browsetimeout_->setSteps(1, 10);
+}
+
+#include "cupsdbrowsingpage.moc"
diff --git a/kdeprint/cups/cupsdconf2/cupsdbrowsingpage.h b/kdeprint/cups/cupsdconf2/cupsdbrowsingpage.h
new file mode 100644
index 000000000..655998a5e
--- /dev/null
+++ b/kdeprint/cups/cupsdconf2/cupsdbrowsingpage.h
@@ -0,0 +1,55 @@
+/*
+ * This file is part of the KDE libraries
+ * Copyright (c) 2001 Michael Goffioul <[email protected]>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License version 2 as published by the Free Software Foundation.
+ *
+ * This library 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
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB. If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ **/
+
+#ifndef CUPSDBROWSINGPAGE_H
+#define CUPSDBROWSINGPAGE_H
+
+#include "cupsdpage.h"
+
+class KIntNumInput;
+class QCheckBox;
+class EditList;
+class QComboBox;
+
+class CupsdBrowsingPage : public CupsdPage
+{
+ Q_OBJECT
+
+public:
+ CupsdBrowsingPage(QWidget *parent = 0, const char *name = 0);
+
+ bool loadConfig(CupsdConf*, QString&);
+ bool saveConfig(CupsdConf*, QString&);
+ void setInfos(CupsdConf*);
+
+protected slots:
+ void slotAdd();
+ void slotEdit(int);
+ void slotDefaultList();
+ void intervalChanged(int);
+
+private:
+ KIntNumInput *browseport_, *browseinterval_, *browsetimeout_;
+ EditList *browseaddresses_;
+ QComboBox *browseorder_;
+ QCheckBox *browsing_, *cups_, *slp_;
+ QCheckBox *useimplicitclasses_, *hideimplicitmembers_, *useshortnames_, *useanyclasses_;
+};
+
+#endif
diff --git a/kdeprint/cups/cupsdconf2/cupsdcomment.cpp b/kdeprint/cups/cupsdconf2/cupsdcomment.cpp
new file mode 100644
index 000000000..d49a104a3
--- /dev/null
+++ b/kdeprint/cups/cupsdconf2/cupsdcomment.cpp
@@ -0,0 +1,136 @@
+/*
+ * This file is part of the KDE libraries
+ * Copyright (c) 2001 Michael Goffioul <[email protected]>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License version 2 as published by the Free Software Foundation.
+ *
+ * This library 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
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB. If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ **/
+
+#include "cupsdcomment.h"
+
+#include <qfile.h>
+#include <qregexp.h>
+#include <klocale.h>
+#include <kstandarddirs.h>
+
+QString Comment::comment()
+{
+ QString str = comment_;
+ str.replace(QRegExp("<[^>]*>"), "");
+ str += ("#\n" + example_);
+ return str;
+}
+
+QString Comment::toolTip()
+{
+ QString str = comment_;
+ str.replace(QRegExp("^#[\\s]*"), "").replace(QRegExp("\n#[\\s]*"), "\n");
+ return i18n("Do not translate the keyword between brackets (e.g. ServerName, ServerAdmin, etc.)", str.utf8());
+}
+
+QString Comment::key()
+{
+ return key_;
+}
+
+bool Comment::load(QFile *f)
+{
+ comment_ = "";
+ example_ = "";
+ key_ = "";
+ QString line, *current = &comment_;
+ while (!f->atEnd())
+ {
+ f->readLine(line, 1024);
+ if (line.left(2) == "$$")
+ {
+ current = &example_;
+ }
+ else if (line.left(2) == "%%")
+ {
+ key_ = line.mid(2).stripWhiteSpace();
+ }
+ else if (line.left(2) == "@@")
+ {
+ return true;
+ }
+ else if (line.stripWhiteSpace().isEmpty())
+ {
+ ; // do nothing
+ }
+ else
+ {
+ if (line[0] != '#') break;
+ else
+ {
+ current->append(line);
+ }
+ }
+ }
+ return false;
+}
+
+//------------------------------------------------------------------------------------------------------------
+
+QString CupsdComment::operator[] (const QString& key)
+{
+ return comment(key);
+}
+
+QString CupsdComment::comment(const QString& key)
+{
+ if (comments_.count() != 0 || loadComments())
+ {
+ Comment *comm = comments_.find(key);
+ if (comm)
+ return comm->comment();
+ }
+ return QString::null;
+}
+
+QString CupsdComment::toolTip(const QString& key)
+{
+ if (comments_.count() != 0 || loadComments())
+ {
+ Comment *comm = comments_.find(key);
+ if (comm)
+ return comm->toolTip();
+ }
+ return QString::null;
+}
+
+bool CupsdComment::loadComments()
+{
+ comments_.setAutoDelete(true);
+ comments_.clear();
+ QFile f(locate("data", "kdeprint/cupsd.conf.template"));
+ if (f.exists() && f.open(IO_ReadOnly))
+ {
+ Comment *comm;
+ while (!f.atEnd())
+ {
+ comm = new Comment();
+ if (!comm->load(&f))
+ break;
+ else
+ {
+ if (comm->key().isEmpty())
+ delete comm;
+ else
+ comments_.insert(comm->key(), comm);
+ }
+ }
+ }
+ return true;
+}
diff --git a/kdeprint/cups/cupsdconf2/cupsdcomment.h b/kdeprint/cups/cupsdconf2/cupsdcomment.h
new file mode 100644
index 000000000..efe242765
--- /dev/null
+++ b/kdeprint/cups/cupsdconf2/cupsdcomment.h
@@ -0,0 +1,55 @@
+/*
+ * This file is part of the KDE libraries
+ * Copyright (c) 2001 Michael Goffioul <[email protected]>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License version 2 as published by the Free Software Foundation.
+ *
+ * This library 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
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB. If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ **/
+
+#ifndef CUPSDCOMMENT_H
+#define CUPSDCOMMENT_H
+
+#include <qstringlist.h>
+#include <qdict.h>
+
+class QFile;
+
+class Comment
+{
+public:
+ bool load(QFile* f);
+ QString toolTip();
+ QString comment();
+ QString key();
+private:
+ QString comment_;
+ QString example_;
+ QString key_;
+};
+
+class CupsdComment
+{
+public:
+ QString operator[] (const QString& key);
+ QString comment(const QString& key);
+ QString toolTip(const QString& key);
+
+private:
+ bool loadComments();
+
+private:
+ QDict<Comment> comments_;
+};
+
+#endif
diff --git a/kdeprint/cups/cupsdconf2/cupsdcomment.pl b/kdeprint/cups/cupsdconf2/cupsdcomment.pl
new file mode 100644
index 000000000..b3da5ee7e
--- /dev/null
+++ b/kdeprint/cups/cupsdconf2/cupsdcomment.pl
@@ -0,0 +1,61 @@
+#!/usr/bin/perl -w
+#
+# Filter to extract comments for translation from cupsd.conf.template
+#
+# This code should produce strings identical to tooltips in cupsdcomment.cpp
+#
+my ($comment_, $example_);
+$example_ = "";
+
+load(); # Skip header
+
+while ( <STDIN> )
+{
+ if(load())
+ {
+ print toolTip();
+ }
+}
+
+# Corresponds to Comment::load in cupsdcomment.cpp
+sub load
+{
+ $comment_ = "";
+ my($current) = \$comment_;
+ while ( <STDIN> )
+ {
+ if (/^\$\$/)
+ {
+ $current = \$example_;
+ }
+ elsif (/^\%\%/)
+ {
+ next; # Do nothing
+ }
+ elsif (/^\@\@/)
+ {
+ return 1;
+ }
+ elsif (/^[\s]*$/)
+ {
+ next; # Do nothing
+ }
+ else
+ {
+ last if (!/^\#/);
+ ${$current} = ${$current} . $_;
+ }
+ }
+ return 0;
+}
+
+# Corresponds to Comment::toolTip in cupsdcomment.cpp
+sub toolTip
+{
+ my($str) = $comment_;
+ $str =~ s/\"/\\\"/g;
+ $str =~ s/^\#[\s]*/i18n\(\"Do not translate the keyword between brackets \(e\.g\. ServerName, ServerAdmin, etc\.\)\",\"/;
+ $str =~ s/\n\#[\s]*/\\n\"\n\"/g;
+ $str =~ s/\n$/\\n\"\n\)\;\n\n/;
+ return $str;
+}
diff --git a/kdeprint/cups/cupsdconf2/cupsdconf.cpp b/kdeprint/cups/cupsdconf2/cupsdconf.cpp
new file mode 100644
index 000000000..4018ab2fb
--- /dev/null
+++ b/kdeprint/cups/cupsdconf2/cupsdconf.cpp
@@ -0,0 +1,884 @@
+/*
+ * This file is part of the KDE libraries
+ * Copyright (c) 2001 Michael Goffioul <[email protected]>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License version 2 as published by the Free Software Foundation.
+ *
+ * This library 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
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB. If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ **/
+
+#include <config.h>
+#include "cupsdconf.h"
+
+#include <qfile.h>
+#include <qregexp.h>
+#include <klocale.h>
+#include <kdebug.h>
+#include <kconfig.h>
+
+#include <stdlib.h>
+#include <cups/cups.h>
+#include <cups/ipp.h>
+#include <cups/language.h>
+
+QString findDir(const QStringList& list)
+{
+ for (QStringList::ConstIterator it=list.begin(); it!=list.end(); ++it)
+ if (QFile::exists(*it))
+ return *it;
+ // if nothing found, just use the first as default value
+ return list[0];
+}
+
+void splitSizeSpec(const QString& s, int& sz, int& suff)
+{
+ int p = s.find(QRegExp("\\D"));
+ sz = s.mid(0, p).toInt();
+ if (p != -1)
+ {
+ switch (s[p].latin1())
+ {
+ case 'k': suff = UNIT_KB; break;
+ default:
+ case 'm': suff = UNIT_MB; break;
+ case 'g': suff = UNIT_GB; break;
+ case 't': suff = UNIT_TILE; break;
+ }
+ }
+ else
+ suff = UNIT_MB;
+}
+
+CupsdConf::CupsdConf()
+{
+ // start by trying to find CUPS directories (useful later)
+ datadir_ = findDir(QStringList("/usr/share/cups")
+ << "/usr/local/share/cups"
+ << "/opt/share/cups"
+ << "/opt/local/share/cups");
+ documentdir_ = findDir(QStringList(datadir_+"/doc")
+ << datadir_.left(datadir_.length()-5)+"/doc/cups");
+ //fontpath_ << (datadir_+"/fonts");
+ requestdir_ = findDir(QStringList("/var/spool/cups")
+ << "/var/cups");
+ serverbin_ = findDir(QStringList("/usr/lib" KDELIBSUFF "/cups")
+ << "/usr/local/lib" KDELIBSUFF "/cups"
+ << "/opt/lib" KDELIBSUFF "/cups"
+ << "/opt/local/lib" KDELIBSUFF "/cups");
+ serverfiles_ = findDir(QStringList("/etc/cups")
+ << "/usr/local/etc/cups");
+ tmpfiles_ = requestdir_+"/tmp";
+
+ // other options
+ servername_ = QString::null;
+ serveradmin_ = QString::null;
+ classification_ = CLASS_NONE;
+ otherclassname_ = QString::null;
+ classoverride_ = false;
+ charset_ = "utf-8";
+ language_ = "en";
+ printcap_ = "/etc/printcap";
+ printcapformat_ = PRINTCAP_BSD;
+ remoteroot_ = "remroot";
+ systemgroup_ = "sys";
+ encryptcert_ = serverfiles_+"/ssl/server.crt";
+ encryptkey_ = serverfiles_+"/ssl/server.key";
+ hostnamelookup_ = HOSTNAME_OFF;
+ keepalive_ = true;
+ keepalivetimeout_ = 60;
+ maxclients_ = 100;
+ maxrequestsize_ = "0";
+ clienttimeout_ = 300;
+ // listenaddresses_
+ QString logdir = findDir(QStringList("/var/log/cups")
+ << "/var/spool/cups/log"
+ << "/var/cups/log");
+ accesslog_ = logdir+"/access_log";
+ errorlog_ = logdir+"/error_log";
+ pagelog_ = logdir+"/page_log";
+ maxlogsize_ = "1m";
+ loglevel_ = LOGLEVEL_INFO;
+ keepjobhistory_ = true;
+ keepjobfiles_ = false;
+ autopurgejobs_ = false;
+ maxjobs_ = 0;
+ maxjobsperprinter_ = 0;
+ maxjobsperuser_ = 0;
+ user_ = "lp";
+ group_ = "sys";
+ ripcache_ = "8m";
+ filterlimit_ = 0;
+ browsing_ = true;
+ browseprotocols_ << "CUPS";
+ browseport_ = ippPort();
+ browseinterval_ = 30;
+ browsetimeout_ = 300;
+ // browseaddresses_
+ browseorder_ = ORDER_ALLOW_DENY;
+ useimplicitclasses_ = true;
+ hideimplicitmembers_ = true;
+ useshortnames_ = true;
+ useanyclasses_ = false;
+
+ loadAvailableResources();
+}
+
+CupsdConf::~CupsdConf()
+{
+}
+
+bool CupsdConf::loadFromFile(const QString& filename)
+{
+ QFile f(filename);
+ if (!f.exists() || !f.open(IO_ReadOnly)) return false;
+ else
+ {
+ QTextStream t(&f);
+ QString line;
+ bool done(false), value(true);
+ while (!done && value)
+ {
+ line = t.readLine().simplifyWhiteSpace();
+ if (line.isEmpty())
+ {
+ if (t.atEnd()) done = true;
+ else continue;
+ }
+ else if (line[0] == '#') continue;
+ else if (line.left(9).lower() == "<location")
+ {
+ CupsLocation *location = new CupsLocation();
+ locations_.append(location);
+ if (!location->parseResource(line) || !parseLocation(location, t))
+ value = false;
+ // search corresponding resource
+ for (resources_.first();resources_.current();resources_.next())
+ if (resources_.current()->path_ == location->resourcename_)
+ location->resource_ = resources_.current();
+ }
+ else value = parseOption(line);
+ }
+ f.close();
+ return value;
+ }
+}
+
+bool CupsdConf::saveToFile(const QString& filename)
+{
+ QFile f(filename);
+ if (!f.open(IO_WriteOnly))
+ return false;
+ else
+ {
+ QTextStream t(&f);
+ t << comments_["header"] << endl;
+ t << "# Server" << endl << endl;
+
+ t << comments_["servername"] << endl;
+ if ( !servername_.isEmpty() )
+ t << "ServerName " << servername_ << endl;
+
+ t << endl << comments_["serveradmin"] << endl;
+ if ( !serveradmin_.isEmpty() )
+ t << "ServerAdmin " << serveradmin_ << endl;
+
+ t << endl << comments_["classification"] << endl;
+ t << "Classification ";
+ switch (classification_)
+ {
+ default:
+ case CLASS_NONE: t << "none"; break;
+ case CLASS_CLASSIFIED: t << "classified"; break;
+ case CLASS_CONFIDENTIAL: t << "confidential"; break;
+ case CLASS_SECRET: t << "secret"; break;
+ case CLASS_TOPSECRET: t << "topsecret"; break;
+ case CLASS_UNCLASSIFIED: t << "unclassified"; break;
+ case CLASS_OTHER: t << otherclassname_; break;
+ }
+ t << endl;
+
+ t << endl << comments_["classifyoverride"] << endl;
+ if (classification_ != CLASS_NONE) t << "ClassifyOverride " << (classoverride_ ? "Yes" : "No") << endl;
+
+ t << endl << comments_["defaultcharset"] << endl;
+ t << "DefaultCharset " << charset_.upper() << endl;
+
+ t << endl << comments_["defaultlanguage"] << endl;
+ t << "DefaultLanguage " << language_.lower() << endl;
+
+ t << endl << comments_["printcap"] << endl;
+ t << "Printcap " << printcap_ << endl;
+
+ t << endl << comments_["printcapformat"] << endl;
+ t << "PrintcapFormat " << (printcapformat_ == PRINTCAP_SOLARIS ? "Solaris" : "BSD") << endl;
+
+ t << endl << "# Security" << endl;
+ t << endl << comments_["remoteroot"] << endl;
+ t << "RemoteRoot " << remoteroot_ << endl;
+
+ t << endl << comments_["systemgroup"] << endl;
+ t << "SystemGroup " << systemgroup_ << endl;
+
+ t << endl << comments_["servercertificate"] << endl;
+ t << "ServerCertificate " << encryptcert_ << endl;
+
+ t << endl << comments_["serverkey"] << endl;
+ t << "ServerKey " << encryptkey_ << endl;
+
+ t << endl << comments_["locations"] << endl;
+ for (locations_.first(); locations_.current(); locations_.next())
+ {
+ CupsLocation *loc = locations_.current();
+ t << "<Location " << loc->resourcename_ << ">" << endl;
+ if (loc->authtype_ != AUTHTYPE_NONE)
+ {
+ t << "AuthType ";
+ switch (loc->authtype_)
+ {
+ case AUTHTYPE_BASIC: t << "Basic"; break;
+ case AUTHTYPE_DIGEST: t << "Digest"; break;
+ }
+ t << endl;
+ }
+ if (loc->authclass_ != AUTHCLASS_ANONYMOUS)
+ {
+ switch (loc->authclass_)
+ {
+ case AUTHCLASS_USER:
+ if (!loc->authname_.isEmpty())
+ t << "Require user " << loc->authname_ << endl;
+ else
+ t << "AuthClass User" << endl;
+ break;
+ case AUTHCLASS_GROUP:
+ if (!loc->authname_.isEmpty())
+ t << "Require group " << loc->authname_ << endl;
+ else
+ t << "AuthClass Group" << endl;
+ break;
+ case AUTHCLASS_SYSTEM:
+ t << "AuthClass System" << endl;
+ break;
+ }
+ }
+ t << "Encryption ";
+ switch (loc->encryption_)
+ {
+ case ENCRYPT_ALWAYS: t << "Always"; break;
+ case ENCRYPT_NEVER: t << "Never"; break;
+ case ENCRYPT_REQUIRED: t << "Required"; break;
+ default:
+ case ENCRYPT_IFREQUESTED: t << "IfRequested"; break;
+ }
+ t << endl;
+ t << "Satisfy " << (loc->satisfy_ == SATISFY_ALL ? "All" : "Any") << endl;
+ t << "Order " << (loc->order_ == ORDER_ALLOW_DENY ? "allow,deny" : "deny,allow") << endl;
+ for (QStringList::ConstIterator it=loc->addresses_.begin(); it!=loc->addresses_.end(); ++it)
+ t << *it << endl;
+ t << "</Location>" << endl;
+ }
+
+ t << endl << "# Network" << endl;
+ t << endl << comments_["hostnamelookups"] << endl;
+ t << "HostnameLookups ";
+ switch (hostnamelookup_)
+ {
+ default:
+ case HOSTNAME_OFF: t << "Off"; break;
+ case HOSTNAME_ON: t << "On"; break;
+ case HOSTNAME_DOUBLE: t << "Double"; break;
+ }
+ t << endl;
+
+ t << endl << comments_["keepalive"] << endl;
+ t << "KeepAlive " << (keepalive_ ? "On" : "Off") << endl;
+
+ t << endl << comments_["keepalivetimeout"] << endl;
+ t << "KeepAliveTimeout " << keepalivetimeout_ << endl;
+
+ t << endl << comments_["maxclients"] << endl;
+ t << "MaxClients " << maxclients_ << endl;
+
+ t << endl << comments_["maxrequestsize"] << endl;
+ t << "MaxRequestSize " << maxrequestsize_ << endl;
+
+ t << endl << comments_["timeout"] << endl;
+ t << "Timeout " << clienttimeout_ << endl;
+
+ t << endl << comments_["listen"] << endl;
+ for (QStringList::ConstIterator it=listenaddresses_.begin(); it!=listenaddresses_.end(); ++it)
+ t << *it << endl;
+
+ t << endl << "# Log" << endl;
+ t << endl << comments_["accesslog"] << endl;
+ t << "AccessLog " << accesslog_ << endl;
+
+ t << endl << comments_["errorlog"] << endl;
+ t << "ErrorLog " << errorlog_ << endl;
+
+ t << endl << comments_["pagelog"] << endl;
+ t << "PageLog " << pagelog_ << endl;
+
+ t << endl << comments_["maxlogsize"] << endl;
+ //t << "MaxLogSize " << maxlogsize_ << "m" << endl;
+ t << "MaxLogSize " << maxlogsize_ << endl;
+
+ t << endl << comments_["loglevel"] << endl;
+ t << "LogLevel ";
+ switch (loglevel_)
+ {
+ case LOGLEVEL_NONE: t << "none"; break;
+ default:
+ case LOGLEVEL_INFO: t << "info"; break;
+ case LOGLEVEL_ERROR: t << "error"; break;
+ case LOGLEVEL_WARN: t << "warn"; break;
+ case LOGLEVEL_DEBUG: t << "debug"; break;
+ case LOGLEVEL_DEBUG2: t << "debug2"; break;
+ }
+ t << endl;
+
+ t << endl << "# Jobs" << endl;
+ t << endl << comments_["preservejobhistory"] << endl;
+ t << "PreserveJobHistory " << (keepjobhistory_ ? "On" : "Off") << endl;
+
+ t << endl << comments_["preservejobfiles"] << endl;
+ if (keepjobhistory_) t << "PreserveJobFiles " << (keepjobfiles_ ? "On" : "Off") << endl;
+
+ t << endl << comments_["autopurgejobs"] << endl;
+ if (keepjobhistory_) t << "AutoPurgeJobs " << (autopurgejobs_ ? "Yes" : "No") << endl;
+
+ t << endl << comments_["maxjobs"] << endl;
+ t << "MaxJobs " << maxjobs_ << endl;
+
+ t << endl << comments_["maxjobsperprinter"] << endl;
+ t << "MaxJobsPerPrinter " << maxjobsperprinter_ << endl;
+
+ t << endl << comments_["maxjobsperuser"] << endl;
+ t << "MaxJobsPerUser " << maxjobsperuser_ << endl;
+
+ t << endl << "# Filter" << endl;
+ t << endl << comments_["user"] << endl;
+ t << "User " << user_ << endl;
+
+ t << endl << comments_["group"] << endl;
+ t << "Group " << group_ << endl;
+
+ t << endl << comments_["ripcache"] << endl;
+ t << "RIPCache " << ripcache_ << endl;
+
+ t << endl << comments_["filterlimit"] << endl;
+ t << "FilterLimit " << filterlimit_ << endl;
+
+ t << endl << "# Directories" << endl;
+ t << endl << comments_["datadir"] << endl;
+ t << "DataDir " << datadir_ << endl;
+
+ t << endl << comments_["documentroot"] << endl;
+ t << "DocumentRoot " << documentdir_ << endl;
+
+ t << endl << comments_["fontpath"] << endl;
+ for (QStringList::ConstIterator it=fontpath_.begin(); it!=fontpath_.end(); ++it)
+ t << "FontPath " << *it << endl;
+
+ t << endl << comments_["requestroot"] << endl;
+ t << "RequestRoot " << requestdir_ << endl;
+
+ t << endl << comments_["serverbin"] << endl;
+ t << "ServerBin " << serverbin_ << endl;
+
+ t << endl << comments_["serverroot"] << endl;
+ t << "ServerRoot " << serverfiles_ << endl;
+
+ t << endl << comments_["tempdir"] << endl;
+ t << "TempDir " << tmpfiles_ << endl;
+
+ t << endl << "# Browsing" << endl;
+ t << endl << comments_["browsing"] << endl;
+ t << "Browsing " << (browsing_ ? "On" : "Off") << endl;
+
+ t << endl << comments_["browseprotocols"] << endl;
+ if (browsing_)
+ {
+ t << "BrowseProtocols ";
+ for (QStringList::ConstIterator it=browseprotocols_.begin(); it!=browseprotocols_.end(); ++it)
+ t << (*it).upper() << " ";
+ t << endl;
+ }
+
+ t << endl << comments_["browseport"] << endl;
+ if (browsing_) t << "BrowsePort " << browseport_ << endl;
+
+ t << endl << comments_["browseinterval"] << endl;
+ if (browsing_) t << "BrowseInterval " << browseinterval_ << endl;
+
+ t << endl << comments_["browsetimeout"] << endl;
+ if (browsing_) t << "BrowseTimeout " << browsetimeout_ << endl;
+
+ t << endl << comments_["browseaddress"] << endl;
+ if (browsing_)
+ for (QStringList::ConstIterator it=browseaddresses_.begin(); it!=browseaddresses_.end(); ++it)
+ if ((*it).startsWith("Send"))
+ t << "BrowseAddress " << (*it).mid(5) << endl;
+ else
+ t << "Browse" << (*it) << endl;
+
+ t << endl << comments_["browseorder"] << endl;
+ if (browsing_) t << "BrowseOrder " << (browseorder_ == ORDER_ALLOW_DENY ? "allow,deny" : "deny,allow") << endl;
+
+ t << endl << comments_["implicitclasses"] << endl;
+ if (browsing_) t << "ImplicitClasses " << (useimplicitclasses_ ? "On" : "Off") << endl;
+
+ t << endl << comments_["implicitanyclasses"] << endl;
+ if (browsing_) t << "ImplicitAnyClasses " << (useanyclasses_ ? "On" : "Off") << endl;
+
+ t << endl << comments_["hideimplicitmembers"] << endl;
+ if (browsing_) t << "HideImplicitMembers " << (hideimplicitmembers_ ? "Yes" : "No") << endl;
+
+ t << endl << comments_["browseshortnames"] << endl;
+ if (browsing_) t << "BrowseShortNames " << (useshortnames_ ? "Yes" : "No") << endl;
+
+ t << endl << "# Unknown" << endl;
+ for (QValueList< QPair<QString,QString> >::ConstIterator it=unknown_.begin(); it!=unknown_.end(); ++it)
+ t << (*it).first << " " << (*it).second << endl;
+
+ return true;
+ }
+}
+
+bool CupsdConf::parseLocation(CupsLocation *location, QTextStream& file)
+{
+ QString line;
+ bool done(false);
+ bool value(true);
+ while (!done && value)
+ {
+ line = file.readLine().simplifyWhiteSpace();
+ if (line.isEmpty())
+ {
+ if (file.atEnd())
+ {
+ value = false;
+ done = true;
+ }
+ else continue;
+ }
+ else if (line[0] == '#') continue;
+ else if (line.lower() == "</location>") done = true;
+ else value = location->parseOption(line);
+ }
+ return value;
+}
+
+bool CupsdConf::parseOption(const QString& line)
+{
+ int p(-1);
+ QString keyword, value, l(line.simplifyWhiteSpace());
+
+ if ((p=l.find(' ')) != -1)
+ {
+ keyword = l.left(p).lower();
+ value = l.mid(p+1);
+ }
+ else
+ {
+ keyword = l.lower();
+ }
+
+ //kdDebug() << "cupsd.conf keyword=" << keyword << endl;
+ if (keyword == "accesslog") accesslog_ = value;
+ else if (keyword == "autopurgejobs") autopurgejobs_ = (value.lower() == "yes");
+ else if (keyword == "browseaddress") browseaddresses_.append("Send "+value);
+ else if (keyword == "browseallow") browseaddresses_.append("Allow "+value);
+ else if (keyword == "browsedeny") browseaddresses_.append("Deny "+value);
+ else if (keyword == "browseinterval") browseinterval_ = value.toInt();
+ else if (keyword == "browseorder") browseorder_ = (value.lower() == "deny,allow" ? ORDER_DENY_ALLOW : ORDER_ALLOW_DENY);
+ else if (keyword == "browsepoll") browseaddresses_.append("Poll "+value);
+ else if (keyword == "browseport") browseport_ = value.toInt();
+ else if (keyword == "browseprotocols")
+ {
+ browseprotocols_.clear();
+ QStringList prots = QStringList::split(QRegExp("\\s"), value, false);
+ if (prots.find("all") != prots.end())
+ browseprotocols_ << "CUPS" << "SLP";
+ else
+ for (QStringList::ConstIterator it=prots.begin(); it!=prots.end(); ++it)
+ browseprotocols_ << (*it).upper();
+ }
+ else if (keyword == "browserelay") browseaddresses_.append("Relay "+value);
+ else if (keyword == "browseshortnames") useshortnames_ = (value.lower() != "no");
+ else if (keyword == "browsetimeout") browsetimeout_ = value.toInt();
+ else if (keyword == "browsing") browsing_ = (value.lower() != "off");
+ else if (keyword == "classification")
+ {
+ QString cl = value.lower();
+ if (cl == "none") classification_ = CLASS_NONE;
+ else if (cl == "classified") classification_ = CLASS_CLASSIFIED;
+ else if (cl == "confidential") classification_ = CLASS_CONFIDENTIAL;
+ else if (cl == "secret") classification_ = CLASS_SECRET;
+ else if (cl == "topsecret") classification_ = CLASS_TOPSECRET;
+ else if (cl == "unclassified") classification_ = CLASS_UNCLASSIFIED;
+ else
+ {
+ classification_ = CLASS_OTHER;
+ otherclassname_ = cl;
+ }
+ }
+ else if (keyword == "classifyoverride") classoverride_ = (value.lower() == "yes");
+ else if (keyword == "datadir") datadir_ = value;
+ else if (keyword == "defaultcharset") charset_ = value;
+ else if (keyword == "defaultlanguage") language_ = value;
+ else if (keyword == "documentroot") documentdir_ = value;
+ else if (keyword == "errorlog") errorlog_ = value;
+ else if (keyword == "filterlimit") filterlimit_ = value.toInt();
+ else if (keyword == "fontpath") fontpath_ += QStringList::split(':', value, false);
+ else if (keyword == "group") group_ = value;
+ else if (keyword == "hideimplicitmembers") hideimplicitmembers_ = (value.lower() != "no");
+ else if (keyword == "hostnamelookups")
+ {
+ QString h = value.lower();
+ if (h == "on") hostnamelookup_ = HOSTNAME_ON;
+ else if (h == "double") hostnamelookup_ = HOSTNAME_DOUBLE;
+ else hostnamelookup_ = HOSTNAME_OFF;
+ }
+ else if (keyword == "implicitclasses") useimplicitclasses_ = (value.lower() != "off");
+ else if (keyword == "implicitanyclasses") useanyclasses_ = (value.lower() == "on");
+ else if (keyword == "keepalive") keepalive_ = (value.lower() != "off");
+ else if (keyword == "keepalivetimeout") keepalivetimeout_ = value.toInt();
+ else if (keyword == "listen") listenaddresses_.append("Listen "+value);
+ else if (keyword == "loglevel")
+ {
+ QString ll = value.lower();
+ if (ll == "none") loglevel_ = LOGLEVEL_NONE;
+ else if (ll == "error") loglevel_ = LOGLEVEL_ERROR;
+ else if (ll == "warn") loglevel_ = LOGLEVEL_WARN;
+ else if (ll == "info") loglevel_ = LOGLEVEL_INFO;
+ else if (ll == "debug") loglevel_ = LOGLEVEL_DEBUG;
+ else if (ll == "debug2") loglevel_ = LOGLEVEL_DEBUG2;
+ }
+ else if (keyword == "maxclients") maxclients_ = value.toInt();
+ else if (keyword == "maxjobs") maxjobs_ = value.toInt();
+ else if (keyword == "maxjobsperprinter") maxjobsperprinter_ = value.toInt();
+ else if (keyword == "maxjobsperuser") maxjobsperuser_ = value.toInt();
+ else if (keyword == "maxrequestsize") maxrequestsize_ = value;
+ else if (keyword == "maxlogsize") maxlogsize_ = value;
+ /*{
+ // FIXME: support for suffixes
+ int suffix;
+ splitSizeSpec( value, maxlogsize_, suffix );
+ }*/
+ else if (keyword == "pagelog") pagelog_ = value;
+ else if (keyword == "port") listenaddresses_.append("Listen *:"+value);
+ else if (keyword == "preservejobhistory") keepjobhistory_ = (value != "off");
+ else if (keyword == "preservejobfiles") keepjobfiles_ = (value == "on");
+ else if (keyword == "printcap") printcap_ = value;
+ else if (keyword == "printcapformat") printcapformat_ = (value.lower() == "solaris" ? PRINTCAP_SOLARIS : PRINTCAP_BSD);
+ else if (keyword == "requestroot") requestdir_ = value;
+ else if (keyword == "remoteroot") remoteroot_ = value;
+ else if (keyword == "ripcache") ripcache_ = value;
+ else if (keyword == "serveradmin") serveradmin_ = value;
+ else if (keyword == "serverbin") serverbin_ = value;
+ else if (keyword == "servercertificate") encryptcert_ = value;
+ else if (keyword == "serverkey") encryptkey_ = value;
+ else if (keyword == "servername") servername_ = value;
+ else if (keyword == "serverroot") serverfiles_ = value;
+ else if (keyword == "ssllisten") listenaddresses_.append("SSLListen "+value);
+ else if (keyword == "sslport") listenaddresses_.append("SSLListen *:"+value);
+ else if (keyword == "systemgroup") systemgroup_ = value;
+ else if (keyword == "tempdir") tmpfiles_ = value;
+ else if (keyword == "timeout") clienttimeout_ = value.toInt();
+ else if (keyword == "user") user_ = value;
+ else
+ {
+ // unrecognized option
+ unknown_ << QPair<QString,QString>(keyword, value);
+ }
+ return true;
+}
+
+bool CupsdConf::loadAvailableResources()
+{
+ KConfig conf("kdeprintrc");
+ conf.setGroup("CUPS");
+ QString host = conf.readEntry("Host",cupsServer());
+ int port = conf.readNumEntry("Port",ippPort());
+ http_t *http_ = httpConnect(host.local8Bit(),port);
+
+ resources_.clear();
+ // standard resources
+ resources_.append(new CupsResource("/"));
+ resources_.append(new CupsResource("/admin"));
+ resources_.append(new CupsResource("/printers"));
+ resources_.append(new CupsResource("/classes"));
+ resources_.append(new CupsResource("/jobs"));
+
+ if (!http_)
+ return false;
+
+ // printer resources
+ ipp_t *request_ = ippNew();
+ cups_lang_t* lang = cupsLangDefault();
+ ippAddString(request_, IPP_TAG_OPERATION, IPP_TAG_CHARSET, "attributes-charset", NULL, cupsLangEncoding(lang));
+ ippAddString(request_, IPP_TAG_OPERATION, IPP_TAG_LANGUAGE, "attributes-natural-language", NULL, lang->language);
+ request_->request.op.operation_id = CUPS_GET_PRINTERS;
+ request_ = cupsDoRequest(http_, request_, "/printers/");
+ if (request_)
+ {
+ QString name;
+ int type(0);
+ ipp_attribute_t *attr = request_->attrs;
+ while (attr)
+ {
+ // check new printer (keep only local non-implicit printers)
+ if (!attr->name)
+ {
+ if (!(type & CUPS_PRINTER_REMOTE) && !(type & CUPS_PRINTER_IMPLICIT) && !name.isEmpty())
+ resources_.append(new CupsResource("/printers/"+name));
+ name = "";
+ type = 0;
+ }
+ else if (strcmp(attr->name, "printer-name") == 0) name = attr->values[0].string.text;
+ else if (strcmp(attr->name, "printer-type") == 0) type = attr->values[0].integer;
+ attr = attr->next;
+ }
+ if (!(type & CUPS_PRINTER_REMOTE) && !(type & CUPS_PRINTER_IMPLICIT) && !name.isEmpty())
+ resources_.append(new CupsResource("/printers/"+name));
+ ippDelete(request_);
+ }
+ // class resources
+ request_ = ippNew();
+ ippAddString(request_, IPP_TAG_OPERATION, IPP_TAG_CHARSET, "attributes-charset", NULL, cupsLangEncoding(lang));
+ ippAddString(request_, IPP_TAG_OPERATION, IPP_TAG_LANGUAGE, "attributes-natural-language", NULL, lang->language);
+ request_->request.op.operation_id = CUPS_GET_CLASSES;
+ request_ = cupsDoRequest(http_, request_, "/classes/");
+ if (request_)
+ {
+ QString name;
+ int type(0);
+ ipp_attribute_t *attr = request_->attrs;
+ while (attr)
+ {
+ // check new class (keep only local classes)
+ if (!attr->name)
+ {
+ if (!(type & CUPS_PRINTER_REMOTE) && !name.isEmpty())
+ resources_.append(new CupsResource("/classes/"+name));
+ name = "";
+ type = 0;
+ }
+ else if (strcmp(attr->name, "printer-name") == 0) name = attr->values[0].string.text;
+ else if (strcmp(attr->name, "printer-type") == 0) type = attr->values[0].integer;
+ attr = attr->next;
+ }
+ if (!(type & CUPS_PRINTER_REMOTE) && !name.isEmpty())
+ resources_.append(new CupsResource("/classes/"+name));
+ ippDelete(request_);
+ }
+ httpClose(http_);
+ return true;
+}
+
+//------------------------------------------------------------------------------------------------
+
+CupsLocation::CupsLocation()
+{
+ resource_ = 0;
+ resourcename_ = "";
+ authtype_ = AUTHTYPE_NONE;
+ authclass_ = AUTHCLASS_ANONYMOUS;
+ authname_ = QString::null;
+ encryption_ = ENCRYPT_IFREQUESTED;
+ satisfy_ = SATISFY_ALL;
+ order_ = ORDER_ALLOW_DENY;
+ // addresses_
+}
+
+CupsLocation::CupsLocation(const CupsLocation& loc)
+: resource_(loc.resource_),
+ resourcename_(loc.resourcename_),
+ authtype_(loc.authtype_),
+ authclass_(loc.authclass_),
+ authname_(loc.authname_),
+ encryption_(loc.encryption_),
+ satisfy_(loc.satisfy_),
+ order_(loc.order_),
+ addresses_(loc.addresses_)
+{
+}
+
+bool CupsLocation::parseResource(const QString& line)
+{
+ QString str = line.simplifyWhiteSpace();
+ int p1 = line.find(' '), p2 = line.find('>');
+ if (p1 != -1 && p2 != -1)
+ {
+ resourcename_ = str.mid(p1+1,p2-p1-1);
+ return true;
+ }
+ else return false;
+}
+
+bool CupsLocation::parseOption(const QString& line)
+{
+ int p(-1);
+ QString keyword, value, l(line.simplifyWhiteSpace());
+
+ if ((p=l.find(' ')) != -1)
+ {
+ keyword = l.left(p).lower();
+ value = l.mid(p+1);
+ }
+ else
+ {
+ keyword = l.lower();
+ }
+
+ if (keyword == "authtype")
+ {
+ QString a = value.lower();
+ if (a == "basic") authtype_ = AUTHTYPE_BASIC;
+ else if (a == "digest") authtype_ = AUTHTYPE_DIGEST;
+ else authtype_ = AUTHTYPE_NONE;
+ }
+ else if (keyword == "authclass")
+ {
+ QString a = value.lower();
+ if (a == "user") authclass_ = AUTHCLASS_USER;
+ else if (a == "system") authclass_ = AUTHCLASS_SYSTEM;
+ else if (a == "group") authclass_ = AUTHCLASS_GROUP;
+ else authclass_ = AUTHCLASS_ANONYMOUS;
+ }
+ else if (keyword == "authgroupname") authname_ = value;
+ else if (keyword == "require")
+ {
+ int p = value.find(' ');
+ if (p != -1)
+ {
+ authname_ = value.mid(p+1);
+ QString cl = value.left(p).lower();
+ if (cl == "user")
+ authclass_ = AUTHCLASS_USER;
+ else if (cl == "group")
+ authclass_ = AUTHCLASS_GROUP;
+ }
+ }
+ else if (keyword == "allow") addresses_.append("Allow "+value);
+ else if (keyword == "deny") addresses_.append("Deny "+value);
+ else if (keyword == "order") order_ = (value.lower() == "deny,allow" ? ORDER_DENY_ALLOW : ORDER_ALLOW_DENY);
+ else if (keyword == "encryption")
+ {
+ QString e = value.lower();
+ if (e == "always") encryption_ = ENCRYPT_ALWAYS;
+ else if (e == "never") encryption_ = ENCRYPT_NEVER;
+ else if (e == "required") encryption_ = ENCRYPT_REQUIRED;
+ else encryption_ = ENCRYPT_IFREQUESTED;
+ }
+ else if (keyword == "satisfy") satisfy_ = (value.lower() == "any" ? SATISFY_ANY : SATISFY_ALL);
+ else return false;
+ return true;
+}
+
+//------------------------------------------------------------------------------------------------
+
+CupsResource::CupsResource()
+{
+ type_ = RESOURCE_GLOBAL;
+}
+
+CupsResource::CupsResource(const QString& path)
+{
+ setPath(path);
+}
+
+void CupsResource::setPath(const QString& path)
+{
+ path_ = path;
+ type_ = typeFromPath(path_);
+ text_ = pathToText(path_);
+}
+
+int CupsResource::typeFromText(const QString& text)
+{
+ if (text == i18n("Base", "Root") || text == i18n("All printers") || text == i18n("All classes") || text == i18n("Print jobs")) return RESOURCE_GLOBAL;
+ else if (text == i18n("Administration")) return RESOURCE_ADMIN;
+ else if (text.find(i18n("Class")) == 0) return RESOURCE_CLASS;
+ else if (text.find(i18n("Printer")) == 0) return RESOURCE_PRINTER;
+ else return RESOURCE_PRINTER;
+}
+
+int CupsResource::typeFromPath(const QString& path)
+{
+ if (path == "/admin") return RESOURCE_ADMIN;
+ else if (path == "/printers" || path == "/classes" || path == "/" || path == "/jobs") return RESOURCE_GLOBAL;
+ else if (path.left(9) == "/printers") return RESOURCE_PRINTER;
+ else if (path.left(8) == "/classes") return RESOURCE_CLASS;
+ else return RESOURCE_GLOBAL;
+}
+
+QString CupsResource::textToPath(const QString& text)
+{
+ QString path("/");
+ if (text == i18n("Administration")) path = "/admin";
+ else if (text == i18n("All printers")) path = "/printers";
+ else if (text == i18n("All classes")) path = "/classes";
+ else if (text == i18n("Print jobs")) path = "/jobs";
+ else if (text == i18n("Base", "Root")) path = "/";
+ else if (text.find(i18n("Printer")) == 0)
+ {
+ path = "/printers/";
+ path.append(text.right(text.length()-i18n("Printer").length()-1));
+ }
+ else if (text.find(i18n("Class")) == 0)
+ {
+ path = "/classes/";
+ path.append(text.right(text.length()-i18n("Class").length()-1));
+ }
+ return path;
+}
+
+QString CupsResource::pathToText(const QString& path)
+{
+ QString text(i18n("Base", "Root"));
+ if (path == "/admin") text = i18n("Administration");
+ else if (path == "/printers") text = i18n("All printers");
+ else if (path == "/classes") text = i18n("All classes");
+ else if (path == "/") text = i18n("Root");
+ else if (path == "/jobs") text = i18n("Print jobs");
+ else if (path.find("/printers/") == 0)
+ {
+ text = i18n("Printer");
+ text.append(" ");
+ text.append(path.right(path.length()-10));
+ }
+ else if (path.find("/classes/") == 0)
+ {
+ text = i18n("Class");
+ text.append(" ");
+ text.append(path.right(path.length()-9));
+ }
+ return text;
+}
+
+QString CupsResource::typeToIconName(int type)
+{
+ switch (type)
+ {
+ case RESOURCE_ADMIN:
+ case RESOURCE_GLOBAL:
+ return QString("folder");
+ case RESOURCE_PRINTER:
+ return QString("kdeprint_printer");
+ case RESOURCE_CLASS:
+ return QString("kdeprint_printer_class");
+ }
+ return QString("folder");
+}
diff --git a/kdeprint/cups/cupsdconf2/cupsdconf.h b/kdeprint/cups/cupsdconf2/cupsdconf.h
new file mode 100644
index 000000000..3c53c5390
--- /dev/null
+++ b/kdeprint/cups/cupsdconf2/cupsdconf.h
@@ -0,0 +1,181 @@
+/*
+ * This file is part of the KDE libraries
+ * Copyright (c) 2001 Michael Goffioul <[email protected]>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License version 2 as published by the Free Software Foundation.
+ *
+ * This library 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
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB. If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ **/
+
+#ifndef CUPSDCONF_H
+#define CUPSDCONF_H
+
+#include <qstring.h>
+#include <qstringlist.h>
+#include <qptrlist.h>
+#include <qtextstream.h>
+#include <qpair.h>
+
+#include "cupsdcomment.h"
+
+enum LogLevelType { LOGLEVEL_DEBUG2 = 0, LOGLEVEL_DEBUG, LOGLEVEL_INFO, LOGLEVEL_WARN, LOGLEVEL_ERROR, LOGLEVEL_NONE };
+enum OrderType { ORDER_ALLOW_DENY = 0, ORDER_DENY_ALLOW };
+enum AuthTypeType { AUTHTYPE_NONE = 0, AUTHTYPE_BASIC, AUTHTYPE_DIGEST };
+enum AuthClassType { AUTHCLASS_ANONYMOUS = 0, AUTHCLASS_USER, AUTHCLASS_SYSTEM, AUTHCLASS_GROUP };
+enum EncryptionType { ENCRYPT_ALWAYS = 0, ENCRYPT_NEVER, ENCRYPT_REQUIRED, ENCRYPT_IFREQUESTED };
+enum BrowseProtocolType { BROWSE_ALL = 0, BROWSE_CUPS, BROWSE_SLP };
+enum PrintcapFormatType { PRINTCAP_BSD = 0, PRINTCAP_SOLARIS };
+enum HostnameLookupType { HOSTNAME_OFF = 0, HOSTNAME_ON, HOSTNAME_DOUBLE };
+enum ClassificationType { CLASS_NONE = 0, CLASS_CLASSIFIED, CLASS_CONFIDENTIAL, CLASS_SECRET, CLASS_TOPSECRET, CLASS_UNCLASSIFIED, CLASS_OTHER };
+enum SatisfyType { SATISFY_ALL = 0, SATISFY_ANY };
+enum UnitType { UNIT_KB = 0, UNIT_MB, UNIT_GB, UNIT_TILE };
+
+struct CupsLocation;
+struct CupsResource;
+enum ResourceType { RESOURCE_GLOBAL, RESOURCE_PRINTER, RESOURCE_CLASS, RESOURCE_ADMIN };
+
+struct CupsdConf
+{
+// functions member
+ CupsdConf();
+ ~CupsdConf();
+
+ bool loadFromFile(const QString& filename);
+ bool saveToFile(const QString& filename);
+ bool parseOption(const QString& line);
+ bool parseLocation(CupsLocation *location, QTextStream& file);
+
+ bool loadAvailableResources();
+
+ static CupsdConf* get();
+ static void release();
+
+// data members
+ static CupsdConf *unique_;
+
+ // Server
+ QString servername_;
+ QString serveradmin_;
+ int classification_;
+ QString otherclassname_;
+ bool classoverride_;
+ QString charset_;
+ QString language_;
+ QString printcap_;
+ int printcapformat_;
+
+ // Security
+ QString remoteroot_;
+ QString systemgroup_;
+ QString encryptcert_;
+ QString encryptkey_;
+ QPtrList<CupsLocation> locations_;
+ QPtrList<CupsResource> resources_;
+
+ // Network
+ int hostnamelookup_;
+ bool keepalive_;
+ int keepalivetimeout_;
+ int maxclients_;
+ QString maxrequestsize_;
+ int clienttimeout_;
+ QStringList listenaddresses_;
+
+ // Log
+ QString accesslog_;
+ QString errorlog_;
+ QString pagelog_;
+ QString maxlogsize_;
+ int loglevel_;
+
+ // Jobs
+ bool keepjobhistory_;
+ bool keepjobfiles_;
+ bool autopurgejobs_;
+ int maxjobs_;
+ int maxjobsperprinter_;
+ int maxjobsperuser_;
+
+ // Filter
+ QString user_;
+ QString group_;
+ QString ripcache_;
+ int filterlimit_;
+
+ // Directories
+ QString datadir_;
+ QString documentdir_;
+ QStringList fontpath_;
+ QString requestdir_;
+ QString serverbin_;
+ QString serverfiles_;
+ QString tmpfiles_;
+
+ // Browsing
+ bool browsing_;
+ QStringList browseprotocols_;
+ int browseport_;
+ int browseinterval_;
+ int browsetimeout_;
+ QStringList browseaddresses_;
+ int browseorder_;
+ bool useimplicitclasses_;
+ bool hideimplicitmembers_;
+ bool useshortnames_;
+ bool useanyclasses_;
+
+ // cupsd.conf file comments
+ CupsdComment comments_;
+
+ // unrecognized options
+ QValueList< QPair<QString,QString> > unknown_;
+};
+
+struct CupsLocation
+{
+ CupsLocation();
+ CupsLocation(const CupsLocation& loc);
+
+ bool parseOption(const QString& line);
+ bool parseResource(const QString& line);
+
+ CupsResource *resource_;
+ QString resourcename_;
+ int authtype_;
+ int authclass_;
+ QString authname_;
+ int encryption_;
+ int satisfy_;
+ int order_;
+ QStringList addresses_;
+};
+
+struct CupsResource
+{
+ CupsResource();
+ CupsResource(const QString& path);
+
+ void setPath(const QString& path);
+
+ int type_;
+ QString path_;
+ QString text_;
+
+ static QString textToPath(const QString& text);
+ static QString pathToText(const QString& path);
+ static int typeFromPath(const QString& path);
+ static int typeFromText(const QString& text);
+ static QString typeToIconName(int type);
+};
+
+#endif
diff --git a/kdeprint/cups/cupsdconf2/cupsddialog.cpp b/kdeprint/cups/cupsdconf2/cupsddialog.cpp
new file mode 100644
index 000000000..a70b5b59e
--- /dev/null
+++ b/kdeprint/cups/cupsdconf2/cupsddialog.cpp
@@ -0,0 +1,360 @@
+/*
+ * This file is part of the KDE libraries
+ * Copyright (c) 2001 Michael Goffioul <[email protected]>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License version 2 as published by the Free Software Foundation.
+ *
+ * This library 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
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB. If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ **/
+
+#include "cupsddialog.h"
+
+#include "cupsdpage.h"
+#include "cupsdconf.h"
+#include "cupsdsplash.h"
+#include "cupsdserverpage.h"
+#include "cupsdlogpage.h"
+#include "cupsdjobspage.h"
+#include "cupsdfilterpage.h"
+#include "cupsddirpage.h"
+#include "cupsdnetworkpage.h"
+#include "cupsdbrowsingpage.h"
+#include "cupsdsecuritypage.h"
+
+#include <qdir.h>
+#include <qvbox.h>
+#include <kmessagebox.h>
+#include <klocale.h>
+#include <qfile.h>
+#include <qfileinfo.h>
+#include <kglobal.h>
+#include <kiconloader.h>
+#include <qstringlist.h>
+#include <qwhatsthis.h>
+#include <kio/passdlg.h>
+#include <kguiitem.h>
+#include <kprocess.h>
+
+#include <signal.h>
+#include <cups/cups.h>
+
+static bool dynamically_loaded = false;
+static QString pass_string;
+
+extern "C"
+{
+#include "cups-util.h"
+ KDEPRINT_EXPORT bool restartServer(QString& msg)
+ {
+ return CupsdDialog::restartServer(msg);
+ }
+ KDEPRINT_EXPORT bool configureServer(QWidget *parent, QString& msg)
+ {
+ dynamically_loaded = true;
+ bool result = CupsdDialog::configure(QString::null, parent, &msg);
+ dynamically_loaded = false;
+ return result;
+ }
+}
+
+int getServerPid()
+{
+ QDir dir("/proc",QString::null,QDir::Name,QDir::Dirs);
+ for (uint i=0;i<dir.count();i++)
+ {
+ if (dir[i] == "." || dir[i] == ".." || dir[i] == "self") continue;
+ QFile f("/proc/" + dir[i] + "/cmdline");
+ if (f.exists() && f.open(IO_ReadOnly))
+ {
+ QTextStream t(&f);
+ QString line;
+ t >> line;
+ f.close();
+ if (line.right(5) == "cupsd" ||
+ line.right(6).left(5) == "cupsd") // second condition for 2.4.x kernels
+ // which add a null byte at the end
+ return dir[i].toInt();
+ }
+ }
+ return (-1);
+}
+
+const char* getPassword(const char*)
+{
+ QString user(cupsUser());
+ QString pass;
+
+ if (KIO::PasswordDialog::getNameAndPassword(user, pass, NULL) == QDialog::Accepted)
+ {
+ cupsSetUser(user.latin1());
+ pass_string = pass;
+ if (pass_string.isEmpty())
+ return "";
+ else
+ return pass_string.latin1();
+ }
+ else
+ return NULL;
+}
+
+//---------------------------------------------------
+
+CupsdDialog::CupsdDialog(QWidget *parent, const char *name)
+ : KDialogBase(IconList, "", Ok|Cancel|User1, Ok, parent, name, true, true, KGuiItem(i18n("Short Help"), "help"))
+{
+ KGlobal::iconLoader()->addAppDir("kdeprint");
+ KGlobal::locale()->insertCatalogue("cupsdconf");
+
+ setShowIconsInTreeList(true);
+ setRootIsDecorated(false);
+
+ pagelist_.setAutoDelete(false);
+ filename_ = "";
+ conf_ = 0;
+ constructDialog();
+
+ setCaption(i18n("CUPS Server Configuration"));
+
+ //resize(500, 400);
+}
+
+CupsdDialog::~CupsdDialog()
+{
+ delete conf_;
+}
+
+void CupsdDialog::addConfPage(CupsdPage *page)
+{
+ QPixmap icon = KGlobal::instance()->iconLoader()->loadIcon(
+ page->pixmap(),
+ KIcon::NoGroup,
+ KIcon::SizeMedium
+ );
+
+ QVBox *box = addVBoxPage(page->pageLabel(), page->header(), icon);
+ page->reparent(box, QPoint(0,0));
+ pagelist_.append(page);
+}
+
+void CupsdDialog::constructDialog()
+{
+ addConfPage(new CupsdSplash(0));
+ addConfPage(new CupsdServerPage(0));
+ addConfPage(new CupsdNetworkPage(0));
+ addConfPage(new CupsdSecurityPage(0));
+ addConfPage(new CupsdLogPage(0));
+ addConfPage(new CupsdJobsPage(0));
+ addConfPage(new CupsdFilterPage(0));
+ addConfPage(new CupsdDirPage(0));
+ addConfPage(new CupsdBrowsingPage(0));
+
+ conf_ = new CupsdConf();
+ for (pagelist_.first();pagelist_.current();pagelist_.next())
+ {
+ pagelist_.current()->setInfos(conf_);
+ }
+}
+
+bool CupsdDialog::setConfigFile(const QString& filename)
+{
+ filename_ = filename;
+ if (!conf_->loadFromFile(filename_))
+ {
+ KMessageBox::error(this, i18n("Error while loading configuration file!"), i18n("CUPS Configuration Error"));
+ return false;
+ }
+ if (conf_->unknown_.count() > 0)
+ {
+ // there were some unknown options, warn the user
+ QString msg;
+ for (QValueList< QPair<QString,QString> >::ConstIterator it=conf_->unknown_.begin(); it!=conf_->unknown_.end(); ++it)
+ msg += ((*it).first + " = " + (*it).second + "<br>");
+ msg.prepend("<p>" + i18n("Some options were not recognized by this configuration tool. "
+ "They will be left untouched and you won't be able to change them.") + "</p>");
+ KMessageBox::sorry(this, msg, i18n("Unrecognized Options"));
+ }
+ bool ok(true);
+ QString msg;
+ for (pagelist_.first();pagelist_.current() && ok;pagelist_.next())
+ ok = pagelist_.current()->loadConfig(conf_, msg);
+ if (!ok)
+ {
+ KMessageBox::error(this, msg.prepend("<qt>").append("</qt>"), i18n("CUPS Configuration Error"));
+ return false;
+ }
+ return true;
+}
+
+bool CupsdDialog::restartServer(QString& msg)
+{
+ int serverPid = getServerPid();
+ msg.truncate(0);
+ if (serverPid <= 0)
+ {
+ msg = i18n("Unable to find a running CUPS server");
+ }
+ else
+ {
+ bool success = false;
+ if (getuid() == 0 )
+ success = (::kill(serverPid, SIGHUP) == 0);
+ else
+ {
+ KProcess proc;
+ proc << "kdesu" << "-c" << "kill -SIGHUP " + QString::number( serverPid );
+ success = proc.start( KProcess::Block ) && proc.normalExit();
+ }
+ if( !success )
+ msg = i18n("Unable to restart CUPS server (pid = %1)").arg(serverPid);
+ }
+ return (msg.isEmpty());
+}
+
+bool CupsdDialog::configure(const QString& filename, QWidget *parent, QString *msg)
+{
+ bool needUpload(false);
+ QString errormsg;
+ bool result = true;
+
+ // init password dialog if needed
+ if (!dynamically_loaded)
+ cupsSetPasswordCB(getPassword);
+
+ // load config file from server
+ QString fn(filename);
+ if (fn.isEmpty())
+ {
+ fn = cupsGetConf();
+ if (fn.isEmpty())
+ errormsg = i18n("Unable to retrieve configuration file from the CUPS server. "
+ "You probably don't have the access permissions to perform this operation.");
+ else needUpload = true;
+ }
+
+ // check read state (only if needed)
+ if (!fn.isEmpty())
+ {
+ QFileInfo fi(fn);
+ if (!fi.exists() || !fi.isReadable() || !fi.isWritable())
+ errormsg = i18n("Internal error: file '%1' not readable/writable!").arg(fn);
+ // check file size
+ if (fi.size() == 0)
+ errormsg = i18n("Internal error: empty file '%1'!").arg(fn);
+ }
+
+ if (!errormsg.isEmpty())
+ {
+ if ( !dynamically_loaded )
+ KMessageBox::error(parent, errormsg.prepend("<qt>").append("</qt>"), i18n("CUPS Configuration Error"));
+ result = false;
+ }
+ else
+ {
+ KGlobal::locale()->insertCatalogue("cupsdconf"); // Must be before dialog is created to translate "Short Help"
+ CupsdDialog dlg(parent);
+ if (dlg.setConfigFile(fn) && dlg.exec())
+ {
+ QCString encodedFn = QFile::encodeName(fn);
+ if (!needUpload)
+ KMessageBox::information(parent,
+ i18n("The config file has not been uploaded to the "
+ "CUPS server. The daemon will not be restarted."));
+ else if (!cupsPutConf(encodedFn.data()))
+ {
+ errormsg = i18n("Unable to upload the configuration file to CUPS server. "
+ "You probably don't have the access permissions to perform this operation.");
+ if ( !dynamically_loaded )
+ KMessageBox::error(parent, errormsg, i18n("CUPS configuration error"));
+ result = false;
+ }
+ }
+
+ }
+ if (needUpload)
+ QFile::remove(fn);
+
+ if ( msg )
+ *msg = errormsg;
+ return result;
+}
+
+void CupsdDialog::slotOk()
+{
+ if (conf_ && !filename_.isEmpty())
+ { // try to save the file
+ bool ok(true);
+ QString msg;
+ CupsdConf newconf_;
+ for (pagelist_.first();pagelist_.current() && ok;pagelist_.next())
+ ok = pagelist_.current()->saveConfig(&newconf_, msg);
+ // copy unknown options
+ newconf_.unknown_ = conf_->unknown_;
+ if (!ok)
+ {
+ ; // do nothing
+ }
+ else if (!newconf_.saveToFile(filename_))
+ {
+ msg = i18n("Unable to write configuration file %1").arg(filename_);
+ ok = false;
+ }
+ if (!ok)
+ {
+ KMessageBox::error(this, msg.prepend("<qt>").append("</qt>"), i18n("CUPS Configuration Error"));
+ }
+ else
+ KDialogBase::slotOk();
+ }
+}
+
+void CupsdDialog::slotUser1()
+{
+ QWhatsThis::enterWhatsThisMode();
+}
+
+int CupsdDialog::serverPid()
+{
+ return getServerPid();
+}
+
+int CupsdDialog::serverOwner()
+{
+ int pid = getServerPid();
+ if (pid > 0)
+ {
+ QString str;
+ str.sprintf("/proc/%d/status",pid);
+ QFile f(str);
+ if (f.exists() && f.open(IO_ReadOnly))
+ {
+ QTextStream t(&f);
+ while (!t.eof())
+ {
+ str = t.readLine();
+ if (str.find("Uid:",0,false) == 0)
+ {
+ QStringList list = QStringList::split('\t', str, false);
+ if (list.count() >= 2)
+ {
+ bool ok;
+ int u = list[1].toInt(&ok);
+ if (ok) return u;
+ }
+ }
+ }
+ }
+ }
+ return (-1);
+}
+
+#include "cupsddialog.moc"
diff --git a/kdeprint/cups/cupsdconf2/cupsddialog.h b/kdeprint/cups/cupsdconf2/cupsddialog.h
new file mode 100644
index 000000000..4de5cd3dc
--- /dev/null
+++ b/kdeprint/cups/cupsdconf2/cupsddialog.h
@@ -0,0 +1,58 @@
+/*
+ * This file is part of the KDE libraries
+ * Copyright (c) 2001 Michael Goffioul <[email protected]>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License version 2 as published by the Free Software Foundation.
+ *
+ * This library 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
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB. If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ **/
+
+#ifndef CUPSDDIALOG_H
+#define CUPSDDIALOG_H
+
+#include <kdialogbase.h>
+#include <qptrlist.h>
+
+class CupsdPage;
+struct CupsdConf;
+
+class CupsdDialog : public KDialogBase
+{
+ Q_OBJECT
+public:
+ CupsdDialog(QWidget *parent = 0, const char *name = 0);
+ ~CupsdDialog();
+
+ bool setConfigFile(const QString& filename);
+
+ static bool configure(const QString& filename = QString::null, QWidget *parent = 0, QString *errormsg = 0);
+ static bool restartServer(QString& msg);
+ static int serverPid();
+ static int serverOwner();
+
+protected slots:
+ void slotOk();
+ void slotUser1();
+
+protected:
+ void addConfPage(CupsdPage*);
+ void constructDialog();
+ void restartServer();
+
+private:
+ QPtrList<CupsdPage> pagelist_;
+ CupsdConf *conf_;
+ QString filename_;
+};
+
+#endif
diff --git a/kdeprint/cups/cupsdconf2/cupsddirpage.cpp b/kdeprint/cups/cupsdconf2/cupsddirpage.cpp
new file mode 100644
index 000000000..04a94c30a
--- /dev/null
+++ b/kdeprint/cups/cupsdconf2/cupsddirpage.cpp
@@ -0,0 +1,109 @@
+/*
+ * This file is part of the KDE libraries
+ * Copyright (c) 2001 Michael Goffioul <[email protected]>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License version 2 as published by the Free Software Foundation.
+ *
+ * This library 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
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB. If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ **/
+
+#include "cupsddirpage.h"
+#include "cupsdconf.h"
+#include "qdirlineedit.h"
+#include "qdirmultilineedit.h"
+
+#include <qlabel.h>
+#include <qlayout.h>
+#include <qwhatsthis.h>
+
+#include <klocale.h>
+
+CupsdDirPage::CupsdDirPage(QWidget *parent, const char *name)
+ : CupsdPage(parent, name)
+{
+ setPageLabel(i18n("Folders"));
+ setHeader(i18n("Folders Settings"));
+ setPixmap("folder");
+
+ datadir_ = new QDirLineEdit(false, this);
+ documentdir_ = new QDirLineEdit(false, this);
+ fontpath_ = new QDirMultiLineEdit(this);
+ requestdir_ = new QDirLineEdit(false, this);
+ serverbin_ = new QDirLineEdit(false, this);
+ serverfiles_ = new QDirLineEdit(false, this);
+ tmpfiles_ = new QDirLineEdit(false, this);
+
+ QLabel *l1 = new QLabel(i18n("Data folder:"), this);
+ QLabel *l2 = new QLabel(i18n("Document folder:"), this);
+ QLabel *l3 = new QLabel(i18n("Font path:"), this);
+ QLabel *l4 = new QLabel(i18n("Request folder:"), this);
+ QLabel *l5 = new QLabel(i18n("Server binaries:"), this);
+ QLabel *l6 = new QLabel(i18n("Server files:"), this);
+ QLabel *l7 = new QLabel(i18n("Temporary files:"), this);
+
+ QGridLayout *m1 = new QGridLayout(this, 8, 2, 10, 7);
+ m1->setRowStretch(7, 1);
+ m1->setColStretch(1, 1);
+ m1->addWidget(l1, 0, 0, Qt::AlignRight);
+ m1->addWidget(l2, 1, 0, Qt::AlignRight);
+ m1->addWidget(l3, 2, 0, Qt::AlignRight|Qt::AlignTop);
+ m1->addWidget(l4, 3, 0, Qt::AlignRight);
+ m1->addWidget(l5, 4, 0, Qt::AlignRight);
+ m1->addWidget(l6, 5, 0, Qt::AlignRight);
+ m1->addWidget(l7, 6, 0, Qt::AlignRight);
+ m1->addWidget(datadir_, 0, 1);
+ m1->addWidget(documentdir_, 1, 1);
+ m1->addWidget(fontpath_, 2, 1);
+ m1->addWidget(requestdir_, 3, 1);
+ m1->addWidget(serverbin_, 4, 1);
+ m1->addWidget(serverfiles_, 5, 1);
+ m1->addWidget(tmpfiles_, 6, 1);
+}
+
+bool CupsdDirPage::loadConfig(CupsdConf *conf, QString&)
+{
+ conf_ = conf;
+ datadir_->setURL(conf_->datadir_);
+ documentdir_->setURL(conf_->documentdir_);
+ fontpath_->setURLs(conf_->fontpath_);
+ requestdir_->setURL(conf_->requestdir_);
+ serverbin_->setURL(conf_->serverbin_);
+ serverfiles_->setURL(conf_->serverfiles_);
+ tmpfiles_->setURL(conf_->tmpfiles_);
+
+ return true;
+}
+
+bool CupsdDirPage::saveConfig(CupsdConf *conf, QString&)
+{
+ conf->datadir_ = datadir_->url();
+ conf->documentdir_ = documentdir_->url();
+ conf->fontpath_ = fontpath_->urls();
+ conf->requestdir_ = requestdir_->url();
+ conf->serverbin_ = serverbin_->url();
+ conf->serverfiles_ = serverfiles_->url();
+ conf->tmpfiles_ = tmpfiles_->url();
+
+ return true;
+}
+
+void CupsdDirPage::setInfos(CupsdConf *conf)
+{
+ QWhatsThis::add(datadir_, conf->comments_.toolTip("datadir"));
+ QWhatsThis::add(documentdir_, conf->comments_.toolTip("documentroot"));
+ QWhatsThis::add(fontpath_, conf->comments_.toolTip("fontpath"));
+ QWhatsThis::add(requestdir_, conf->comments_.toolTip("requestroot"));
+ QWhatsThis::add(serverbin_, conf->comments_.toolTip("serverbin"));
+ QWhatsThis::add(serverfiles_, conf->comments_.toolTip("serverroot"));
+ QWhatsThis::add(tmpfiles_, conf->comments_.toolTip("tempdir"));
+}
diff --git a/kdeprint/cups/cupsdconf2/cupsddirpage.h b/kdeprint/cups/cupsdconf2/cupsddirpage.h
new file mode 100644
index 000000000..ffce797e8
--- /dev/null
+++ b/kdeprint/cups/cupsdconf2/cupsddirpage.h
@@ -0,0 +1,47 @@
+/*
+ * This file is part of the KDE libraries
+ * Copyright (c) 2001 Michael Goffioul <[email protected]>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License version 2 as published by the Free Software Foundation.
+ *
+ * This library 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
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB. If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ **/
+
+#ifndef CUPSDDIRPAGE_H
+#define CUPSDDIRPAGE_H
+
+#include "cupsdpage.h"
+
+class QDirLineEdit;
+class QDirMultiLineEdit;
+
+class CupsdDirPage : public CupsdPage
+{
+public:
+ CupsdDirPage(QWidget *parent = 0, const char *name = 0);
+
+ bool loadConfig(CupsdConf*, QString&);
+ bool saveConfig(CupsdConf*, QString&);
+ void setInfos(CupsdConf*);
+
+private:
+ QDirLineEdit *datadir_,
+ *documentdir_,
+ *requestdir_,
+ *serverbin_,
+ *serverfiles_,
+ *tmpfiles_;
+ QDirMultiLineEdit *fontpath_;
+};
+
+#endif
diff --git a/kdeprint/cups/cupsdconf2/cupsdfilterpage.cpp b/kdeprint/cups/cupsdconf2/cupsdfilterpage.cpp
new file mode 100644
index 000000000..12270bc26
--- /dev/null
+++ b/kdeprint/cups/cupsdconf2/cupsdfilterpage.cpp
@@ -0,0 +1,94 @@
+/*
+ * This file is part of the KDE libraries
+ * Copyright (c) 2001 Michael Goffioul <[email protected]>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License version 2 as published by the Free Software Foundation.
+ *
+ * This library 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
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB. If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ **/
+
+#include "cupsdfilterpage.h"
+#include "cupsdconf.h"
+#include "sizewidget.h"
+
+#include <qlabel.h>
+#include <qlineedit.h>
+#include <qlayout.h>
+#include <qwhatsthis.h>
+#include <qcombobox.h>
+
+#include <klocale.h>
+#include <knuminput.h>
+
+CupsdFilterPage::CupsdFilterPage(QWidget *parent, const char *name)
+ : CupsdPage(parent, name)
+{
+ setPageLabel(i18n("Filter"));
+ setHeader(i18n("Filter Settings"));
+ setPixmap("filter");
+
+ user_ = new QLineEdit(this);
+ group_ = new QLineEdit(this);
+ ripcache_ = new SizeWidget(this);
+ filterlimit_ = new KIntNumInput(this);
+
+ filterlimit_->setRange(0, 1000, 1, true);
+ filterlimit_->setSpecialValueText(i18n("Unlimited"));
+ filterlimit_->setSteps(1, 10);
+
+ QLabel *l1 = new QLabel(i18n("User:"), this);
+ QLabel *l2 = new QLabel(i18n("Group:"), this);
+ QLabel *l3 = new QLabel(i18n("RIP cache:"), this);
+ QLabel *l4 = new QLabel(i18n("Filter limit:"), this);
+
+ QGridLayout *m1 = new QGridLayout(this, 5, 2, 10, 7);
+ m1->setRowStretch(4, 1);
+ m1->setColStretch(1, 1);
+ m1->addWidget(l1, 0, 0, Qt::AlignRight);
+ m1->addWidget(l2, 1, 0, Qt::AlignRight);
+ m1->addWidget(l3, 2, 0, Qt::AlignRight);
+ m1->addWidget(l4, 3, 0, Qt::AlignRight);
+ m1->addWidget(user_, 0, 1);
+ m1->addWidget(group_, 1, 1);
+ m1->addWidget(ripcache_, 2, 1);
+ m1->addWidget(filterlimit_, 3, 1);
+}
+
+bool CupsdFilterPage::loadConfig(CupsdConf *conf, QString&)
+{
+ conf_ = conf;
+ user_->setText(conf_->user_);
+ group_->setText(conf_->group_);
+ ripcache_->setSizeString(conf_->ripcache_);
+ filterlimit_->setValue(conf_->filterlimit_);
+
+ return true;
+}
+
+bool CupsdFilterPage::saveConfig(CupsdConf *conf, QString&)
+{
+ conf->user_ = user_->text();
+ conf->group_ = group_->text();
+ conf->ripcache_ = ripcache_->sizeString();
+ conf->filterlimit_ = filterlimit_->value();
+
+ return true;
+}
+
+void CupsdFilterPage::setInfos(CupsdConf *conf)
+{
+ QWhatsThis::add(user_, conf->comments_.toolTip("user"));
+ QWhatsThis::add(group_, conf->comments_.toolTip("group"));
+ QWhatsThis::add(ripcache_, conf->comments_.toolTip("ripcache"));
+ QWhatsThis::add(filterlimit_, conf->comments_.toolTip("filterlimit"));
+}
diff --git a/kdeprint/cups/cupsdconf2/cupsdfilterpage.h b/kdeprint/cups/cupsdconf2/cupsdfilterpage.h
new file mode 100644
index 000000000..894777520
--- /dev/null
+++ b/kdeprint/cups/cupsdconf2/cupsdfilterpage.h
@@ -0,0 +1,45 @@
+/*
+ * This file is part of the KDE libraries
+ * Copyright (c) 2001 Michael Goffioul <[email protected]>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License version 2 as published by the Free Software Foundation.
+ *
+ * This library 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
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB. If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ **/
+
+#ifndef CUPSDFILTERPAGE_H
+#define CUPSDFILTERPAGE_H
+
+#include "cupsdpage.h"
+
+class SizeWidget;
+class QLineEdit;
+class QComboBox;
+class KIntNumInput;
+
+class CupsdFilterPage : public CupsdPage
+{
+public:
+ CupsdFilterPage(QWidget *parent = 0, const char *name = 0);
+
+ bool loadConfig(CupsdConf*, QString&);
+ bool saveConfig(CupsdConf*, QString&);
+ void setInfos(CupsdConf*);
+
+private:
+ QLineEdit *user_, *group_;
+ KIntNumInput *filterlimit_;
+ SizeWidget *ripcache_;
+};
+
+#endif
diff --git a/kdeprint/cups/cupsdconf2/cupsdjobspage.cpp b/kdeprint/cups/cupsdconf2/cupsdjobspage.cpp
new file mode 100644
index 000000000..bfb2832eb
--- /dev/null
+++ b/kdeprint/cups/cupsdconf2/cupsdjobspage.cpp
@@ -0,0 +1,123 @@
+/*
+ * This file is part of the KDE libraries
+ * Copyright (c) 2001 Michael Goffioul <[email protected]>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License version 2 as published by the Free Software Foundation.
+ *
+ * This library 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
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB. If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ **/
+
+#include "cupsdjobspage.h"
+#include "cupsdconf.h"
+
+#include <qlabel.h>
+#include <qcheckbox.h>
+#include <qlayout.h>
+#include <qwhatsthis.h>
+
+#include <klocale.h>
+#include <knuminput.h>
+
+CupsdJobsPage::CupsdJobsPage(QWidget *parent, const char *name)
+ : CupsdPage(parent, name)
+{
+ setPageLabel(i18n("Jobs"));
+ setHeader(i18n("Print Jobs Settings"));
+ setPixmap("fileprint");
+
+ keepjobhistory_ = new QCheckBox(i18n("Preserve job history"), this);
+ keepjobfiles_ = new QCheckBox(i18n("Preserve job files"), this);
+ autopurgejobs_ = new QCheckBox(i18n("Auto purge jobs"), this);
+ maxjobs_ = new KIntNumInput(this);
+ maxjobsperprinter_ = new KIntNumInput(this);
+ maxjobsperuser_ = new KIntNumInput(this);
+
+ maxjobs_->setRange(0, 1000, 1, true);
+ maxjobs_->setSteps(1, 10);
+ maxjobs_->setSpecialValueText(i18n("Unlimited"));
+ maxjobsperprinter_->setRange(0, 1000, 1, true);
+ maxjobsperprinter_->setSpecialValueText(i18n("Unlimited"));
+ maxjobsperprinter_->setSteps(1, 10);
+ maxjobsperuser_->setRange(0, 1000, 1, true);
+ maxjobsperuser_->setSpecialValueText(i18n("Unlimited"));
+ maxjobsperuser_->setSteps(1, 10);
+
+ QLabel *l1 = new QLabel(i18n("Max jobs:"), this);
+ QLabel *l2 = new QLabel(i18n("Max jobs per printer:"), this);
+ QLabel *l3 = new QLabel(i18n("Max jobs per user:"), this);
+
+ QGridLayout *m1 = new QGridLayout(this, 7, 2, 10, 7);
+ m1->setRowStretch(6, 1);
+ m1->setColStretch(1, 1);
+ m1->addWidget(keepjobhistory_, 0, 1);
+ m1->addWidget(keepjobfiles_, 1, 1);
+ m1->addWidget(autopurgejobs_, 2, 1);
+ m1->addWidget(l1, 3, 0, Qt::AlignRight);
+ m1->addWidget(l2, 4, 0, Qt::AlignRight);
+ m1->addWidget(l3, 5, 0, Qt::AlignRight);
+ m1->addWidget(maxjobs_, 3, 1);
+ m1->addWidget(maxjobsperprinter_, 4, 1);
+ m1->addWidget(maxjobsperuser_, 5, 1);
+
+ connect(keepjobhistory_, SIGNAL(toggled(bool)), SLOT(historyChanged(bool)));
+ keepjobhistory_->setChecked(true);
+}
+
+bool CupsdJobsPage::loadConfig(CupsdConf *conf, QString&)
+{
+ conf_ = conf;
+ keepjobhistory_->setChecked(conf_->keepjobhistory_);
+ if (conf_->keepjobhistory_)
+ {
+ keepjobfiles_->setChecked(conf_->keepjobfiles_);
+ autopurgejobs_->setChecked(conf_->autopurgejobs_);
+ }
+ maxjobs_->setValue(conf_->maxjobs_);
+ maxjobsperprinter_->setValue(conf_->maxjobsperprinter_);
+ maxjobsperuser_->setValue(conf_->maxjobsperuser_);
+
+ return true;
+}
+
+bool CupsdJobsPage::saveConfig(CupsdConf *conf, QString&)
+{
+ conf->keepjobhistory_ = keepjobhistory_->isChecked();
+ if (conf->keepjobhistory_)
+ {
+ conf->keepjobfiles_ = keepjobfiles_->isChecked();
+ conf->autopurgejobs_ = autopurgejobs_->isChecked();
+ }
+ conf->maxjobs_ = maxjobs_->value();
+ conf->maxjobsperprinter_ = maxjobsperprinter_->value();
+ conf->maxjobsperuser_ = maxjobsperuser_->value();
+
+ return true;
+}
+
+void CupsdJobsPage::setInfos(CupsdConf *conf)
+{
+ QWhatsThis::add(keepjobhistory_, conf->comments_.toolTip("preservejobhistory"));
+ QWhatsThis::add(keepjobfiles_, conf->comments_.toolTip("preservejobfiles"));
+ QWhatsThis::add(autopurgejobs_, conf->comments_.toolTip("autopurgejobs"));
+ QWhatsThis::add(maxjobs_, conf->comments_.toolTip("maxjobs"));
+ QWhatsThis::add(maxjobsperprinter_, conf->comments_.toolTip("maxjobsperprinter"));
+ QWhatsThis::add(maxjobsperuser_, conf->comments_.toolTip("maxjobsperuser"));
+}
+
+void CupsdJobsPage::historyChanged(bool on)
+{
+ keepjobfiles_->setEnabled(on);
+ autopurgejobs_->setEnabled(on);
+}
+
+#include "cupsdjobspage.moc"
diff --git a/kdeprint/cups/cupsdconf2/cupsdjobspage.h b/kdeprint/cups/cupsdconf2/cupsdjobspage.h
new file mode 100644
index 000000000..19e76a2aa
--- /dev/null
+++ b/kdeprint/cups/cupsdconf2/cupsdjobspage.h
@@ -0,0 +1,47 @@
+/*
+ * This file is part of the KDE libraries
+ * Copyright (c) 2001 Michael Goffioul <[email protected]>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License version 2 as published by the Free Software Foundation.
+ *
+ * This library 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
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB. If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ **/
+
+#ifndef CUPSDJOBSPAGE_H
+#define CUPSDJOBSPAGE_H
+
+#include "cupsdpage.h"
+
+class KIntNumInput;
+class QCheckBox;
+
+class CupsdJobsPage : public CupsdPage
+{
+ Q_OBJECT
+
+public:
+ CupsdJobsPage(QWidget *parent = 0, const char *name = 0);
+
+ bool loadConfig(CupsdConf*, QString&);
+ bool saveConfig(CupsdConf*, QString&);
+ void setInfos(CupsdConf*);
+
+protected slots:
+ void historyChanged(bool);
+
+private:
+ KIntNumInput *maxjobs_, *maxjobsperprinter_, *maxjobsperuser_;
+ QCheckBox *keepjobhistory_, *keepjobfiles_, *autopurgejobs_;
+};
+
+#endif
diff --git a/kdeprint/cups/cupsdconf2/cupsdlogpage.cpp b/kdeprint/cups/cupsdconf2/cupsdlogpage.cpp
new file mode 100644
index 000000000..49840050e
--- /dev/null
+++ b/kdeprint/cups/cupsdconf2/cupsdlogpage.cpp
@@ -0,0 +1,111 @@
+/*
+ * This file is part of the KDE libraries
+ * Copyright (c) 2001 Michael Goffioul <[email protected]>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License version 2 as published by the Free Software Foundation.
+ *
+ * This library 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
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB. If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ **/
+
+#include "cupsdlogpage.h"
+#include "cupsdconf.h"
+#include "qdirlineedit.h"
+#include "sizewidget.h"
+
+#include <qlabel.h>
+#include <qcombobox.h>
+#include <qlayout.h>
+#include <qwhatsthis.h>
+
+#include <klocale.h>
+#include <kfiledialog.h>
+
+CupsdLogPage::CupsdLogPage(QWidget *parent, const char *name)
+ : CupsdPage(parent, name)
+{
+ setPageLabel(i18n("Log"));
+ setHeader(i18n("Log Settings"));
+ setPixmap("contents");
+
+ accesslog_ = new QDirLineEdit(true, this);
+ errorlog_ = new QDirLineEdit(true, this);
+ pagelog_ = new QDirLineEdit(true, this);
+ maxlogsize_ = new SizeWidget(this);
+ loglevel_ = new QComboBox(this);
+
+ loglevel_->insertItem(i18n("Detailed Debugging"));
+ loglevel_->insertItem(i18n("Debug Information"));
+ loglevel_->insertItem(i18n("General Information"));
+ loglevel_->insertItem(i18n("Warnings"));
+ loglevel_->insertItem(i18n("Errors"));
+ loglevel_->insertItem(i18n("No Logging"));
+
+ /*maxlogsize_->setRange(0, 100, 1, true);
+ maxlogsize_->setSteps(1, 5);
+ maxlogsize_->setSpecialValueText(i18n("Unlimited"));
+ maxlogsize_->setSuffix(i18n("MB"));*/
+
+ QLabel *l1 = new QLabel(i18n("Access log:"), this);
+ QLabel *l2 = new QLabel(i18n("Error log:"), this);
+ QLabel *l3 = new QLabel(i18n("Page log:"), this);
+ QLabel *l4 = new QLabel(i18n("Max log size:"), this);
+ QLabel *l5 = new QLabel(i18n("Log level:"), this);
+
+ loglevel_->setCurrentItem(2);
+
+ QGridLayout *m1 = new QGridLayout(this, 6, 2, 10, 7);
+ m1->setRowStretch(5, 1);
+ m1->setColStretch(1, 1);
+ m1->addWidget(l1, 0, 0, Qt::AlignRight);
+ m1->addWidget(l2, 1, 0, Qt::AlignRight);
+ m1->addWidget(l3, 2, 0, Qt::AlignRight);
+ m1->addWidget(l4, 3, 0, Qt::AlignRight);
+ m1->addWidget(l5, 4, 0, Qt::AlignRight);
+ m1->addWidget(accesslog_, 0, 1);
+ m1->addWidget(errorlog_, 1, 1);
+ m1->addWidget(pagelog_, 2, 1);
+ m1->addWidget(maxlogsize_, 3, 1);
+ m1->addWidget(loglevel_, 4, 1);
+}
+
+bool CupsdLogPage::loadConfig(CupsdConf *conf, QString&)
+{
+ conf_ = conf;
+ accesslog_->setURL(conf_->accesslog_);
+ errorlog_->setURL(conf_->errorlog_);
+ pagelog_->setURL(conf_->pagelog_);
+ maxlogsize_->setSizeString(conf_->maxlogsize_);
+ loglevel_->setCurrentItem(conf_->loglevel_);
+
+ return true;
+}
+
+bool CupsdLogPage::saveConfig(CupsdConf *conf, QString&)
+{
+ conf->accesslog_ = accesslog_->url();
+ conf->errorlog_ = errorlog_->url();
+ conf->pagelog_ = pagelog_->url();
+ conf->maxlogsize_ = maxlogsize_->sizeString();
+ conf->loglevel_ = loglevel_->currentItem();
+
+ return true;
+}
+
+void CupsdLogPage::setInfos(CupsdConf *conf)
+{
+ QWhatsThis::add(accesslog_, conf->comments_.toolTip("accesslog"));
+ QWhatsThis::add(errorlog_, conf->comments_.toolTip("errorlog"));
+ QWhatsThis::add(pagelog_, conf->comments_.toolTip("pagelog"));
+ QWhatsThis::add(maxlogsize_, conf->comments_.toolTip("maxlogsize"));
+ QWhatsThis::add(loglevel_, conf->comments_.toolTip("loglevel"));
+}
diff --git a/kdeprint/cups/cupsdconf2/cupsdlogpage.h b/kdeprint/cups/cupsdconf2/cupsdlogpage.h
new file mode 100644
index 000000000..68e15ff45
--- /dev/null
+++ b/kdeprint/cups/cupsdconf2/cupsdlogpage.h
@@ -0,0 +1,44 @@
+/*
+ * This file is part of the KDE libraries
+ * Copyright (c) 2001 Michael Goffioul <[email protected]>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License version 2 as published by the Free Software Foundation.
+ *
+ * This library 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
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB. If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ **/
+
+#ifndef CUPSDLOGPAGE_H
+#define CUPSDLOGPAGE_H
+
+#include "cupsdpage.h"
+
+class QDirLineEdit;
+class SizeWidget;
+class QComboBox;
+
+class CupsdLogPage : public CupsdPage
+{
+public:
+ CupsdLogPage(QWidget *parent = 0, const char *name = 0);
+
+ bool loadConfig(CupsdConf*, QString&);
+ bool saveConfig(CupsdConf*, QString&);
+ void setInfos(CupsdConf*);
+
+private:
+ QDirLineEdit *accesslog_, *errorlog_, *pagelog_;
+ QComboBox *loglevel_;
+ SizeWidget *maxlogsize_;
+};
+
+#endif
diff --git a/kdeprint/cups/cupsdconf2/cupsdnetworkpage.cpp b/kdeprint/cups/cupsdconf2/cupsdnetworkpage.cpp
new file mode 100644
index 000000000..6b0f196b5
--- /dev/null
+++ b/kdeprint/cups/cupsdconf2/cupsdnetworkpage.cpp
@@ -0,0 +1,159 @@
+/*
+ * This file is part of the KDE libraries
+ * Copyright (c) 2001 Michael Goffioul <[email protected]>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License version 2 as published by the Free Software Foundation.
+ *
+ * This library 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
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB. If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ **/
+
+#include "cupsdnetworkpage.h"
+#include "cupsdconf.h"
+#include "editlist.h"
+#include "portdialog.h"
+#include "sizewidget.h"
+
+#include <qlabel.h>
+#include <qcheckbox.h>
+#include <qcombobox.h>
+#include <qlayout.h>
+#include <qwhatsthis.h>
+
+#include <klocale.h>
+#include <knuminput.h>
+
+CupsdNetworkPage::CupsdNetworkPage(QWidget *parent, const char *name)
+ : CupsdPage(parent, name)
+{
+ setPageLabel(i18n("Network"));
+ setHeader(i18n("Network Settings"));
+ setPixmap("network");
+
+ keepalive_ = new QCheckBox(i18n("Keep alive"), this);
+ keepalivetimeout_ = new KIntNumInput(this);
+ maxclients_ = new KIntNumInput(this);
+ maxrequestsize_ = new SizeWidget(this);
+ clienttimeout_ = new KIntNumInput(this);
+ hostnamelookup_ = new QComboBox(this);
+ listen_ = new EditList(this);
+
+ keepalivetimeout_->setRange(0, 10000, 1, true);
+ keepalivetimeout_->setSteps(1, 10);
+ keepalivetimeout_->setSpecialValueText(i18n("Unlimited"));
+ keepalivetimeout_->setSuffix(i18n(" sec"));
+
+ maxclients_->setRange(1, 1000, 1, true);
+ maxclients_->setSteps(1, 10);
+
+ clienttimeout_->setRange(0, 10000, 1, true);
+ clienttimeout_->setSteps(1, 10);
+ clienttimeout_->setSpecialValueText(i18n("Unlimited"));
+ clienttimeout_->setSuffix(i18n(" sec"));
+
+ hostnamelookup_->insertItem(i18n("Off"));
+ hostnamelookup_->insertItem(i18n("On"));
+ hostnamelookup_->insertItem(i18n("Double"));
+
+ QLabel *l1 = new QLabel(i18n("Hostname lookups:"), this);
+ QLabel *l2 = new QLabel(i18n("Keep-alive timeout:"), this);
+ QLabel *l3 = new QLabel(i18n("Max clients:"), this);
+ QLabel *l4 = new QLabel(i18n("Max request size:"), this);
+ QLabel *l5 = new QLabel(i18n("Client timeout:"), this);
+ QLabel *l6 = new QLabel(i18n("Listen to:"), this);
+
+ QGridLayout *m1 = new QGridLayout(this, 8, 2, 10, 7);
+ m1->setRowStretch(7, 1);
+ m1->setColStretch(1, 1);
+ m1->addWidget(l1, 0, 0, Qt::AlignRight);
+ m1->addWidget(l2, 2, 0, Qt::AlignRight);
+ m1->addWidget(l3, 3, 0, Qt::AlignRight);
+ m1->addWidget(l4, 4, 0, Qt::AlignRight);
+ m1->addWidget(l5, 5, 0, Qt::AlignRight);
+ m1->addWidget(l6, 6, 0, Qt::AlignTop|Qt::AlignRight);
+ m1->addWidget(keepalive_, 1, 1);
+ m1->addWidget(hostnamelookup_, 0, 1);
+ m1->addWidget(keepalivetimeout_, 2, 1);
+ m1->addWidget(maxclients_, 3, 1);
+ m1->addWidget(maxrequestsize_, 4, 1);
+ m1->addWidget(clienttimeout_, 5, 1);
+ m1->addWidget(listen_, 6, 1);
+
+ connect(listen_, SIGNAL(add()), SLOT(slotAdd()));
+ connect(listen_, SIGNAL(edit(int)), SLOT(slotEdit(int)));
+ connect(listen_, SIGNAL(defaultList()), SLOT(slotDefaultList()));
+ connect(keepalive_, SIGNAL(toggled(bool)), keepalivetimeout_, SLOT(setEnabled(bool)));
+ keepalive_->setChecked(true);
+}
+
+bool CupsdNetworkPage::loadConfig(CupsdConf *conf, QString&)
+{
+ conf_ = conf;
+ hostnamelookup_->setCurrentItem(conf_->hostnamelookup_);
+ keepalive_->setChecked(conf_->keepalive_);
+ keepalivetimeout_->setValue(conf_->keepalivetimeout_);
+ maxclients_->setValue(conf_->maxclients_);
+ maxrequestsize_->setSizeString(conf_->maxrequestsize_);
+ clienttimeout_->setValue(conf_->clienttimeout_);
+ listen_->insertItems(conf_->listenaddresses_);
+
+ return true;
+}
+
+bool CupsdNetworkPage::saveConfig(CupsdConf *conf, QString&)
+{
+ conf->hostnamelookup_ = hostnamelookup_->currentItem();
+ conf->keepalive_ = keepalive_->isChecked();
+ conf->keepalivetimeout_ = keepalivetimeout_->value();
+ conf->maxclients_ = maxclients_->value();
+ conf->maxrequestsize_ = maxrequestsize_->sizeString();
+ conf->clienttimeout_ = clienttimeout_->value();
+ conf->listenaddresses_ = listen_->items();
+
+ return true;
+}
+
+void CupsdNetworkPage::setInfos(CupsdConf *conf)
+{
+ QWhatsThis::add(hostnamelookup_, conf->comments_.toolTip("hostnamelookups"));
+ QWhatsThis::add(keepalive_, conf->comments_.toolTip("keepalive"));
+ QWhatsThis::add(keepalivetimeout_, conf->comments_.toolTip("keepalivetimeout"));
+ QWhatsThis::add(maxclients_, conf->comments_.toolTip("maxclients"));
+ QWhatsThis::add(maxrequestsize_, conf->comments_.toolTip("maxrequestsize"));
+ QWhatsThis::add(clienttimeout_, conf->comments_.toolTip("timeout"));
+ QWhatsThis::add(listen_, conf->comments_.toolTip("listen"));
+}
+
+void CupsdNetworkPage::slotAdd()
+{
+ QString s = PortDialog::newListen(this, conf_);
+ if (!s.isEmpty())
+ listen_->insertItem(s);
+}
+
+void CupsdNetworkPage::slotEdit(int index)
+{
+ QString s = listen_->text(index);
+ s = PortDialog::editListen(s, this, conf_);
+ if (!s.isEmpty())
+ listen_->setText(index, s);
+}
+
+void CupsdNetworkPage::slotDefaultList()
+{
+ listen_->clear();
+ QStringList l;
+ l << "Listen *:631";
+ listen_->insertItems(l);
+}
+
+#include "cupsdnetworkpage.moc"
diff --git a/kdeprint/cups/cupsdconf2/cupsdnetworkpage.h b/kdeprint/cups/cupsdconf2/cupsdnetworkpage.h
new file mode 100644
index 000000000..c4c8bd450
--- /dev/null
+++ b/kdeprint/cups/cupsdconf2/cupsdnetworkpage.h
@@ -0,0 +1,55 @@
+/*
+ * This file is part of the KDE libraries
+ * Copyright (c) 2001 Michael Goffioul <[email protected]>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License version 2 as published by the Free Software Foundation.
+ *
+ * This library 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
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB. If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ **/
+
+#ifndef CUPSDNETWORKPAGE_H
+#define CUPSDNETWORKPAGE_H
+
+#include "cupsdpage.h"
+
+class KIntNumInput;
+class QCheckBox;
+class QComboBox;
+class EditList;
+class SizeWidget;
+
+class CupsdNetworkPage : public CupsdPage
+{
+ Q_OBJECT
+
+public:
+ CupsdNetworkPage(QWidget *parent = 0, const char *name = 0);
+
+ bool loadConfig(CupsdConf*, QString&);
+ bool saveConfig(CupsdConf*, QString&);
+ void setInfos(CupsdConf*);
+
+protected slots:
+ void slotAdd();
+ void slotEdit(int);
+ void slotDefaultList();
+
+private:
+ KIntNumInput *keepalivetimeout_, *maxclients_, *clienttimeout_;
+ QComboBox *hostnamelookup_;
+ QCheckBox *keepalive_;
+ EditList *listen_;
+ SizeWidget *maxrequestsize_;
+};
+
+#endif
diff --git a/kdeprint/cups/cupsdconf2/cupsdpage.cpp b/kdeprint/cups/cupsdconf2/cupsdpage.cpp
new file mode 100644
index 000000000..00798552c
--- /dev/null
+++ b/kdeprint/cups/cupsdconf2/cupsdpage.cpp
@@ -0,0 +1,32 @@
+/*
+ * This file is part of the KDE libraries
+ * Copyright (c) 2001 Michael Goffioul <[email protected]>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License version 2 as published by the Free Software Foundation.
+ *
+ * This library 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
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB. If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ **/
+
+#include "cupsdpage.h"
+
+CupsdPage::CupsdPage(QWidget *parent, const char *name)
+ : QWidget(parent, name)
+{
+ conf_ = 0;
+}
+
+CupsdPage::~CupsdPage()
+{
+}
+
+#include "cupsdpage.moc"
diff --git a/kdeprint/cups/cupsdconf2/cupsdpage.h b/kdeprint/cups/cupsdconf2/cupsdpage.h
new file mode 100644
index 000000000..dedd53ade
--- /dev/null
+++ b/kdeprint/cups/cupsdconf2/cupsdpage.h
@@ -0,0 +1,54 @@
+/*
+ * This file is part of the KDE libraries
+ * Copyright (c) 2001 Michael Goffioul <[email protected]>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License version 2 as published by the Free Software Foundation.
+ *
+ * This library 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
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB. If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ **/
+
+#ifndef CUPSDPAGE_H
+#define CUPSDPAGE_H
+
+#include <qwidget.h>
+
+struct CupsdConf;
+
+class CupsdPage : public QWidget
+{
+ Q_OBJECT
+public:
+ CupsdPage(QWidget *parent = 0, const char *name = 0);
+ virtual ~CupsdPage();
+
+ virtual bool loadConfig(CupsdConf *conf, QString& msg) = 0;
+ virtual bool saveConfig(CupsdConf *conf, QString& msg) = 0;
+ virtual void setInfos(CupsdConf*) {}
+
+ QString pageLabel() const { return label_; }
+ QString header() const { return header_; }
+ QString pixmap() const { return pixmap_; }
+
+protected:
+ void setPageLabel(const QString& s) { label_ = s; }
+ void setHeader(const QString& s) { header_ = s; }
+ void setPixmap(const QString& s) { pixmap_ = s; }
+
+protected:
+ CupsdConf *conf_;
+ QString label_;
+ QString header_;
+ QString pixmap_;
+};
+
+#endif
diff --git a/kdeprint/cups/cupsdconf2/cupsdsecuritypage.cpp b/kdeprint/cups/cupsdconf2/cupsdsecuritypage.cpp
new file mode 100644
index 000000000..a77f21708
--- /dev/null
+++ b/kdeprint/cups/cupsdconf2/cupsdsecuritypage.cpp
@@ -0,0 +1,168 @@
+/*
+ * This file is part of the KDE libraries
+ * Copyright (c) 2001 Michael Goffioul <[email protected]>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License version 2 as published by the Free Software Foundation.
+ *
+ * This library 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
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB. If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ **/
+
+#include "cupsdsecuritypage.h"
+#include "cupsdconf.h"
+#include "qdirlineedit.h"
+#include "editlist.h"
+#include "locationdialog.h"
+
+#include <qlabel.h>
+#include <qlineedit.h>
+#include <qlayout.h>
+#include <qwhatsthis.h>
+
+#include <klocale.h>
+#include <kiconloader.h>
+#include <kmessagebox.h>
+
+CupsdSecurityPage::CupsdSecurityPage(QWidget *parent, const char *name)
+ : CupsdPage(parent, name)
+{
+ setPageLabel(i18n("Security"));
+ setHeader(i18n("Security Settings"));
+ setPixmap("password");
+ locs_.setAutoDelete(true);
+
+ remoteroot_ = new QLineEdit(this);
+ systemgroup_ = new QLineEdit(this);
+ encryptcert_ = new QDirLineEdit(true, this);
+ encryptkey_ = new QDirLineEdit(true, this);
+ locations_ = new EditList(this);
+
+ QLabel *l1 = new QLabel(i18n("Remote root user:"), this);
+ QLabel *l2 = new QLabel(i18n("System group:"), this);
+ QLabel *l3 = new QLabel(i18n("Encryption certificate:"), this);
+ QLabel *l4 = new QLabel(i18n("Encryption key:"), this);
+ QLabel *l5 = new QLabel(i18n("Locations:"), this);
+
+ QGridLayout *m1 = new QGridLayout(this, 6, 2, 10, 7);
+ m1->setRowStretch(5, 1);
+ m1->setColStretch(1, 1);
+ m1->addWidget(l1, 0, 0, Qt::AlignRight);
+ m1->addWidget(l2, 1, 0, Qt::AlignRight);
+ m1->addWidget(l3, 2, 0, Qt::AlignRight);
+ m1->addWidget(l4, 3, 0, Qt::AlignRight);
+ m1->addWidget(l5, 4, 0, Qt::AlignRight|Qt::AlignTop);
+ m1->addWidget(remoteroot_, 0, 1);
+ m1->addWidget(systemgroup_, 1, 1);
+ m1->addWidget(encryptcert_, 2, 1);
+ m1->addWidget(encryptkey_, 3, 1);
+ m1->addWidget(locations_, 4, 1);
+
+ connect(locations_, SIGNAL(add()), SLOT(slotAdd()));
+ connect(locations_, SIGNAL(edit(int)), SLOT(slotEdit(int)));
+ connect(locations_, SIGNAL(defaultList()), SLOT(slotDefaultList()));
+ connect(locations_, SIGNAL(deleted(int)), SLOT(slotDeleted(int)));
+}
+
+bool CupsdSecurityPage::loadConfig(CupsdConf *conf, QString&)
+{
+ conf_ = conf;
+ remoteroot_->setText(conf_->remoteroot_);
+ systemgroup_->setText(conf_->systemgroup_);
+ encryptcert_->setURL(conf_->encryptcert_);
+ encryptkey_->setURL(conf_->encryptkey_);
+ locs_.clear();
+ QPtrListIterator<CupsLocation> it(conf_->locations_);
+ for (;it.current();++it)
+ {
+ locs_.append(new CupsLocation(*(it.current())));
+ if (it.current()->resource_)
+ locations_->insertItem(SmallIcon(CupsResource::typeToIconName(it.current()->resource_->type_)), it.current()->resource_->text_);
+ else
+ locations_->insertItem(it.current()->resourcename_);
+ }
+
+ return true;
+}
+
+bool CupsdSecurityPage::saveConfig(CupsdConf *conf, QString&)
+{
+ conf->remoteroot_ = remoteroot_->text();
+ conf->systemgroup_ = systemgroup_->text();
+ conf->encryptcert_ = encryptcert_->url();
+ conf->encryptkey_ = encryptkey_->url();
+ conf->locations_.clear();
+ QPtrListIterator<CupsLocation> it(locs_);
+ for (;it.current();++it)
+ conf->locations_.append(new CupsLocation(*(it.current())));
+
+ return true;
+}
+
+void CupsdSecurityPage::setInfos(CupsdConf *conf)
+{
+ QWhatsThis::add(remoteroot_, conf->comments_.toolTip("remoteroot"));
+ QWhatsThis::add(systemgroup_, conf->comments_.toolTip("systemgroup"));
+ QWhatsThis::add(encryptcert_, conf->comments_.toolTip("servercertificate"));
+ QWhatsThis::add(encryptkey_, conf->comments_.toolTip("serverkey"));
+ QWhatsThis::add(locations_, conf->comments_.toolTip("locationsshort"));
+}
+
+void CupsdSecurityPage::slotAdd()
+{
+ CupsLocation *loc = new CupsLocation;
+ if (LocationDialog::newLocation(loc, this, conf_))
+ {
+ int index(-1);
+ for (locs_.first(); locs_.current(); locs_.next())
+ if (locs_.current()->resource_ == loc->resource_)
+ {
+ if (KMessageBox::warningContinueCancel(this, i18n("This location is already defined. Do you want to replace the existing one?"),QString::null,i18n("Replace")) == KMessageBox::Continue)
+ {
+ index = locs_.at();
+ locs_.remove();
+ break;
+ }
+ else
+ {
+ delete loc;
+ return;
+ }
+ }
+
+ if (index == -1)
+ index = locs_.count();
+ locs_.insert(index, loc);
+ locations_->insertItem(SmallIcon(loc->resource_->typeToIconName(loc->resource_->type_)), loc->resource_->text_);
+ }
+ else
+ delete loc;
+}
+
+void CupsdSecurityPage::slotEdit(int index)
+{
+ CupsLocation *loc = locs_.at(index);
+ LocationDialog::editLocation(loc, this, conf_);
+}
+
+void CupsdSecurityPage::slotDefaultList()
+{
+ locs_.clear();
+ locations_->clear();
+}
+
+void CupsdSecurityPage::slotDeleted(int index)
+{
+ if (index >= 0 && index < (int)(locs_.count()))
+ locs_.remove(index);
+}
+
+#include "cupsdsecuritypage.moc"
diff --git a/kdeprint/cups/cupsdconf2/cupsdsecuritypage.h b/kdeprint/cups/cupsdconf2/cupsdsecuritypage.h
new file mode 100644
index 000000000..56a9e2e45
--- /dev/null
+++ b/kdeprint/cups/cupsdconf2/cupsdsecuritypage.h
@@ -0,0 +1,56 @@
+/*
+ * This file is part of the KDE libraries
+ * Copyright (c) 2001 Michael Goffioul <[email protected]>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License version 2 as published by the Free Software Foundation.
+ *
+ * This library 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
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB. If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ **/
+
+#ifndef CUPSDSECURITYPAGE_H
+#define CUPSDSECURITYPAGE_H
+
+#include "cupsdpage.h"
+#include <qptrlist.h>
+
+class QLineEdit;
+class EditList;
+class QDirLineEdit;
+struct CupsLocation;
+
+class CupsdSecurityPage : public CupsdPage
+{
+ Q_OBJECT
+
+public:
+ CupsdSecurityPage(QWidget *parent = 0, const char *name = 0);
+
+ bool loadConfig(CupsdConf*, QString&);
+ bool saveConfig(CupsdConf*, QString&);
+ void setInfos(CupsdConf*);
+
+protected slots:
+ void slotAdd();
+ void slotEdit(int);
+ void slotDefaultList();
+ void slotDeleted(int);
+
+private:
+ QLineEdit *remoteroot_, *systemgroup_;
+ QDirLineEdit *encryptcert_, *encryptkey_;
+ EditList *locations_;
+
+ QPtrList<CupsLocation> locs_;
+};
+
+#endif
diff --git a/kdeprint/cups/cupsdconf2/cupsdserverpage.cpp b/kdeprint/cups/cupsdconf2/cupsdserverpage.cpp
new file mode 100644
index 000000000..861dad9de
--- /dev/null
+++ b/kdeprint/cups/cupsdconf2/cupsdserverpage.cpp
@@ -0,0 +1,181 @@
+/*
+ * This file is part of the KDE libraries
+ * Copyright (c) 2001 Michael Goffioul <[email protected]>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License version 2 as published by the Free Software Foundation.
+ *
+ * This library 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
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB. If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ **/
+
+#include "cupsdserverpage.h"
+#include "cupsdconf.h"
+
+#include <qlineedit.h>
+#include <qlabel.h>
+#include <qcheckbox.h>
+#include <qcombobox.h>
+#include <qlayout.h>
+#include <qwhatsthis.h>
+
+#include <klocale.h>
+
+int findComboItem(QComboBox *cb, const QString& str)
+{
+ for (int i=0; i<cb->count(); i++)
+ if (cb->text(i) == str)
+ return i;
+ return (-1);
+}
+
+CupsdServerPage::CupsdServerPage(QWidget *parent, const char *name)
+ : CupsdPage(parent, name)
+{
+ setPageLabel(i18n("Server"));
+ setHeader(i18n("Server Settings"));
+ setPixmap("gear");
+
+ servername_ = new QLineEdit(this);
+ serveradmin_ = new QLineEdit(this);
+ otherclassname_ = new QLineEdit(this);
+ language_ = new QLineEdit(this);
+ printcap_ = new QLineEdit(this);
+ classification_ = new QComboBox(this);
+ charset_ = new QComboBox(this);
+ printcapformat_ = new QComboBox(this);
+ classoverride_ = new QCheckBox(i18n("Allow overrides"), this);
+
+ classification_->insertItem(i18n("None"));
+ classification_->insertItem(i18n("Classified"));
+ classification_->insertItem(i18n("Confidential"));
+ classification_->insertItem(i18n("Secret"));
+ classification_->insertItem(i18n("Top Secret"));
+ classification_->insertItem(i18n("Unclassified"));
+ classification_->insertItem(i18n("Other"));
+
+ charset_->insertItem("UTF-8");
+ charset_->insertItem("ISO-8859-1");
+ charset_->insertItem("ISO-8859-2");
+ charset_->insertItem("ISO-8859-3");
+ charset_->insertItem("ISO-8859-4");
+ charset_->insertItem("ISO-8859-5");
+ charset_->insertItem("ISO-8859-6");
+ charset_->insertItem("ISO-8859-7");
+ charset_->insertItem("ISO-8859-8");
+ charset_->insertItem("ISO-8859-9");
+ charset_->insertItem("ISO-8859-10");
+ charset_->insertItem("ISO-8859-13");
+ charset_->insertItem("ISO-8859-14");
+ charset_->insertItem("ISO-8859-15");
+
+ printcapformat_->insertItem("BSD");
+ printcapformat_->insertItem("SOLARIS");
+
+ QLabel *l1 = new QLabel(i18n("Server name:"), this);
+ QLabel *l2 = new QLabel(i18n("Server administrator:"), this);
+ QLabel *l3 = new QLabel(i18n("Classification:"), this);
+ QLabel *l4 = new QLabel(i18n("Default character set:"), this);
+ QLabel *l5 = new QLabel(i18n("Default language:"), this);
+ QLabel *l6 = new QLabel(i18n("Printcap file:"), this);
+ QLabel *l7 = new QLabel(i18n("Printcap format:"), this);
+
+ connect(classification_, SIGNAL(activated(int)), SLOT(classChanged(int)));
+ classification_->setCurrentItem(0);
+ charset_->setCurrentItem(0);
+ printcapformat_->setCurrentItem(0);
+ classChanged(0);
+
+ QGridLayout *m1 = new QGridLayout(this, 9, 2, 10, 7);
+ m1->setRowStretch(8, 1);
+ m1->setColStretch(1, 1);
+ m1->addWidget(l1, 0, 0, Qt::AlignRight);
+ m1->addWidget(l2, 1, 0, Qt::AlignRight);
+ m1->addWidget(l3, 2, 0, Qt::AlignRight);
+ m1->addWidget(l4, 4, 0, Qt::AlignRight);
+ m1->addWidget(l5, 5, 0, Qt::AlignRight);
+ m1->addWidget(l6, 6, 0, Qt::AlignRight);
+ m1->addWidget(l7, 7, 0, Qt::AlignRight);
+ m1->addWidget(servername_, 0, 1);
+ m1->addWidget(serveradmin_, 1, 1);
+ m1->addWidget(charset_, 4, 1);
+ m1->addWidget(language_, 5, 1);
+ m1->addWidget(printcap_, 6, 1);
+ m1->addWidget(printcapformat_, 7, 1);
+ QHBoxLayout *m2 = new QHBoxLayout(0, 0, 5);
+ m1->addLayout(m2, 2, 1);
+ m2->addWidget(classification_);
+ m2->addWidget(otherclassname_);
+ QWidget *w = new QWidget(this);
+ w->setFixedWidth(20);
+ QHBoxLayout *m3 = new QHBoxLayout(0, 0, 0);
+ m1->addLayout(m3, 3, 1);
+ m3->addWidget(w);
+ m3->addWidget(classoverride_);
+}
+
+bool CupsdServerPage::loadConfig(CupsdConf *conf, QString&)
+{
+ conf_ = conf;
+ servername_->setText(conf_->servername_);
+ serveradmin_->setText(conf_->serveradmin_);
+ classification_->setCurrentItem(conf_->classification_);
+ classChanged(conf_->classification_);
+ if (conf->classification_ != CLASS_NONE)
+ classoverride_->setChecked(conf_->classoverride_);
+ if (conf->classification_ == CLASS_OTHER)
+ otherclassname_->setText(conf_->otherclassname_);
+ int index = findComboItem(charset_, conf_->charset_.upper());
+ if (index != -1)
+ charset_->setCurrentItem(index);
+ language_->setText(conf_->language_);
+ printcap_->setText(conf_->printcap_);
+ printcapformat_->setCurrentItem(conf_->printcapformat_);
+
+ return true;
+}
+
+bool CupsdServerPage::saveConfig(CupsdConf *conf, QString&)
+{
+ conf->servername_ = servername_->text();
+ conf->serveradmin_ = serveradmin_->text();
+ conf->classification_ = classification_->currentItem();
+ if (conf->classification_ != CLASS_NONE)
+ conf->classoverride_ = classoverride_->isChecked();
+ if (conf->classification_ == CLASS_OTHER)
+ conf->otherclassname_ = otherclassname_->text();
+ conf->charset_ = charset_->currentText();
+ conf->language_ = language_->text();
+ conf->printcap_ = printcap_->text();
+ conf->printcapformat_ = printcapformat_->currentItem();
+
+ return true;
+}
+
+void CupsdServerPage::setInfos(CupsdConf *conf)
+{
+ QWhatsThis::add(servername_, conf->comments_.toolTip("servername"));
+ QWhatsThis::add(serveradmin_, conf->comments_.toolTip("serveradmin"));
+ QWhatsThis::add(classification_, conf->comments_.toolTip("classification"));
+ QWhatsThis::add(classoverride_, conf->comments_.toolTip("classifyoverride"));
+ QWhatsThis::add(charset_, conf->comments_.toolTip("defaultcharset"));
+ QWhatsThis::add(language_, conf->comments_.toolTip("defaultlanguage"));
+ QWhatsThis::add(printcap_, conf->comments_.toolTip("printcap"));
+ QWhatsThis::add(printcapformat_, conf->comments_.toolTip("printcapformat"));
+}
+
+void CupsdServerPage::classChanged(int index)
+{
+ classoverride_->setEnabled(index != 0);
+ otherclassname_->setEnabled(index == CLASS_OTHER);
+}
+
+#include "cupsdserverpage.moc"
diff --git a/kdeprint/cups/cupsdconf2/cupsdserverpage.h b/kdeprint/cups/cupsdconf2/cupsdserverpage.h
new file mode 100644
index 000000000..d82367c30
--- /dev/null
+++ b/kdeprint/cups/cupsdconf2/cupsdserverpage.h
@@ -0,0 +1,49 @@
+/*
+ * This file is part of the KDE libraries
+ * Copyright (c) 2001 Michael Goffioul <[email protected]>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License version 2 as published by the Free Software Foundation.
+ *
+ * This library 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
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB. If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ **/
+
+#ifndef CUPSDSERVERPAGE_H
+#define CUPSDSERVERPAGE_H
+
+#include "cupsdpage.h"
+
+class QLineEdit;
+class QCheckBox;
+class QComboBox;
+
+class CupsdServerPage : public CupsdPage
+{
+ Q_OBJECT
+
+public:
+ CupsdServerPage(QWidget *parent = 0, const char *name = 0);
+
+ bool loadConfig(CupsdConf*, QString&);
+ bool saveConfig(CupsdConf*, QString&);
+ void setInfos(CupsdConf*);
+
+protected slots:
+ void classChanged(int);
+
+private:
+ QLineEdit *servername_, *serveradmin_, *language_, *printcap_, *otherclassname_;
+ QComboBox *classification_, *charset_, *printcapformat_;
+ QCheckBox *classoverride_;
+};
+
+#endif
diff --git a/kdeprint/cups/cupsdconf2/cupsdsplash.cpp b/kdeprint/cups/cupsdconf2/cupsdsplash.cpp
new file mode 100644
index 000000000..7a623e972
--- /dev/null
+++ b/kdeprint/cups/cupsdconf2/cupsdsplash.cpp
@@ -0,0 +1,73 @@
+/*
+ * This file is part of the KDE libraries
+ * Copyright (c) 2001 Michael Goffioul <[email protected]>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License version 2 as published by the Free Software Foundation.
+ *
+ * This library 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
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB. If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ **/
+
+#include "cupsdsplash.h"
+
+#include <qlabel.h>
+#include <qpixmap.h>
+#include <qlayout.h>
+#include <klocale.h>
+#include <kstandarddirs.h>
+
+CupsdSplash::CupsdSplash(QWidget *parent, const char *name)
+ : CupsdPage(parent, name)
+{
+ setHeader(i18n("Welcome to the CUPS Server Configuration Tool"));
+ setPageLabel(i18n("Welcome"));
+ setPixmap("go");
+
+ QVBoxLayout *main_ = new QVBoxLayout(this, 10, 10);
+ QHBoxLayout *sub_ = new QHBoxLayout(0, 0, 10);
+ main_->addLayout(sub_);
+
+ QLabel *cupslogo_ = new QLabel(this);
+ QString logopath = locate("data", QString("kdeprint/cups_logo.png"));
+ cupslogo_->setPixmap(logopath.isEmpty() ? QPixmap() : QPixmap(logopath));
+ cupslogo_->setAlignment(Qt::AlignCenter);
+ QLabel *kupslogo_ = new QLabel(this);
+ logopath = locate("data", QString("kdeprint/kde_logo.png"));
+ kupslogo_->setPixmap(logopath.isEmpty() ? QPixmap() : QPixmap(logopath));
+ kupslogo_->setAlignment(Qt::AlignCenter);
+
+ QLabel *helptxt_ = new QLabel(this);
+ helptxt_->setText(i18n( "<p>This tool will help you to configure graphically the server of the CUPS printing system. "
+ "The available options are grouped into sets of related topics and can be accessed "
+ "quickly through the icon view located on the left. Each option has a default value that is "
+ "shown if it has not been previously set. This default value should be OK in most cases.</p><br>"
+ "<p>You can access a short help message for each option using either the '?' button in the "
+ "the title bar, or the button at the bottom of this dialog.</p>"));
+
+ sub_->addWidget(cupslogo_);
+ sub_->addWidget(kupslogo_);
+ main_->addWidget(helptxt_, 1);
+}
+
+CupsdSplash::~CupsdSplash()
+{
+}
+
+bool CupsdSplash::loadConfig(CupsdConf*, QString&)
+{
+ return true;
+}
+
+bool CupsdSplash::saveConfig(CupsdConf*, QString&)
+{
+ return true;
+}
diff --git a/kdeprint/cups/cupsdconf2/cupsdsplash.h b/kdeprint/cups/cupsdconf2/cupsdsplash.h
new file mode 100644
index 000000000..ed548948d
--- /dev/null
+++ b/kdeprint/cups/cupsdconf2/cupsdsplash.h
@@ -0,0 +1,35 @@
+/*
+ * This file is part of the KDE libraries
+ * Copyright (c) 2001 Michael Goffioul <[email protected]>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License version 2 as published by the Free Software Foundation.
+ *
+ * This library 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
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB. If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ **/
+
+#ifndef CUPSDSPLASH_H
+#define CUPSDSPLASH_H
+
+#include "cupsdpage.h"
+
+class CupsdSplash : public CupsdPage
+{
+public:
+ CupsdSplash(QWidget *parent = 0, const char *name = 0);
+ ~CupsdSplash();
+
+ bool loadConfig(CupsdConf *conf, QString& msg);
+ bool saveConfig(CupsdConf *conf, QString& msg);
+};
+
+#endif
diff --git a/kdeprint/cups/cupsdconf2/editlist.cpp b/kdeprint/cups/cupsdconf2/editlist.cpp
new file mode 100644
index 000000000..4c924dbb4
--- /dev/null
+++ b/kdeprint/cups/cupsdconf2/editlist.cpp
@@ -0,0 +1,124 @@
+/*
+ * This file is part of the KDE libraries
+ * Copyright (c) 2001 Michael Goffioul <[email protected]>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License version 2 as published by the Free Software Foundation.
+ *
+ * This library 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
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB. If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ **/
+
+#include "editlist.h"
+
+#include <klistbox.h>
+#include <kpushbutton.h>
+#include <qlayout.h>
+#include <klocale.h>
+#include <kiconloader.h>
+#include <kguiitem.h>
+
+EditList::EditList(QWidget *parent, const char *name)
+ : QWidget(parent, name)
+{
+ list_ = new KListBox(this);
+ addbtn_ = new KPushButton(KGuiItem(i18n("Add..."), "filenew"), this);
+ editbtn_ = new KPushButton(KGuiItem(i18n("Edit..."), "edit"), this);
+ delbtn_ = new KPushButton(KGuiItem(i18n("Delete"), "editdelete"), this);
+ defbtn_ = new KPushButton(KGuiItem(i18n("Default List"), "history"), this);
+
+ QGridLayout *m1 = new QGridLayout(this, 4, 2, 0, 0);
+ m1->setColStretch(0, 1);
+ m1->addMultiCellWidget(list_, 0, 3, 0, 1);
+ m1->addWidget(addbtn_, 0, 1);
+ m1->addWidget(editbtn_, 1, 1);
+ m1->addWidget(delbtn_, 2, 1);
+ m1->addWidget(defbtn_, 3, 1);
+
+ connect(addbtn_, SIGNAL(clicked()), SIGNAL(add()));
+ connect(editbtn_, SIGNAL(clicked()), SLOT(slotEdit()));
+ connect(delbtn_, SIGNAL(clicked()), SLOT(slotDelete()));
+ connect(defbtn_, SIGNAL(clicked()), SIGNAL(defaultList()));
+ connect(list_, SIGNAL(highlighted(int)), SLOT(slotSelected(int)));
+ slotSelected(-1);
+}
+
+void EditList::slotEdit()
+{
+ int index = list_->currentItem();
+ if (index >= 0)
+ emit edit(index);
+}
+
+void EditList::slotDelete()
+{
+ int index = list_->currentItem();
+ list_->removeItem(index);
+ slotSelected((list_->count() > 0 ? list_->currentItem() : -1));
+ emit deleted(index);
+}
+
+void EditList::slotSelected(int index)
+{
+ editbtn_->setEnabled(index >= 0);
+ delbtn_->setEnabled(index >= 0);
+}
+
+QString EditList::text(int index)
+{
+ return list_->text(index);
+}
+
+void EditList::setText(int index, const QString& s)
+{
+ if (list_->text(index) != s)
+ {
+ QListBoxItem *it = list_->findItem(s, Qt::ExactMatch);
+ if (!it)
+ list_->changeItem(s, index);
+ else
+ list_->removeItem(index);
+ }
+}
+
+void EditList::clear()
+{
+ list_->clear();
+ slotSelected(-1);
+}
+
+void EditList::insertItem(const QString& s)
+{
+ if (!list_->findItem(s, Qt::ExactMatch))
+ list_->insertItem(s);
+}
+
+void EditList::insertItem(const QPixmap& icon, const QString& s)
+{
+ if (!list_->findItem(s, Qt::ExactMatch))
+ list_->insertItem(icon, s);
+}
+
+void EditList::insertItems(const QStringList& l)
+{
+ for (QStringList::ConstIterator it=l.begin(); it!=l.end(); ++it)
+ insertItem(*it);
+}
+
+QStringList EditList::items()
+{
+ QStringList l;
+ for (uint i=0; i<list_->count(); i++)
+ l << list_->text(i);
+ return l;
+}
+
+#include "editlist.moc"
diff --git a/kdeprint/cups/cupsdconf2/editlist.h b/kdeprint/cups/cupsdconf2/editlist.h
new file mode 100644
index 000000000..773667304
--- /dev/null
+++ b/kdeprint/cups/cupsdconf2/editlist.h
@@ -0,0 +1,60 @@
+/*
+ * This file is part of the KDE libraries
+ * Copyright (c) 2001 Michael Goffioul <[email protected]>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License version 2 as published by the Free Software Foundation.
+ *
+ * This library 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
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB. If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ **/
+
+#ifndef EDITLIST_H
+#define EDITLIST_H
+
+#include <qwidget.h>
+#include <qpixmap.h>
+
+class KListBox;
+class QPushButton;
+
+class EditList : public QWidget
+{
+ Q_OBJECT
+
+public:
+ EditList(QWidget *parent = 0, const char *name = 0);
+
+ QString text(int);
+ void setText(int, const QString&);
+ void insertItem(const QString&);
+ void insertItem(const QPixmap&, const QString&);
+ void insertItems(const QStringList&);
+ QStringList items();
+ void clear();
+
+signals:
+ void add();
+ void edit(int);
+ void defaultList();
+ void deleted(int);
+
+protected slots:
+ void slotDelete();
+ void slotEdit();
+ void slotSelected(int);
+
+private:
+ KListBox *list_;
+ QPushButton *addbtn_, *editbtn_, *delbtn_, *defbtn_;
+};
+
+#endif
diff --git a/kdeprint/cups/cupsdconf2/kde_logo.png b/kdeprint/cups/cupsdconf2/kde_logo.png
new file mode 100644
index 000000000..6ba204607
--- /dev/null
+++ b/kdeprint/cups/cupsdconf2/kde_logo.png
Binary files differ
diff --git a/kdeprint/cups/cupsdconf2/locationdialog.cpp b/kdeprint/cups/cupsdconf2/locationdialog.cpp
new file mode 100644
index 000000000..fc5c55076
--- /dev/null
+++ b/kdeprint/cups/cupsdconf2/locationdialog.cpp
@@ -0,0 +1,222 @@
+/*
+ * This file is part of the KDE libraries
+ * Copyright (c) 2001 Michael Goffioul <[email protected]>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License version 2 as published by the Free Software Foundation.
+ *
+ * This library 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
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB. If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ **/
+
+#include "locationdialog.h"
+#include "cupsdconf.h"
+#include "editlist.h"
+#include "addressdialog.h"
+
+#include <qlineedit.h>
+#include <qcombobox.h>
+#include <qlayout.h>
+#include <qlabel.h>
+#include <qpushbutton.h>
+#include <qwhatsthis.h>
+
+#include <klocale.h>
+#include <kiconloader.h>
+
+LocationDialog::LocationDialog(QWidget *parent, const char *name)
+ : KDialogBase(parent, name, true, QString::null, Ok|Cancel, Ok, true)
+{
+ QWidget *dummy = new QWidget(this);
+ setMainWidget(dummy);
+ resource_ = new QComboBox(dummy);
+ authtype_ = new QComboBox(dummy);
+ authclass_ = new QComboBox(dummy);
+ authname_ = new QLineEdit(dummy);
+ encryption_ = new QComboBox(dummy);
+ satisfy_ = new QComboBox(dummy);
+ order_ = new QComboBox(dummy);
+ addresses_ = new EditList(dummy);
+
+ authtype_->insertItem(i18n("None"));
+ authtype_->insertItem(i18n("Basic"));
+ authtype_->insertItem(i18n("Digest"));
+
+ authclass_->insertItem(i18n("None"));
+ authclass_->insertItem(i18n("User"));
+ authclass_->insertItem(i18n("System"));
+ authclass_->insertItem(i18n("Group"));
+
+ encryption_->insertItem(i18n("Always"));
+ encryption_->insertItem(i18n("Never"));
+ encryption_->insertItem(i18n("Required"));
+ encryption_->insertItem(i18n("If Requested"));
+
+ satisfy_->insertItem(i18n("All"));
+ satisfy_->insertItem(i18n("Any"));
+
+ order_->insertItem(i18n("Allow, Deny"));
+ order_->insertItem(i18n("Deny, Allow"));
+
+ connect(authclass_, SIGNAL(activated(int)), SLOT(slotClassChanged(int)));
+ connect(authtype_, SIGNAL(activated(int)), SLOT(slotTypeChanged(int)));
+
+ QLabel *l1 = new QLabel(i18n("Resource:"), dummy);
+ QLabel *l2 = new QLabel(i18n("Authentication:"), dummy);
+ QLabel *l3 = new QLabel(i18n("Class:"), dummy);
+ QLabel *l4 = new QLabel(i18n("Names:"), dummy);
+ QLabel *l5 = new QLabel(i18n("Encryption:"), dummy);
+ QLabel *l6 = new QLabel(i18n("Satisfy:"), dummy);
+ QLabel *l7 = new QLabel(i18n("ACL order:"), dummy);
+ QLabel *l8 = new QLabel(i18n("ACL addresses:"),dummy);
+
+ QGridLayout *m1 = new QGridLayout(dummy, 8, 2, 0, 5);
+ m1->setColStretch(1, 1);
+ m1->addWidget(l1, 0, 0, Qt::AlignRight);
+ m1->addWidget(l2, 1, 0, Qt::AlignRight);
+ m1->addWidget(l3, 2, 0, Qt::AlignRight);
+ m1->addWidget(l4, 3, 0, Qt::AlignRight);
+ m1->addWidget(l5, 4, 0, Qt::AlignRight);
+ m1->addWidget(l6, 5, 0, Qt::AlignRight);
+ m1->addWidget(l7, 6, 0, Qt::AlignRight);
+ m1->addWidget(l8, 7, 0, Qt::AlignRight|Qt::AlignTop);
+ m1->addWidget(resource_, 0, 1);
+ m1->addWidget(authtype_, 1, 1);
+ m1->addWidget(authclass_, 2, 1);
+ m1->addWidget(authname_, 3, 1);
+ m1->addWidget(encryption_, 4, 1);
+ m1->addWidget(satisfy_, 5, 1);
+ m1->addWidget(order_, 6, 1);
+ m1->addWidget(addresses_, 7, 1);
+
+ setCaption(i18n("Location"));
+ resize(400, 100);
+
+ slotTypeChanged(AUTHTYPE_NONE);
+ slotClassChanged(AUTHCLASS_ANONYMOUS);
+ encryption_->setCurrentItem(ENCRYPT_IFREQUESTED);
+
+ connect(addresses_, SIGNAL(add()), SLOT(slotAdd()));
+ connect(addresses_, SIGNAL(edit(int)), SLOT(slotEdit(int)));
+ connect(addresses_, SIGNAL(defaultList()), SLOT(slotDefaultList()));
+}
+
+void LocationDialog::setInfos(CupsdConf *conf)
+{
+ conf_ = conf;
+
+ QPtrListIterator<CupsResource> it(conf->resources_);
+ for (; it.current(); ++it)
+ resource_->insertItem(SmallIcon(it.current()->typeToIconName(it.current()->type_)), it.current()->text_);
+
+ QWhatsThis::add(encryption_, conf_->comments_.toolTip("encryption"));
+ QWhatsThis::add(order_, conf_->comments_.toolTip("order"));
+ QWhatsThis::add(authclass_, conf_->comments_.toolTip("authclass"));
+ QWhatsThis::add(authtype_, conf_->comments_.toolTip("authtype"));
+ QWhatsThis::add(authname_, conf_->comments_.toolTip("authname"));
+ QWhatsThis::add(satisfy_, conf_->comments_.toolTip("satisfy"));
+ QWhatsThis::add(addresses_, conf_->comments_.toolTip("allowdeny"));
+}
+
+void LocationDialog::fillLocation(CupsLocation *loc)
+{
+ loc->resource_ = conf_->resources_.at(resource_->currentItem());
+ loc->resourcename_ = loc->resource_->path_;
+ loc->authtype_ = authtype_->currentItem();
+ loc->authclass_ = (loc->authtype_ == AUTHTYPE_NONE ? AUTHCLASS_ANONYMOUS : authclass_->currentItem());
+ loc->authname_ = (loc->authclass_ == AUTHCLASS_USER || loc->authclass_ == AUTHCLASS_GROUP ? authname_->text() : QString::null);
+ loc->encryption_ = encryption_->currentItem();
+ loc->satisfy_ = satisfy_->currentItem();
+ loc->order_ = order_->currentItem();
+ loc->addresses_ = addresses_->items();
+}
+
+void LocationDialog::setLocation(CupsLocation *loc)
+{
+ int index = conf_->resources_.findRef(loc->resource_);
+ resource_->setCurrentItem(index);
+ authtype_->setCurrentItem(loc->authtype_);
+ authclass_->setCurrentItem(loc->authclass_);
+ authname_->setText(loc->authname_);
+ encryption_->setCurrentItem(loc->encryption_);
+ satisfy_->setCurrentItem(loc->satisfy_);
+ order_->setCurrentItem(loc->order_);
+ addresses_->insertItems(loc->addresses_);
+
+ slotTypeChanged(loc->authtype_);
+ slotClassChanged(loc->authclass_);
+}
+
+void LocationDialog::slotTypeChanged(int index)
+{
+ authclass_->setEnabled(index != AUTHTYPE_NONE);
+ if (index != AUTHTYPE_NONE)
+ slotClassChanged(authclass_->currentItem());
+ else
+ authname_->setEnabled(false);
+}
+
+void LocationDialog::slotClassChanged(int index)
+{
+ authname_->setEnabled((index == AUTHCLASS_USER || index == AUTHCLASS_GROUP));
+}
+
+bool LocationDialog::newLocation(CupsLocation *loc, QWidget *parent, CupsdConf *conf)
+{
+ LocationDialog dlg(parent);
+ if (conf)
+ dlg.setInfos(conf);
+ if (dlg.exec())
+ {
+ dlg.fillLocation(loc);
+ return true;
+ }
+ else
+ return false;
+}
+
+bool LocationDialog::editLocation(CupsLocation *loc, QWidget *parent, CupsdConf *conf)
+{
+ LocationDialog dlg(parent);
+ if (conf)
+ dlg.setInfos(conf);
+ dlg.setLocation(loc);
+ dlg.resource_->setEnabled(false);
+ if (dlg.exec())
+ {
+ dlg.fillLocation(loc);
+ return true;
+ }
+ else
+ return false;
+}
+
+void LocationDialog::slotAdd()
+{
+ QString addr = AddressDialog::newAddress(this);
+ if (!addr.isEmpty())
+ addresses_->insertItem(addr);
+}
+
+void LocationDialog::slotEdit(int index)
+{
+ QString addr = addresses_->text(index);
+ addr = AddressDialog::editAddress(addr, this);
+ if (!addr.isEmpty())
+ addresses_->insertItem(addr);
+}
+
+void LocationDialog::slotDefaultList()
+{
+ addresses_->clear();
+}
+
+#include "locationdialog.moc"
diff --git a/kdeprint/cups/cupsdconf2/locationdialog.h b/kdeprint/cups/cupsdconf2/locationdialog.h
new file mode 100644
index 000000000..5ca8c4d53
--- /dev/null
+++ b/kdeprint/cups/cupsdconf2/locationdialog.h
@@ -0,0 +1,58 @@
+/*
+ * This file is part of the KDE libraries
+ * Copyright (c) 2001 Michael Goffioul <[email protected]>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License version 2 as published by the Free Software Foundation.
+ *
+ * This library 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
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB. If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ **/
+
+#ifndef LOCATIONDIALOG_H
+#define LOCATIONDIALOG_H
+
+#include <kdialogbase.h>
+
+class QComboBox;
+class QLineEdit;
+class EditList;
+struct CupsdConf;
+struct CupsLocation;
+
+class LocationDialog : public KDialogBase
+{
+ Q_OBJECT
+public:
+ LocationDialog(QWidget *parent = 0, const char *name = 0);
+
+ void setInfos(CupsdConf*);
+ void fillLocation(CupsLocation*);
+ void setLocation(CupsLocation*);
+
+ static bool newLocation(CupsLocation*, QWidget *parent = 0, CupsdConf *conf = 0);
+ static bool editLocation(CupsLocation*, QWidget *parent = 0, CupsdConf *conf = 0);
+
+protected slots:
+ void slotTypeChanged(int);
+ void slotClassChanged(int);
+ void slotAdd();
+ void slotEdit(int);
+ void slotDefaultList();
+
+private:
+ QComboBox *resource_, *authtype_, *authclass_, *encryption_, *satisfy_, *order_;
+ QLineEdit *authname_;
+ EditList *addresses_;
+ CupsdConf *conf_;
+};
+
+#endif
diff --git a/kdeprint/cups/cupsdconf2/main.cpp b/kdeprint/cups/cupsdconf2/main.cpp
new file mode 100644
index 000000000..e8fd3df6a
--- /dev/null
+++ b/kdeprint/cups/cupsdconf2/main.cpp
@@ -0,0 +1,48 @@
+/*
+ * This file is part of the KDE libraries
+ * Copyright (c) 2001 Michael Goffioul <[email protected]>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License version 2 as published by the Free Software Foundation.
+ *
+ * This library 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
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB. If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ **/
+
+#include "cupsddialog.h"
+
+#include <qfile.h>
+#include <klocale.h>
+#include <kcmdlineargs.h>
+#include <kapplication.h>
+
+static KCmdLineOptions options[] =
+{
+ { "+[file]", I18N_NOOP("Configuration file to load"), 0},
+ KCmdLineLastOption
+};
+
+extern "C" KDE_EXPORT int kdemain(int argc, char *argv[])
+{
+ KCmdLineArgs::init(argc,argv,"cupsdconf",
+ I18N_NOOP("A CUPS configuration tool"),
+ I18N_NOOP("A CUPS configuration tool"),"0.0.1");
+ KCmdLineArgs::addCmdLineOptions(options);
+ KApplication app;
+ KCmdLineArgs *args = KCmdLineArgs::parsedArgs();
+
+ KURL configfile;
+ if (args->count() > 0)
+ CupsdDialog::configure(args->url(0).path());
+ else
+ CupsdDialog::configure();
+ return (0);
+}
diff --git a/kdeprint/cups/cupsdconf2/portdialog.cpp b/kdeprint/cups/cupsdconf2/portdialog.cpp
new file mode 100644
index 000000000..f866450b8
--- /dev/null
+++ b/kdeprint/cups/cupsdconf2/portdialog.cpp
@@ -0,0 +1,118 @@
+/*
+ * This file is part of the KDE libraries
+ * Copyright (c) 2001 Michael Goffioul <[email protected]>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License version 2 as published by the Free Software Foundation.
+ *
+ * This library 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
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB. If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ **/
+
+#include "portdialog.h"
+#include "cupsdconf.h"
+
+#include <qlineedit.h>
+#include <qspinbox.h>
+#include <qcheckbox.h>
+#include <qpushbutton.h>
+#include <qlabel.h>
+#include <qlayout.h>
+#include <qwhatsthis.h>
+
+#include <klocale.h>
+
+PortDialog::PortDialog(QWidget *parent, const char *name)
+ : KDialogBase(parent, name, true, QString::null, Ok|Cancel, Ok, true)
+{
+ QWidget *dummy = new QWidget(this);
+ setMainWidget(dummy);
+ address_ = new QLineEdit(dummy);
+ port_ = new QSpinBox(0, 9999, 1, dummy);
+ port_->setValue(631);
+ usessl_ = new QCheckBox(i18n("Use SSL encryption"), dummy);
+
+ QLabel *l1 = new QLabel(i18n("Address:"), dummy);
+ QLabel *l2 = new QLabel(i18n("Port:"), dummy);
+
+ QVBoxLayout *m1 = new QVBoxLayout(dummy, 0, 10);
+ QGridLayout *m2 = new QGridLayout(0, 3, 2, 0, 5);
+ m1->addLayout(m2);
+ m2->addWidget(l1, 0, 0, Qt::AlignRight);
+ m2->addWidget(l2, 1, 0, Qt::AlignRight);
+ m2->addMultiCellWidget(usessl_, 2, 2, 0, 1);
+ m2->addWidget(address_, 0, 1);
+ m2->addWidget(port_, 1, 1);
+
+ setCaption(i18n("Listen To"));
+ resize(250, 100);
+}
+
+QString PortDialog::listenString()
+{
+ QString s;
+ if (usessl_->isChecked())
+ s.append("SSLListen ");
+ else
+ s.append("Listen ");
+ if (!address_->text().isEmpty())
+ s.append(address_->text());
+ else
+ s.append("*");
+ s.append(":").append(port_->text());
+ return s;
+}
+
+void PortDialog::setInfos(CupsdConf *conf)
+{
+ QWhatsThis::add(address_, conf->comments_.toolTip("address"));
+ QWhatsThis::add(port_, conf->comments_.toolTip("port"));
+ QWhatsThis::add(usessl_, conf->comments_.toolTip("usessl"));
+}
+
+QString PortDialog::newListen(QWidget *parent, CupsdConf *conf)
+{
+ PortDialog dlg(parent);
+ dlg.setInfos(conf);
+ if (dlg.exec())
+ {
+ return dlg.listenString();
+ }
+ return QString::null;
+}
+
+QString PortDialog::editListen(const QString& s, QWidget *parent, CupsdConf *conf)
+{
+ PortDialog dlg(parent);
+ dlg.setInfos(conf);
+ int p = s.find(' ');
+ if (p != -1)
+ {
+ dlg.usessl_->setChecked(s.left(p).startsWith("SSL"));
+ QString addr = s.mid(p+1).stripWhiteSpace();
+ int p1 = addr.find(':');
+ if (p1 == -1)
+ {
+ dlg.address_->setText(addr);
+ dlg.port_->setValue(631);
+ }
+ else
+ {
+ dlg.address_->setText(addr.left(p1));
+ dlg.port_->setValue(addr.mid(p1+1).toInt());
+ }
+ }
+ if (dlg.exec())
+ {
+ return dlg.listenString();
+ }
+ return QString::null;
+}
diff --git a/kdeprint/cups/cupsdconf2/portdialog.h b/kdeprint/cups/cupsdconf2/portdialog.h
new file mode 100644
index 000000000..8f0b9f3e9
--- /dev/null
+++ b/kdeprint/cups/cupsdconf2/portdialog.h
@@ -0,0 +1,46 @@
+/*
+ * This file is part of the KDE libraries
+ * Copyright (c) 2001 Michael Goffioul <[email protected]>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License version 2 as published by the Free Software Foundation.
+ *
+ * This library 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
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB. If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ **/
+
+#ifndef PORTDIALOG_H
+#define PORTDIALOG_H
+
+#include <kdialogbase.h>
+
+class QLineEdit;
+class QSpinBox;
+class QCheckBox;
+struct CupsdConf;
+
+class PortDialog : public KDialogBase
+{
+public:
+ PortDialog(QWidget *parent = 0, const char *name = 0);
+
+ QString listenString();
+ void setInfos(CupsdConf*);
+ static QString newListen(QWidget *parent = 0, CupsdConf *conf = 0);
+ static QString editListen(const QString& s, QWidget *parent = 0, CupsdConf *conf = 0);
+
+private:
+ QLineEdit *address_;
+ QSpinBox *port_;
+ QCheckBox *usessl_;
+};
+
+#endif
diff --git a/kdeprint/cups/cupsdconf2/qdirlineedit.cpp b/kdeprint/cups/cupsdconf2/qdirlineedit.cpp
new file mode 100644
index 000000000..931d6ac4a
--- /dev/null
+++ b/kdeprint/cups/cupsdconf2/qdirlineedit.cpp
@@ -0,0 +1,73 @@
+/*
+ * This file is part of the KDE libraries
+ * Copyright (c) 2001 Michael Goffioul <[email protected]>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License version 2 as published by the Free Software Foundation.
+ *
+ * This library 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
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB. If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ **/
+
+#include "qdirlineedit.h"
+
+#include <qlineedit.h>
+#include <qlayout.h>
+#include <kpushbutton.h>
+#include <kfiledialog.h>
+#include <kiconloader.h>
+
+QDirLineEdit::QDirLineEdit(bool file, QWidget *parent, const char *name)
+ : QWidget(parent, name)
+{
+ edit_ = new QLineEdit(this);
+ button_ = new KPushButton(this);
+ button_->setPixmap(SmallIcon("fileopen"));
+ connect(button_,SIGNAL(clicked()),SLOT(buttonClicked()));
+
+ QHBoxLayout *main_ = new QHBoxLayout(this, 0, 3);
+ main_->addWidget(edit_);
+ main_->addWidget(button_);
+
+ fileedit_ = file;
+}
+
+QDirLineEdit::~QDirLineEdit()
+{
+}
+
+void QDirLineEdit::setURL(const QString& txt)
+{
+ edit_->setText(txt);
+}
+
+QString QDirLineEdit::url()
+{
+ return edit_->text();
+}
+
+void QDirLineEdit::buttonClicked()
+{
+ QString dirname;
+ if (!fileedit_)
+ dirname = KFileDialog::getExistingDirectory(edit_->text(), this);
+ else
+ dirname = KFileDialog::getOpenFileName(edit_->text(), QString::null, this);
+ if (!dirname.isEmpty())
+ edit_->setText(dirname);
+}
+
+void QDirLineEdit::setFileEdit(bool on)
+{
+ fileedit_ = on;
+}
+
+#include "qdirlineedit.moc"
diff --git a/kdeprint/cups/cupsdconf2/qdirlineedit.h b/kdeprint/cups/cupsdconf2/qdirlineedit.h
new file mode 100644
index 000000000..b4b977b75
--- /dev/null
+++ b/kdeprint/cups/cupsdconf2/qdirlineedit.h
@@ -0,0 +1,49 @@
+/*
+ * This file is part of the KDE libraries
+ * Copyright (c) 2001 Michael Goffioul <[email protected]>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License version 2 as published by the Free Software Foundation.
+ *
+ * This library 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
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB. If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ **/
+
+#ifndef QDIRLINEEDIT_H
+#define QDIRLINEEDIT_H
+
+#include <qwidget.h>
+#include <qstring.h>
+
+class QLineEdit;
+class QPushButton;
+
+class QDirLineEdit : public QWidget
+{
+ Q_OBJECT
+public:
+ QDirLineEdit(bool file, QWidget *parent = 0, const char *name = 0);
+ ~QDirLineEdit();
+
+ void setURL(const QString& txt);
+ QString url();
+ void setFileEdit(bool on = true);
+
+private slots:
+ void buttonClicked();
+
+private:
+ QLineEdit *edit_;
+ QPushButton *button_;
+ bool fileedit_;
+};
+
+#endif
diff --git a/kdeprint/cups/cupsdconf2/qdirmultilineedit.cpp b/kdeprint/cups/cupsdconf2/qdirmultilineedit.cpp
new file mode 100644
index 000000000..31a544e91
--- /dev/null
+++ b/kdeprint/cups/cupsdconf2/qdirmultilineedit.cpp
@@ -0,0 +1,109 @@
+/*
+ * This file is part of the KDE libraries
+ * Copyright (c) 2001-2002 Michael Goffioul <[email protected]>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License version 2 as published by the Free Software Foundation.
+ *
+ * This library 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
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB. If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ **/
+
+#include "qdirmultilineedit.h"
+
+#include <qlayout.h>
+#include <qheader.h>
+#include <qpushbutton.h>
+#include <klistview.h>
+#include <klocale.h>
+#include <kfiledialog.h>
+#include <kiconloader.h>
+
+QDirMultiLineEdit::QDirMultiLineEdit(QWidget *parent, const char *name)
+: QWidget(parent, name)
+{
+ m_view = new KListView(this);
+ m_view->header()->hide();
+ m_view->addColumn("");
+ m_view->setFullWidth(true);
+ connect(m_view, SIGNAL(selectionChanged(QListViewItem*)), SLOT(slotSelected(QListViewItem*)));
+
+ m_add = new QPushButton(this);
+ m_add->setPixmap(SmallIcon("folder_new"));
+ connect(m_add, SIGNAL(clicked()), SLOT(slotAddClicked()));
+ m_remove = new QPushButton(this);
+ m_remove->setPixmap(SmallIcon("editdelete"));
+ connect(m_remove, SIGNAL(clicked()), SLOT(slotRemoveClicked()));
+ m_remove->setEnabled(false);
+
+ m_view->setFixedHeight(QMAX(m_view->fontMetrics().lineSpacing()*3+m_view->lineWidth()*2, m_add->sizeHint().height()*2));
+
+ QHBoxLayout *l0 = new QHBoxLayout(this, 0, 3);
+ QVBoxLayout *l1 = new QVBoxLayout(0, 0, 0);
+ l0->addWidget(m_view);
+ l0->addLayout(l1);
+ l1->addWidget(m_add);
+ l1->addWidget(m_remove);
+ l1->addStretch(1);
+}
+
+QDirMultiLineEdit::~QDirMultiLineEdit()
+{
+}
+
+void QDirMultiLineEdit::setURLs(const QStringList& urls)
+{
+ m_view->clear();
+ for (QStringList::ConstIterator it=urls.begin(); it!=urls.end(); ++it)
+ addURL(*it);
+}
+
+QStringList QDirMultiLineEdit::urls()
+{
+ QListViewItem *item = m_view->firstChild();
+ QStringList l;
+ while (item)
+ {
+ l << item->text(0);
+ item = item->nextSibling();
+ }
+ return l;
+}
+
+void QDirMultiLineEdit::addURL(const QString& url)
+{
+ QListViewItem *item = new QListViewItem(m_view, url);
+ item->setRenameEnabled(0, true);
+}
+
+void QDirMultiLineEdit::slotAddClicked()
+{
+ QString dirname = KFileDialog::getExistingDirectory(QString::null, this);
+ if (!dirname.isEmpty())
+ addURL(dirname);
+}
+
+void QDirMultiLineEdit::slotRemoveClicked()
+{
+ QListViewItem *item = m_view->currentItem();
+ if (item)
+ {
+ delete item;
+ slotSelected(m_view->currentItem());
+ }
+}
+
+void QDirMultiLineEdit::slotSelected(QListViewItem *item)
+{
+ m_remove->setEnabled((item != NULL));
+}
+
+#include "qdirmultilineedit.moc"
diff --git a/kdeprint/cups/cupsdconf2/qdirmultilineedit.h b/kdeprint/cups/cupsdconf2/qdirmultilineedit.h
new file mode 100644
index 000000000..963292985
--- /dev/null
+++ b/kdeprint/cups/cupsdconf2/qdirmultilineedit.h
@@ -0,0 +1,53 @@
+/*
+ * This file is part of the KDE libraries
+ * Copyright (c) 2001-2002 Michael Goffioul <[email protected]>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License version 2 as published by the Free Software Foundation.
+ *
+ * This library 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
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB. If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ **/
+
+#ifndef QDIRMULTILINEEDIT_H
+#define QDIRMULTILINEEDIT_H
+
+#include <qwidget.h>
+
+class KListView;
+class QListViewItem;
+class QPushButton;
+
+class QDirMultiLineEdit : public QWidget
+{
+ Q_OBJECT
+
+public:
+ QDirMultiLineEdit(QWidget *parent = 0, const char *name = 0);
+ ~QDirMultiLineEdit();
+
+ void setURLs(const QStringList&);
+ QStringList urls();
+
+protected:
+ void addURL(const QString&);
+
+private slots:
+ void slotAddClicked();
+ void slotRemoveClicked();
+ void slotSelected(QListViewItem*);
+
+private:
+ KListView *m_view;
+ QPushButton *m_add, *m_remove;
+};
+
+#endif
diff --git a/kdeprint/cups/cupsdconf2/sizewidget.cpp b/kdeprint/cups/cupsdconf2/sizewidget.cpp
new file mode 100644
index 000000000..c61996282
--- /dev/null
+++ b/kdeprint/cups/cupsdconf2/sizewidget.cpp
@@ -0,0 +1,83 @@
+/*
+ * This file is part of the KDE libraries
+ * Copyright (c) 2002 Michael Goffioul <[email protected]>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License version 2 as published by the Free Software Foundation.
+ *
+ * This library 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
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB. If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ **/
+
+#include "sizewidget.h"
+
+#include <qcombobox.h>
+#include <qspinbox.h>
+#include <qlayout.h>
+#include <qregexp.h>
+#include <klocale.h>
+
+SizeWidget::SizeWidget( QWidget *parent, const char *name )
+ : QWidget( parent, name )
+{
+ m_size = new QSpinBox( 0, 9999, 1, this );
+ m_unit = new QComboBox( this );
+
+ m_unit->insertItem( i18n( "KB" ) );
+ m_unit->insertItem( i18n( "MB" ) );
+ m_unit->insertItem( i18n( "GB" ) );
+ m_unit->insertItem( i18n( "Tiles" ) );
+ m_unit->setCurrentItem( 1 );
+ m_size->setSpecialValueText( i18n( "Unlimited" ) );
+
+ QHBoxLayout *l0 = new QHBoxLayout( this, 0, 5 );
+ l0->addWidget( m_size, 1 );
+ l0->addWidget( m_unit, 0 );
+}
+
+void SizeWidget::setSizeString( const QString& sz )
+{
+ int p = sz.find( QRegExp( "\\D" ) );
+ m_size->setValue( sz.left( p ).toInt() );
+ switch( sz[ p ].latin1() )
+ {
+ case 'k': p = 0; break;
+ default:
+ case 'm': p = 1; break;
+ case 'g': p = 2; break;
+ case 't': p = 3; break;
+ }
+ m_unit->setCurrentItem( p );
+}
+
+QString SizeWidget::sizeString() const
+{
+ QString result = QString::number( m_size->value() );
+ switch ( m_unit->currentItem() )
+ {
+ case 0: result.append( "k" ); break;
+ case 1: result.append( "m" ); break;
+ case 2: result.append( "g" ); break;
+ case 3: result.append( "t" ); break;
+ }
+ return result;
+}
+
+void SizeWidget::setValue( int value )
+{
+ m_size->setValue( value );
+ m_unit->setCurrentItem( 1 );
+}
+
+int SizeWidget::value() const
+{
+ return m_size->value();
+}
diff --git a/kdeprint/cups/cupsdconf2/sizewidget.h b/kdeprint/cups/cupsdconf2/sizewidget.h
new file mode 100644
index 000000000..c7f6557df
--- /dev/null
+++ b/kdeprint/cups/cupsdconf2/sizewidget.h
@@ -0,0 +1,43 @@
+/*
+ * This file is part of the KDE libraries
+ * Copyright (c) 2002 Michael Goffioul <[email protected]>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License version 2 as published by the Free Software Foundation.
+ *
+ * This library 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
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB. If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ **/
+
+#ifndef SIZEWIDGET_H
+#define SIZEWIDGET_H
+
+#include <qwidget.h>
+
+class QSpinBox;
+class QComboBox;
+
+class SizeWidget : public QWidget
+{
+public:
+ SizeWidget( QWidget *parent = 0, const char *name = 0 );
+
+ void setSizeString( const QString& sizeString );
+ QString sizeString() const;
+ void setValue( int sz );
+ int value() const;
+
+private:
+ QSpinBox *m_size;
+ QComboBox *m_unit;
+};
+
+#endif