QServiceProxy::QServiceProxy(const QByteArray& metadata, ObjectEndPoint* endPoint, QObject* parent) : QObject(parent) { Q_ASSERT(endPoint); d = new QServiceProxyPrivate(); d->metadata = metadata; d->meta = 0; d->endPoint = endPoint; QDataStream stream(d->metadata); QMetaObjectBuilder builder; QMap<QByteArray, const QMetaObject*> refs; builder.deserialize(stream, refs); if (stream.status() != QDataStream::Ok) { qWarning() << "Invalid metaObject for service received"; } else { QMetaMethodBuilder b = builder.addSignal("errorUnrecoverableIPCFault(QService::UnrecoverableIPCError)"); // After all methods are filled in, otherwise qvector won't be big enough localSignals.fill(false, builder.methodCount()); localSignals.replace(b.index(), true); // Call activate locally d->meta = builder.toMetaObject(); } }
QMetaObject *GoValue::metaObjectFor(GoTypeInfo *typeInfo) { if (typeInfo->metaObject) { return reinterpret_cast<QMetaObject *>(typeInfo->metaObject); } QMetaObjectBuilder mob; mob.setSuperClass(&QObject::staticMetaObject); mob.setClassName(typeInfo->typeName); mob.setFlags(QMetaObjectBuilder::DynamicMetaObject); GoMemberInfo *memberInfo; memberInfo = typeInfo->fields; int relativePropIndex = mob.propertyCount(); for (int i = 0; i < typeInfo->fieldsLen; i++) { mob.addSignal("__" + QByteArray::number(relativePropIndex) + "()"); QMetaPropertyBuilder propb = mob.addProperty(memberInfo->memberName, "QVariant", relativePropIndex); propb.setWritable(true); memberInfo->metaIndex = relativePropIndex; memberInfo++; relativePropIndex++; } memberInfo = typeInfo->methods; int relativeMethodIndex = mob.methodCount(); for (int i = 0; i < typeInfo->methodsLen; i++) { if (*memberInfo->resultSignature) { mob.addMethod(memberInfo->methodSignature, memberInfo->resultSignature); } else { mob.addMethod(memberInfo->methodSignature); } memberInfo->metaIndex = relativeMethodIndex; memberInfo++; relativeMethodIndex++; } QMetaObject *mo = mob.toMetaObject(); // Turn the relative indexes into absolute indexes. memberInfo = typeInfo->fields; int propOffset = mo->propertyOffset(); for (int i = 0; i < typeInfo->fieldsLen; i++) { memberInfo->metaIndex += propOffset; memberInfo++; } memberInfo = typeInfo->methods; int methodOffset = mo->methodOffset(); for (int i = 0; i < typeInfo->methodsLen; i++) { memberInfo->metaIndex += methodOffset; memberInfo++; } typeInfo->metaObject = mo; return mo; }
QMetaObject *metaObjectFor(GoTypeInfo *typeInfo) { if (typeInfo->metaObject) { return reinterpret_cast<QMetaObject *>(typeInfo->metaObject); } QMetaObjectBuilder mob; if (typeInfo->paint) { mob.setSuperClass(&QQuickPaintedItem::staticMetaObject); } else { mob.setSuperClass(&QObject::staticMetaObject); } mob.setClassName(typeInfo->typeName); mob.setFlags(QMetaObjectBuilder::DynamicMetaObject); GoMemberInfo *memberInfo; memberInfo = typeInfo->fields; int relativePropIndex = mob.propertyCount(); for (int i = 0; i < typeInfo->fieldsLen; i++) { mob.addSignal("__" + QByteArray::number(relativePropIndex) + "()"); const char *typeName = "QVariant"; if (memberInfo->memberType == DTListProperty) { typeName = "QQmlListProperty<QObject>"; } QMetaPropertyBuilder propb = mob.addProperty(memberInfo->memberName, typeName, relativePropIndex); propb.setWritable(true); memberInfo->metaIndex = relativePropIndex; memberInfo++; relativePropIndex++; } memberInfo = typeInfo->methods; int relativeMethodIndex = mob.methodCount(); for (int i = 0; i < typeInfo->methodsLen; i++) { if (*memberInfo->resultSignature) { mob.addMethod(memberInfo->methodSignature, memberInfo->resultSignature); } else { mob.addMethod(memberInfo->methodSignature); } memberInfo->metaIndex = relativeMethodIndex; memberInfo++; relativeMethodIndex++; } // TODO Support default properties. //mob.addClassInfo("DefaultProperty", "objects"); QMetaObject *mo = mob.toMetaObject(); // Turn the relative indexes into absolute indexes. memberInfo = typeInfo->fields; int propOffset = mo->propertyOffset(); for (int i = 0; i < typeInfo->fieldsLen; i++) { memberInfo->metaIndex += propOffset; memberInfo++; } memberInfo = typeInfo->methods; int methodOffset = mo->methodOffset(); for (int i = 0; i < typeInfo->methodsLen; i++) { memberInfo->metaIndex += methodOffset; memberInfo++; } typeInfo->metaObject = mo; return mo; }