Specify better increment for captured properties
[qt:qtquick1.git] / src / declarative / qml / qdeclarativeengine_p.h
1 /****************************************************************************
2 **
3 ** Copyright (C) 2012 Digia Plc and/or its subsidiary(-ies).
4 ** Contact: http://www.qt-project.org/legal
5 **
6 ** This file is part of the QtDeclarative 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 Digia.  For licensing terms and
14 ** conditions see http://qt.digia.com/licensing.  For further information
15 ** use the contact form at http://qt.digia.com/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 2.1 as published by the Free Software
20 ** Foundation and appearing in the file LICENSE.LGPL included in the
21 ** packaging of this file.  Please review the following information to
22 ** ensure the GNU Lesser General Public License version 2.1 requirements
23 ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
24 **
25 ** In addition, as a special exception, Digia gives you certain additional
26 ** rights.  These rights are described in the Digia Qt LGPL Exception
27 ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
28 **
29 ** GNU General Public License Usage
30 ** Alternatively, this file may be used under the terms of the GNU
31 ** General Public License version 3.0 as published by the Free Software
32 ** Foundation and appearing in the file LICENSE.GPL included in the
33 ** packaging of this file.  Please review the following information to
34 ** ensure the GNU General Public License version 3.0 requirements will be
35 ** met: http://www.gnu.org/copyleft/gpl.html.
36 **
37 **
38 ** $QT_END_LICENSE$
39 **
40 ****************************************************************************/
41
42 #ifndef QDECLARATIVEENGINE_P_H
43 #define QDECLARATIVEENGINE_P_H
44
45 //
46 //  W A R N I N G
47 //  -------------
48 //
49 // This file is not part of the Qt API.  It exists purely as an
50 // implementation detail.  This header file may change from version to
51 // version without notice, or even be removed.
52 //
53 // We mean it.
54 //
55
56 #include "qdeclarativeengine.h"
57
58 #include "private/qdeclarativetypeloader_p.h"
59 #include "private/qdeclarativeimport_p.h"
60 #include "private/qpodvector_p.h"
61 #include "qdeclarative.h"
62 #include "private/qdeclarativevaluetype_p.h"
63 #include "qdeclarativecontext.h"
64 #include "private/qdeclarativecontext_p.h"
65 #include "qdeclarativeexpression.h"
66 #include "qdeclarativeimageprovider.h"
67 #include "private/qdeclarativeproperty_p.h"
68 #include "private/qdeclarativepropertycache_p.h"
69 #include "private/qdeclarativeobjectscriptclass_p.h"
70 #include "private/qdeclarativecontextscriptclass_p.h"
71 #include "private/qdeclarativevaluetypescriptclass_p.h"
72 #include "private/qdeclarativemetatype_p.h"
73 #include "private/qdeclarativedirparser_p.h"
74
75 #include <QtScript/QScriptClass>
76 #include <QtScript/QScriptValue>
77 #include <QtScript/QScriptString>
78 #include <QtCore/qstring.h>
79 #include <QtCore/qlist.h>
80 #include <QtCore/qpair.h>
81 #include <QtCore/qstack.h>
82 #include <QtCore/qmutex.h>
83 #include <QtScript/qscriptengine.h>
84
85 #include <private/qobject_p.h>
86
87 QT_BEGIN_NAMESPACE
88
89 class QDeclarativeContext;
90 class QDeclarativeEngine;
91 class QDeclarativeContextPrivate;
92 class QDeclarativeExpression;
93 class QDeclarativeContextScriptClass;
94 class QDeclarativeImportDatabase;
95 class QDeclarativeObjectScriptClass;
96 class QDeclarativeTypeNameScriptClass;
97 class QDeclarativeValueTypeScriptClass;
98 class QNetworkReply;
99 class QNetworkAccessManager;
100 class QDeclarativeNetworkAccessManagerFactory;
101 class QDeclarativeAbstractBinding;
102 class QScriptDeclarativeClass;
103 class QDeclarativeTypeNameScriptClass;
104 class QDeclarativeTypeNameCache;
105 class QDeclarativeComponentAttached;
106 class QDeclarativeListScriptClass;
107 class QDeclarativeCleanup;
108 class QDeclarativeDelayedError;
109 class QDeclarativeWorkerScriptEngine;
110 class QDeclarativeGlobalScriptClass;
111 class QDir;
112
113 class QDeclarativeScriptEngine : public QScriptEngine
114 {
115 public:
116     QDeclarativeScriptEngine(QDeclarativeEnginePrivate *priv);
117     virtual ~QDeclarativeScriptEngine();
118
119     QUrl resolvedUrl(QScriptContext *context, const QUrl& url); // resolved against p's context, or baseUrl if no p
120     static QScriptValue resolvedUrl(QScriptContext *ctxt, QScriptEngine *engine);
121
122     static QDeclarativeScriptEngine *get(QScriptEngine* e) { return static_cast<QDeclarativeScriptEngine*>(e); }
123
124     QDeclarativeEnginePrivate *p;
125
126     // User by SQL API
127     QScriptClass *sqlQueryClass;
128     QString offlineStoragePath;
129
130     // Used by DOM Core 3 API
131     QScriptClass *namedNodeMapClass;
132     QScriptClass *nodeListClass;
133
134     QUrl baseUrl;
135
136     virtual QNetworkAccessManager *networkAccessManager();
137 };
138
139 class Q_AUTOTEST_EXPORT QDeclarativeEnginePrivate : public QObjectPrivate
140 {
141     Q_DECLARE_PUBLIC(QDeclarativeEngine)
142 public:
143     QDeclarativeEnginePrivate(QDeclarativeEngine *);
144     ~QDeclarativeEnginePrivate();
145
146     void init();
147
148     struct CapturedProperty {
149         CapturedProperty(QObject *o, int c, int n)
150             : object(o), coreIndex(c), notifier(0), notifyIndex(n) {}
151         CapturedProperty(QDeclarativeNotifier *n)
152             : object(0), coreIndex(-1), notifier(n), notifyIndex(-1) {}
153
154         QObject *object;
155         int coreIndex;
156         QDeclarativeNotifier *notifier;
157         int notifyIndex;
158     };
159     bool captureProperties;
160     QPODVector<CapturedProperty, 16> capturedProperties;
161
162     QDeclarativeContext *rootContext;
163     bool isDebugging;
164
165     bool outputWarningsToStdErr;
166
167     QDeclarativeContextScriptClass *contextClass;
168     QDeclarativeContextData *sharedContext;
169     QObject *sharedScope;
170     QDeclarativeObjectScriptClass *objectClass;
171     QDeclarativeValueTypeScriptClass *valueTypeClass;
172     QDeclarativeTypeNameScriptClass *typeNameClass;
173     QDeclarativeListScriptClass *listClass;
174     // Global script class
175     QDeclarativeGlobalScriptClass *globalClass;
176
177     // Registered cleanup handlers
178     QDeclarativeCleanup *cleanup;
179
180     // Bindings that have had errors during startup
181     QDeclarativeDelayedError *erroredBindings;
182     int inProgressCreations;
183
184     QDeclarativeScriptEngine scriptEngine;
185
186     QDeclarativeWorkerScriptEngine *getWorkerScriptEngine();
187     QDeclarativeWorkerScriptEngine *workerScriptEngine;
188
189     QUrl baseUrl;
190
191     template<class T>
192     struct SimpleList {
193         SimpleList()
194             : count(0), values(0) {}
195         SimpleList(int r)
196             : count(0), values(new T*[r]) {}
197
198         int count;
199         T **values;
200
201         void append(T *v) {
202             values[count++] = v;
203         }
204
205         T *at(int idx) const {
206             return values[idx];
207         }
208
209         void clear() {
210             delete [] values;
211         }
212     };
213
214     static void clear(SimpleList<QDeclarativeAbstractBinding> &);
215     static void clear(SimpleList<QDeclarativeParserStatus> &);
216
217     QList<SimpleList<QDeclarativeAbstractBinding> > bindValues;
218     QList<SimpleList<QDeclarativeParserStatus> > parserStatus;
219     QList<QPair<QDeclarativeGuard<QObject>,int> > finalizedParserStatus;
220     QDeclarativeComponentAttached *componentAttached;
221
222     void registerFinalizedParserStatusObject(QObject *obj, int index) {
223         finalizedParserStatus.append(qMakePair(QDeclarativeGuard<QObject>(obj), index));
224     }
225
226     bool inBeginCreate;
227
228     QNetworkAccessManager *createNetworkAccessManager(QObject *parent) const;
229     QNetworkAccessManager *getNetworkAccessManager() const;
230     mutable QNetworkAccessManager *networkAccessManager;
231     mutable QDeclarativeNetworkAccessManagerFactory *networkAccessManagerFactory;
232
233     QHash<QString,QSharedPointer<QDeclarativeImageProvider> > imageProviders;
234     QDeclarativeImageProvider::ImageType getImageProviderType(const QUrl &url);
235     QImage getImageFromProvider(const QUrl &url, QSize *size, const QSize& req_size);
236     QPixmap getPixmapFromProvider(const QUrl &url, QSize *size, const QSize& req_size);
237
238     mutable QMutex mutex;
239
240     QDeclarativeTypeLoader typeLoader;
241     QDeclarativeImportDatabase importDatabase;
242
243     QString offlineStoragePath;
244
245     mutable quint32 uniqueId;
246     quint32 getUniqueId() const {
247         return uniqueId++;
248     }
249
250     QDeclarativeValueTypeFactory valueTypes;
251
252     QHash<const QMetaObject *, QDeclarativePropertyCache *> propertyCache;
253     QHash<QPair<QDeclarativeType *, int>, QDeclarativePropertyCache *> typePropertyCache;
254     inline QDeclarativePropertyCache *cache(QObject *obj);
255     inline QDeclarativePropertyCache *cache(const QMetaObject *);
256     inline QDeclarativePropertyCache *cache(QDeclarativeType *, int, QDeclarativeError &error);
257     QDeclarativePropertyCache *createCache(const QMetaObject *);
258     QDeclarativePropertyCache *createCache(QDeclarativeType *, int, QDeclarativeError &error);
259
260     void registerCompositeType(QDeclarativeCompiledData *);
261
262     bool isQObject(int);
263     QObject *toQObject(const QVariant &, bool *ok = 0) const;
264     QDeclarativeMetaType::TypeCategory typeCategory(int) const;
265     bool isList(int) const;
266     int listType(int) const;
267     const QMetaObject *rawMetaObjectForType(int) const;
268     const QMetaObject *metaObjectForType(int) const;
269     QHash<int, int> m_qmlLists;
270     QHash<int, QDeclarativeCompiledData *> m_compositeTypes;
271
272     QHash<QString, QScriptValue> m_sharedScriptImports;
273
274     QScriptValue scriptValueFromVariant(const QVariant &);
275     QVariant scriptValueToVariant(const QScriptValue &, int hint = QVariant::Invalid);
276
277     void sendQuit();
278     void warning(const QDeclarativeError &);
279     void warning(const QList<QDeclarativeError> &);
280     static void warning(QDeclarativeEngine *, const QDeclarativeError &);
281     static void warning(QDeclarativeEngine *, const QList<QDeclarativeError> &);
282     static void warning(QDeclarativeEnginePrivate *, const QDeclarativeError &);
283     static void warning(QDeclarativeEnginePrivate *, const QList<QDeclarativeError> &);
284
285     static QScriptValue qmlScriptObject(QObject*, QDeclarativeEngine*);
286
287     static QScriptValue createComponent(QScriptContext*, QScriptEngine*);
288     static QScriptValue createQmlObject(QScriptContext*, QScriptEngine*);
289     static QScriptValue isQtObject(QScriptContext*, QScriptEngine*);
290     static QScriptValue vector3d(QScriptContext*, QScriptEngine*);
291     static QScriptValue rgba(QScriptContext*, QScriptEngine*);
292     static QScriptValue hsla(QScriptContext*, QScriptEngine*);
293     static QScriptValue point(QScriptContext*, QScriptEngine*);
294     static QScriptValue size(QScriptContext*, QScriptEngine*);
295     static QScriptValue rect(QScriptContext*, QScriptEngine*);
296
297     static QScriptValue lighter(QScriptContext*, QScriptEngine*);
298     static QScriptValue darker(QScriptContext*, QScriptEngine*);
299     static QScriptValue tint(QScriptContext*, QScriptEngine*);
300
301     static QScriptValue desktopOpenUrl(QScriptContext*, QScriptEngine*);
302     static QScriptValue fontFamilies(QScriptContext*, QScriptEngine*);
303     static QScriptValue md5(QScriptContext*, QScriptEngine*);
304     static QScriptValue btoa(QScriptContext*, QScriptEngine*);
305     static QScriptValue atob(QScriptContext*, QScriptEngine*);
306     static QScriptValue consoleLog(QScriptContext*, QScriptEngine*);
307     static QScriptValue quit(QScriptContext*, QScriptEngine*);
308
309 #ifndef QT_NO_DATESTRING
310     static QScriptValue formatDate(QScriptContext*, QScriptEngine*);
311     static QScriptValue formatTime(QScriptContext*, QScriptEngine*);
312     static QScriptValue formatDateTime(QScriptContext*, QScriptEngine*);
313 #endif
314     static QScriptEngine *getScriptEngine(QDeclarativeEngine *e) { return &e->d_func()->scriptEngine; }
315     static QDeclarativeEngine *getEngine(QScriptEngine *e) { return static_cast<QDeclarativeScriptEngine*>(e)->p->q_func(); }
316     static QDeclarativeEnginePrivate *get(QDeclarativeEngine *e) { return e->d_func(); }
317     static QDeclarativeEnginePrivate *get(QDeclarativeContext *c) { return (c && c->engine()) ? QDeclarativeEnginePrivate::get(c->engine()) : 0; }
318     static QDeclarativeEnginePrivate *get(QDeclarativeContextData *c) { return (c && c->engine) ? QDeclarativeEnginePrivate::get(c->engine) : 0; }
319     static QDeclarativeEnginePrivate *get(QScriptEngine *e) { return static_cast<QDeclarativeScriptEngine*>(e)->p; }
320     static QDeclarativeEngine *get(QDeclarativeEnginePrivate *p) { return p->q_func(); }
321     QDeclarativeContextData *getContext(QScriptContext *);
322     QUrl getUrl(QScriptContext *);
323
324     static QString urlToLocalFileOrQrc(const QUrl& url);
325
326     static void defineModule();
327     static void defineModuleCompat();
328
329     static bool qml_debugging_enabled;
330 };
331
332 /*!
333 Returns a QDeclarativePropertyCache for \a obj if one is available.
334
335 If \a obj is null, being deleted or contains a dynamic meta object 0
336 is returned.
337
338 The returned cache is not referenced, so if it is to be stored, call addref().
339 */
340 QDeclarativePropertyCache *QDeclarativeEnginePrivate::cache(QObject *obj)
341 {
342     if (!obj || QObjectPrivate::get(obj)->metaObject || QObjectPrivate::get(obj)->wasDeleted)
343         return 0;
344
345     const QMetaObject *mo = obj->metaObject();
346     QDeclarativePropertyCache *rv = propertyCache.value(mo);
347     if (!rv) rv = createCache(mo);
348     return rv;
349 }
350
351 /*!
352 Returns a QDeclarativePropertyCache for \a metaObject.
353
354 As the cache is persisted for the life of the engine, \a metaObject must be
355 a static "compile time" meta-object, or a meta-object that is otherwise known to
356 exist for the lifetime of the QDeclarativeEngine.
357
358 The returned cache is not referenced, so if it is to be stored, call addref().
359 */
360 QDeclarativePropertyCache *QDeclarativeEnginePrivate::cache(const QMetaObject *metaObject)
361 {
362     Q_ASSERT(metaObject);
363
364     QDeclarativePropertyCache *rv = propertyCache.value(metaObject);
365     if (!rv) rv = createCache(metaObject);
366     return rv;
367 }
368
369 /*!
370 Returns a QDeclarativePropertyCache for \a type with \a minorVersion.
371
372 The returned cache is not referenced, so if it is to be stored, call addref().
373 */
374 QDeclarativePropertyCache *QDeclarativeEnginePrivate::cache(QDeclarativeType *type, int minorVersion, QDeclarativeError &error)
375 {
376     Q_ASSERT(type);
377
378     if (minorVersion == -1 || !type->containsRevisionedAttributes())
379         return cache(type->metaObject());
380
381     QDeclarativePropertyCache *rv = typePropertyCache.value(qMakePair(type, minorVersion));
382     if (!rv) rv = createCache(type, minorVersion, error);
383     return rv;
384 }
385
386 QT_END_NAMESPACE
387
388 #endif // QDECLARATIVEENGINE_P_H