File indexing completed on 2024-06-30 05:51:31

0001 /*
0002     This file is part of the Okteta Kasten Framework, made within the KDE community.
0003 
0004     SPDX-FileCopyrightText: 2012 Alex Richardson <alex.richardson@gmx.de>
0005 
0006     SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL
0007 */
0008 
0009 #include "pointerscriptclass.hpp"
0010 
0011 #include "../../datatypes/primitive/pointerdatainformation.hpp"
0012 #include "../../parsers/parserutils.hpp"
0013 #include "../../parsers/scriptvalueconverter.hpp"
0014 
0015 PointerScriptClass::PointerScriptClass(QScriptEngine* engine, ScriptHandlerInfo* handlerInfo)
0016     : PrimitiveScriptClass(engine, handlerInfo)
0017 {
0018     s_type = engine->toStringHandle(ParserStrings::PROPERTY_TYPE());
0019     mIterableProperties.append(qMakePair(s_type, QScriptValue::PropertyFlags(QScriptValue::Undeletable)));
0020     s_target = engine->toStringHandle(ParserStrings::PROPERTY_TARGET());
0021     mIterableProperties.append(qMakePair(s_target, QScriptValue::PropertyFlags(QScriptValue::Undeletable)));
0022     s_scale = engine->toStringHandle(ParserStrings::PROPERTY_SCALE());
0023     mIterableProperties.append(qMakePair(s_scale, QScriptValue::PropertyFlags(QScriptValue::Undeletable)));
0024     s_interpretFunc = engine->toStringHandle(ParserStrings::PROPERTY_INTERPRET_FUNC());
0025     mIterableProperties.append(qMakePair(s_interpretFunc, QScriptValue::PropertyFlags(QScriptValue::Undeletable)));
0026 }
0027 
0028 PointerScriptClass::~PointerScriptClass() = default;
0029 
0030 QScriptValue PointerScriptClass::additionalProperty(const DataInformation* data, const QScriptString& name,
0031                                                     uint id)
0032 {
0033     Q_ASSERT(data->isPointer());
0034     if (name == s_type) {
0035         return PrimitiveType::standardTypeName(data->asPointer()->pointerType()->type());
0036     }
0037     if (name == s_target) {
0038         return data->asPointer()->pointerTarget()->toScriptValue(engine(), mHandlerInfo);
0039     }
0040     if (name == s_scale) {
0041         return engine()->toScriptValue(data->asPointer()->pointerScale());
0042     }
0043     if (name == s_interpretFunc) {
0044         return data->asPointer()->interpreterFunction();
0045     }
0046     return PrimitiveScriptClass::additionalProperty(data, name, id);
0047 }
0048 
0049 bool PointerScriptClass::queryAdditionalProperty(const DataInformation* data, const QScriptString& name,
0050                                                  QScriptClass::QueryFlags* flags, uint* id)
0051 {
0052     if (name == s_type || name == s_target || name == s_scale || name == s_interpretFunc) {
0053         *flags = QScriptClass::HandlesReadAccess | QScriptClass::HandlesWriteAccess;
0054         return true;
0055     }
0056     return PrimitiveScriptClass::queryAdditionalProperty(data, name, flags, id);
0057 }
0058 
0059 bool PointerScriptClass::setAdditionalProperty(DataInformation* data, const QScriptString& name, uint id,
0060                                                const QScriptValue& value)
0061 {
0062     if (name == s_type) {
0063         DataInformation* newType = ScriptValueConverter::convert(value, QStringLiteral("(pointer value)"),
0064                                                                  data->logger(), data);
0065         if (!newType) {
0066             data->logError() << "Could not set new pointer type.";
0067         } else if (!data->asPointer()->setPointerType(newType)) {
0068             delete newType;
0069         }
0070 
0071         return true;
0072     }
0073     if (name == s_target) {
0074         DataInformation* newTarget = ScriptValueConverter::convert(value, QStringLiteral("(pointer value)"),
0075                                                                    data->logger(), data);
0076         if (!newTarget) {
0077             data->logError() << "Could not set new pointer target.";
0078         } else {
0079             data->asPointer()->setPointerTarget(newTarget);
0080         }
0081         return true;
0082     }
0083     if (name == s_scale) {
0084         if (!value.isNumber()) {
0085             data->logError() << "Could not set new pointer scale.";
0086         } else {
0087             data->asPointer()->setPointerScale(value.toInteger());
0088         }
0089         return true;
0090     }
0091     if (name == s_interpretFunc) {
0092         if (!value.isFunction()) {
0093             data->logError() << "Could not set new pointer interpreter function.";
0094         } else {
0095             data->asPointer()->setInterpreterFunction(value);
0096         }
0097         return true;
0098     }
0099     return PrimitiveScriptClass::setAdditionalProperty(data, name, id, value);
0100 }