Windows: Improve debug output of mime conversion handling.
authorFriedemann Kleint <Friedemann.Kleint@theqtcompany.com>
Wed, 19 Aug 2015 10:29:41 +0000 (12:29 +0200)
committerFriedemann Kleint <Friedemann.Kleint@theqtcompany.com>
Tue, 1 Sep 2015 12:06:52 +0000 (12:06 +0000)
Introduce convenience function for obtaining the format
name and use that.
Add debug operator for struct FORMATETC including format name.
Replace all code enclosed in #ifdef QMIME_DEBUG by qCDebug().

Task-number: QTBUG-47656
Change-Id: Ibb3c860c57edee4a31e8f5f37e3245feebed52a1
Reviewed-by: Joerg Bornemann <joerg.bornemann@theqtcompany.com>
src/plugins/platforms/windows/qwindowsclipboard.cpp
src/plugins/platforms/windows/qwindowsmime.cpp
src/plugins/platforms/windows/qwindowsmime.h
src/plugins/platforms/windows/qwindowsole.cpp

index 925427ac30e4f8af0d0f11d34b73e9f0f60dfd05..97459a4d97bce21c11c4e6d012ab571f08391ea6 100644 (file)
@@ -109,8 +109,11 @@ static QDebug operator<<(QDebug d, const QMimeData *mimeData)
 IDataObject *QWindowsClipboardRetrievalMimeData::retrieveDataObject() const
 {
     IDataObject * pDataObj = 0;
-    if (OleGetClipboard(&pDataObj) == S_OK)
+    if (OleGetClipboard(&pDataObj) == S_OK) {
+        if (QWindowsContext::verbose > 1)
+            qCDebug(lcQpaMime) << __FUNCTION__ << pDataObj;
         return pDataObj;
+    }
     return 0;
 }
 
index 622352e98759a3b0012e916027b28e67be539275..375a7f11db0bfb49573c1f41adea01404d2e3229 100644 (file)
@@ -299,8 +299,6 @@ static bool qt_read_dibv5(QDataStream &s, QImage &image)
     return true;
 }
 
-//#define QMIME_DEBUG
-
 // helpers for using global memory
 
 static int getCf(const FORMATETC &formatetc)
@@ -380,6 +378,73 @@ static bool canGetData(int cf, IDataObject * pDataObj)
     return true;
 }
 
+#ifndef QT_NO_DEBUG_OUTPUT
+QDebug operator<<(QDebug d, const FORMATETC &tc)
+{
+    QDebugStateSaver saver(d);
+    d.nospace();
+    d << "FORMATETC(cfFormat=" << tc.cfFormat << ' ';
+    switch (tc.cfFormat) {
+    case CF_TEXT:
+        d << "CF_TEXT";
+        break;
+    case CF_BITMAP:
+        d << "CF_BITMAP";
+        break;
+    case CF_TIFF:
+        d << "CF_TIFF";
+        break;
+    case CF_OEMTEXT:
+        d << "CF_OEMTEXT";
+        break;
+    case CF_DIB:
+        d << "CF_DIB";
+        break;
+    case CF_DIBV5:
+        d << "CF_DIBV5";
+        break;
+    case CF_UNICODETEXT:
+        d << "CF_UNICODETEXT";
+        break;
+#ifndef Q_OS_WINCE
+    case CF_ENHMETAFILE:
+        d << "CF_ENHMETAFILE";
+        break;
+#endif // !Q_OS_WINCE
+    default:
+        d << QWindowsMimeConverter::clipboardFormatName(tc.cfFormat);
+        break;
+    }
+    d << ", dwAspect=" << tc.dwAspect << ", lindex=" << tc.lindex
+        << ", tymed=" << tc.tymed << ", ptd=" << tc.ptd << ')';
+    return d;
+}
+
+QDebug operator<<(QDebug d, IDataObject *dataObj)
+{
+    QDebugStateSaver saver(d);
+    d.nospace();
+    d.noquote();
+    d << "IDataObject(";
+    if (dataObj) { // Output formats contained in IDataObject.
+        IEnumFORMATETC *enumFormatEtc;
+        if (SUCCEEDED(dataObj->EnumFormatEtc(DATADIR_GET, &enumFormatEtc)) && enumFormatEtc) {
+            FORMATETC formatEtc[1];
+            ULONG fetched;
+            if (SUCCEEDED(enumFormatEtc->Reset())) {
+                while (SUCCEEDED(enumFormatEtc->Next(1, formatEtc, &fetched)) && fetched)
+                    d << formatEtc[0] << ',';
+                enumFormatEtc->Release();
+            }
+        }
+    } else {
+        d << '0';
+    }
+    d << ')';
+    return d;
+}
+#endif // !QT_NO_DEBUG_OUTPUT
+
 /*!
     \class QWindowsMime
     \brief The QWindowsMime class maps open-standard MIME to Window Clipboard formats.
@@ -894,11 +959,7 @@ QVariant QWindowsMimeHtml::convertToMime(const QString &mime, IDataObject *pData
     QVariant result;
     if (canConvertToMime(mime, pDataObj)) {
         QByteArray html = getData(CF_HTML, pDataObj);
-#ifdef QMIME_DEBUG
-        qDebug("QWindowsMimeHtml::convertToMime");
-        qDebug("raw :");
-        qDebug(html);
-#endif
+        qCDebug(lcQpaMime) << __FUNCTION__ << "raw:" << html;
         int start = html.indexOf("StartHTML:");
         int end = html.indexOf("EndHTML:");
 
@@ -996,6 +1057,8 @@ QVector<FORMATETC> QWindowsMimeImage::formatsForMime(const QString &mimeType, co
             formatetcs += setCf(CF_DIBV5);
         formatetcs += setCf(CF_DIB);
     }
+    if (!formatetcs.isEmpty())
+        qCDebug(lcQpaMime) << __FUNCTION__ << mimeType << formatetcs;
     return formatetcs;
 }
 
@@ -1216,9 +1279,7 @@ QVariant QBuiltInMimes::convertToMime(const QString &mimeType, IDataObject *pDat
     if (canConvertToMime(mimeType, pDataObj)) {
         QByteArray data = getData(inFormats.key(mimeType), pDataObj);
         if (!data.isEmpty()) {
-#ifdef QMIME_DEBUG
-            qDebug("QBuiltInMimes::convertToMime()");
-#endif
+            qCDebug(lcQpaMime) << __FUNCTION__;
             if (mimeType == QLatin1String("text/html") && preferredType == QVariant::String) {
                 // text/html is in wide chars on windows (compatible with Mozilla)
                 val = QString::fromWCharArray((const wchar_t *)data.data());
@@ -1326,6 +1387,8 @@ QVector<FORMATETC> QLastResortMimes::formatsForMime(const QString &mimeType, con
         that->formats.insert(cf, mimeType);
         formatetcs += setCf(cf);
     }
+    if (!formatetcs.isEmpty())
+        qCDebug(lcQpaMime) << __FUNCTION__ << mimeType << formatetcs;
     return formatetcs;
 }
 static const char x_qt_windows_mime[] = "application/x-qt-windows-mime;value=\"";
@@ -1400,11 +1463,8 @@ QString QLastResortMimes::mimeForFormat(const FORMATETC &formatetc) const
     if (!format.isEmpty())
         return format;
 
-    wchar_t buffer[256];
-    int len = GetClipboardFormatName(getCf(formatetc), buffer, 256);
-
-    if (len) {
-        QString clipFormat = QString::fromWCharArray(buffer, len);
+    const QString clipFormat = QWindowsMimeConverter::clipboardFormatName(getCf(formatetc));
+    if (!clipFormat.isEmpty()) {
 #ifndef QT_NO_DRAGANDDROP
         if (QInternalMimeData::canReadData(clipFormat))
             format = clipFormat;
@@ -1470,15 +1530,12 @@ QStringList QWindowsMimeConverter::allMimesForFormats(IDataObject *pDataObj) con
     if (hr == NOERROR) {
         FORMATETC fmtetc;
         while (S_OK == fmtenum->Next(1, &fmtetc, 0)) {
-#if defined(QMIME_DEBUG)
-            wchar_t buf[256] = {0};
-            GetClipboardFormatName(fmtetc.cfFormat, buf, 255);
-            qDebug("CF = %d : %s", fmtetc.cfFormat, qPrintable(QString::fromWCharArray(buf)));
-#endif
             for (int i= m_mimes.size() - 1; i >= 0; --i) {
                 QString format = m_mimes.at(i)->mimeForFormat(fmtetc);
                 if (!format.isEmpty() && !formats.contains(format)) {
                     formats += format;
+                    if (QWindowsContext::verbose > 1 && lcQpaMime().isDebugEnabled())
+                        qCDebug(lcQpaMime) << __FUNCTION__ << fmtetc << format;
                 }
             }
             // as documented in MSDN to avoid possible memleak
@@ -1494,6 +1551,7 @@ QStringList QWindowsMimeConverter::allMimesForFormats(IDataObject *pDataObj) con
 QWindowsMime * QWindowsMimeConverter::converterFromMime(const FORMATETC &formatetc, const QMimeData *mimeData) const
 {
     ensureInitialized();
+    qCDebug(lcQpaMime) << __FUNCTION__ << formatetc;
     for (int i = m_mimes.size()-1; i >= 0; --i) {
         if (m_mimes.at(i)->canConvertFromMime(formatetc, mimeData))
             return m_mimes.at(i);
@@ -1528,6 +1586,13 @@ void QWindowsMimeConverter::ensureInitialized() const
     }
 }
 
+QString QWindowsMimeConverter::clipboardFormatName(int cf)
+{
+    wchar_t buf[256] = {0};
+    return GetClipboardFormatName(cf, buf, 255)
+        ? QString::fromWCharArray(buf) : QString();
+}
+
 QVariant QWindowsMimeConverter::convertToMime(const QStringList &mimeTypes,
                                               IDataObject *pDataObj,
                                               QVariant::Type preferredType,
index 952410e14b70f3eed8b682e19a598484f9789e5c..17fddef1bcd4709c4a1a1bc59b966dc384b5704a 100644 (file)
@@ -42,6 +42,7 @@
 
 QT_BEGIN_NAMESPACE
 
+class QDebug;
 class QMimeData;
 
 class QWindowsMime
@@ -83,6 +84,8 @@ public:
     void registerMime(QWindowsMime *mime);
     void unregisterMime(QWindowsMime *mime) { m_mimes.removeOne(mime); }
 
+    static QString clipboardFormatName(int cf);
+
 private:
     void ensureInitialized() const;
 
@@ -90,6 +93,11 @@ private:
     mutable int m_internalMimeCount;
 };
 
+#ifndef QT_NO_DEBUG_OUTPUT
+QDebug operator<<(QDebug, const FORMATETC &);
+QDebug operator<<(QDebug d, IDataObject *);
+#endif
+
 QT_END_NAMESPACE
 
 #endif // QWINDOWSMIME_H
index 6f5a521af81a73aadb41d7448aa8496fc97be571..e480c1ebcfbb624e5d0953daabba5fd126d57195 100644 (file)
@@ -132,12 +132,6 @@ QWindowsOleDataObject::GetData(LPFORMATETC pformatetc, LPSTGMEDIUM pmedium)
 {
     HRESULT hr = ResultFromScode(DATA_E_FORMATETC);
 
-    if (QWindowsContext::verbose > 1 && lcQpaMime().isDebugEnabled()) {
-        wchar_t buf[256] = {0};
-        GetClipboardFormatName(pformatetc->cfFormat, buf, 255);
-        qCDebug(lcQpaMime) <<__FUNCTION__ << "CF = " << pformatetc->cfFormat << QString::fromWCharArray(buf);
-    }
-
     if (data) {
         const QWindowsMimeConverter &mc = QWindowsContext::instance()->mimeConverter();
         if (QWindowsMime *converter = mc.converterFromMime(*pformatetc, data))
@@ -145,11 +139,8 @@ QWindowsOleDataObject::GetData(LPFORMATETC pformatetc, LPSTGMEDIUM pmedium)
                 hr = ResultFromScode(S_OK);
     }
 
-    if (QWindowsContext::verbose > 1) {
-        wchar_t buf[256] = {0};
-        GetClipboardFormatName(pformatetc->cfFormat, buf, 255);
-        qCDebug(lcQpaMime) <<__FUNCTION__ << "CF = " << pformatetc->cfFormat << " returns 0x" << int(hr) << dec;
-    }
+    if (QWindowsContext::verbose > 1 && lcQpaMime().isDebugEnabled())
+        qCDebug(lcQpaMime) <<__FUNCTION__ << *pformatetc << "returns" << hex << showbase << quint64(hr);
 
     return hr;
 }
@@ -211,7 +202,7 @@ STDMETHODIMP
 QWindowsOleDataObject::EnumFormatEtc(DWORD dwDirection, LPENUMFORMATETC FAR* ppenumFormatEtc)
 {
      if (QWindowsContext::verbose > 1)
-         qCDebug(lcQpaMime) << __FUNCTION__;
+         qCDebug(lcQpaMime) << __FUNCTION__ << "dwDirection=" << dwDirection;
 
     if (!data)
         return ResultFromScode(DATA_E_FORMATETC);
@@ -274,7 +265,7 @@ QWindowsOleEnumFmtEtc::QWindowsOleEnumFmtEtc(const QVector<FORMATETC> &fmtetcs)
     m_dwRefs(1), m_nIndex(0), m_isNull(false)
 {
     if (QWindowsContext::verbose > 1)
-        qCDebug(lcQpaMime) << __FUNCTION__;
+        qCDebug(lcQpaMime) << __FUNCTION__ << fmtetcs;
     m_lpfmtetcs.reserve(fmtetcs.count());
     for (int idx = 0; idx < fmtetcs.count(); ++idx) {
         LPFORMATETC destetc = new FORMATETC();