13QT_IMPL_METATYPE_EXTERN_TAGGED(QCUPSSupport::JobHoldUntil,
14 QCUPSSupport__JobHoldUntil)
15QT_IMPL_METATYPE_EXTERN_TAGGED(QCUPSSupport::BannerPage,
16 QCUPSSupport__BannerPage)
17QT_IMPL_METATYPE_EXTERN_TAGGED(QCUPSSupport::PageSet, QCUPSSupport__PageSet)
18QT_IMPL_METATYPE_EXTERN_TAGGED(QCUPSSupport::PagesPerSheetLayout,
19 QCUPSSupport__PagesPerSheetLayout)
20QT_IMPL_METATYPE_EXTERN_TAGGED(QCUPSSupport::PagesPerSheet,
21 QCUPSSupport__PagesPerSheet)
23static QStringList cupsOptionsList(QPrinter *printer)
noexcept
25 return printer->printEngine()->property(
PPK_CupsOptions).toStringList();
28void setCupsOptions(QPrinter *printer,
const QStringList &cupsOptions)
noexcept
30 printer->printEngine()->setProperty(
PPK_CupsOptions, QVariant(cupsOptions));
33void QCUPSSupport::setCupsOption(QPrinter *printer,
const QString &option,
const QString &value)
35 QStringList cupsOptions = cupsOptionsList(printer);
36 if (cupsOptions.contains(option)) {
37 cupsOptions.replace(cupsOptions.indexOf(option) + 1, value);
39 cupsOptions.append(option);
40 cupsOptions.append(value);
42 setCupsOptions(printer, cupsOptions);
45void QCUPSSupport::clearCupsOption(QPrinter *printer,
const QString &option)
47 QStringList cupsOptions = cupsOptionsList(printer);
49 const QStringList::iterator it = std::find(cupsOptions.begin(), cupsOptions.end(), option);
50 if (it != cupsOptions.end()) {
51 Q_ASSERT(it + 1 < cupsOptions.end());
52 cupsOptions.erase(it, it+1);
53 setCupsOptions(printer, cupsOptions);
65 case QCUPSSupport::Indefinite:
66 return QStringLiteral(
"indefinite");
67 case QCUPSSupport::DayTime:
68 return QStringLiteral(
"day-time");
69 case QCUPSSupport::Night:
70 return QStringLiteral(
"night");
71 case QCUPSSupport::SecondShift:
72 return QStringLiteral(
"second-shift");
73 case QCUPSSupport::ThirdShift:
74 return QStringLiteral(
"third-shift");
75 case QCUPSSupport::Weekend:
76 return QStringLiteral(
"weekend");
77 case QCUPSSupport::SpecificTime:
78 if (!holdUntilTime.isNull()) {
80 QDateTime localDateTime = QDateTime::currentDateTime();
82 if (holdUntilTime < localDateTime.time())
83 localDateTime = localDateTime.addDays(1);
84 localDateTime.setTime(holdUntilTime);
85 return localDateTime.toUTC().time().toString(u"HH:mm");
89 case QCUPSSupport::NoHold:
92 Q_UNREACHABLE_RETURN(QString());
95QCUPSSupport::JobHoldUntilWithTime QCUPSSupport::parseJobHoldUntil(
const QString &jobHoldUntil)
97 if (jobHoldUntil ==
"indefinite"_L1) {
98 return { QCUPSSupport::Indefinite, QTime() };
99 }
else if (jobHoldUntil ==
"day-time"_L1) {
100 return { QCUPSSupport::DayTime, QTime() };
101 }
else if (jobHoldUntil ==
"night"_L1) {
102 return { QCUPSSupport::Night, QTime() };
103 }
else if (jobHoldUntil ==
"second-shift"_L1) {
104 return { QCUPSSupport::SecondShift, QTime() };
105 }
else if (jobHoldUntil ==
"third-shift"_L1) {
106 return { QCUPSSupport::ThirdShift, QTime() };
107 }
else if (jobHoldUntil ==
"weekend"_L1) {
108 return { QCUPSSupport::Weekend, QTime() };
112 QTime parsedTime = QTime::fromString(jobHoldUntil, u"h:m:s");
113 if (!parsedTime.isValid())
114 parsedTime = QTime::fromString(jobHoldUntil, u"h:m");
115 if (parsedTime.isValid()) {
117 QDateTime dateTimeUtc = QDateTime::currentDateTimeUtc();
118 dateTimeUtc.setTime(parsedTime);
119 return { QCUPSSupport::SpecificTime, dateTimeUtc.toLocalTime().time() };
122 return { QCUPSSupport::NoHold, QTime() };
125ppd_option_t *QCUPSSupport::findPpdOption(
const char *optionName, QPrintDevice *printDevice)
127 ppd_file_t *ppd = qvariant_cast<ppd_file_t*>(printDevice->property(
PDPK_PpdFile));
130 for (
int i = 0; i < ppd->num_groups; ++i) {
131 ppd_group_t *group = &ppd->groups[i];
133 for (
int i = 0; i < group->num_options; ++i) {
134 ppd_option_t *option = &group->options[i];
136 if (qstrcmp(option->keyword, optionName) == 0)
145void QCUPSSupport::setJobHold(QPrinter *printer,
const JobHoldUntil jobHold, QTime holdUntilTime)
147 const QString jobHoldUntilArgument = jobHoldToString(jobHold, holdUntilTime);
148 if (!jobHoldUntilArgument.isEmpty()) {
149 setCupsOption(printer,
150 QStringLiteral(
"job-hold-until"),
151 jobHoldUntilArgument);
153 clearCupsOption(printer, QStringLiteral(
"job-hold-until"));
169 switch (bannerPage) {
170 case QCUPSSupport::NoBanner:
return QStringLiteral(
"none");
171 case QCUPSSupport::Standard:
return QStringLiteral(
"standard");
172 case QCUPSSupport::Unclassified:
return QStringLiteral(
"unclassified");
173 case QCUPSSupport::Confidential:
return QStringLiteral(
"confidential");
174 case QCUPSSupport::Classified:
return QStringLiteral(
"classified");
175 case QCUPSSupport::Secret:
return QStringLiteral(
"secret");
176 case QCUPSSupport::TopSecret:
return QStringLiteral(
"topsecret");
178 Q_UNREACHABLE_RETURN(QString());
194QCUPSSupport::JobSheets QCUPSSupport::parseJobSheets(
const QString &jobSheets)
198 const QStringList parts = jobSheets.split(u',');
199 if (parts.size() == 2) {
200 result.startBannerPage = stringToBannerPage(parts[0]);
201 result.endBannerPage = stringToBannerPage(parts[1]);
207void QCUPSSupport::setBannerPages(QPrinter *printer,
const BannerPage startBannerPage,
const BannerPage endBannerPage)
209 const QString startBanner = bannerPageToString(startBannerPage);
210 const QString endBanner = bannerPageToString(endBannerPage);
212 setCupsOption(printer, QStringLiteral(
"job-sheets"), startBanner + u',' + endBanner);
215void QCUPSSupport::setPageSet(QPrinter *printer,
const PageSet pageSet)
217 QString pageSetString;
221 pageSetString = QStringLiteral(
"odd");
224 pageSetString = QStringLiteral(
"even");
227 pageSetString = QStringLiteral(
"all");
231 setCupsOption(printer, QStringLiteral(
"page-set"), pageSetString);
234void QCUPSSupport::setPagesPerSheetLayout(QPrinter *printer,
const PagesPerSheet pagesPerSheet,
235 const PagesPerSheetLayout pagesPerSheetLayout)
240 static const char pagesPerSheetData[][2] = {
"1",
"2",
"4",
"6",
"9", {
'1',
'6'},
"\0" };
241 static const char pageLayoutData[][5] = {
"lrtb",
"lrbt",
"rlbt",
"rltb",
"btlr",
"btrl",
"tblr",
"tbrl"};
242 setCupsOption(printer, QStringLiteral(
"number-up"), QLatin1StringView(pagesPerSheetData[pagesPerSheet]));
243 setCupsOption(printer, QStringLiteral(
"number-up-layout"), QLatin1StringView(pageLayoutData[pagesPerSheetLayout]));