From 3ff80d1fe4c35f68bcebde7dccfde7b0fb03014f Mon Sep 17 00:00:00 2001 From: Friedemann Kleint Date: Thu, 5 Mar 2015 16:52:42 +0100 Subject: Windows printing: Add more error reporting. Task-number: QTCREATORBUG-13742 Change-Id: Ic234c7e86531c0924ddc03c63cd50b442bdcc9e9 Reviewed-by: Andy Shaw --- src/printsupport/kernel/qprintengine_win.cpp | 42 +++++++++++++++++++++++----- src/printsupport/kernel/qprintengine_win_p.h | 5 +--- 2 files changed, 36 insertions(+), 11 deletions(-) (limited to 'src/printsupport/kernel') diff --git a/src/printsupport/kernel/qprintengine_win.cpp b/src/printsupport/kernel/qprintengine_win.cpp index 65af6fadf7..5b3184a20d 100644 --- a/src/printsupport/kernel/qprintengine_win.cpp +++ b/src/printsupport/kernel/qprintengine_win.cpp @@ -89,6 +89,17 @@ QWin32PrintEngine::QWin32PrintEngine(QPrinter::PrinterMode mode) d->initialize(); } +static QByteArray msgBeginFailed(const char *function, const DOCINFO &d) +{ + QString result; + QTextStream str(&result); + str << "QWin32PrintEngine::begin: " << function << " failed, document \"" + << QString::fromWCharArray(d.lpszDocName) << '"'; + if (d.lpszOutput[0]) + str << ", file \"" << QString::fromWCharArray(d.lpszOutput) << '"'; + return result.toLocal8Bit(); +} + bool QWin32PrintEngine::begin(QPaintDevice *pdev) { Q_D(QWin32PrintEngine); @@ -123,12 +134,12 @@ bool QWin32PrintEngine::begin(QPaintDevice *pdev) if (d->printToFile) di.lpszOutput = d->fileName.isEmpty() ? L"FILE:" : reinterpret_cast(d->fileName.utf16()); if (ok && StartDoc(d->hdc, &di) == SP_ERROR) { - qErrnoWarning("QWin32PrintEngine::begin: StartDoc failed"); + qErrnoWarning(msgBeginFailed("StartDoc", di)); ok = false; } if (StartPage(d->hdc) <= 0) { - qErrnoWarning("QWin32PrintEngine::begin: StartPage failed"); + qErrnoWarning(msgBeginFailed("StartPage", di)); ok = false; } @@ -175,8 +186,10 @@ bool QWin32PrintEngine::end() return true; if (d->hdc) { - EndPage(d->hdc); // end; printing done - EndDoc(d->hdc); + if (EndPage(d->hdc) <= 0) // end; printing done + qErrnoWarning("QWin32PrintEngine::end: EndPage failed (%p)", d->hdc); + if (EndDoc(d->hdc) <= 0) + qErrnoWarning("QWin32PrintEngine::end: EndDoc failed"); } d->state = QPrinter::Idle; @@ -201,10 +214,8 @@ bool QWin32PrintEngine::newPage() } if (d->reinit) { - if (!d->resetDC()) { - qErrnoWarning("QWin32PrintEngine::newPage: ResetDC failed"); + if (!d->resetDC()) return false; - } d->reinit = false; } @@ -241,6 +252,8 @@ bool QWin32PrintEngine::newPage() d->reinit = false; } success = (StartPage(d->hdc) > 0); + if (!success) + qErrnoWarning("Win32PrintEngine::newPage: StartPage failed (2)"); } if (!success) { d->state = QPrinter::Aborted; @@ -966,6 +979,21 @@ void QWin32PrintEnginePrivate::doReinit() } } +bool QWin32PrintEnginePrivate::resetDC() +{ + if (!hdc) { + qWarning() << "ResetDC() called with null hdc."; + return false; + } + const HDC oldHdc = hdc; + const HDC hdc = ResetDC(oldHdc, devMode); + if (!hdc) { + const int lastError = GetLastError(); + qErrnoWarning(lastError, "ResetDC() on %p failed (%d)", oldHdc, lastError); + } + return hdc != 0; +} + static int indexOfId(const QList &inputSlots, QPrint::InputSlotId id) { for (int i = 0; i < inputSlots.size(); ++i) { diff --git a/src/printsupport/kernel/qprintengine_win_p.h b/src/printsupport/kernel/qprintengine_win_p.h index 2f2a92f822..98a4cff1a8 100644 --- a/src/printsupport/kernel/qprintengine_win_p.h +++ b/src/printsupport/kernel/qprintengine_win_p.h @@ -152,10 +152,7 @@ public: is handled in the next begin or newpage. */ void doReinit(); - inline bool resetDC() { - hdc = ResetDC(hdc, devMode); - return hdc != 0; - } + bool resetDC(); void strokePath(const QPainterPath &path, const QColor &color); void fillPath(const QPainterPath &path, const QColor &color); -- cgit v1.2.3