summaryrefslogtreecommitdiffstats
path: root/src/plugins/printsupport/cups/qcupsprintersupport.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/plugins/printsupport/cups/qcupsprintersupport.cpp')
-rw-r--r--src/plugins/printsupport/cups/qcupsprintersupport.cpp75
1 files changed, 67 insertions, 8 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