From af13869fef8db737ec9e0ed4f1e95c7fd8fd4eab Mon Sep 17 00:00:00 2001 From: Friedemann Kleint Date: Mon, 30 May 2011 11:18:46 +0200 Subject: Add QPlatformPrinterSupport. Add QPlatformPrinterSupport which provides functionality for obtaining QPrinterInfo and creating native printer engines. Rubber-stamped-by: Lars Knoll --- src/gui/kernel/qplatformintegration_qpa.cpp | 12 ++ src/gui/kernel/qplatformintegration_qpa.h | 4 +- src/gui/painting/painting.pri | 7 +- src/gui/painting/qcups.cpp | 45 ++++++++ src/gui/painting/qcups_p.h | 12 ++ src/gui/painting/qplatformprintersupport_qpa.cpp | 133 +++++++++++++++++++++++ src/gui/painting/qplatformprintersupport_qpa.h | 84 ++++++++++++++ src/gui/painting/qprinter.cpp | 8 +- src/gui/painting/qprinterinfo.cpp | 26 +++++ src/gui/painting/qprinterinfo.h | 1 + src/gui/painting/qprinterinfo_p.h | 7 +- src/gui/painting/qprinterinfo_unix.cpp | 80 ++------------ src/gui/painting/qprinterinfo_unix_p.h | 5 + 13 files changed, 347 insertions(+), 77 deletions(-) create mode 100644 src/gui/painting/qplatformprintersupport_qpa.cpp create mode 100644 src/gui/painting/qplatformprintersupport_qpa.h (limited to 'src/gui') diff --git a/src/gui/kernel/qplatformintegration_qpa.cpp b/src/gui/kernel/qplatformintegration_qpa.cpp index 7a95ffa2a5..b335dd5a97 100644 --- a/src/gui/kernel/qplatformintegration_qpa.cpp +++ b/src/gui/kernel/qplatformintegration_qpa.cpp @@ -43,6 +43,7 @@ #include #include +#include QT_BEGIN_NAMESPACE @@ -218,8 +219,19 @@ bool QPlatformIntegration::hasCapability(Capability cap) const return false; } +/*! + Returns the platform's printing support. + \since 5.0 +*/ +QPlatformPrinterSupport *QPlatformIntegration::printerSupport() const +{ + static QPlatformPrinterSupport *ps = 0; + if (!ps) + ps = new QPlatformPrinterSupport; + return ps; +} QT_END_NAMESPACE diff --git a/src/gui/kernel/qplatformintegration_qpa.h b/src/gui/kernel/qplatformintegration_qpa.h index b42a162019..c3d311eb1e 100644 --- a/src/gui/kernel/qplatformintegration_qpa.h +++ b/src/gui/kernel/qplatformintegration_qpa.h @@ -60,7 +60,7 @@ class QPlatformEventLoopIntegration; class QPlatformFontDatabase; class QPlatformClipboard; class QPlatformNativeInterface; - +class QPlatformPrinterSupport; class Q_GUI_EXPORT QPlatformIntegration { @@ -98,6 +98,8 @@ public: // Access native handles. The window handle is already available from Wid; virtual QPlatformNativeInterface *nativeInterface() const; + + virtual QPlatformPrinterSupport *printerSupport() const; }; QT_END_NAMESPACE diff --git a/src/gui/painting/painting.pri b/src/gui/painting/painting.pri index 3e284c04c1..aaf3b04833 100644 --- a/src/gui/painting/painting.pri +++ b/src/gui/painting/painting.pri @@ -100,8 +100,7 @@ win32:!qpa { SOURCES += \ painting/qcolormap_win.cpp \ painting/qpaintdevice_win.cpp \ - painting/qprintengine_win.cpp \ - painting/qprinterinfo_win.cpp + painting/qprintengine_win.cpp !win32-borland:!wince*:LIBS += -lmsimg32 } @@ -139,9 +138,11 @@ unix:!mac:!symbian { } qpa { + HEADERS += painting/qplatformprintersupport_qpa.h SOURCES += \ painting/qcolormap_qpa.cpp \ - painting/qpaintdevice_qpa.cpp + painting/qpaintdevice_qpa.cpp \ + painting/qplatformprintersupport_qpa.cpp } symbian { diff --git a/src/gui/painting/qcups.cpp b/src/gui/painting/qcups.cpp index 3ec5f72395..76050d9d71 100644 --- a/src/gui/painting/qcups.cpp +++ b/src/gui/painting/qcups.cpp @@ -40,6 +40,7 @@ ****************************************************************************/ #include #include "qcups_p.h" +#include "qprinterinfo_unix_p.h" #ifndef QT_NO_CUPS @@ -396,6 +397,50 @@ int QCUPSSupport::printFile(const char * printerName, const char * filename, con return _cupsPrintFile(printerName, filename, title, num_options, options); } +QCUPSSupport::Printer::Printer(const QString &n) : name(n), isDefault(false), cupsPrinterIndex(-1) +{ +} + +QList QCUPSSupport::availableUnixPrinters() +{ + QList printers; + +#if !defined(QT_NO_CUPS) && !defined(QT_NO_LIBRARY) + if (QCUPSSupport::isAvailable()) { + QCUPSSupport cups; + int cupsPrinterCount = cups.availablePrintersCount(); + const cups_dest_t* cupsPrinters = cups.availablePrinters(); + for (int i = 0; i < cupsPrinterCount; ++i) { + QString printerName(QString::fromLocal8Bit(cupsPrinters[i].name)); + if (cupsPrinters[i].instance) + printerName += QLatin1Char('/') + QString::fromLocal8Bit(cupsPrinters[i].instance); + + Printer p(printerName); + if (cupsPrinters[i].is_default) + p.isDefault = true; + p.cupsPrinterIndex = i; + printers.append(p); + } + } else +#endif + { + QList lprPrinters; + int defprn = qt_getLprPrinters(lprPrinters); + // populating printer combo + foreach (const QPrinterDescription &description, lprPrinters) + printers.append(Printer(description.name)); + if (defprn >= 0 && defprn < printers.size()) + printers[defprn].isDefault = true; + } + + return printers; +} + +QList QCUPSSupport::getCupsPrinterPaperSizes(int cupsPrinterIndex) +{ + return qt_getCupsPrinterPaperSizes(cupsPrinterIndex); +} + QT_END_NAMESPACE #endif // QT_NO_CUPS diff --git a/src/gui/painting/qcups_p.h b/src/gui/painting/qcups_p.h index e6c53111a5..6b6a55a440 100644 --- a/src/gui/painting/qcups_p.h +++ b/src/gui/painting/qcups_p.h @@ -54,6 +54,7 @@ // #include "QtCore/qstring.h" #include "QtCore/qstringlist.h" +#include "QtCore/qpair.h" #include "QtGui/qprinter.h" #ifndef QT_NO_CUPS @@ -68,6 +69,14 @@ Q_DECLARE_TYPEINFO(cups_option_t, Q_MOVABLE_TYPE | Q_PRIMITIVE_TYPE); class Q_GUI_EXPORT QCUPSSupport { public: + struct Printer + { + Printer(const QString &name = QString()); + + QString name; + bool isDefault; + int cupsPrinterIndex; + }; QCUPSSupport(); ~QCUPSSupport(); @@ -100,6 +109,9 @@ public: int printFile(const char * printerName, const char * filename, const char * title, int num_options, cups_option_t * options); + static QList availableUnixPrinters(); + static QList getCupsPrinterPaperSizes(int cupsPrinterIndex); + private: void collectMarkedOptions(QStringList& list, const ppd_group_t* group = 0) const; void collectMarkedOptionsHelper(QStringList& list, const ppd_group_t* group) const; diff --git a/src/gui/painting/qplatformprintersupport_qpa.cpp b/src/gui/painting/qplatformprintersupport_qpa.cpp new file mode 100644 index 0000000000..9fb25c953f --- /dev/null +++ b/src/gui/painting/qplatformprintersupport_qpa.cpp @@ -0,0 +1,133 @@ +/**************************************************************************** +** +** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the QtGui module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** GNU Lesser General Public License Usage +** This file may be used under the terms of the GNU Lesser General Public +** License version 2.1 as published by the Free Software Foundation and +** appearing in the file LICENSE.LGPL included in the packaging of this +** file. Please review the following information to ensure the GNU Lesser +** General Public License version 2.1 requirements will be met: +** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU General +** Public License version 3.0 as published by the Free Software Foundation +** and appearing in the file LICENSE.GPL included in the packaging of this +** file. Please review the following information to ensure the GNU General +** Public License version 3.0 requirements will be met: +** http://www.gnu.org/copyleft/gpl.html. +** +** Other Usage +** Alternatively, this file may be used in accordance with the terms and +** conditions contained in a signed written agreement between you and Nokia. +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "qplatformprintersupport_qpa.h" + +#include + +#include + +#ifndef QT_NO_PRINTER + +QT_BEGIN_NAMESPACE + +QPlatformPrinterSupport::QPlatformPrinterSupport() +{ +} + +QPlatformPrinterSupport::~QPlatformPrinterSupport() +{ +} + +QPrintEngine *QPlatformPrinterSupport::createNativePrintEngine(QPrinter::PrinterMode) +{ + return 0; +} + +QPaintEngine *QPlatformPrinterSupport::createPaintEngine(QPrintEngine *, QPrinter::PrinterMode) +{ + return 0; +} + +QList QPlatformPrinterSupport::supportedPaperSizes(const QPrinterInfo &) const +{ + return QList(); +} + +QList QPlatformPrinterSupport::availablePrinters() +{ + return QList(); +} + +QPrinterInfo QPlatformPrinterSupport::defaultPrinter() +{ + const QList printers = availablePrinters(); + foreach (const QPrinterInfo &printerInfo, printers) { + if (printerInfo.isDefault()) + return printerInfo; + } + return printers.isEmpty() ? QPrinterInfo() : printers.front(); +} + +QPrinterInfo QPlatformPrinterSupport::printerInfo(const QString &printerName, bool isDefault) +{ + QPrinterInfo pi = QPrinterInfo(printerName); + pi.d_func()->isDefault = isDefault; + return pi; +} + +void QPlatformPrinterSupport::setPrinterInfoDefault(QPrinterInfo *p, bool isDefault) +{ + p->d_func()->isDefault = isDefault; +} + +bool QPlatformPrinterSupport::printerInfoIsDefault(const QPrinterInfo &p) +{ + return p.d_func()->isDefault; +} + +int QPlatformPrinterSupport::printerInfoCupsPrinterIndex(const QPrinterInfo &p) +{ + int i = -1; +#if (defined(Q_OS_UNIX) && !defined(Q_OS_MAC) && !defined(Q_OS_SYMBIAN)) || defined(Q_WS_QPA) +#if !defined(QT_NO_CUPS) && !defined(QT_NO_LIBRARY) + if (!p.isNull()) + return i = p.d_func()->cupsPrinterIndex; +#endif +#endif + Q_UNUSED(p) + return i; +} + +void QPlatformPrinterSupport::setPrinterInfoCupsPrinterIndex(QPrinterInfo *p, int index) +{ +#if (defined(Q_OS_UNIX) && !defined(Q_OS_MAC) && !defined(Q_OS_SYMBIAN)) || defined(Q_WS_QPA) +#if !defined(QT_NO_CUPS) && !defined(QT_NO_LIBRARY) + p->d_func()->cupsPrinterIndex = index; +#endif +#endif + Q_UNUSED(p) + Q_UNUSED(index) +} + +QT_END_NAMESPACE + +#endif // QT_NO_PRINTER diff --git a/src/gui/painting/qplatformprintersupport_qpa.h b/src/gui/painting/qplatformprintersupport_qpa.h new file mode 100644 index 0000000000..90dd260925 --- /dev/null +++ b/src/gui/painting/qplatformprintersupport_qpa.h @@ -0,0 +1,84 @@ +/**************************************************************************** +** +** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the QtGui module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** GNU Lesser General Public License Usage +** This file may be used under the terms of the GNU Lesser General Public +** License version 2.1 as published by the Free Software Foundation and +** appearing in the file LICENSE.LGPL included in the packaging of this +** file. Please review the following information to ensure the GNU Lesser +** General Public License version 2.1 requirements will be met: +** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU General +** Public License version 3.0 as published by the Free Software Foundation +** and appearing in the file LICENSE.GPL included in the packaging of this +** file. Please review the following information to ensure the GNU General +** Public License version 3.0 requirements will be met: +** http://www.gnu.org/copyleft/gpl.html. +** +** Other Usage +** Alternatively, this file may be used in accordance with the terms and +** conditions contained in a signed written agreement between you and Nokia. +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef QPLATFORMPRINTINGSUPPORT_H +#define QPLATFORMPRINTINGSUPPORT_H + +#include + +QT_BEGIN_HEADER + +QT_BEGIN_NAMESPACE + +QT_MODULE(Gui) + +#ifndef QT_NO_PRINTER + +class QPrintEngine; + +class Q_GUI_EXPORT QPlatformPrinterSupport +{ +public: + QPlatformPrinterSupport(); + virtual ~QPlatformPrinterSupport(); + + virtual QPrintEngine *createNativePrintEngine(QPrinter::PrinterMode printerMode); + virtual QPaintEngine *createPaintEngine(QPrintEngine *, QPrinter::PrinterMode printerMode); + virtual QList supportedPaperSizes(const QPrinterInfo &) const; + + virtual QList availablePrinters(); + virtual QPrinterInfo defaultPrinter(); + +protected: + static QPrinterInfo printerInfo(const QString &printerName, bool isDefault = false); + static void setPrinterInfoDefault(QPrinterInfo *p, bool isDefault); + static bool printerInfoIsDefault(const QPrinterInfo &p); + static int printerInfoCupsPrinterIndex(const QPrinterInfo &p); + static void setPrinterInfoCupsPrinterIndex(QPrinterInfo *p, int index); +}; + +#endif // QT_NO_PRINTER + +QT_END_NAMESPACE + +QT_END_HEADER + +#endif // QPLATFORMPRINTINGSUPPORT_H diff --git a/src/gui/painting/qprinter.cpp b/src/gui/painting/qprinter.cpp index bfd2c44b9f..059331f5f9 100644 --- a/src/gui/painting/qprinter.cpp +++ b/src/gui/painting/qprinter.cpp @@ -52,6 +52,9 @@ #ifndef QT_NO_PRINTER +#include +#include + #if defined (Q_WS_WIN) #include #elif defined (Q_WS_MAC) @@ -165,7 +168,10 @@ void QPrinterPrivate::createDefaultEngines() switch (realOutputFormat) { case QPrinter::NativeFormat: { -#if defined (Q_WS_WIN) +#if defined (Q_WS_QPA) + printEngine = QGuiApplicationPrivate::platformIntegration()->printerSupport()->createNativePrintEngine(printerMode); + paintEngine = QGuiApplicationPrivate::platformIntegration()->printerSupport()->createPaintEngine(printEngine, printerMode); +#elif defined (Q_WS_WIN) QWin32PrintEngine *winEngine = new QWin32PrintEngine(printerMode); paintEngine = winEngine; printEngine = winEngine; diff --git a/src/gui/painting/qprinterinfo.cpp b/src/gui/painting/qprinterinfo.cpp index a7ddc85a54..0049bd248a 100644 --- a/src/gui/painting/qprinterinfo.cpp +++ b/src/gui/painting/qprinterinfo.cpp @@ -30,6 +30,9 @@ #ifndef QT_NO_PRINTER +#include +#include + QT_BEGIN_NAMESPACE QPrinterInfoPrivate QPrinterInfoPrivate::shared_null; @@ -168,6 +171,29 @@ bool QPrinterInfo::isDefault() const On Mac OS X 10.3, this function always returns an empty list. */ +#ifdef Q_WS_QPA +QList QPrinterInfo::supportedPaperSizes() const +{ + const Q_D(QPrinterInfo); + if (!isNull() && !d->hasPaperSizes) { + d->paperSizes = QGuiApplicationPrivate::platformIntegration()->printerSupport()->supportedPaperSizes(*this); + d->hasPaperSizes = true; + } + return d->paperSizes; +} + +QList QPrinterInfo::availablePrinters() +{ + return QGuiApplicationPrivate::platformIntegration()->printerSupport()->availablePrinters(); +} + +QPrinterInfo QPrinterInfo::defaultPrinter() +{ + return QGuiApplicationPrivate::platformIntegration()->printerSupport()->defaultPrinter(); +} + +#endif //Q_WS_QPA + QT_END_NAMESPACE #endif // QT_NO_PRINTER diff --git a/src/gui/painting/qprinterinfo.h b/src/gui/painting/qprinterinfo.h index 9ff1bd16bd..72082cf299 100644 --- a/src/gui/painting/qprinterinfo.h +++ b/src/gui/painting/qprinterinfo.h @@ -77,6 +77,7 @@ private: QPrinterInfo(const QString &name); private: + friend class QPlatformPrinterSupport; Q_DECLARE_PRIVATE(QPrinterInfo) QScopedPointer d_ptr; }; diff --git a/src/gui/painting/qprinterinfo_p.h b/src/gui/painting/qprinterinfo_p.h index a3f7d5d252..a3c654e7b7 100644 --- a/src/gui/painting/qprinterinfo_p.h +++ b/src/gui/painting/qprinterinfo_p.h @@ -68,9 +68,10 @@ public: name(name), isDefault(false) #if (defined(Q_OS_UNIX) && !defined(Q_OS_MAC) && !defined(Q_OS_SYMBIAN)) || defined(Q_WS_QPA) #if !defined(QT_NO_CUPS) && !defined(QT_NO_LIBRARY) - , cupsPrinterIndex(0), hasPaperSizes(false) + , cupsPrinterIndex(0) #endif #endif + , hasPaperSizes(false) {} ~QPrinterInfoPrivate() {} @@ -83,10 +84,10 @@ public: #if (defined(Q_OS_UNIX) && !defined(Q_OS_MAC) && !defined(Q_OS_SYMBIAN)) || defined(Q_WS_QPA) #if !defined(QT_NO_CUPS) && !defined(QT_NO_LIBRARY) int cupsPrinterIndex; - mutable bool hasPaperSizes; - mutable QList paperSizes; #endif #endif + mutable bool hasPaperSizes; + mutable QList paperSizes; }; diff --git a/src/gui/painting/qprinterinfo_unix.cpp b/src/gui/painting/qprinterinfo_unix.cpp index 7420bbfb90..3c66481b4d 100644 --- a/src/gui/painting/qprinterinfo_unix.cpp +++ b/src/gui/painting/qprinterinfo_unix.cpp @@ -835,78 +835,20 @@ Q_GUI_EXPORT int qt_getLprPrinters(QList& printers) ///////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////// -QList QPrinterInfo::availablePrinters() +QList qt_getCupsPrinterPaperSizes(int cupsPrinterIndex) { - QList printers; - + QList result; #if !defined(QT_NO_CUPS) && !defined(QT_NO_LIBRARY) - if (QCUPSSupport::isAvailable()) { - QCUPSSupport cups; - int cupsPrinterCount = cups.availablePrintersCount(); - const cups_dest_t* cupsPrinters = cups.availablePrinters(); - for (int i = 0; i < cupsPrinterCount; ++i) { - QString printerName(QString::fromLocal8Bit(cupsPrinters[i].name)); - if (cupsPrinters[i].instance) - printerName += QLatin1Char('/') + QString::fromLocal8Bit(cupsPrinters[i].instance); - - QPrinterInfo printerInfo(printerName); - if (cupsPrinters[i].is_default) - printerInfo.d_ptr->isDefault = true; - printerInfo.d_ptr->cupsPrinterIndex = i; - printers.append(printerInfo); - } - } else -#endif - { - QList lprPrinters; - int defprn = qt_getLprPrinters(lprPrinters); - // populating printer combo - foreach (const QPrinterDescription &description, lprPrinters) - printers.append(QPrinterInfo(description.name)); - if (defprn >= 0 && defprn < printers.size()) - printers[defprn].d_ptr->isDefault = true; + if (!QCUPSSupport::isAvailable() || cupsPrinterIndex < 0) + return result; + // Find paper sizes from CUPS. + QCUPSSupport cups; + cups.setCurrentPrinter(cupsPrinterIndex); + if (const ppd_option_t* size = cups.pageSizes()) { + for (int j = 0; j < size->num_choices; ++j) + result.append(string2PaperSize(size->choices[j].choice)); } - - return printers; -} - -QPrinterInfo QPrinterInfo::defaultPrinter() -{ - QList printers = availablePrinters(); - foreach (const QPrinterInfo &printerInfo, printers) { - if (printerInfo.isDefault()) - return printerInfo; - } - - return printers.value(0); -} - -QList QPrinterInfo::supportedPaperSizes() const -{ -#if !defined(QT_NO_CUPS) && !defined(QT_NO_LIBRARY) - const Q_D(QPrinterInfo); - - if (isNull()) - return d->paperSizes; - - if (!d->hasPaperSizes) { - d->hasPaperSizes = true; - - if (QCUPSSupport::isAvailable()) { - // Find paper sizes from CUPS. - QCUPSSupport cups; - cups.setCurrentPrinter(d->cupsPrinterIndex); - const ppd_option_t* sizes = cups.pageSizes(); - if (sizes) { - for (int j = 0; j < sizes->num_choices; ++j) - d->paperSizes.append(string2PaperSize(sizes->choices[j].choice)); - } - } - } - - return d->paperSizes; -#else - return QList(); + return result; #endif } diff --git a/src/gui/painting/qprinterinfo_unix_p.h b/src/gui/painting/qprinterinfo_unix_p.h index 1ededf5a36..f8721deaa9 100644 --- a/src/gui/painting/qprinterinfo_unix_p.h +++ b/src/gui/painting/qprinterinfo_unix_p.h @@ -42,6 +42,9 @@ #ifndef QPRINTERINFO_UNIX_P_H #define QPRINTERINFO_UNIX_P_H +#include +#include + #ifndef QT_NO_NIS # ifndef BOOL_DEFINED # define BOOL_DEFINED @@ -118,6 +121,8 @@ void qt_parseSpoolInterface(QList *printers); void qt_parseQconfig(QList *printers); int qt_getLprPrinters(QList& printers); +QList qt_getCupsPrinterPaperSizes(int cupsPrinterIndex); + #endif // QT_NO_PRINTER QT_END_NAMESPACE -- cgit v1.2.3