DataInformation* OsdParser::parseNode(const QDomNode& node, const DataInformation* parent) { QDomElement elem = node.toElement(); // try to convert the node to an element. DataInformation* data = NULL; if (!elem.isNull()) { // kDebug() << "element tag: " << elem.tagName(); //e is element const QString tag = elem.tagName(); if (tag == QLatin1String("struct")) data = structFromXML(elem); else if (tag == QLatin1String("array")) data = arrayFromXML(elem, parent); else if (tag == QLatin1String("bitfield")) data = bitfieldFromXML(elem); else if (tag == QLatin1String("primitive")) data = primitiveFromXML(elem); else if (tag == QLatin1String("union")) data = unionFromXML(elem); else if (tag == QLatin1String("enum")) data = enumFromXML(elem, false); else if (tag == QLatin1String("flags")) data = enumFromXML(elem, true); else if (tag == QLatin1String("string")) data = stringFromXML(elem); } if (data) { QString byteOrder = elem.attribute(QLatin1String("byteOrder"), QLatin1String("inherit")); data->setByteOrder(byteOrderFromString(byteOrder)); } return data; }
void DefaultScriptClass::setProperty(QScriptValue& object, const QScriptString& name, uint id, const QScriptValue& value) { const ScriptHandlerInfo::Mode mode = mHandlerInfo->mode(); Q_ASSERT(mode != ScriptHandlerInfo::None); DataInformation* data = toDataInformation(object); if (!data) { mHandlerInfo->logger()->error() << "could not cast data from" << object.data().toString(); engine()->currentContext()->throwError(QScriptContext::ReferenceError, QStringLiteral("Attempting to access an invalid object")); return; } if (mode == ScriptHandlerInfo::Validating) { //only way write access is allowed is when validating: valid and validationError if (data->hasBeenValidated()) data->logError() << "Cannot modify this object, it has already been validated!"; else if (name == s_valid) data->mValidationSuccessful = value.toBool(); else if (name == s_validationError) data->setValidationError(value.toString()); else data->logError() << "Cannot write to property" << name.toString() << "while validating!"; return; } if (mode != ScriptHandlerInfo::Updating) { data->logError() << "Writing to property" << name.toString() << "is only allowed when updating."; return; } Q_ASSERT(mode == ScriptHandlerInfo::Updating); if (name == s_byteOrder) { data->setByteOrder(ParserUtils::byteOrderFromString(value.toString(), LoggerWithContext(data->logger(), data->fullObjectPath()))); } else if (name == s_datatype) { //change the type of the underlying object setDataType(value, data); } else if (name == s_updateFunc) { data->setUpdateFunc(value); } else if (name == s_validationFunc) { data->setValidationFunc(value); } else if (name == s_name) { data->setName(value.toString()); } else if (name == s_customTypeName) { if (!value.isValid() || value.isNull() || value.isUndefined()) data->setCustomTypeName(QString()); //unset else data->setCustomTypeName(value.toString()); } else if (name == s_asStringFunc) { data->setToStringFunction(value); } else { bool setAdditional = setAdditionalProperty(data, name, id, value); if (setAdditional) return; else { data->logError() << "could not set property with name" << name.toString(); engine()->currentContext()->throwError(QScriptContext::ReferenceError, QStringLiteral("Cannot write property ") + name.toString()); } } }