Initial import from the monolithic Qt.
[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 ** No Commercial Usage
11 ** This file contains pre-release code and may not be distributed.
12 ** You may use this file in accordance with the terms and conditions
13 ** contained in the Technology Preview License Agreement accompanying
14 ** this package.
15 **
16 ** GNU Lesser General Public License Usage
17 ** Alternatively, this file may be used under the terms of the GNU Lesser
18 ** General Public License version 2.1 as published by the Free Software
19 ** Foundation and appearing in the file LICENSE.LGPL included in the
20 ** packaging of this file.  Please review the following information to
21 ** ensure the GNU Lesser General Public License version 2.1 requirements
22 ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
23 **
24 ** In addition, as a special exception, Nokia gives you certain additional
25 ** rights.  These rights are described in the Nokia Qt LGPL Exception
26 ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
27 **
28 ** If you have questions regarding the use of this file, please contact
29 ** Nokia at qt-info@nokia.com.
30 **
31 **
32 **
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 QScriptEngineDebugger;
99 class QNetworkReply;
100 class QNetworkAccessManager;
101 class QDeclarativeNetworkAccessManagerFactory;
102 class QDeclarativeAbstractBinding;
103 class QScriptDeclarativeClass;
104 class QDeclarativeTypeNameScriptClass;
105 class QDeclarativeTypeNameCache;
106 class QDeclarativeComponentAttached;
107 class QDeclarativeListScriptClass;
108 class QDeclarativeCleanup;
109 class QDeclarativeDelayedError;
110 class QDeclarativeWorkerScriptEngine;
111 class QDeclarativeGlobalScriptClass;
112 class QDir;
113
114 class QDeclarativeScriptEngine : public QScriptEngine
115 {
116 public:
117     QDeclarativeScriptEngine(QDeclarativeEnginePrivate *priv);
118     virtual ~QDeclarativeScriptEngine();
119
120     QUrl resolvedUrl(QScriptContext *context, const QUrl& url); // resolved against p's context, or baseUrl if no p
121     static QScriptValue resolvedUrl(QScriptContext *ctxt, QScriptEngine *engine);
122
123     static QDeclarativeScriptEngine *get(QScriptEngine* e) { return static_cast<QDeclarativeScriptEngine*>(e); }
124
125     QDeclarativeEnginePrivate *p;
126
127     // User by SQL API
128     QScriptClass *sqlQueryClass;
129     QString offlineStoragePath;
130
131     // Used by DOM Core 3 API
132     QScriptClass *namedNodeMapClass;
133     QScriptClass *nodeListClass;
134
135     QUrl baseUrl;
136
137     virtual QNetworkAccessManager *networkAccessManager();
138 };
139
140 class Q_AUTOTEST_EXPORT QDeclarativeEnginePrivate : public QObjectPrivate
141 {
142     Q_DECLARE_PUBLIC(QDeclarativeEngine)
143 public:
144     QDeclarativeEnginePrivate(QDeclarativeEngine *);
145     ~QDeclarativeEnginePrivate();
146
147     void init();
148
149     struct CapturedProperty {
150         CapturedProperty(QObject *o, int c, int n)
151             : object(o), coreIndex(c), notifier(0), notifyIndex(n) {}
152         CapturedProperty(QDeclarativeNotifier *n)
153             : object(0), coreIndex(-1), notifier(n), notifyIndex(-1) {}
154
155         QObject *object;
156         int coreIndex;
157         QDeclarativeNotifier *notifier;
158         int notifyIndex;
159     };
160     bool captureProperties;
161     QPODVector<CapturedProperty> capturedProperties;
162
163     QDeclarativeContext *rootContext;
164     bool isDebugging;
165
166     bool outputWarningsToStdErr;
167
168     QDeclarativeContextScriptClass *contextClass;
169     QDeclarativeContextData *sharedContext;
170     QObject *sharedScope;
171     QDeclarativeObjectScriptClass *objectClass;
172     QDeclarativeValueTypeScriptClass *valueTypeClass;
173     QDeclarativeTypeNameScriptClass *typeNameClass;
174     QDeclarativeListScriptClass *listClass;
175     // Global script class
176     QDeclarativeGlobalScriptClass *globalClass;
177
178     // Registered cleanup handlers
179     QDeclarativeCleanup *cleanup;
180
181     // Bindings that have had errors during startup
182     QDeclarativeDelayedError *erroredBindings;
183     int inProgressCreations;
184
185     QDeclarativeScriptEngine scriptEngine;
186
187     QDeclarativeWorkerScriptEngine *getWorkerScriptEngine();
188     QDeclarativeWorkerScriptEngine *workerScriptEngine;
189
190     QUrl baseUrl;
191
192     template<class T>
193     struct SimpleList {
194         SimpleList()
195             : count(0), values(0) {}
196         SimpleList(int r)
197             : count(0), values(new T*[r]) {}
198
199         int count;
200         T **values;
201
202         void append(T *v) {
203             values[count++] = v;
204         }
205
206         T *at(int idx) const {
207             return values[idx];
208         }
209
210         void clear() {
211             delete [] values;
212         }
213     };
214
215     static void clear(SimpleList<QDeclarativeAbstractBinding> &);
216     static void clear(SimpleList<QDeclarativeParserStatus> &);
217
218     QList<SimpleList<QDeclarativeAbstractBinding> > bindValues;
219     QList<SimpleList<QDeclarativeParserStatus> > parserStatus;
220     QList<QPair<QDeclarativeGuard<QObject>,int> > finalizedParserStatus;
221     QDeclarativeComponentAttached *componentAttached;
222
223     void registerFinalizedParserStatusObject(QObject *obj, int index) {
224         finalizedParserStatus.append(qMakePair(QDeclarativeGuard<QObject>(obj), index));
225     }
226
227     bool inBeginCreate;
228
229     QNetworkAccessManager *createNetworkAccessManager(QObject *parent) const;
230     QNetworkAccessManager *getNetworkAccessManager() const;
231     mutable QNetworkAccessManager *networkAccessManager;
232     mutable QDeclarativeNetworkAccessManagerFactory *networkAccessManagerFactory;
233
234     QHash<QString,QSharedPointer<QDeclarativeImageProvider> > imageProviders;
235     QDeclarativeImageProvider::ImageType getImageProviderType(const QUrl &url);
236     QImage getImageFromProvider(const QUrl &url, QSize *size, const QSize& req_size);
237     QPixmap getPixmapFromProvider(const QUrl &url, QSize *size, const QSize& req_size);
238
239     mutable QMutex mutex;
240
241     QDeclarativeTypeLoader typeLoader;
242     QDeclarativeImportDatabase importDatabase;
243
244     QString offlineStoragePath;
245
246     mutable quint32 uniqueId;
247     quint32 getUniqueId() const {
248         return uniqueId++;
249     }
250
251     QDeclarativeValueTypeFactory valueTypes;
252
253     QHash<const QMetaObject *, QDeclarativePropertyCache *> propertyCache;
254     QHash<QPair<QDeclarativeType *, int>, QDeclarativePropertyCache *> typePropertyCache;
255     inline QDeclarativePropertyCache *cache(QObject *obj);
256     inline QDeclarativePropertyCache *cache(const QMetaObject *);
257     inline QDeclarativePropertyCache *cache(QDeclarativeType *, int, QDeclarativeError &error);
258     QDeclarativePropertyCache *createCache(const QMetaObject *);
259     QDeclarativePropertyCache *createCache(QDeclarativeType *, int, QDeclarativeError &error);
260
261     void registerCompositeType(QDeclarativeCompiledData *);
262
263     bool isQObject(int);
264     QObject *toQObject(const QVariant &, bool *ok = 0) const;
265     QDeclarativeMetaType::TypeCategory typeCategory(int) const;
266     bool isList(int) const;
267     int listType(int) const;
268     const QMetaObject *rawMetaObjectForType(int) const;
269     const QMetaObject *metaObjectForType(int) const;
270     QHash<int, int> m_qmlLists;
271     QHash<int, QDeclarativeCompiledData *> m_compositeTypes;
272
273     QHash<QString, QScriptValue> m_sharedScriptImports;
274
275     QScriptValue scriptValueFromVariant(const QVariant &);
276     QVariant scriptValueToVariant(const QScriptValue &, int hint = QVariant::Invalid);
277
278     void sendQuit();
279     void warning(const QDeclarativeError &);
280     void warning(const QList<QDeclarativeError> &);
281     static void warning(QDeclarativeEngine *, const QDeclarativeError &);
282     static void warning(QDeclarativeEngine *, const QList<QDeclarativeError> &);
283     static void warning(QDeclarativeEnginePrivate *, const QDeclarativeError &);
284     static void warning(QDeclarativeEnginePrivate *, const QList<QDeclarativeError> &);
285
286     static QScriptValue qmlScriptObject(QObject*, QDeclarativeEngine*);
287
288     static QScriptValue createComponent(QScriptContext*, QScriptEngine*);
289     static QScriptValue createQmlObject(QScriptContext*, QScriptEngine*);
290     static QScriptValue isQtObject(QScriptContext*, QScriptEngine*);
291     static QScriptValue vector3d(QScriptContext*, QScriptEngine*);
292     static QScriptValue rgba(QScriptContext*, QScriptEngine*);
293     static QScriptValue hsla(QScriptContext*, QScriptEngine*);
294     static QScriptValue point(QScriptContext*, QScriptEngine*);
295     static QScriptValue size(QScriptContext*, QScriptEngine*);
296     static QScriptValue rect(QScriptContext*, QScriptEngine*);
297
298     static QScriptValue lighter(QScriptContext*, QScriptEngine*);
299     static QScriptValue darker(QScriptContext*, QScriptEngine*);
300     static QScriptValue tint(QScriptContext*, QScriptEngine*);
301
302     static QScriptValue desktopOpenUrl(QScriptContext*, QScriptEngine*);
303     static QScriptValue fontFamilies(QScriptContext*, QScriptEngine*);
304     static QScriptValue md5(QScriptContext*, QScriptEngine*);
305     static QScriptValue btoa(QScriptContext*, QScriptEngine*);
306     static QScriptValue atob(QScriptContext*, QScriptEngine*);
307     static QScriptValue consoleLog(QScriptContext*, QScriptEngine*);
308     static QScriptValue quit(QScriptContext*, QScriptEngine*);
309
310 #ifndef QT_NO_DATESTRING
311     static QScriptValue formatDate(QScriptContext*, QScriptEngine*);
312     static QScriptValue formatTime(QScriptContext*, QScriptEngine*);
313     static QScriptValue formatDateTime(QScriptContext*, QScriptEngine*);
314 #endif
315     static QScriptEngine *getScriptEngine(QDeclarativeEngine *e) { return &e->d_func()->scriptEngine; }
316     static QDeclarativeEngine *getEngine(QScriptEngine *e) { return static_cast<QDeclarativeScriptEngine*>(e)->p->q_func(); }
317     static QDeclarativeEnginePrivate *get(QDeclarativeEngine *e) { return e->d_func(); }
318     static QDeclarativeEnginePrivate *get(QDeclarativeContext *c) { return (c && c->engine()) ? QDeclarativeEnginePrivate::get(c->engine()) : 0; }
319     static QDeclarativeEnginePrivate *get(QDeclarativeContextData *c) { return (c && c->engine) ? QDeclarativeEnginePrivate::get(c->engine) : 0; }
320     static QDeclarativeEnginePrivate *get(QScriptEngine *e) { return static_cast<QDeclarativeScriptEngine*>(e)->p; }
321     static QDeclarativeEngine *get(QDeclarativeEnginePrivate *p) { return p->q_func(); }
322     QDeclarativeContextData *getContext(QScriptContext *);
323     QUrl getUrl(QScriptContext *);
324
325     static QString urlToLocalFileOrQrc(const QUrl& url);
326
327     static void defineModule();
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