summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFriedemann Kleint <Friedemann.Kleint@theqtcompany.com>2015-01-23 15:01:12 +0100
committerFriedemann Kleint <Friedemann.Kleint@theqtcompany.com>2015-01-23 16:34:13 +0100
commitdb68fe94a7502b92887d55a2bdb1741a2ec8f492 (patch)
tree03d902a2f847b6a929a987b5fdda6fb334dbcca5
parentbf72626849b7aabbe4dc01ca9b40e2f5f78e33a1 (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.cpp53
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;