diff options
author | Friedemann Kleint <Friedemann.Kleint@theqtcompany.com> | 2015-01-23 15:01:12 +0100 |
---|---|---|
committer | Friedemann Kleint <Friedemann.Kleint@theqtcompany.com> | 2015-01-23 16:34:13 +0100 |
commit | db68fe94a7502b92887d55a2bdb1741a2ec8f492 (patch) | |
tree | 03d902a2f847b6a929a987b5fdda6fb334dbcca5 | |
parent | bf72626849b7aabbe4dc01ca9b40e2f5f78e33a1 (diff) |
Fix handling of unsupported out parameters in QVariantToVARIANT().
Clear the VARIANT and Bail out before performing any actions on
the parameters.
Task-number: QTBUG-44048
Change-Id: Id382ba7dc8a3a0cda1a2d7a20b1ffb59152e95fa
Reviewed-by: Andy Shaw <andy.shaw@digia.com>
-rw-r--r-- | src/activeqt/shared/qaxtypes.cpp | 53 |
1 files changed, 35 insertions, 18 deletions
diff --git a/src/activeqt/shared/qaxtypes.cpp b/src/activeqt/shared/qaxtypes.cpp index 364e680..0515742 100644 --- a/src/activeqt/shared/qaxtypes.cpp +++ b/src/activeqt/shared/qaxtypes.cpp @@ -50,6 +50,7 @@ #include <qpixmap.h> #include <qpainter.h> #include <qobject.h> +#include <qdebug.h> #ifdef QAX_SERVER # include <qaxfactory.h> # include <private/qsystemlibrary_p.h> @@ -217,6 +218,12 @@ static DATE QDateTimeToDATE(const QDateTime &dt) return vtime; } +static QByteArray msgOutParameterNotSupported(const QByteArray &type) +{ + return QByteArrayLiteral("QVariantToVARIANT: out-parameter not supported for \"") + + type + QByteArrayLiteral("\"."); +} + /* Converts \a var to \a arg, and tries to coerce \a arg to \a type. @@ -706,13 +713,15 @@ bool QVariantToVARIANT(const QVariant &var, VARIANT &arg, const QByteArray &type break; } + if (out) { + qWarning().noquote() << msgOutParameterNotSupported("records"); + arg.vt = VT_EMPTY; + arg.byref = Q_NULLPTR; + return false; + } arg.vt = VT_RECORD; arg.pRecInfo = recordInfo, arg.pvRecord = record; - if (out) { - qWarning("QVariantToVARIANT: out-parameter not supported for records"); - return false; - } } break; #endif // QAX_SERVER @@ -724,30 +733,40 @@ bool QVariantToVARIANT(const QVariant &var, VARIANT &arg, const QByteArray &type subType.truncate(subType.length() - 1); #endif if (!qstrcmp(qvar.typeName(), "IDispatch*")) { + if (out) { + qWarning().noquote() << msgOutParameterNotSupported(qvar.typeName()); + arg.vt = VT_EMPTY; + arg.byref = Q_NULLPTR; + return false; + } arg.vt = VT_DISPATCH; arg.pdispVal = *(IDispatch**)qvar.data(); if (arg.pdispVal) arg.pdispVal->AddRef(); - if (out) { - qWarning("QVariantToVARIANT: out-parameter not supported for IDispatch"); - return false; - } } else if (!qstrcmp(qvar.typeName(), "IDispatch**")) { arg.vt = VT_DISPATCH; arg.ppdispVal = *(IDispatch***)qvar.data(); if (out) arg.vt |= VT_BYREF; } else if (!qstrcmp(qvar.typeName(), "IUnknown*")) { + if (out) { + qWarning().noquote() << msgOutParameterNotSupported(qvar.typeName()); + arg.vt = VT_EMPTY; + arg.byref = Q_NULLPTR; + return false; + } arg.vt = VT_UNKNOWN; arg.punkVal = *(IUnknown**)qvar.data(); if (arg.punkVal) arg.punkVal->AddRef(); +#ifdef QAX_SERVER + } else if (qAxFactory()->metaObject(QString::fromLatin1(subType.constData()))) { if (out) { - qWarning("QVariantToVARIANT: out-parameter not supported for IUnknown"); + qWarning().noquote() << msgOutParameterNotSupported("subtype"); + arg.vt = VT_EMPTY; + arg.byref = Q_NULLPTR; return false; } -#ifdef QAX_SERVER - } else if (qAxFactory()->metaObject(QString::fromLatin1(subType.constData()))) { arg.vt = VT_DISPATCH; void *user = *(void**)qvar.constData(); // qVariantGet(qvar, user, qvar.typeName()); @@ -756,20 +775,18 @@ bool QVariantToVARIANT(const QVariant &var, VARIANT &arg, const QByteArray &type } else { qAxFactory()->createObjectWrapper(static_cast<QObject*>(user), &arg.pdispVal); } +#else + } else if (QMetaType::type(subType)) { if (out) { - qWarning("QVariantToVARIANT: out-parameter not supported for subtype"); + qWarning().noquote() << msgOutParameterNotSupported("subtype"); + arg.vt = VT_EMPTY; + arg.byref = Q_NULLPTR; return false; } -#else - } else if (QMetaType::type(subType)) { QAxObject *object = *(QAxObject**)qvar.constData(); // qVariantGet(qvar, object, subType); arg.vt = VT_DISPATCH; object->queryInterface(IID_IDispatch, (void**)&arg.pdispVal); - if (out) { - qWarning("QVariantToVARIANT: out-parameter not supported for subtype"); - return false; - } #endif } else { return false; |