9#include <private/qprinterinfo_p.h>
10#include <private/qprintdevice_p.h>
12#include <QtPrintSupport/QPrinterInfo>
14#if QT_CONFIG(cupspassworddialog)
15#include <QGuiApplication>
17#include <QDialogButtonBox>
25# include <cups/language.h>
30#if QT_CONFIG(cupspassworddialog)
31static const char *getPasswordCB(
const char *, http_t *http,
const char *,
const char *resource,
void *)
35 static QByteArray password;
41 char hostname[HTTP_MAX_HOST];
42 httpGetHostname(http, hostname, HTTP_MAX_HOST);
44 const QString username = QString::fromLocal8Bit(cupsUser());
47 dialog.setWindowTitle(QCoreApplication::translate(
"QCupsPrinterSupport",
"Authentication Needed"));
49 QFormLayout *layout =
new QFormLayout(&dialog);
50 layout->setSizeConstraint(QLayout::SetFixedSize);
52 QLineEdit *usernameLE =
new QLineEdit();
53 usernameLE->setText(username);
55 QLineEdit *passwordLE =
new QLineEdit();
56 passwordLE->setEchoMode(QLineEdit::Password);
58 QString resourceString = QString::fromLocal8Bit(resource);
59 if (resourceString.startsWith(QStringLiteral(
"/printers/")))
60 resourceString = resourceString.mid(QStringLiteral(
"/printers/").size());
62 QLabel *label =
new QLabel();
63 if (hostname == QStringLiteral(
"localhost")) {
64 label->setText(QCoreApplication::translate(
"QCupsPrinterSupport",
"Authentication needed to use %1.").arg(resourceString));
66 label->setText(QCoreApplication::translate(
"QCupsPrinterSupport",
"Authentication needed to use %1 on %2.").arg(resourceString).arg(hostname));
67 label->setWordWrap(
true);
70 layout->addRow(label);
71 layout->addRow(
new QLabel(QCoreApplication::translate(
"QCupsPrinterSupport",
"Username:")), usernameLE);
72 layout->addRow(
new QLabel(QCoreApplication::translate(
"QCupsPrinterSupport",
"Password:")), passwordLE);
74 QDialogButtonBox *buttonBox =
new QDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel);
75 layout->addRow(buttonBox);
77 QObject::connect(buttonBox, &QDialogButtonBox::accepted, &dialog, &QDialog::accept);
78 QObject::connect(buttonBox, &QDialogButtonBox::rejected, &dialog, &QDialog::reject);
80 passwordLE->setFocus();
82 if (dialog.exec() != QDialog::Accepted)
85 if (usernameLE->text() != username)
86 cupsSetUser(usernameLE->text().toLocal8Bit().constData());
88 password = passwordLE->text().toLocal8Bit();
90 return password.constData();
94QCupsPrinterSupport::QCupsPrinterSupport()
95 : QPlatformPrinterSupport()
97#if QT_CONFIG(cupspassworddialog)
99 if (qobject_cast<QGuiApplication*>(QCoreApplication::instance()))
100 cupsSetPasswordCB2(getPasswordCB,
nullptr );
104QCupsPrinterSupport::~QCupsPrinterSupport()
108QPrintEngine *QCupsPrinterSupport::createNativePrintEngine(QPrinter::PrinterMode printerMode,
const QString &deviceId)
110 return new QCupsPrintEngine(printerMode, (deviceId.isEmpty() ? defaultPrintDeviceId() : deviceId));
113QPaintEngine *QCupsPrinterSupport::createPaintEngine(QPrintEngine *engine, QPrinter::PrinterMode printerMode)
115 Q_UNUSED(printerMode);
119QPrintDevice QCupsPrinterSupport::createPrintDevice(
const QString &id)
121 return QPlatformPrinterSupport::createPrintDevice(
new QPpdPrintDevice(id));
124QStringList QCupsPrinterSupport::availablePrintDeviceIds()
const
128 int count = cupsGetDests(&dests);
130 for (
int i = 0; i < count; ++i) {
131 QString printerId = QString::fromLocal8Bit(dests[i].name);
132 if (dests[i].instance)
133 printerId += u'/' + QString::fromLocal8Bit(dests[i].instance);
134 list.append(printerId);
136 cupsFreeDests(count, dests);
140QString QCupsPrinterSupport::defaultPrintDeviceId()
const
142 return staticDefaultPrintDeviceId();
145QString QCupsPrinterSupport::staticDefaultPrintDeviceId()
149 int count = cupsGetDests(&dests);
150 for (
int i = 0; i < count; ++i) {
151 if (dests[i].is_default) {
152 printerId = QString::fromLocal8Bit(dests[i].name);
153 if (dests[i].instance) {
154 printerId += u'/' + QString::fromLocal8Bit(dests[i].instance);
159 cupsFreeDests(count, dests);