diff options
-rw-r--r-- | src/activeqt/container/qaxbase.cpp | 80 |
1 files changed, 50 insertions, 30 deletions
diff --git a/src/activeqt/container/qaxbase.cpp b/src/activeqt/container/qaxbase.cpp index c1b38e2..125975f 100644 --- a/src/activeqt/container/qaxbase.cpp +++ b/src/activeqt/container/qaxbase.cpp @@ -1730,6 +1730,12 @@ private: using BuilderMethodCreationFunc = QMetaMethodBuilder (QMetaObjectBuilder::*)(const QByteArray &); + static void addMetaMethod(QMetaObjectBuilder &builder, + BuilderMethodCreationFunc creationFunc, + const QByteArray &name, + const QByteArray ¶meters, + const QByteArray &returnType = QByteArray(), + int attributes = 0); static void buildMethods(const QMap<QByteArray, Method> &list, QMetaObjectExtra &moExtra, QMetaObjectBuilder &builder, @@ -1783,9 +1789,6 @@ QMetaObject *qax_readInterfaceInfo(ITypeLib *typeLib, ITypeInfo *typeInfo, const QMetaObject *qax_readClassInfo(ITypeLib *typeLib, ITypeInfo *classInfo, const QMetaObject *parentObject) { MetaObjectGenerator generator(typeLib, nullptr); - generator.addSignal("exception(int,QString,QString,QString)", "code,source,disc,help"); - generator.addSignal("propertyChanged(QString)", "name"); - QString className; BSTR bstr; if (S_OK != classInfo->GetDocumentation(-1, &bstr, nullptr, nullptr, nullptr)) @@ -1883,13 +1886,6 @@ void MetaObjectGenerator::init() disp = d->dispatch(); iid_propNotifySink = IID_IPropertyNotifySink; - - addSignal("signal(QString,int,void*)", "name,argc,argv"); - addSignal("exception(int,QString,QString,QString)", "code,source,disc,help"); - addSignal("propertyChanged(QString)", "name"); - if (d || dispInfo) { - addProperty("QString", "control", Readable|Writable|Designable|Scriptable|Stored|Editable|StdCppSet); - } } MetaObjectGenerator::~MetaObjectGenerator() @@ -2996,6 +2992,24 @@ static uint nameToTypeInfo(const QByteArray &typeName, QMetaStringTable &strings return uint(result); } +static void addMetaProperty(QMetaObjectBuilder &builder, const QByteArray &name, + const QByteArray &type, uint flags) +{ + QMetaPropertyBuilder propertyBuilder = builder.addProperty(name, type); + propertyBuilder.setReadable(flags & Readable); + propertyBuilder.setWritable(flags & Writable); + propertyBuilder.setResettable(flags & Resettable); + propertyBuilder.setEnumOrFlag(flags & EnumOrFlag); + propertyBuilder.setStdCppSet(flags & StdCppSet); + propertyBuilder.setConstant(flags & Constant); + propertyBuilder.setFinal(flags & Final); + propertyBuilder.setDesignable(flags & Designable); + propertyBuilder.setScriptable(flags & Scriptable); + propertyBuilder.setStored(flags & Stored); + propertyBuilder.setEditable(flags & Editable); + propertyBuilder.setUser(flags & User); +} + // Returns the sum of all parameters (including return type) for the given // \a map of methods. This is needed for calculating the size of the methods' // parameter type/name meta-data. @@ -3008,6 +3022,21 @@ int MetaObjectGenerator::aggregateParameterCount(const QMap<QByteArray, Method> return sum; } +void MetaObjectGenerator::addMetaMethod(QMetaObjectBuilder &builder, + BuilderMethodCreationFunc creationFunc, + const QByteArray &name, + const QByteArray ¶meters, + const QByteArray &returnType, + int attributes) +{ + QMetaMethodBuilder methodBuilder = (builder.*creationFunc)(name); + if (!parameters.isEmpty()) + methodBuilder.setParameterNames(parameters.split(',')); + if (!returnType.isEmpty() && returnType != QByteArrayLiteral("void")) + methodBuilder.setReturnType(returnType); + methodBuilder.setAttributes(attributes); +} + void MetaObjectGenerator::buildMethods(const QMap<QByteArray, Method> &map, QMetaObjectExtra &moExtra, QMetaObjectBuilder &builder, @@ -3018,12 +3047,8 @@ void MetaObjectGenerator::buildMethods(const QMap<QByteArray, Method> &map, const Method &method(it.value()); if (!method.realPrototype.isEmpty()) moExtra.realPrototype.insert(prototype, method.realPrototype); - QMetaMethodBuilder methodBuilder = (builder.*creationFunc)(prototype); - if (!method.parameters.isEmpty()) - methodBuilder.setParameterNames(method.parameters.split(',')); - if (method.type != QByteArrayLiteral("void")) - methodBuilder.setReturnType(method.type); - methodBuilder.setAttributes(method.attributes); + addMetaMethod(builder, creationFunc, prototype, method.parameters, + method.type, method.attributes); } } @@ -3064,10 +3089,18 @@ QMetaObject *MetaObjectGenerator::metaObject(const QMetaObject *parentObject, co builder.addClassInfo(it.key(), it.value()); // add each method. Signals must be added before other methods, to match moc. + addMetaMethod(builder, &QMetaObjectBuilder::addSignal, + "exception(int,QString,QString,QString)", "code,source,desc,help"); + addMetaMethod(builder, &QMetaObjectBuilder::addSignal, + "propertyChanged(QString)", "name"); + addMetaMethod(builder, &QMetaObjectBuilder::addSignal, + "signal(QString,int,void*)", "name,argc,argv"); buildMethods(signal_list, moExtra, builder, &QMetaObjectBuilder::addSignal); buildMethods(slot_list, moExtra, builder, &QMetaObjectBuilder::addSlot); // each property + addMetaProperty(builder, "control", "QString", + Readable | Writable | Designable | Scriptable | Stored | Editable | StdCppSet); for (auto it = property_list.cbegin(), end = property_list.cend(); it != end; ++it) { const QByteArray &name = it.key(); const QByteArray &type = it.value().type; @@ -3075,20 +3108,7 @@ QMetaObject *MetaObjectGenerator::metaObject(const QMetaObject *parentObject, co QByteArray realType(it.value().realType); if (!realType.isEmpty() && realType != type) moExtra.realPrototype.insert(name, realType); - QMetaPropertyBuilder propertyBuilder = builder.addProperty(name, type); - const uint flags = it.value().flags; - propertyBuilder.setReadable(flags & Readable); - propertyBuilder.setWritable(flags & Writable); - propertyBuilder.setResettable(flags & Resettable); - propertyBuilder.setEnumOrFlag(flags & EnumOrFlag); - propertyBuilder.setStdCppSet(flags & StdCppSet); - propertyBuilder.setConstant(flags & Constant); - propertyBuilder.setFinal(flags & Final); - propertyBuilder.setDesignable(flags & Designable); - propertyBuilder.setScriptable(flags & Scriptable); - propertyBuilder.setStored(flags & Stored); - propertyBuilder.setEditable(flags & Editable); - propertyBuilder.setUser(flags & User); + addMetaProperty(builder, name, type, it.value().flags); } // each enum in form name\0 |