void MetaInfoPrivate::typeInfo(const QMetaObject *qMetaObject, QString *typeName, int *majorVersion, int *minorVersion) const { Q_ASSERT(typeName); if (!qMetaObject) return; *typeName = qMetaObject->className(); int majVersion = -1; int minVersion = -1; QDeclarativeType *qmlType = QDeclarativeMetaType::qmlType(qMetaObject); if (qmlType) { if (!qmlType->qmlTypeName().isEmpty()) { *typeName = qmlType->qmlTypeName(); majVersion = qmlType->majorVersion(); minVersion = qmlType->minorVersion(); } } if (majorVersion) *majorVersion = majVersion; if (minorVersion) *minorVersion = minVersion; }
void QJnextMainLoop::createObject(QVariantList& args, QByteArray* result) { uint id = idBase++; // this will OWN the backing char array QByteArray param = args.takeFirst().toByteArray(); QByteArray ns(param); QByteArray ver = QtBridge::takeLastParam(ns, "@"); if (ver.size() == 0) ver = "1.0"; QByteArray cls = QtBridge::takeLastParam(ns, "."); QString qmlcls = QString(ns) + "/" + cls; QObject *& object = objects[id]; if (object != NULL) { *result = "Error object already exists for id" + QByteArray::number(id); qWarning() << *result; return; } #ifdef DEBUG_QJnextMainLoop qDebug() << "[QJnextMainLoop]\tQDeclarative" << "import " + ns + " " + ver + "; " + cls + " {}"; #endif QDeclarativeComponent component(declarativeEngine, this); component.setData( "import " + ns + " " + ver + "; import QtQuick 1.0; QtObject {}", QUrl()); if (component.isError() || !component.isReady()) { qWarning() << "COMPONENT ERROR" << component.errorString(); } int majorVersion = -1, minorVersion = -1; QDeclarativeType * dtype = NULL; QString scls = cls; QList<QDeclarativeType*> types = QDeclarativeMetaType::qmlTypes(); foreach(QDeclarativeType* type, types) { if (ns == type->module()) { QString qmlType = QString::fromLatin1(type->qmlTypeName()); if (qmlcls.compare(qmlType, Qt::CaseInsensitive) == 0) { if (type->majorVersion() > majorVersion && type->minorVersion() > minorVersion) { majorVersion = type->majorVersion(); minorVersion = type->minorVersion(); dtype = type; } } } } if (dtype == NULL && ns == "bb" && cls == "Application") { object = bb::Application::instance(); object->setUserData(userDataId, new QJnextUserData(id)); goto end_createObject; } if (dtype == NULL) { *result = "No such Type " + cls + " in namespace " + ns; qWarning() << *result; return; } else if (!dtype->isCreatable()) { *result = "Class " + ns + "." + cls + " is not creatable: " + dtype->noCreationReason().toLatin1(); qWarning() << *result; return; } #ifdef DEBUG_QJnextMainLoop qDebug() << "[QJnextMainLoop]\t" << dtype->typeId() << dtype->typeName() << QString("%1.%2").arg(QString::number(dtype->majorVersion())).arg( QString::number(dtype->minorVersion())); #endif object = dtype->create(); if (!object) { qWarning() << "COMPONENT.CREATE ERROR"; *result = "Error creating component"; return; } object->setUserData(userDataId, new QJnextUserData(id)); object->setParent(this); end_createObject: *result = QByteArray::number(id); #ifdef DEBUG_QJnextMainLoop qDebug() << "[QJnextMainLoop]\tCreated object" << id; #endif }