summaryrefslogtreecommitdiffstats
path: root/kdeprint/cups/kcupsprinterimpl.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'kdeprint/cups/kcupsprinterimpl.cpp')
-rw-r--r--kdeprint/cups/kcupsprinterimpl.cpp159
1 files changed, 159 insertions, 0 deletions
diff --git a/kdeprint/cups/kcupsprinterimpl.cpp b/kdeprint/cups/kcupsprinterimpl.cpp
new file mode 100644
index 000000000..665183063
--- /dev/null
+++ b/kdeprint/cups/kcupsprinterimpl.cpp
@@ -0,0 +1,159 @@
+/*
+ * This file is part of the KDE libraries
+ * Copyright (c) 2001 Michael Goffioul <kdeprint@swing.be>
+ *
+ * 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 "kcupsprinterimpl.h"
+#include "kprinter.h"
+#include "driver.h"
+#include "kmfactory.h"
+#include "kmmanager.h"
+#include "cupsinfos.h"
+
+#include <qfile.h>
+#include <cups/cups.h>
+#include <stdlib.h>
+#include <kprocess.h>
+
+static void mapToCupsOptions(const QMap<QString,QString>& opts, QString& cmd);
+
+QSize rangeToSize(const QString& s)
+{
+ QString range = s;
+ int p(-1);
+ int from, to;
+
+ if ((p=range.find(',')) != -1)
+ range.truncate(p);
+ if ((p=range.find('-')) != -1)
+ {
+ from = range.left(p).toInt();
+ to = range.right(range.length()-p-1).toInt();
+ }
+ else if (!range.isEmpty())
+ from = to = range.toInt();
+ else
+ from = to = 0;
+
+ return QSize(from,to);
+}
+//******************************************************************************************************
+
+KCupsPrinterImpl::KCupsPrinterImpl(QObject *parent, const char *name, const QStringList & /*args*/)
+: KPrinterImpl(parent,name)
+{
+}
+
+KCupsPrinterImpl::~KCupsPrinterImpl()
+{
+}
+
+bool KCupsPrinterImpl::setupCommand(QString& cmd, KPrinter *printer)
+{
+ // check printer object
+ if (!printer) return false;
+
+ QString hoststr = QString::fromLatin1("%1:%2").arg(CupsInfos::self()->host()).arg(CupsInfos::self()->port());
+ cmd = QString::fromLatin1("cupsdoprint -P %1 -J %3 -H %2").arg(quote(printer->printerName())).arg(quote(hoststr)).arg(quote(printer->docName()));
+ if (!CupsInfos::self()->login().isEmpty())
+ {
+ QString userstr(CupsInfos::self()->login());
+ //if (!CupsInfos::self()->password().isEmpty())
+ // userstr += (":" + CupsInfos::self()->password());
+ cmd.append(" -U ").append(quote(userstr));
+ }
+ mapToCupsOptions(printer->options(),cmd);
+ return true;
+}
+
+void KCupsPrinterImpl::preparePrinting(KPrinter *printer)
+{
+ // process orientation
+ QString o = printer->option("orientation-requested");
+ printer->setOption("kde-orientation",(o == "4" || o == "5" ? "Landscape" : "Portrait"));
+ // if it's a Qt application, then convert orientation as it will be handled by Qt directly
+ if (printer->applicationType() == KPrinter::Dialog)
+ printer->setOption("orientation-requested",(o == "5" || o == "6" ? "6" : "3"));
+
+ // translate copies number
+ if (!printer->option("kde-copies").isEmpty()) printer->setOption("copies",printer->option("kde-copies"));
+
+ // page ranges are handled by CUPS, so application should print all pages
+ if (printer->pageSelection() == KPrinter::SystemSide)
+ { // Qt => CUPS
+ // translations
+ if (!printer->option("kde-range").isEmpty())
+ printer->setOption("page-ranges",printer->option("kde-range"));
+ if (printer->option("kde-pageorder") == "Reverse")
+ printer->setOption("OutputOrder",printer->option("kde-pageorder"));
+ o = printer->option("kde-pageset");
+ if (!o.isEmpty() && o != "0")
+ printer->setOption("page-set",(o == "1" ? "odd" : "even"));
+ printer->setOption("multiple-document-handling",(printer->option("kde-collate") == "Collate" ? "separate-documents-collated-copies" : "separate-documents-uncollated-copies"));
+ }
+ else
+ { // No translation needed (but range => (from,to))
+ QString range = printer->option("kde-range");
+ if (!range.isEmpty())
+ {
+ QSize s = rangeToSize(range);
+ printer->setOption("kde-from",QString::number(s.width()));
+ printer->setOption("kde-to",QString::number(s.height()));
+ }
+ }
+
+ // needed for page size and margins
+ KPrinterImpl::preparePrinting(printer);
+}
+
+void KCupsPrinterImpl::broadcastOption(const QString& key, const QString& value)
+{
+ KPrinterImpl::broadcastOption(key,value);
+ if (key == "kde-orientation")
+ KPrinterImpl::broadcastOption("orientation-requested",(value == "Landscape" ? "4" : "3"));
+ else if (key == "kde-pagesize")
+ {
+ QString pagename = QString::fromLatin1(pageSizeToPageName((KPrinter::PageSize)value.toInt()));
+ KPrinterImpl::broadcastOption("PageSize",pagename);
+ // simple hack for classes
+ KPrinterImpl::broadcastOption("media",pagename);
+ }
+}
+
+//******************************************************************************************************
+
+static void mapToCupsOptions(const QMap<QString,QString>& opts, QString& cmd)
+{
+ QString optstr;
+ for (QMap<QString,QString>::ConstIterator it=opts.begin(); it!=opts.end(); ++it)
+ {
+ // only encode those options that doesn't start with "kde-" or "app-".
+ if (!it.key().startsWith("kde-") && !it.key().startsWith("app-") && !it.key().startsWith("_kde"))
+ {
+ QString key = it.key();
+ if (key.startsWith("KDEPrint-"))
+ /* Those are keys added by the "Additional Tags" page. *
+ * Strip the prefix to build valid a CUPS option. */
+ key = key.mid(9);
+ optstr.append(" ").append(key);
+ if (!it.data().isEmpty())
+ optstr.append("=").append(it.data());
+ }
+ }
+ if (!optstr.isEmpty())
+ cmd.append(" -o ").append( KProcess::quote( optstr ) );
+}