Windows: Improve debug output of mime conversion handling.
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>bb10
parent
01c6f7200a
commit
29af8741b6
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
|
|
|
|||
Loading…
Reference in New Issue