diff options
author | John Layt <jlayt@kde.org> | 2012-06-01 19:49:45 +0100 |
---|---|---|
committer | Qt by Nokia <qt-info@nokia.com> | 2012-06-09 01:46:36 +0200 |
commit | 14f45e535b4ef4cf169c3e0db817ac519b51b401 (patch) | |
tree | b3709a54368419e8ee7ac8351e83a2b9c64aff3c /src/plugins/printsupport/cups/qcupsprintersupport.cpp | |
parent | 80ceba9a367a59da549b8680780ca5d160d16274 (diff) |
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 <teemu.katajisto@digia.com>
Reviewed-by: John Layt <jlayt@kde.org>
Diffstat (limited to 'src/plugins/printsupport/cups/qcupsprintersupport.cpp')
-rw-r--r-- | src/plugins/printsupport/cups/qcupsprintersupport.cpp | 75 |
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 |