summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFriedemann Kleint <Friedemann.Kleint@theqtcompany.com>2016-02-10 09:56:41 +0100
committerFriedemann Kleint <Friedemann.Kleint@theqtcompany.com>2016-02-10 19:37:53 +0000
commit3d3b0abf45ad4bf6abd82d022e01080cd423c1c5 (patch)
tree0d4e26f7a5c07682c8b00472e72cb8295223d342
parentde83e48d7908e2f50d9cdbe41207b77a41332f2d (diff)
Introduce helper functions for ITypeInfo::GetNames().
Move code to axutils. Change-Id: I149d72bba2f250a2c11e144b449b55385fe280e2 Reviewed-by: Joerg Bornemann <joerg.bornemann@theqtcompany.com>
-rw-r--r--src/activeqt/container/qaxbase.cpp74
-rw-r--r--src/activeqt/control/qaxserverbase.cpp12
-rw-r--r--src/activeqt/shared/qaxutils.cpp28
-rw-r--r--src/activeqt/shared/qaxutils_p.h3
4 files changed, 52 insertions, 65 deletions
diff --git a/src/activeqt/container/qaxbase.cpp b/src/activeqt/container/qaxbase.cpp
index acc319e..fb1351e 100644
--- a/src/activeqt/container/qaxbase.cpp
+++ b/src/activeqt/container/qaxbase.cpp
@@ -663,13 +663,10 @@ QByteArray QAxEventSink::findProperty(DISPID dispID)
if (!typeinfo)
return propname;
- BSTR names;
- UINT cNames;
- typeinfo->GetNames(dispID, &names, 1, &cNames);
- if (cNames) {
- propname = QString::fromWCharArray(names).toLatin1();
- SysFreeString(names);
- }
+
+ const QByteArray propnameI = qaxTypeInfoName(typeinfo, dispID);
+ if (!propnameI.isEmpty())
+ propname = propnameI;
typeinfo->Release();
QByteArray propsignal(propname + "Changed(");
@@ -2298,17 +2295,9 @@ void MetaObjectGenerator::readEnumInfo()
int value = vardesc->lpvarValue->lVal;
int memid = vardesc->memid;
// Get the name of the value
- BSTR valuename;
- QByteArray valueName;
- UINT maxNamesOut;
- enuminfo->GetNames(memid, &valuename, 1, &maxNamesOut);
- if (maxNamesOut) {
- valueName = QString::fromWCharArray(valuename).toLatin1();
- SysFreeString(valuename);
- } else {
+ QByteArray valueName = qaxTypeInfoName(enuminfo, memid);
+ if (valueName.isEmpty())
valueName = "value" + QByteArray::number(valueindex++);
- }
-
if (clashCheck.contains(QString::fromLatin1(valueName)))
valueName += QByteArray::number(++clashIndex);
@@ -2457,25 +2446,15 @@ void MetaObjectGenerator::readFuncsInfo(ITypeInfo *typeinfo, ushort nFuncs)
if (!funcdesc)
break;
- QByteArray function;
QByteArray type;
QByteArray prototype;
QList<QByteArray> parameters;
// parse function description
- BSTR bstrNames[256];
- UINT maxNames = 255;
- UINT maxNamesOut;
- typeinfo->GetNames(funcdesc->memid, (BSTR*)&bstrNames, maxNames, &maxNamesOut);
- QList<QByteArray> names;
- int p;
- for (p = 0; p < (int)maxNamesOut; ++p) {
- names << QString::fromWCharArray(bstrNames[p]).toLatin1();
- SysFreeString(bstrNames[p]);
- }
-
+ const QByteArrayList names = qaxTypeInfoNames(typeinfo, funcdesc->memid);
+ const int maxNamesOut = names.size();
// function name
- function = names.at(0);
+ const QByteArray &function = names.at(0);
if ((maxNamesOut == 3 && function == "QueryInterface") ||
(maxNamesOut == 1 && function == "AddRef") ||
(maxNamesOut == 1 && function == "Release") ||
@@ -2574,7 +2553,7 @@ void MetaObjectGenerator::readFuncsInfo(ITypeInfo *typeinfo, ushort nFuncs)
bool defargs;
do {
QByteArray pnames;
- for (p = 0; p < parameters.count(); ++p) {
+ for (int p = 0; p < parameters.count(); ++p) {
pnames += parameters.at(p);
if (p < parameters.count() - 1)
pnames += ',';
@@ -2640,24 +2619,17 @@ void MetaObjectGenerator::readVarsInfo(ITypeInfo *typeinfo, ushort nVars)
}
// get variable name
- BSTR bstrName;
- UINT maxNames = 1;
- UINT maxNamesOut;
- typeinfo->GetNames(vardesc->memid, &bstrName, maxNames, &maxNamesOut);
- if (maxNamesOut != 1 || !bstrName) {
+ const QByteArray variableName = qaxTypeInfoName(typeinfo, vardesc->memid);
+ if (variableName.isEmpty()) {
typeinfo->ReleaseVarDesc(vardesc);
continue;
}
- QByteArray variableType;
- QByteArray variableName;
- uint flags = 0;
- variableName = QString::fromWCharArray(bstrName).toLatin1();
- SysFreeString(bstrName);
+ uint flags = 0;
// get variable type
TYPEDESC typedesc = vardesc->elemdescVar.tdesc;
- variableType = guessTypes(typedesc, typeinfo, variableName);
+ const QByteArray variableType = guessTypes(typedesc, typeinfo, variableName);
// generate meta property
if (!hasProperty(variableName)) {
@@ -2798,29 +2770,17 @@ void MetaObjectGenerator::readEventInterface(ITypeInfo *eventinfo, IConnectionPo
continue;
}
- QByteArray function;
QByteArray prototype;
QList<QByteArray> parameters;
- // parse event function description
- BSTR bstrNames[256];
- UINT maxNames = 255;
- UINT maxNamesOut;
- eventinfo->GetNames(funcdesc->memid, (BSTR*)&bstrNames, maxNames, &maxNamesOut);
- QList<QByteArray> names;
- int p;
- for (p = 0; p < (int)maxNamesOut; ++p) {
- names << QString::fromWCharArray(bstrNames[p]).toLatin1();
- SysFreeString(bstrNames[p]);
- }
+ // parse event function description, get event function prototype
+ const QByteArrayList names = qaxTypeInfoNames(eventinfo, funcdesc->memid);
- // get event function prototype
- function = names.at(0);
QByteArray type; // dummy - we don't care about return values for signals
prototype = createPrototype(/*in*/ funcdesc, eventinfo, names, /*out*/type, parameters);
if (!hasSignal(prototype)) {
QByteArray pnames;
- for (p = 0; p < parameters.count(); ++p) {
+ for (int p = 0; p < parameters.count(); ++p) {
pnames += parameters.at(p);
if (p < parameters.count() - 1)
pnames += ',';
diff --git a/src/activeqt/control/qaxserverbase.cpp b/src/activeqt/control/qaxserverbase.cpp
index 1402d32..583cb76 100644
--- a/src/activeqt/control/qaxserverbase.cpp
+++ b/src/activeqt/control/qaxserverbase.cpp
@@ -2290,15 +2290,11 @@ HRESULT WINAPI QAxServerBase::Invoke(DISPID dispidMember, REFIID riid,
index = mo->indexOfProperty(name);
}
} else {
- BSTR bname;
- UINT cname = 0;
- if (m_spTypeInfo)
- m_spTypeInfo->GetNames(dispidMember, &bname, 1, &cname);
- if (!cname)
+ if (!m_spTypeInfo)
+ return res;
+ name = qaxTypeInfoName(m_spTypeInfo, dispidMember);
+ if (name.isEmpty())
return res;
-
- name = QString::fromWCharArray(bname).toLatin1();
- SysFreeString(bname);
}
}
diff --git a/src/activeqt/shared/qaxutils.cpp b/src/activeqt/shared/qaxutils.cpp
index 9f94835..7c7e967 100644
--- a/src/activeqt/shared/qaxutils.cpp
+++ b/src/activeqt/shared/qaxutils.cpp
@@ -346,4 +346,32 @@ HRGN qaxHrgnFromQRegion(const QRegion &region, const QWidget *widget)
#endif // QT_WIDGETS_LIB
+QByteArray qaxTypeInfoName(ITypeInfo *typeInfo, MEMBERID memId)
+{
+ QByteArray result;
+ BSTR names;
+ UINT cNames = 0;
+ typeInfo->GetNames(memId, &names, 1, &cNames);
+ if (cNames && names) {
+ result = QString::fromWCharArray(names).toLatin1();
+ SysFreeString(names);
+ }
+ return result;
+}
+
+QByteArrayList qaxTypeInfoNames(ITypeInfo *typeInfo, MEMBERID memId)
+{
+ QByteArrayList result;
+ BSTR bstrNames[256];
+ UINT maxNames = 255;
+ UINT maxNamesOut = 0;
+ typeInfo->GetNames(memId, reinterpret_cast<BSTR *>(&bstrNames), maxNames, &maxNamesOut);
+ result.reserve(maxNamesOut);
+ for (UINT p = 0; p < maxNamesOut; ++p) {
+ result.append(QString::fromWCharArray(bstrNames[p]).toLatin1());
+ SysFreeString(bstrNames[p]);
+ }
+ return result;
+}
+
QT_END_NAMESPACE
diff --git a/src/activeqt/shared/qaxutils_p.h b/src/activeqt/shared/qaxutils_p.h
index acd0eb8..f2576c1 100644
--- a/src/activeqt/shared/qaxutils_p.h
+++ b/src/activeqt/shared/qaxutils_p.h
@@ -120,6 +120,9 @@ QRect qaxFromNativeRect(const RECT &r, const QWidget *w);
HRGN qaxHrgnFromQRegion(const QRegion &region, const QWidget *widget);
#endif // QT_WIDGETS_LIB
+QByteArray qaxTypeInfoName(ITypeInfo *typeInfo, MEMBERID memId);
+QByteArrayList qaxTypeInfoNames(ITypeInfo *typeInfo, MEMBERID memId);
+
QT_END_NAMESPACE
Q_DECLARE_METATYPE(IDispatch**)