summaryrefslogtreecommitdiffstats
path: root/src/printsupport/kernel
diff options
context:
space:
mode:
Diffstat (limited to 'src/printsupport/kernel')
-rw-r--r--src/printsupport/kernel/qcups.cpp92
-rw-r--r--src/printsupport/kernel/qcups_p.h23
2 files changed, 114 insertions, 1 deletions
diff --git a/src/printsupport/kernel/qcups.cpp b/src/printsupport/kernel/qcups.cpp
index 49a97e327c..332245cc21 100644
--- a/src/printsupport/kernel/qcups.cpp
+++ b/src/printsupport/kernel/qcups.cpp
@@ -342,6 +342,97 @@ QStringList QCUPSSupport::options() const
return list;
}
+QStringList QCUPSSupport::cupsOptionsList(QPrinter *printer)
+{
+ return printer->printEngine()->property(PPK_CupsOptions).toStringList();
+}
+
+void QCUPSSupport::setCupsOptions(QPrinter *printer, const QStringList &cupsOptions)
+{
+ printer->printEngine()->setProperty(PPK_CupsOptions, QVariant(cupsOptions));
+}
+
+void QCUPSSupport::setCupsOption(QStringList &cupsOptions, const QString &option, const QString &value)
+{
+ if (cupsOptions.contains(option)) {
+ cupsOptions.replace(cupsOptions.indexOf(option) + 1, value);
+ } else {
+ cupsOptions.append(option);
+ cupsOptions.append(value);
+ }
+}
+
+void QCUPSSupport::setJobHold(QPrinter *printer, const JobHoldUntil jobHold, const QTime &holdUntilTime)
+{
+ QStringList cupsOptions = cupsOptionsList(printer);
+
+ switch (jobHold) {
+ case NoHold: //default
+ break;
+ case Indefinite:
+ setCupsOption(cupsOptions,
+ QStringLiteral("job-hold-until"),
+ QStringLiteral("indefinite"));
+ break;
+ case DayTime:
+ setCupsOption(cupsOptions,
+ QStringLiteral("job-hold-until"),
+ QStringLiteral("day-time"));
+ break;
+ case Night:
+ setCupsOption(cupsOptions,
+ QStringLiteral("job-hold-until"),
+ QStringLiteral("night"));
+ break;
+ case SecondShift:
+ setCupsOption(cupsOptions,
+ QStringLiteral("job-hold-until"),
+ QStringLiteral("second-shift"));
+ break;
+ case ThirdShift:
+ setCupsOption(cupsOptions,
+ QStringLiteral("job-hold-until"),
+ QStringLiteral("third-shift"));
+ break;
+ case Weekend:
+ setCupsOption(cupsOptions,
+ QStringLiteral("job-hold-until"),
+ QStringLiteral("weekend"));
+ break;
+ case SpecificTime:
+ if (holdUntilTime.isNull()) {
+ setJobHold(printer, NoHold);
+ return;
+ }
+ // CUPS expects the time in UTC, user has entered in local time, so get the UTS equivalent
+ QDateTime localDateTime = QDateTime::currentDateTime();
+ // Check if time is for tomorrow in case of DST change overnight
+ if (holdUntilTime < localDateTime.time())
+ localDateTime.addDays(1);
+ localDateTime.setTime(holdUntilTime);
+ setCupsOption(cupsOptions,
+ QStringLiteral("job-hold-until"),
+ localDateTime.toUTC().time().toString(QStringLiteral("HH:mm")));
+ break;
+ }
+
+ setCupsOptions(printer, cupsOptions);
+}
+
+void QCUPSSupport::setJobBilling(QPrinter *printer, const QString &jobBilling)
+{
+ QStringList cupsOptions = cupsOptionsList(printer);
+ setCupsOption(cupsOptions, QStringLiteral("job-billing"), jobBilling);
+ setCupsOptions(printer, cupsOptions);
+}
+
+void QCUPSSupport::setJobPriority(QPrinter *printer, int priority)
+{
+ QStringList cupsOptions = cupsOptionsList(printer);
+ setCupsOption(cupsOptions, QStringLiteral("job-priority"), QString::number(priority));
+ setCupsOptions(printer, cupsOptions);
+}
+
bool QCUPSSupport::printerHasPPD(const char *printerName)
{
if (!isAvailable())
@@ -511,7 +602,6 @@ QList<QPair<QString, QSizeF> > QCUPSSupport::getCupsPrinterPaperSizesWithNames(i
return result;
}
-
QT_END_NAMESPACE
#endif // QT_NO_CUPS
diff --git a/src/printsupport/kernel/qcups_p.h b/src/printsupport/kernel/qcups_p.h
index 0828f582a3..58608ea1f1 100644
--- a/src/printsupport/kernel/qcups_p.h
+++ b/src/printsupport/kernel/qcups_p.h
@@ -56,6 +56,7 @@
#include "QtCore/qstringlist.h"
#include "QtCore/qpair.h"
#include "QtPrintSupport/qprinter.h"
+#include "QtCore/qdatetime.h"
#ifndef QT_NO_CUPS
#include <QtCore/qlibrary.h>
@@ -90,6 +91,18 @@ public:
QCUPSSupport();
~QCUPSSupport();
+ // Enum for values of job-hold-until option
+ enum JobHoldUntil {
+ NoHold = 0, //CUPS Default
+ Indefinite,
+ DayTime,
+ Night,
+ SecondShift,
+ ThirdShift,
+ Weekend,
+ SpecificTime
+ };
+
static bool isAvailable();
static int cupsVersion() { return isAvailable() ? CUPS_VERSION_MAJOR*10000+CUPS_VERSION_MINOR*100+CUPS_VERSION_PATCH : 0; }
int availablePrintersCount() const;
@@ -111,6 +124,14 @@ public:
QStringList options() const;
+ static QStringList cupsOptionsList(QPrinter *printer);
+ static void setCupsOptions(QPrinter *printer, const QStringList &cupsOptions);
+ static void setCupsOption(QStringList &cupsOptions, const QString &option, const QString &value);
+
+ static void setJobHold(QPrinter *printer, const JobHoldUntil jobHold = NoHold, const QTime &holdUntilTime = QTime());
+ static void setJobBilling(QPrinter *printer, const QString &jobBilling = QString());
+ static void setJobPriority(QPrinter *printer, int priority = 50);
+
static bool printerHasPPD(const char *printerName);
QString unicodeString(const char *s);
@@ -139,6 +160,8 @@ private:
QT_END_NAMESPACE
+Q_DECLARE_METATYPE(QCUPSSupport::JobHoldUntil)
+
#endif // QT_NO_CUPS
#endif