summaryrefslogtreecommitdiffstats
path: root/src/plugins/printsupport
diff options
context:
space:
mode:
Diffstat (limited to 'src/plugins/printsupport')
-rw-r--r--src/plugins/printsupport/cups/qcupsprintersupport.cpp75
-rw-r--r--src/plugins/printsupport/cups/qcupsprintersupport_p.h24
2 files changed, 89 insertions, 10 deletions
diff --git a/src/plugins/printsupport/cups/qcupsprintersupport.cpp b/src/plugins/printsupport/cups/qcupsprintersupport.cpp
index 83d4068d16..493e01df5b 100644
--- a/src/plugins/printsupport/cups/qcupsprintersupport.cpp
+++ b/src/plugins/printsupport/cups/qcupsprintersupport.cpp
@@ -46,16 +46,26 @@
#include <QtPrintSupport/QPrinterInfo>
-#include "qcups_p.h"
+#include <cups/ppd.h>
+#ifndef QT_LINUXBASE // LSB merges everything into cups.h
+# include <cups/language.h>
+#endif
QT_BEGIN_NAMESPACE
-QCupsPrinterSupport::QCupsPrinterSupport() : QPlatformPrinterSupport()
+QCupsPrinterSupport::QCupsPrinterSupport() : QPlatformPrinterSupport(),
+ m_cups(QLatin1String("cups"), 2),
+ m_cupsPrinters(0),
+ m_cupsPrintersCount(0)
{
+ loadCups();
+ loadCupsPrinters();
}
QCupsPrinterSupport::~QCupsPrinterSupport()
{
+ if (cupsFreeDests)
+ cupsFreeDests(m_cupsPrintersCount, m_cupsPrinters);
}
QPrintEngine *QCupsPrinterSupport::createNativePrintEngine(QPrinter::PrinterMode printerMode)
@@ -74,14 +84,63 @@ QList<QPrinter::PaperSize> QCupsPrinterSupport::supportedPaperSizes(const QPrint
return QCUPSSupport::getCupsPrinterPaperSizes(printerIndex(printerInfo));
}
-QList<QPrinterInfo> QCupsPrinterSupport::availablePrinters()
+void QCupsPrinterSupport::loadCups()
{
- QList<QPrinterInfo> printers;
- foreach (const QCUPSSupport::Printer &p, QCUPSSupport::availableUnixPrinters()) {
- QPrinterInfo printer = createPrinterInfo(p.name, QString(), QString(), QString(), p.isDefault, p.cupsPrinterIndex);
- printers.append(printer);
+ cupsGetDests = (CupsGetDests) m_cups.resolve("cupsGetDests");
+ cupsFreeDests = (CupsFreeDests) m_cups.resolve("cupsFreeDests");
+ cupsGetOption = (CupsGetOption) m_cups.resolve("cupsGetOption");
+}
+
+void QCupsPrinterSupport::loadCupsPrinters()
+{
+ m_cupsPrintersCount = 0;
+ m_printers.clear();
+
+ if (cupsFreeDests)
+ cupsFreeDests(m_cupsPrintersCount, m_cupsPrinters);
+
+ if (cupsGetDests)
+ m_cupsPrintersCount = cupsGetDests(&m_cupsPrinters);
+
+ for (int i = 0; i < m_cupsPrintersCount; ++i) {
+ QString printerName = QString::fromLocal8Bit(m_cupsPrinters[i].name);
+ if (m_cupsPrinters[i].instance)
+ printerName += QLatin1Char('/') + QString::fromLocal8Bit(m_cupsPrinters[i].instance);
+ QString description = cupsOption(i, "printer-info");
+ QString location = cupsOption(i, "printer-location");
+ QString makeAndModel = cupsOption(i, "printer-make-and-model");
+ QPrinterInfo printer = createPrinterInfo(printerName, description, location, makeAndModel,
+ m_cupsPrinters[i].is_default, i);
+ m_printers.append(printer);
+ }
+}
+
+QString QCupsPrinterSupport::printerOption(const QPrinterInfo &printer, const QString &key) const
+{
+ return cupsOption(printerIndex(printer), key);
+}
+
+QString QCupsPrinterSupport::cupsOption(int i, const QString &key) const
+{
+ QString value;
+ if (i > -1 && i < m_cupsPrintersCount && cupsGetOption)
+ value = cupsGetOption(key.toLocal8Bit(), m_cupsPrinters[i].num_options, m_cupsPrinters[i].options);
+ return value;
+}
+
+PrinterOptions QCupsPrinterSupport::printerOptions(const QPrinterInfo &printer) const
+{
+ PrinterOptions options;
+ int p = printerIndex(printer);
+ if (p <= -1 || p >= m_cupsPrintersCount)
+ return options;
+ int numOptions = m_cupsPrinters[p].num_options;
+ for (int i = 0; i < numOptions; ++i) {
+ QString name = m_cupsPrinters[p].options[i].name;
+ QString value = m_cupsPrinters[p].options[i].value;
+ options.insert(name, value);
}
- return printers;
+ return options;
}
QT_END_NAMESPACE
diff --git a/src/plugins/printsupport/cups/qcupsprintersupport_p.h b/src/plugins/printsupport/cups/qcupsprintersupport_p.h
index 13b65a5cb5..847047226a 100644
--- a/src/plugins/printsupport/cups/qcupsprintersupport_p.h
+++ b/src/plugins/printsupport/cups/qcupsprintersupport_p.h
@@ -44,9 +44,18 @@
#include <qpa/qplatformprintersupport.h>
+#include <QtCore/qlibrary.h>
+#include <QtCore/qlist.h>
+
+#include <cups/cups.h>
+
QT_BEGIN_HEADER
QT_BEGIN_NAMESPACE
+typedef int (*CupsGetDests)(cups_dest_t **dests);
+typedef void (*CupsFreeDests)(int num_dests, cups_dest_t *dests);
+typedef const char* (*CupsGetOption)(const char *name, int num_options, cups_option_t *options);
+
class QCupsPrinterSupport : public QPlatformPrinterSupport
{
public:
@@ -56,10 +65,21 @@ public:
virtual QPrintEngine *createNativePrintEngine(QPrinter::PrinterMode printerMode);
virtual QPaintEngine *createPaintEngine(QPrintEngine *printEngine, QPrinter::PrinterMode);
virtual QList<QPrinter::PaperSize> supportedPaperSizes(const QPrinterInfo &) const;
-
- virtual QList<QPrinterInfo> availablePrinters();
+ virtual QString printerOption(const QPrinterInfo &printer, const QString &key) const;
+ virtual PrinterOptions printerOptions(const QPrinterInfo &printer) const;
private:
+ void loadCups();
+ void loadCupsPrinters();
+ QString cupsOption(int i, const QString &key) const;
+
+ QLibrary m_cups;
+ cups_dest_t *m_cupsPrinters;
+ int m_cupsPrintersCount;
+
+ CupsGetDests cupsGetDests;
+ CupsFreeDests cupsFreeDests;
+ CupsGetOption cupsGetOption;
};
QT_END_NAMESPACE