14QT_IMPL_METATYPE_EXTERN_TAGGED(QCUPSSupport::JobHoldUntil,
15 QCUPSSupport__JobHoldUntil)
16QT_IMPL_METATYPE_EXTERN_TAGGED(QCUPSSupport::BannerPage,
17 QCUPSSupport__BannerPage)
18QT_IMPL_METATYPE_EXTERN_TAGGED(QCUPSSupport::PageSet, QCUPSSupport__PageSet)
19QT_IMPL_METATYPE_EXTERN_TAGGED(QCUPSSupport::PagesPerSheetLayout,
20 QCUPSSupport__PagesPerSheetLayout)
21QT_IMPL_METATYPE_EXTERN_TAGGED(QCUPSSupport::PagesPerSheet,
22 QCUPSSupport__PagesPerSheet)
24static QStringList cupsOptionsList(QPrinter *printer)
noexcept
26 return printer->printEngine()->property(
PPK_CupsOptions).toStringList();
29void setCupsOptions(QPrinter *printer,
const QStringList &cupsOptions)
noexcept
31 printer->printEngine()->setProperty(
PPK_CupsOptions, QVariant(cupsOptions));
34void QCUPSSupport::setCupsOption(QPrinter *printer,
const QString &option,
const QString &value)
36 QStringList cupsOptions = cupsOptionsList(printer);
37 if (cupsOptions.contains(option)) {
38 cupsOptions.replace(cupsOptions.indexOf(option) + 1, value);
40 cupsOptions.append(option);
41 cupsOptions.append(value);
43 setCupsOptions(printer, cupsOptions);
46void QCUPSSupport::clearCupsOption(QPrinter *printer,
const QString &option)
48 QStringList cupsOptions = cupsOptionsList(printer);
50 const QStringList::iterator it = std::find(cupsOptions.begin(), cupsOptions.end(), option);
51 if (it != cupsOptions.end()) {
52 Q_ASSERT(it + 1 < cupsOptions.end());
53 cupsOptions.erase(it, it+1);
54 setCupsOptions(printer, cupsOptions);
66 case QCUPSSupport::Indefinite:
67 return QStringLiteral(
"indefinite");
68 case QCUPSSupport::DayTime:
69 return QStringLiteral(
"day-time");
70 case QCUPSSupport::Night:
71 return QStringLiteral(
"night");
72 case QCUPSSupport::SecondShift:
73 return QStringLiteral(
"second-shift");
74 case QCUPSSupport::ThirdShift:
75 return QStringLiteral(
"third-shift");
76 case QCUPSSupport::Weekend:
77 return QStringLiteral(
"weekend");
78 case QCUPSSupport::SpecificTime:
79 if (!holdUntilTime.isNull()) {
81 QDateTime localDateTime = QDateTime::currentDateTime();
83 if (holdUntilTime < localDateTime.time())
84 localDateTime = localDateTime.addDays(1);
85 localDateTime.setTime(holdUntilTime);
86 return localDateTime.toUTC().time().toString(u"HH:mm");
90 case QCUPSSupport::NoHold:
93 Q_UNREACHABLE_RETURN(QString());
96QCUPSSupport::JobHoldUntilWithTime QCUPSSupport::parseJobHoldUntil(
const QString &jobHoldUntil)
98 if (jobHoldUntil ==
"indefinite"_L1) {
99 return { QCUPSSupport::Indefinite, QTime() };
100 }
else if (jobHoldUntil ==
"day-time"_L1) {
101 return { QCUPSSupport::DayTime, QTime() };
102 }
else if (jobHoldUntil ==
"night"_L1) {
103 return { QCUPSSupport::Night, QTime() };
104 }
else if (jobHoldUntil ==
"second-shift"_L1) {
105 return { QCUPSSupport::SecondShift, QTime() };
106 }
else if (jobHoldUntil ==
"third-shift"_L1) {
107 return { QCUPSSupport::ThirdShift, QTime() };
108 }
else if (jobHoldUntil ==
"weekend"_L1) {
109 return { QCUPSSupport::Weekend, QTime() };
113 QTime parsedTime = QTime::fromString(jobHoldUntil, u"h:m:s");
114 if (!parsedTime.isValid())
115 parsedTime = QTime::fromString(jobHoldUntil, u"h:m");
116 if (parsedTime.isValid()) {
118 QDateTime dateTimeUtc = QDateTime::currentDateTimeUtc();
119 dateTimeUtc.setTime(parsedTime);
120 return { QCUPSSupport::SpecificTime, dateTimeUtc.toLocalTime().time() };
123 return { QCUPSSupport::NoHold, QTime() };
126ppd_option_t *QCUPSSupport::findPpdOption(
const char *optionName, QPrintDevice *printDevice)
128 ppd_file_t *ppd = qvariant_cast<ppd_file_t*>(printDevice->property(
PDPK_PpdFile));
131 for (
int i = 0; i < ppd->num_groups; ++i) {
132 ppd_group_t *group = &ppd->groups[i];
134 for (
int i = 0; i < group->num_options; ++i) {
135 ppd_option_t *option = &group->options[i];
137 if (qstrcmp(option->keyword, optionName) == 0)
146void QCUPSSupport::setJobHold(QPrinter *printer,
const JobHoldUntil jobHold, QTime holdUntilTime)
148 const QString jobHoldUntilArgument = jobHoldToString(jobHold, holdUntilTime);
149 if (!jobHoldUntilArgument.isEmpty()) {
150 setCupsOption(printer,
151 QStringLiteral(
"job-hold-until"),
152 jobHoldUntilArgument);
154 clearCupsOption(printer, QStringLiteral(
"job-hold-until"));
170 switch (bannerPage) {
171 case QCUPSSupport::NoBanner:
return QStringLiteral(
"none");
172 case QCUPSSupport::Standard:
return QStringLiteral(
"standard");
173 case QCUPSSupport::Unclassified:
return QStringLiteral(
"unclassified");
174 case QCUPSSupport::Confidential:
return QStringLiteral(
"confidential");
175 case QCUPSSupport::Classified:
return QStringLiteral(
"classified");
176 case QCUPSSupport::Secret:
return QStringLiteral(
"secret");
177 case QCUPSSupport::TopSecret:
return QStringLiteral(
"topsecret");
179 Q_UNREACHABLE_RETURN(QString());
195QCUPSSupport::JobSheets QCUPSSupport::parseJobSheets(
const QString &jobSheets)
199 const QStringList parts = jobSheets.split(u',');
200 if (parts.size() == 2) {
201 result.startBannerPage = stringToBannerPage(parts[0]);
202 result.endBannerPage = stringToBannerPage(parts[1]);
208void QCUPSSupport::setBannerPages(QPrinter *printer,
const BannerPage startBannerPage,
const BannerPage endBannerPage)
210 const QString startBanner = bannerPageToString(startBannerPage);
211 const QString endBanner = bannerPageToString(endBannerPage);
213 setCupsOption(printer, QStringLiteral(
"job-sheets"), startBanner + u',' + endBanner);
216void QCUPSSupport::setPageSet(QPrinter *printer,
const PageSet pageSet)
218 QString pageSetString;
222 pageSetString = QStringLiteral(
"odd");
225 pageSetString = QStringLiteral(
"even");
228 pageSetString = QStringLiteral(
"all");
232 setCupsOption(printer, QStringLiteral(
"page-set"), pageSetString);
235void QCUPSSupport::setPagesPerSheetLayout(QPrinter *printer,
const PagesPerSheet pagesPerSheet,
236 const PagesPerSheetLayout pagesPerSheetLayout)
241 static const char pagesPerSheetData[][2] = {
"1",
"2",
"4",
"6",
"9", {
'1',
'6'},
"\0" };
242 static const char pageLayoutData[][5] = {
"lrtb",
"lrbt",
"rlbt",
"rltb",
"btlr",
"btrl",
"tblr",
"tbrl"};
243 setCupsOption(printer, QStringLiteral(
"number-up"), QLatin1StringView(pagesPerSheetData[pagesPerSheet]));
244 setCupsOption(printer, QStringLiteral(
"number-up-layout"), QLatin1StringView(pageLayoutData[pagesPerSheetLayout]));