From 14f45e535b4ef4cf169c3e0db817ac519b51b401 Mon Sep 17 00:00:00 2001 From: John Layt Date: Fri, 1 Jun 2012 19:49:45 +0100 Subject: QtPrintSupport - Add CUPS printer and options queries to plugin Implement initial support in the CUPS plugin for directly calling CUPS to obtain printer list and basic printer info rather than QCupsSupport. Add api to the plugin to return any options for a printer, usually IPP options as implemented for CUPS, but whatever applies for the host print system. Future changes will add support for returning the PPD options. This api may eventually be added to QPrinterInfo, but not in 5.0. Change-Id: I6c8bae4c9295009599e6ab31382f5fff4c93981f Reviewed-by: Teemu Katajisto Reviewed-by: John Layt --- .../printsupport/cups/qcupsprintersupport.cpp | 75 +++++++++++++++++++--- .../printsupport/cups/qcupsprintersupport_p.h | 24 ++++++- 2 files changed, 89 insertions(+), 10 deletions(-) (limited to 'src/plugins/printsupport/cups') 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 -#include "qcups_p.h" +#include +#ifndef QT_LINUXBASE // LSB merges everything into cups.h +# include +#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 QCupsPrinterSupport::supportedPaperSizes(const QPrint return QCUPSSupport::getCupsPrinterPaperSizes(printerIndex(printerInfo)); } -QList QCupsPrinterSupport::availablePrinters() +void QCupsPrinterSupport::loadCups() { - QList 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 +#include +#include + +#include + 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 supportedPaperSizes(const QPrinterInfo &) const; - - virtual QList 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 -- cgit v1.2.3