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: 2011, 2012, 2013 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 #ifndef KASTEN_DEFAULTSCRIPTCLASS_HPP
0010 #define KASTEN_DEFAULTSCRIPTCLASS_HPP
0011 
0012 #include <QVector>
0013 #include <QScriptClass>
0014 #include <QScriptValue>
0015 #include <QScriptEngine>
0016 #include <QScriptString>
0017 #include <QScriptClassPropertyIterator>
0018 
0019 class DataInformation;
0020 class ScriptHandlerInfo;
0021 
0022 class DefaultScriptClass : public QScriptClass
0023 {
0024     friend class DefaultscriptClassIterator;
0025 
0026 public:
0027     using DataInfPtr = DataInformation*;
0028     using PropertyInfoList = QVector<QPair<QScriptString, QScriptValue::PropertyFlags>>;
0029 
0030     DefaultScriptClass(QScriptEngine* engine, ScriptHandlerInfo* handlerInfo);
0031     ~DefaultScriptClass() override;
0032 
0033     QueryFlags queryProperty(const QScriptValue& object, const QScriptString& name, QueryFlags flags, uint* id) override;
0034     QScriptValue::PropertyFlags propertyFlags(const QScriptValue& object, const QScriptString& name, uint id) override;
0035     QScriptValue property(const QScriptValue& object, const QScriptString& name, uint id) override;
0036     void setProperty(QScriptValue& object, const QScriptString& name, uint id, const QScriptValue& value) override;
0037     QScriptValue prototype() const override;
0038 
0039     QScriptClassPropertyIterator* newIterator(const QScriptValue& object) override;
0040 
0041     /** Convert a QScriptValue to DataInformation than qscriptvalue_cast, since we know exactly what to expect
0042      * @param val the value to convert. Do not call .data() on it.
0043      * @return @p val converted to a Datainformation*
0044      */
0045     static DataInformation* toDataInformation(const QScriptValue& obj);
0046 
0047 protected:
0048     virtual bool queryAdditionalProperty(const DataInformation* data, const QScriptString& name, QueryFlags* flags, uint* id) = 0;
0049     virtual bool additionalPropertyFlags(const DataInformation* data, const QScriptString& name, uint id, QScriptValue::PropertyFlags* flags)  = 0;
0050     virtual QScriptValue additionalProperty(const DataInformation* data, const QScriptString& name, uint id)  = 0;
0051     virtual bool setAdditionalProperty(DataInformation* data, const QScriptString& name, uint id, const QScriptValue& value) = 0;
0052     static QScriptValue Default_proto_toString(QScriptContext* ctx, QScriptEngine* eng);
0053 
0054 private:
0055     void setDataType(const QScriptValue& value, DataInformation* data);
0056 
0057 protected:
0058     QScriptString s_valid;
0059     QScriptString s_wasAbleToRead;
0060     QScriptString s_validationError;
0061     QScriptString s_parent;
0062     QScriptString s_byteOrder;
0063     QScriptString s_name;
0064     QScriptString s_datatype;
0065     QScriptString s_updateFunc;
0066     QScriptString s_validationFunc;
0067     QScriptString s_customTypeName;
0068     QScriptString s_asStringFunc;
0069     /** Contains all properties of this class, classes inheriting should add their own properties to this list */
0070     PropertyInfoList mIterableProperties;
0071     QScriptValue mDefaultPrototype;
0072     ScriptHandlerInfo* mHandlerInfo;
0073 };
0074 
0075 /** Provide a default iterator for all properties. This should suffice for all classes that don't have children */
0076 class DefaultscriptClassIterator : public QScriptClassPropertyIterator
0077 {
0078 public:
0079     DefaultscriptClassIterator(const QScriptValue& object, DefaultScriptClass* cls);
0080     ~DefaultscriptClassIterator() override;
0081     bool hasNext() const override;
0082     bool hasPrevious() const override;
0083     QScriptString name() const override;
0084     QScriptValue::PropertyFlags flags() const override;
0085     uint id() const override;
0086     void next() override;
0087     void previous() override;
0088     void toBack() override;
0089     void toFront() override;
0090 
0091 private:
0092     int mCurrent = -1;
0093     DefaultScriptClass* mClass;
0094     DataInformation* mData;
0095 };
0096 
0097 #endif // KASTEN_DEFAULTSCRIPTCLASS_HPP