diff options
author | João Abecasis <joao.abecasis@nokia.com> | 2012-02-09 10:35:43 +0100 |
---|---|---|
committer | Qt by Nokia <qt-info@nokia.com> | 2012-02-15 12:46:02 +0100 |
commit | e507ca474862970ca347b81ec486c084dd5ce442 (patch) | |
tree | b358aed757c06dd24e8845274a35f809e32e50ef /src | |
parent | b3ecf716f1f4194014b9178f7e7eab2fda3c38d1 (diff) | |
download | qtactiveqt-e507ca474862970ca347b81ec486c084dd5ce442.tar.gz |
Don't register previously registered types as aliases
Some types were being registered in multiple places in different ways.
This patch tries to ensure that types are preferentially registered in
the canonical qRegisterMetaType<T>(#T) form.
Where this is not possible, we first check whether the type is already
registered, and only then attempt aliasing to void*/QObject*.
Hid away IsPointerToTypeDerivedFromQObject monstruosity, as QtCore now
provides a macro for this purpose.
Change-Id: I564b6ad3cd14daed9452d85a775c980f5772c703
Reviewed-by: Friedemann Kleint <Friedemann.Kleint@nokia.com>
Diffstat (limited to 'src')
-rw-r--r-- | src/activeqt/container/qaxbase.cpp | 9 | ||||
-rw-r--r-- | src/activeqt/container/qaxbase.h | 14 | ||||
-rw-r--r-- | src/activeqt/control/qaxfactory.h | 13 | ||||
-rw-r--r-- | src/activeqt/control/qaxserver.cpp | 15 | ||||
-rw-r--r-- | src/activeqt/shared/qaxtypes.cpp | 6 |
5 files changed, 23 insertions, 34 deletions
diff --git a/src/activeqt/container/qaxbase.cpp b/src/activeqt/container/qaxbase.cpp index 8d9ec32..6732d6c 100644 --- a/src/activeqt/container/qaxbase.cpp +++ b/src/activeqt/container/qaxbase.cpp @@ -4398,11 +4398,12 @@ QVariant QAxBase::asVariant() const else if (d->ptr) qvar.setValue(d->ptr); } else { - cn = cn.mid(cn.lastIndexOf(':') + 1); + cn = cn.mid(cn.lastIndexOf(':') + 1) + '*'; QObject *object = qObject(); - if (QMetaType::type(cn)) - qvar = QVariant(qRegisterMetaType<QObject*>(cn + '*'), &object); -// qvar.setValue(qObject(), cn + '*'); + int typeId = QMetaType::type(cn); + if (!typeId) + typeId = qRegisterMetaType<QObject *>(cn); + qvar = QVariant(typeId, &object); } return qvar; diff --git a/src/activeqt/container/qaxbase.h b/src/activeqt/container/qaxbase.h index 52d2ff1..cb8a7f1 100644 --- a/src/activeqt/container/qaxbase.h +++ b/src/activeqt/container/qaxbase.h @@ -215,18 +215,8 @@ QT_END_NAMESPACE #ifndef Q_COM_METATYPE_DECLARED #define Q_COM_METATYPE_DECLARED -QT_BEGIN_NAMESPACE namespace QtPrivate { -template <> struct IsPointerToTypeDerivedFromQObject<IUnknown*> { - enum { Value = false }; -}; -} QT_END_NAMESPACE - -QT_BEGIN_NAMESPACE namespace QtPrivate { -template <> struct IsPointerToTypeDerivedFromQObject<IDispatch*> { - enum { Value = false }; -}; -} QT_END_NAMESPACE - +Q_DECLARE_OPAQUE_POINTER(IUnknown*) +Q_DECLARE_OPAQUE_POINTER(IDispatch*) Q_DECLARE_METATYPE(IUnknown*) Q_DECLARE_METATYPE(IDispatch*) diff --git a/src/activeqt/control/qaxfactory.h b/src/activeqt/control/qaxfactory.h index 3463fca..e262292 100644 --- a/src/activeqt/control/qaxfactory.h +++ b/src/activeqt/control/qaxfactory.h @@ -299,17 +299,8 @@ QT_END_NAMESPACE #ifndef Q_COM_METATYPE_DECLARED #define Q_COM_METATYPE_DECLARED -QT_BEGIN_NAMESPACE namespace QtPrivate { -template <> struct IsPointerToTypeDerivedFromQObject<IUnknown*> { - enum { Value = false }; -}; -} QT_END_NAMESPACE - -QT_BEGIN_NAMESPACE namespace QtPrivate { -template <> struct IsPointerToTypeDerivedFromQObject<IDispatch*> { - enum { Value = false }; -}; -} QT_END_NAMESPACE +Q_DECLARE_OPAQUE_POINTER(IUnknown*) +Q_DECLARE_OPAQUE_POINTER(IDispatch*) Q_DECLARE_METATYPE(IUnknown*) Q_DECLARE_METATYPE(IDispatch*) diff --git a/src/activeqt/control/qaxserver.cpp b/src/activeqt/control/qaxserver.cpp index d6925fb..06344b6 100644 --- a/src/activeqt/control/qaxserver.cpp +++ b/src/activeqt/control/qaxserver.cpp @@ -90,8 +90,9 @@ QAxFactory *qAxFactory() // register all types with metatype system as pointers QStringList keys(qax_factory->featureList()); for (int i = 0; i < keys.count(); ++i) { - QString key(keys.at(i)); - qRegisterMetaType((key + QLatin1Char('*')).toLatin1(), (void**)0); + QByteArray pointerType = keys.at(i).toLatin1() + '*'; + if (!QMetaType::type(pointerType.constData())) + qRegisterMetaType<void *>(pointerType); } } return qax_factory; @@ -493,8 +494,8 @@ static const char* const type_map[][2] = static QByteArray convertTypes(const QByteArray &qtype, bool *ok) { - qRegisterMetaType("IDispatch*", (void**)0); - qRegisterMetaType("IUnknown*", (void**)0); + qRegisterMetaType<IDispatch *>("IDispatch*"); + qRegisterMetaType<IUnknown *>("IUnknown*"); *ok = false; @@ -1195,10 +1196,12 @@ extern "C" HRESULT __stdcall DumpIDL(const QString &outfile, const QString &ver) QByteArray cleanType = qax_clean_type(*key, mo).toLatin1(); out << "\tcoclass " << cleanType << ';' << endl; subtypes.append(cleanType); - qRegisterMetaType(cleanType, (void**)0); + if (!QMetaType::type(cleanType)) + qRegisterMetaType<void *>(cleanType); cleanType += '*'; subtypes.append(cleanType); - qRegisterMetaType(cleanType, (void**)0); + if (!QMetaType::type(cleanType)) + qRegisterMetaType<void *>(cleanType); } } out << endl; diff --git a/src/activeqt/shared/qaxtypes.cpp b/src/activeqt/shared/qaxtypes.cpp index 52bbf86..566bfb0 100644 --- a/src/activeqt/shared/qaxtypes.cpp +++ b/src/activeqt/shared/qaxtypes.cpp @@ -1111,7 +1111,11 @@ QVariant VARIANTToQVariant(const VARIANT &arg, const QByteArray &typeName, uint if (iface) { QObject *qObj = iface->qObject(); iface->Release(); - var = QVariant(qRegisterMetaType<QObject*>(qObj ? QByteArray(qObj->metaObject()->className()) + '*' : typeName), &qObj); + QByteArray pointerType = qObj ? QByteArray(qObj->metaObject()->className()) + '*' : typeName; + int pointerTypeId = QMetaType::type(pointerType); + if (!pointerTypeId) + pointerTypeId = qRegisterMetaType<QObject *>(pointerType); + var = QVariant(pointerTypeId, &qObj); } else #endif { |