bool FlatListModel::addValue(const QScriptValue &value, QHash<int, QVariant> *row, QList<int> *roles) { QScriptValueIterator it(value); while (it.hasNext()) { it.next(); QScriptValue value = it.value(); if (!value.isVariant() && !value.isRegExp() && !value.isDate() && value.isObject()) { qmlInfo(m_listModel) << "Cannot add list-type data when modifying or after modification from a worker script"; return false; } QString name = it.name(); QVariant v = it.value().toVariant(); QHash<QString, int>::Iterator iter = m_strings.find(name); if (iter == m_strings.end()) { int role = m_roles.count(); m_roles.insert(role, name); iter = m_strings.insert(name, role); if (roles) roles->append(role); } else { int role = iter.value(); if (roles && row->contains(role) && row->value(role) != v) roles->append(role); } row->insert(*iter, v); } return true; }
void FlatListScriptClass::setProperty(Object *obj, const Identifier &name, const QScriptValue &value) { if (!value.isVariant() && !value.isRegExp() && !value.isDate() && value.isObject()) { qmlInfo(m_model->m_listModel) << "Cannot add list-type data when modifying or after modification from a worker script"; return; } FlatNodeObjectData *objData = static_cast<FlatNodeObjectData*>(obj); if (!objData->nodeData) // item at this index has been deleted return; int index = objData->nodeData->index; QString propName = toString(name); int role = m_model->m_strings.value(propName, -1); if (role >= 0 && index >= 0) { QHash<int, QVariant> &row = m_model->m_values[index]; row[role] = value.toVariant(); QList<int> roles; roles << role; if (m_model->m_parentAgent) { // This is the list in the worker thread, so tell the agent to // emit itemsChanged() later m_model->m_parentAgent->changedData(index, 1, roles); } else { // This is the list in the main thread, so emit itemsChanged() emit m_model->m_listModel->itemsChanged(index, 1, roles); } } }
void fromScriptValueEntityReference(const QScriptValue &obj, EntityReference &s) { if (obj.isString()) s.ref = obj.toString(); else { if (!obj.property("ref").isValid()) LogError("Can't convert QScriptValue to EntityReference! QScriptValue does not contain ref attribute!"); else { QScriptValue ref = obj.property("ref"); if (ref.isNull()) s.ref = ""; // Empty the reference else if (ref.isString()) s.ref = ref.toString(); else if (ref.isQObject()) { // If the object is an Entity, call EntityReference::Set() with it Entity* entity = dynamic_cast<Entity*>(ref.toQObject()); s.Set(entity); } else if (ref.isNumber() || ref.isVariant()) s.ref = QString::number(ref.toInt32()); else LogError("Can't convert QScriptValue to EntityReference! Ref attribute is not null, string, a number, or an entity"); } } }
SharedDbiDataHandler ScriptEngineUtils::getDbiId(QScriptEngine * /*engine*/, const QScriptValue &value) { if (value.isVariant()) { QVariant var = value.toVariant(); if (var.canConvert<SharedDbiDataHandler>()) { return var.value<SharedDbiDataHandler>(); } } return SharedDbiDataHandler(); }
static JSAgentWatchData fromScriptValue(const QString &expression, const QScriptValue &value) { static const QString arrayStr = QCoreApplication::translate ("Debugger::JSAgentWatchData", "[Array of length %1]"); static const QString undefinedStr = QCoreApplication::translate ("Debugger::JSAgentWatchData", "<undefined>"); JSAgentWatchData data; data.exp = expression.toUtf8(); data.name = data.exp; data.hasChildren = false; data.value = value.toString().toUtf8(); data.objectId = value.objectId(); if (value.isArray()) { data.type = "Array"; data.value = arrayStr.arg(value.property(QLatin1String("length")).toString()).toUtf8(); data.hasChildren = true; } else if (value.isBool()) { data.type = "Bool"; // data.value = value.toBool() ? "true" : "false"; } else if (value.isDate()) { data.type = "Date"; data.value = value.toDateTime().toString().toUtf8(); } else if (value.isError()) { data.type = "Error"; } else if (value.isFunction()) { data.type = "Function"; } else if (value.isUndefined()) { data.type = undefinedStr.toUtf8(); } else if (value.isNumber()) { data.type = "Number"; } else if (value.isRegExp()) { data.type = "RegExp"; } else if (value.isString()) { data.type = "String"; } else if (value.isVariant()) { data.type = "Variant"; } else if (value.isQObject()) { const QObject *obj = value.toQObject(); data.type = "Object"; data.value += '['; data.value += obj->metaObject()->className(); data.value += ']'; data.hasChildren = true; } else if (value.isObject()) { data.type = "Object"; data.hasChildren = true; data.value = "[Object]"; } else if (value.isNull()) { data.type = "<null>"; } else { data.type = "<unknown>"; } return data; }
SharedDbiDataHandler ScriptEngineUtils::getDbiId(QScriptEngine *engine, const QScriptValue &value, const QString &className) { QScriptValue sClass = engine->globalObject().property(className); QScriptValue idValue = value; if (value.instanceOf(sClass)) { QScriptValue getIdFun = value.property("getId"); if (getIdFun.isFunction()) { idValue = getIdFun.call(value); } } if (idValue.isVariant()) { QVariant var = idValue.toVariant(); if (var.canConvert<SharedDbiDataHandler>()) { return var.value<SharedDbiDataHandler>(); } } return SharedDbiDataHandler(); }
QVariant scriptValueToVariant(const QScriptValue &value) { QVariant var; if (value.isBool() || value.isNumber() || value.isString() || value.isVariant() || value.isDate() || value.isRegExp()) { var = value.toVariant(); } else if (value.isArray()) { QVariantList list; int len = value.property(QLatin1String("length")).toInt32(); for (int i = 0; i < len; i++) list << scriptValueToVariant(value.property(i)); var = list; } else if (value.isObject()) { QVariantMap map; QScriptValueIterator it(value); while (it.hasNext()) { it.next(); map.insert(it.name(), scriptValueToVariant(it.value())); } var = map; } return var; }
bool operator==(const QScriptValue& first, const QScriptValue& second) { if (first.isUndefined()) { return second.isUndefined(); } else if (first.isNull()) { return second.isNull(); } else if (first.isBool()) { return second.isBool() && first.toBool() == second.toBool(); } else if (first.isNumber()) { return second.isNumber() && first.toNumber() == second.toNumber(); } else if (first.isString()) { return second.isString() && first.toString() == second.toString(); } else if (first.isVariant()) { return second.isVariant() && first.toVariant() == second.toVariant(); } else if (first.isQObject()) { return second.isQObject() && first.toQObject() == second.toQObject(); } else if (first.isQMetaObject()) { return second.isQMetaObject() && first.toQMetaObject() == second.toQMetaObject(); } else if (first.isDate()) { return second.isDate() && first.toDateTime() == second.toDateTime(); } else if (first.isRegExp()) { return second.isRegExp() && first.toRegExp() == second.toRegExp(); } else if (first.isArray()) { if (!second.isArray()) { return false; } int length = first.property(ScriptCache::getInstance()->getLengthString()).toInt32(); if (second.property(ScriptCache::getInstance()->getLengthString()).toInt32() != length) { return false; } for (int i = 0; i < length; i++) { if (first.property(i) != second.property(i)) { return false; } } return true; } else if (first.isObject()) { if (!second.isObject()) { return false; } int propertyCount = 0; for (QScriptValueIterator it(first); it.hasNext(); ) { it.next(); if (second.property(it.scriptName()) != it.value()) { return false; } propertyCount++; } // make sure the second has exactly as many properties as the first for (QScriptValueIterator it(second); it.hasNext(); ) { it.next(); if (--propertyCount < 0) { return false; } } return true; } else { // if none of the above tests apply, first must be invalid return !second.isValid(); } }
/*! Returns the match score for converting \a actual to be of type \a conversionType. A zero score means "perfect match" whereas a higher score is worse. The conversion table is copied out of the QtScript callQtMethod() function. */ int QDeclarativeObjectMethodScriptClass::matchScore(const QScriptValue &actual, int conversionType, const QByteArray &conversionTypeName) { if (actual.isNumber()) { switch (conversionType) { case QMetaType::Double: return 0; case QMetaType::Float: return 1; case QMetaType::LongLong: case QMetaType::ULongLong: return 2; case QMetaType::Long: case QMetaType::ULong: return 3; case QMetaType::Int: case QMetaType::UInt: return 4; case QMetaType::Short: case QMetaType::UShort: return 5; break; case QMetaType::Char: case QMetaType::UChar: return 6; default: return 10; } } else if (actual.isString()) { switch (conversionType) { case QMetaType::QString: return 0; default: return 10; } } else if (actual.isBoolean()) { switch (conversionType) { case QMetaType::Bool: return 0; default: return 10; } } else if (actual.isDate()) { switch (conversionType) { case QMetaType::QDateTime: return 0; case QMetaType::QDate: return 1; case QMetaType::QTime: return 2; default: return 10; } } else if (actual.isRegExp()) { switch (conversionType) { case QMetaType::QRegExp: return 0; default: return 10; } } else if (actual.isVariant()) { if (conversionType == qMetaTypeId<QVariant>()) return 0; else if (actual.toVariant().userType() == conversionType) return 0; else return 10; } else if (actual.isArray()) { switch (conversionType) { case QMetaType::QStringList: case QMetaType::QVariantList: return 5; default: return 10; } } else if (actual.isQObject()) { switch (conversionType) { case QMetaType::QObjectStar: return 0; default: return 10; } } else if (actual.isNull()) { switch (conversionType) { case QMetaType::VoidStar: case QMetaType::QObjectStar: return 0; default: if (!conversionTypeName.endsWith('*')) return 10; else return 0; } } else { return 10; } }
QString ActionInstance::evaluateTextString(bool &ok, const QString &toEvaluate, int &position) { ok = true; int startIndex = position; QString result; while(position < toEvaluate.length()) { if(toEvaluate[position] == QLatin1Char('$')) { //find a variable name if(VariableRegExp.indexIn(toEvaluate, position) != -1) { QString foundVariableName = VariableRegExp.cap(1); QScriptValue foundVariable = d->scriptEngine->globalObject().property(foundVariableName); position += foundVariableName.length(); if(!foundVariable.isValid()) { ok = false; emit executionException(ActionException::InvalidParameterException, tr("Undefined variable \"%1\"").arg(foundVariableName)); return QString(); } QString stringEvaluationResult; if(foundVariable.isNull()) stringEvaluationResult = QStringLiteral("[Null]"); else if(foundVariable.isUndefined()) stringEvaluationResult = QStringLiteral("[Undefined]"); else if(foundVariable.isArray()) { while((position + 1 < toEvaluate.length()) && toEvaluate[position + 1] == QLatin1Char('[')) { position += 2; QString indexArray = evaluateTextString(ok, toEvaluate, position); if((position < toEvaluate.length()) && toEvaluate[position] == QLatin1Char(']')) { QScriptString internalIndexArray = d->scriptEngine->toStringHandle(indexArray); bool flag = true; int numIndex = internalIndexArray.toArrayIndex(&flag); if(flag) //numIndex is valid foundVariable = foundVariable.property(numIndex); else //use internalIndexArray foundVariable = foundVariable.property(internalIndexArray); } else { //syntax error ok = false; emit executionException(ActionException::InvalidParameterException, tr("Invalid parameter. Unable to evaluate string")); return QString(); } //COMPATIBILITY: we break the while loop if foundVariable is no more of Array type if(!foundVariable.isArray()) break; } //end of while, no more '[' if(foundVariable.isArray()) stringEvaluationResult = evaluateVariableArray(ok, foundVariable); else stringEvaluationResult = foundVariable.toString(); } else if(foundVariable.isVariant()) { QVariant variantEvaluationResult = foundVariable.toVariant(); switch(variantEvaluationResult.type()) { case QVariant::StringList: stringEvaluationResult = variantEvaluationResult.toStringList().join(QStringLiteral("\n")); break; case QVariant::ByteArray: stringEvaluationResult = QStringLiteral("[Raw data]"); break; default: stringEvaluationResult = foundVariable.toString(); break; } } else stringEvaluationResult = foundVariable.toString(); result.append(stringEvaluationResult); } } else if (toEvaluate[position] == QLatin1Char(']')) { if(startIndex == 0) //in top level evaluation isolated character ']' is accepted (for compatibility reason), now prefer "\]" //i.e without matching '[' result.append(toEvaluate[position]); else //on other levels, the parsing is stopped at this point return result; } else if(toEvaluate[position] == QLatin1Char('\\')) { if(startIndex == 0) { //for ascendant compatibility reason //in top level evaluation '\' is not only an escape character, //but can also be a standard character in some cases if((position + 1) < toEvaluate.length()) { position++; if(toEvaluate[position] == QLatin1Char('$') || toEvaluate[position] == QLatin1Char('[') || toEvaluate[position] == QLatin1Char(']') || toEvaluate[position] == QLatin1Char('\\')) result.append(toEvaluate[position]); else { position--; result.append(toEvaluate[position]); } } else result.append(toEvaluate[position]); } else { position++; if( position < toEvaluate.length() ) result.append(toEvaluate[position]); } } else result.append(toEvaluate[position]); position++; } return result; }
void tst_QScriptValueGenerated::isVariant_test(const char*, const QScriptValue& value) { QFETCH(bool, expected); QCOMPARE(value.isVariant(), expected); QCOMPARE(value.isVariant(), expected); }