diff options
author | Miikka Heikkinen <miikka.heikkinen@digia.com> | 2012-03-19 15:31:17 +0200 |
---|---|---|
committer | Qt by Nokia <qt-info@nokia.com> | 2012-03-19 18:02:39 +0100 |
commit | 4bcd8fc2dee683da632466e6de5d782f52263951 (patch) | |
tree | dd61d751af0f32130e9941904be5e0caee9e81b7 | |
parent | 2d5a4a5d3aae4efe7c17cadf03dfbb5cc4c36e86 (diff) |
Fix infinite recursion crash in QPrinterInfo::supportedPaperSizes()
This function calls platform specific function
QWindowsPrinterSupport::supportedPaperSizes(), which then called back
to QPrinterInfo::supportedPaperSizes(), causing infinite recursion.
Fixed by providing a proper implementation for querying supported
paper sizes in QWin32PrintEngine - the same implementation was used in
Qt 4.8.
Task-number: QTBUG-24190
Change-Id: I64a2773d83596df19818bf2636f1255943d7851d
Reviewed-by: Friedemann Kleint <Friedemann.Kleint@nokia.com>
4 files changed, 25 insertions, 9 deletions
diff --git a/src/plugins/printsupport/windows/qwindowsprintersupport.cpp b/src/plugins/printsupport/windows/qwindowsprintersupport.cpp index 9444038997..2905063c51 100644 --- a/src/plugins/printsupport/windows/qwindowsprintersupport.cpp +++ b/src/plugins/printsupport/windows/qwindowsprintersupport.cpp @@ -87,15 +87,9 @@ QPaintEngine *QWindowsPrinterSupport::createPaintEngine(QPrintEngine *engine, QP return static_cast<QWin32PrintEngine *>(engine); } -QList<QPrinter::PaperSize> QWindowsPrinterSupport::supportedPaperSizes(const QPrinterInfo &) const +QList<QPrinter::PaperSize> QWindowsPrinterSupport::supportedPaperSizes(const QPrinterInfo &printerInfo) const { - QList<QPrinter::PaperSize> returnList; - foreach (const QPrinterInfo &info, mPrinterList) { - foreach (const QPrinter::PaperSize supportedSize, info.supportedPaperSizes()) - if (!returnList.contains(supportedSize)) - returnList.append(supportedSize); - } - return returnList; + return QWin32PrintEngine::supportedPaperSizes(printerInfo); } QList<QPrinterInfo> QWindowsPrinterSupport::availablePrinters() diff --git a/src/printsupport/kernel/qprintengine_win.cpp b/src/printsupport/kernel/qprintengine_win.cpp index e209314fbc..171ebbce17 100644 --- a/src/printsupport/kernel/qprintengine_win.cpp +++ b/src/printsupport/kernel/qprintengine_win.cpp @@ -1581,6 +1581,26 @@ void QWin32PrintEngine::releaseDC(HDC) const } +QList<QPrinter::PaperSize> QWin32PrintEngine::supportedPaperSizes(const QPrinterInfo &printerInfo) +{ + QList<QPrinter::PaperSize> returnList; + + if (printerInfo.isNull()) + return returnList; + + DWORD size = DeviceCapabilities(reinterpret_cast<const wchar_t *>(printerInfo.printerName().utf16()), + NULL, DC_PAPERS, NULL, NULL); + if ((int)size != -1) { + wchar_t *papers = new wchar_t[size]; + size = DeviceCapabilities(reinterpret_cast<const wchar_t *>(printerInfo.printerName().utf16()), + NULL, DC_PAPERS, papers, NULL); + for (int c = 0; c < (int)size; ++c) + returnList.append(mapDevmodePaperSize(papers[c])); + delete [] papers; + } + return returnList; +} + HGLOBAL *QWin32PrintEnginePrivate::createDevNames() { int size = sizeof(DEVNAMES) diff --git a/src/printsupport/kernel/qprintengine_win_p.h b/src/printsupport/kernel/qprintengine_win_p.h index baf8ccefce..c267c1057f 100644 --- a/src/printsupport/kernel/qprintengine_win_p.h +++ b/src/printsupport/kernel/qprintengine_win_p.h @@ -58,6 +58,7 @@ #include <QtGui/qpaintengine.h> #include <QtPrintSupport/QPrintEngine> #include <QtPrintSupport/QPrinter> +#include <QtPrintSupport/QPrinterInfo> #include <private/qpaintengine_alpha_p.h> #include <QtCore/qt_windows.h> @@ -105,6 +106,8 @@ public: HDC getPrinterDC() const { return getDC(); } void releasePrinterDC(HDC dc) const { releaseDC(dc); } + static QList<QPrinter::PaperSize> supportedPaperSizes(const QPrinterInfo &printerInfo); + private: friend class QPrintDialog; friend class QPageSetupDialog; diff --git a/tests/auto/printsupport/kernel/qprinterinfo/qprinterinfo.pro b/tests/auto/printsupport/kernel/qprinterinfo/qprinterinfo.pro index 88cb07f338..b0e69dca2e 100644 --- a/tests/auto/printsupport/kernel/qprinterinfo/qprinterinfo.pro +++ b/tests/auto/printsupport/kernel/qprinterinfo/qprinterinfo.pro @@ -7,4 +7,3 @@ QT += printsupport network testlib DEFINES += QT_USE_USING_NAMESPACE mac: CONFIG += insignificant_test # QTBUG-23060 -win32:CONFIG += insignificant_test # QTBUG-24190 |