summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJoão Abecasis <joao.abecasis@nokia.com>2012-02-09 10:35:43 +0100
committerQt by Nokia <qt-info@nokia.com>2012-02-15 12:46:02 +0100
commite507ca474862970ca347b81ec486c084dd5ce442 (patch)
treeb358aed757c06dd24e8845274a35f809e32e50ef /src
parentb3ecf716f1f4194014b9178f7e7eab2fda3c38d1 (diff)
downloadqtactiveqt-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.cpp9
-rw-r--r--src/activeqt/container/qaxbase.h14
-rw-r--r--src/activeqt/control/qaxfactory.h13
-rw-r--r--src/activeqt/control/qaxserver.cpp15
-rw-r--r--src/activeqt/shared/qaxtypes.cpp6
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
{