Update licenseheader text in source files for qtdeclarative Qt module
[profile/ivi/qtdeclarative.git] / src / declarative / qml / qdeclarativeengine_p.h
1 /****************************************************************************
2 **
3 ** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
4 ** All rights reserved.
5 ** Contact: Nokia Corporation (qt-info@nokia.com)
6 **
7 ** This file is part of the QtDeclarative module of the Qt Toolkit.
8 **
9 ** $QT_BEGIN_LICENSE:LGPL$
10 ** GNU Lesser General Public License Usage
11 ** This file may be used under the terms of the GNU Lesser General Public
12 ** License version 2.1 as published by the Free Software Foundation and
13 ** appearing in the file LICENSE.LGPL included in the packaging of this
14 ** file. Please review the following information to ensure the GNU Lesser
15 ** General Public License version 2.1 requirements will be met:
16 ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
17 **
18 ** In addition, as a special exception, Nokia gives you certain additional
19 ** rights. These rights are described in the Nokia Qt LGPL Exception
20 ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
21 **
22 ** GNU General Public License Usage
23 ** Alternatively, this file may be used under the terms of the GNU General
24 ** Public License version 3.0 as published by the Free Software Foundation
25 ** and appearing in the file LICENSE.GPL included in the packaging of this
26 ** file. Please review the following information to ensure the GNU General
27 ** Public License version 3.0 requirements will be met:
28 ** http://www.gnu.org/copyleft/gpl.html.
29 **
30 ** Other Usage
31 ** Alternatively, this file may be used in accordance with the terms and
32 ** conditions contained in a signed written agreement between you and Nokia.
33 **
34 **
35 **
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> 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
328     static bool qml_debugging_enabled;
329 };
330
331 /*!
332 Returns a QDeclarativePropertyCache for \a obj if one is available.
333
334 If \a obj is null, being deleted or contains a dynamic meta object 0
335 is returned.
336
337 The returned cache is not referenced, so if it is to be stored, call addref().
338 */
339 QDeclarativePropertyCache *QDeclarativeEnginePrivate::cache(QObject *obj)
340 {
341     if (!obj || QObjectPrivate::get(obj)->metaObject || QObjectPrivate::get(obj)->wasDeleted)
342         return 0;
343
344     const QMetaObject *mo = obj->metaObject();
345     QDeclarativePropertyCache *rv = propertyCache.value(mo);
346     if (!rv) rv = createCache(mo);
347     return rv;
348 }
349
350 /*!
351 Returns a QDeclarativePropertyCache for \a metaObject.
352
353 As the cache is persisted for the life of the engine, \a metaObject must be
354 a static "compile time" meta-object, or a meta-object that is otherwise known to
355 exist for the lifetime of the QDeclarativeEngine.
356
357 The returned cache is not referenced, so if it is to be stored, call addref().
358 */
359 QDeclarativePropertyCache *QDeclarativeEnginePrivate::cache(const QMetaObject *metaObject)
360 {
361     Q_ASSERT(metaObject);
362
363     QDeclarativePropertyCache *rv = propertyCache.value(metaObject);
364     if (!rv) rv = createCache(metaObject);
365     return rv;
366 }
367
368 /*!
369 Returns a QDeclarativePropertyCache for \a type with \a minorVersion.
370
371 The returned cache is not referenced, so if it is to be stored, call addref().
372 */
373 QDeclarativePropertyCache *QDeclarativeEnginePrivate::cache(QDeclarativeType *type, int minorVersion, QDeclarativeError &error)
374 {
375     Q_ASSERT(type);
376
377     if (minorVersion == -1 || !type->containsRevisionedAttributes())
378         return cache(type->metaObject());
379
380     QDeclarativePropertyCache *rv = typePropertyCache.value(qMakePair(type, minorVersion));
381     if (!rv) rv = createCache(type, minorVersion, error);
382     return rv;
383 }
384
385 QT_END_NAMESPACE
386
387 #endif // QDECLARATIVEENGINE_P_H