Example #1
0
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
}