1 /****************************************************************************
2 **
3 ** Copyright (C) 2015 The Qt Company Ltd.
4 ** Contact: http://www.qt.io/licensing/
5 **
6 ** This file is part of the QtScript module of the Qt Toolkit.
7 **
8 ** $QT_BEGIN_LICENSE:LGPL$
9 ** Commercial License Usage
10 ** Licensees holding valid commercial Qt licenses may use this file in
11 ** accordance with the commercial license agreement provided with the
12 ** Software or, alternatively, in accordance with the terms contained in
13 ** a written agreement between you and The Qt Company. For licensing terms
14 ** and conditions see https://www.qt.io/terms-conditions. For further
15 ** information use the contact form at https://www.qt.io/contact-us.
16 **
17 ** GNU Lesser General Public License Usage
18 ** Alternatively, this file may be used under the terms of the GNU Lesser
19 ** General Public License version 3 as published by the Free Software
20 ** Foundation and appearing in the file LICENSE.LGPL3 included in the
21 ** packaging of this file. Please review the following information to
22 ** ensure the GNU Lesser General Public License version 3 requirements
23 ** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
24 **
25 ** GNU General Public License Usage
26 ** Alternatively, this file may be used under the terms of the GNU
27 ** General Public License version 2.0 or (at your option) the GNU General
28 ** Public license version 3 or any later version approved by the KDE Free
29 ** Qt Foundation. The licenses are as published by the Free Software
30 ** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
31 ** included in the packaging of this file. Please review the following
32 ** information to ensure the GNU General Public License requirements will
33 ** be met: https://www.gnu.org/licenses/gpl-2.0.html and
34 ** https://www.gnu.org/licenses/gpl-3.0.html.
35 **
36 ** $QT_END_LICENSE$
37 **
38 ****************************************************************************/
39 
40 #ifndef QSCRIPTDECLARATIVECLASS_P_H
41 #define QSCRIPTDECLARATIVECLASS_P_H
42 
43 //
44 //  W A R N I N G
45 //  -------------
46 //
47 // This file is not part of the Qt API.  It exists purely as an
48 // implementation detail.  This header file may change from version to
49 // version without notice, or even be removed.
50 //
51 // We mean it.
52 //
53 
54 #include <QtCore/qobjectdefs.h>
55 #include <QtScript/qscriptvalue.h>
56 #include <QtScript/qscriptclass.h>
57 
58 QT_BEGIN_NAMESPACE
59 
60 class QScriptDeclarativeClassPrivate;
61 class PersistentIdentifierPrivate;
62 class QScriptContext;
63 class Q_SCRIPT_EXPORT QScriptDeclarativeClass
64 {
65 public:
66 #define QT_HAVE_QSCRIPTDECLARATIVECLASS_VALUE
67     class Q_SCRIPT_EXPORT Value
68     {
69     public:
70         Value();
71         Value(const Value &);
72 
73         Value(QScriptContext *, int);
74         Value(QScriptContext *, uint);
75         Value(QScriptContext *, bool);
76         Value(QScriptContext *, double);
77         Value(QScriptContext *, float);
78         Value(QScriptContext *, const QString &);
79         Value(QScriptContext *, const QScriptValue &);
80         Value(QScriptEngine *, int);
81         Value(QScriptEngine *, uint);
82         Value(QScriptEngine *, bool);
83         Value(QScriptEngine *, double);
84         Value(QScriptEngine *, float);
85         Value(QScriptEngine *, const QString &);
86         Value(QScriptEngine *, const QScriptValue &);
87         ~Value();
88 
89         QScriptValue toScriptValue(QScriptEngine *) const;
90     private:
91         char dummy[8];
92     };
93 
94     typedef void* Identifier;
95 
~ObjectObject96     struct Object { virtual ~Object() {} };
97 
98     static QScriptValue newObject(QScriptEngine *, QScriptDeclarativeClass *, Object *);
99     static Value newObjectValue(QScriptEngine *, QScriptDeclarativeClass *, Object *);
100     static QScriptDeclarativeClass *scriptClass(const QScriptValue &);
101     static Object *object(const QScriptValue &);
102 
103     static QScriptValue function(const QScriptValue &, const Identifier &);
104     static QScriptValue property(const QScriptValue &, const Identifier &);
105     static Value functionValue(const QScriptValue &, const Identifier &);
106     static Value propertyValue(const QScriptValue &, const Identifier &);
107 
108     static QScriptValue scopeChainValue(QScriptContext *, int index);
109     static QScriptContext *pushCleanContext(QScriptEngine *);
110 
111     static QScriptValue newStaticScopeObject(
112         QScriptEngine *, int propertyCount, const QString *names,
113        const QScriptValue *values, const QScriptValue::PropertyFlags *flags);
114     static QScriptValue newStaticScopeObject(QScriptEngine *);
115 
116     class Q_SCRIPT_EXPORT PersistentIdentifier
117     {
118     public:
119         Identifier identifier;
120 
121         PersistentIdentifier();
122         ~PersistentIdentifier();
123         PersistentIdentifier(const PersistentIdentifier &other);
124         PersistentIdentifier &operator=(const PersistentIdentifier &other);
125 
126         QString toString() const;
127     private:
128         friend class QScriptDeclarativeClass;
PersistentIdentifier(QScriptEnginePrivate * e)129         PersistentIdentifier(QScriptEnginePrivate *e) : identifier(0), engine(e), d(0) {}
130         QScriptEnginePrivate *engine;
131         void *d;
132     };
133 
134     QScriptDeclarativeClass(QScriptEngine *engine);
135     virtual ~QScriptDeclarativeClass();
136 
137     QScriptEngine *engine() const;
138 
139     bool supportsCall() const;
140     void setSupportsCall(bool);
141 
142     PersistentIdentifier createPersistentIdentifier(const QString &);
143     PersistentIdentifier createPersistentIdentifier(const Identifier &);
144 
145     QString toString(const Identifier &);
146     bool startsWithUpper(const Identifier &);
147     quint32 toArrayIndex(const Identifier &, bool *ok);
148 
149     virtual QScriptClass::QueryFlags queryProperty(Object *, const Identifier &,
150                                                    QScriptClass::QueryFlags flags);
151 
152     virtual Value property(Object *, const Identifier &);
153     virtual void setProperty(Object *, const Identifier &name, const QScriptValue &);
154     virtual QScriptValue::PropertyFlags propertyFlags(Object *, const Identifier &);
155     virtual Value call(Object *, QScriptContext *);
156     virtual bool compare(Object *, Object *);
157 
158     virtual QStringList propertyNames(Object *);
159 
160     virtual bool isQObject() const;
161     virtual QObject *toQObject(Object *, bool *ok = 0);
162     virtual QVariant toVariant(Object *, bool *ok = 0);
163 
164     QScriptContext *context() const;
165 protected:
166     friend class QScriptDeclarativeClassPrivate;
167     QScopedPointer<QScriptDeclarativeClassPrivate> d_ptr;
168 };
169 
170 QT_END_NAMESPACE
171 
172 #endif
173