summaryrefslogtreecommitdiff
path: root/src/declarative/qml/qdeclarativeengine_p.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/declarative/qml/qdeclarativeengine_p.h')
-rw-r--r--src/declarative/qml/qdeclarativeengine_p.h522
1 files changed, 0 insertions, 522 deletions
diff --git a/src/declarative/qml/qdeclarativeengine_p.h b/src/declarative/qml/qdeclarativeengine_p.h
deleted file mode 100644
index afc7a18161..0000000000
--- a/src/declarative/qml/qdeclarativeengine_p.h
+++ /dev/null
@@ -1,522 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
-** Contact: http://www.qt-project.org/
-**
-** This file is part of the QtDeclarative module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** GNU Lesser General Public License Usage
-** This file may be used under the terms of the GNU Lesser General Public
-** License version 2.1 as published by the Free Software Foundation and
-** appearing in the file LICENSE.LGPL included in the packaging of this
-** file. Please review the following information to ensure the GNU Lesser
-** General Public License version 2.1 requirements will be met:
-** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain additional
-** rights. These rights are described in the Nokia Qt LGPL Exception
-** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU General
-** Public License version 3.0 as published by the Free Software Foundation
-** and appearing in the file LICENSE.GPL included in the packaging of this
-** file. Please review the following information to ensure the GNU General
-** Public License version 3.0 requirements will be met:
-** http://www.gnu.org/copyleft/gpl.html.
-**
-** Other Usage
-** Alternatively, this file may be used in accordance with the terms and
-** conditions contained in a signed written agreement between you and Nokia.
-**
-**
-**
-**
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QDECLARATIVEENGINE_P_H
-#define QDECLARATIVEENGINE_P_H
-
-//
-// W A R N I N G
-// -------------
-//
-// This file is not part of the Qt API. It exists purely as an
-// implementation detail. This header file may change from version to
-// version without notice, or even be removed.
-//
-// We mean it.
-//
-
-#include "qdeclarativeengine.h"
-
-#include "qdeclarativetypeloader_p.h"
-#include "qdeclarativeimport_p.h"
-#include <private/qpodvector_p.h>
-#include "qdeclarative.h"
-#include "qdeclarativevaluetype_p.h"
-#include "qdeclarativecontext.h"
-#include "qdeclarativecontext_p.h"
-#include "qdeclarativeexpression.h"
-#include "qdeclarativeimageprovider.h"
-#include "qdeclarativeproperty_p.h"
-#include "qdeclarativepropertycache_p.h"
-#include "qdeclarativemetatype_p.h"
-#include "qdeclarativedirparser_p.h"
-#include <private/qintrusivelist_p.h>
-#include <private/qrecyclepool_p.h>
-
-#include <QtCore/qlist.h>
-#include <QtCore/qpair.h>
-#include <QtCore/qstack.h>
-#include <QtCore/qmutex.h>
-#include <QtCore/qstring.h>
-#include <QtCore/qthread.h>
-
-#include <private/qobject_p.h>
-
-#include <private/qv8engine_p.h>
-#include <private/qjsengine_p.h>
-
-QT_BEGIN_NAMESPACE
-
-class QDeclarativeContext;
-class QDeclarativeEngine;
-class QDeclarativeContextPrivate;
-class QDeclarativeExpression;
-class QDeclarativeImportDatabase;
-class QNetworkReply;
-class QNetworkAccessManager;
-class QDeclarativeNetworkAccessManagerFactory;
-class QDeclarativeAbstractBinding;
-class QDeclarativeTypeNameCache;
-class QDeclarativeComponentAttached;
-class QDeclarativeCleanup;
-class QDeclarativeDelayedError;
-class QDeclarativeWorkerScriptEngine;
-class QDeclarativeVME;
-class QDir;
-class QDeclarativeIncubator;
-
-// This needs to be declared here so that the pool for it can live in QDeclarativeEnginePrivate.
-// The inline method definitions are in qdeclarativeexpression_p.h
-class QDeclarativeJavaScriptExpressionGuard : public QDeclarativeNotifierEndpoint
-{
-public:
- inline QDeclarativeJavaScriptExpressionGuard(QDeclarativeJavaScriptExpression *);
-
- static inline void endpointCallback(QDeclarativeNotifierEndpoint *);
- static inline QDeclarativeJavaScriptExpressionGuard *New(QDeclarativeJavaScriptExpression *e,
- QDeclarativeEngine *engine);
- inline void Delete();
-
- QDeclarativeJavaScriptExpression *expression;
- QDeclarativeJavaScriptExpressionGuard *next;
-};
-
-class Q_DECLARATIVE_EXPORT QDeclarativeEnginePrivate : public QJSEnginePrivate
-{
- Q_DECLARE_PUBLIC(QDeclarativeEngine)
-public:
- QDeclarativeEnginePrivate(QDeclarativeEngine *);
- ~QDeclarativeEnginePrivate();
-
- void init();
-
- class PropertyCapture {
- public:
- inline virtual ~PropertyCapture() {}
- virtual void captureProperty(QDeclarativeNotifier *) = 0;
- virtual void captureProperty(QObject *, int, int) = 0;
- };
-
- PropertyCapture *propertyCapture;
- inline void captureProperty(QDeclarativeNotifier *);
- inline void captureProperty(QObject *, int, int);
-
- QRecyclePool<QDeclarativeJavaScriptExpressionGuard> jsExpressionGuardPool;
-
- QDeclarativeContext *rootContext;
- bool isDebugging;
-
- bool outputWarningsToStdErr;
-
- QDeclarativeContextData *sharedContext;
- QObject *sharedScope;
-
- // Registered cleanup handlers
- QDeclarativeCleanup *cleanup;
-
- // Bindings that have had errors during startup
- QDeclarativeDelayedError *erroredBindings;
- int inProgressCreations;
-
- QV8Engine *v8engine() const { return q_func()->handle(); }
-
- QDeclarativeWorkerScriptEngine *getWorkerScriptEngine();
- QDeclarativeWorkerScriptEngine *workerScriptEngine;
-
- QUrl baseUrl;
-
- typedef QPair<QDeclarativeGuard<QObject>,int> FinalizeCallback;
- void registerFinalizeCallback(QObject *obj, int index);
-
- QDeclarativeVME *activeVME;
-
- QNetworkAccessManager *createNetworkAccessManager(QObject *parent) const;
- QNetworkAccessManager *getNetworkAccessManager() const;
- mutable QNetworkAccessManager *networkAccessManager;
- mutable QDeclarativeNetworkAccessManagerFactory *networkAccessManagerFactory;
-
- QHash<QString,QSharedPointer<QDeclarativeImageProvider> > imageProviders;
- QDeclarativeImageProvider::ImageType getImageProviderType(const QUrl &url);
- QDeclarativeTextureFactory *getTextureFromProvider(const QUrl &url, QSize *size, const QSize& req_size);
- QImage getImageFromProvider(const QUrl &url, QSize *size, const QSize& req_size);
- QPixmap getPixmapFromProvider(const QUrl &url, QSize *size, const QSize& req_size);
-
- // Scarce resources are "exceptionally high cost" QVariant types where allowing the
- // normal JavaScript GC to clean them up is likely to lead to out-of-memory or other
- // out-of-resource situations. When such a resource is passed into JavaScript we
- // add it to the scarceResources list and it is destroyed when we return from the
- // JavaScript execution that created it. The user can prevent this behavior by
- // calling preserve() on the object which removes it from this scarceResource list.
- class ScarceResourceData {
- public:
- ScarceResourceData(const QVariant &data) : data(data) {}
- QVariant data;
- QIntrusiveListNode node;
- };
- QIntrusiveList<ScarceResourceData, &ScarceResourceData::node> scarceResources;
- int scarceResourcesRefCount;
- void referenceScarceResources();
- void dereferenceScarceResources();
-
- QDeclarativeTypeLoader typeLoader;
- QDeclarativeImportDatabase importDatabase;
-
- QString offlineStoragePath;
-
- mutable quint32 uniqueId;
- inline quint32 getUniqueId() const {
- return uniqueId++;
- }
-
- QDeclarativeValueTypeFactory valueTypes;
-
- // Unfortunate workaround to avoid a circular dependency between
- // qdeclarativeengine_p.h and qdeclarativeincubator_p.h
- struct Incubator {
- QIntrusiveListNode next;
- // Unfortunate workaround for MSVC
- QIntrusiveListNode nextWaitingFor;
- };
- QIntrusiveList<Incubator, &Incubator::next> incubatorList;
- unsigned int incubatorCount;
- QDeclarativeIncubationController *incubationController;
- void incubate(QDeclarativeIncubator &, QDeclarativeContextData *);
-
- // These methods may be called from any thread
- inline bool isEngineThread() const;
- inline static bool isEngineThread(const QDeclarativeEngine *);
- template<typename T>
- inline void deleteInEngineThread(T *);
- template<typename T>
- inline static void deleteInEngineThread(QDeclarativeEngine *, T *);
-
- // These methods may be called from the loader thread
- QDeclarativeMetaType::ModuleApiInstance *moduleApiInstance(const QDeclarativeMetaType::ModuleApi &module);
-
- // These methods may be called from the loader thread
- inline QDeclarativePropertyCache *cache(QObject *obj);
- inline QDeclarativePropertyCache *cache(const QMetaObject *);
- inline QDeclarativePropertyCache *cache(QDeclarativeType *, int, QDeclarativeError &error);
-
- // These methods may be called from the loader thread
- bool isQObject(int);
- QObject *toQObject(const QVariant &, bool *ok = 0) const;
- QDeclarativeMetaType::TypeCategory typeCategory(int) const;
- bool isList(int) const;
- int listType(int) const;
- const QMetaObject *rawMetaObjectForType(int) const;
- const QMetaObject *metaObjectForType(int) const;
- void registerCompositeType(QDeclarativeCompiledData *);
-
- void sendQuit();
- void warning(const QDeclarativeError &);
- void warning(const QList<QDeclarativeError> &);
- static void warning(QDeclarativeEngine *, const QDeclarativeError &);
- static void warning(QDeclarativeEngine *, const QList<QDeclarativeError> &);
- static void warning(QDeclarativeEnginePrivate *, const QDeclarativeError &);
- static void warning(QDeclarativeEnginePrivate *, const QList<QDeclarativeError> &);
-
- inline static QV8Engine *getV8Engine(QDeclarativeEngine *e);
- inline static QDeclarativeEnginePrivate *get(QDeclarativeEngine *e);
- inline static const QDeclarativeEnginePrivate *get(const QDeclarativeEngine *e);
- inline static QDeclarativeEnginePrivate *get(QDeclarativeContext *c);
- inline static QDeclarativeEnginePrivate *get(QDeclarativeContextData *c);
- inline static QDeclarativeEngine *get(QDeclarativeEnginePrivate *p);
-
- static QString urlToLocalFileOrQrc(const QUrl& url);
- static QString urlToLocalFileOrQrc(const QString& url);
-
- static void registerBaseTypes(const char *uri, int versionMajor, int versionMinor);
- static void defineModule();
-
- static bool qml_debugging_enabled;
-
- mutable QMutex mutex;
-
-private:
- // Locker locks the QDeclarativeEnginePrivate data structures for read and write, if necessary.
- // Currently, locking is only necessary if the threaded loader is running concurrently. If it is
- // either idle, or is running with the main thread blocked, no locking is necessary. This way
- // we only pay for locking when we have to.
- // Consequently, this class should only be used to protect simple accesses or modifications of the
- // QDeclarativeEnginePrivate structures or operations that can be guarenteed not to start activity
- // on the loader thread.
- // The Locker API is identical to QMutexLocker. Locker reuses the QDeclarativeEnginePrivate::mutex
- // QMutex instance and multiple Lockers are recursive in the same thread.
- class Locker
- {
- public:
- inline Locker(const QDeclarativeEngine *);
- inline Locker(const QDeclarativeEnginePrivate *);
- inline ~Locker();
-
- inline void unlock();
- inline void relock();
-
- private:
- const QDeclarativeEnginePrivate *m_ep;
- quint32 m_locked:1;
- };
-
- // Must be called locked
- QDeclarativePropertyCache *createCache(const QMetaObject *);
- QDeclarativePropertyCache *createCache(QDeclarativeType *, int, QDeclarativeError &error);
-
- // These members must be protected by a QDeclarativeEnginePrivate::Locker as they are required by
- // the threaded loader. Only access them through their respective accessor methods.
- QHash<QDeclarativeMetaType::ModuleApi, QDeclarativeMetaType::ModuleApiInstance *> moduleApiInstances;
- QHash<const QMetaObject *, QDeclarativePropertyCache *> propertyCache;
- QHash<QPair<QDeclarativeType *, int>, QDeclarativePropertyCache *> typePropertyCache;
- QHash<int, int> m_qmlLists;
- QHash<int, QDeclarativeCompiledData *> m_compositeTypes;
-
- // These members is protected by the full QDeclarativeEnginePrivate::mutex mutex
- struct Deletable { Deletable():next(0) {} virtual ~Deletable() {} Deletable *next; };
- QFieldList<Deletable, &Deletable::next> toDeleteInEngineThread;
- void doDeleteInEngineThread();
-};
-
-QDeclarativeEnginePrivate::Locker::Locker(const QDeclarativeEngine *e)
-: m_ep(QDeclarativeEnginePrivate::get(e))
-{
- relock();
-}
-
-QDeclarativeEnginePrivate::Locker::Locker(const QDeclarativeEnginePrivate *e)
-: m_ep(e), m_locked(false)
-{
- relock();
-}
-
-QDeclarativeEnginePrivate::Locker::~Locker()
-{
- unlock();
-}
-
-void QDeclarativeEnginePrivate::Locker::unlock()
-{
- if (m_locked) {
- m_ep->mutex.unlock();
- m_locked = false;
- }
-}
-
-void QDeclarativeEnginePrivate::Locker::relock()
-{
- Q_ASSERT(!m_locked);
- if (m_ep->typeLoader.isConcurrent()) {
- m_ep->mutex.lock();
- m_locked = true;
- }
-}
-
-/*!
-Returns true if the calling thread is the QDeclarativeEngine thread.
-*/
-bool QDeclarativeEnginePrivate::isEngineThread() const
-{
- Q_Q(const QDeclarativeEngine);
- return QThread::currentThread() == q->thread();
-}
-
-/*!
-Returns true if the calling thread is the QDeclarativeEngine \a engine thread.
-*/
-bool QDeclarativeEnginePrivate::isEngineThread(const QDeclarativeEngine *engine)
-{
- Q_ASSERT(engine);
- return QDeclarativeEnginePrivate::get(engine)->isEngineThread();
-}
-
-/*!
-Delete \a value in the engine thread. If the calling thread is the engine
-thread, \a value will be deleted immediately.
-
-This method should be used for *any* type that has resources that need to
-be freed in the engine thread. This is generally types that use V8 handles.
-As there is some small overhead in checking the current thread, it is best
-practice to check if any V8 handles actually need to be freed and delete
-the instance directly if not.
-*/
-template<typename T>
-void QDeclarativeEnginePrivate::deleteInEngineThread(T *value)
-{
- Q_Q(QDeclarativeEngine);
-
- Q_ASSERT(value);
- if (isEngineThread()) {
- delete value;
- } else {
- struct I : public Deletable {
- I(T *value) : value(value) {}
- ~I() { delete value; }
- T *value;
- };
- I *i = new I(value);
- mutex.lock();
- bool wasEmpty = toDeleteInEngineThread.isEmpty();
- toDeleteInEngineThread.append(i);
- mutex.unlock();
- if (wasEmpty)
- QCoreApplication::postEvent(q, new QEvent(QEvent::User));
- }
-}
-
-/*!
-Delete \a value in the \a engine thread. If the calling thread is the engine
-thread, \a value will be deleted immediately.
-*/
-template<typename T>
-void QDeclarativeEnginePrivate::deleteInEngineThread(QDeclarativeEngine *engine, T *value)
-{
- Q_ASSERT(engine);
- QDeclarativeEnginePrivate::get(engine)->deleteInEngineThread<T>(value);
-}
-
-/*!
-Returns a QDeclarativePropertyCache for \a obj if one is available.
-
-If \a obj is null, being deleted or contains a dynamic meta object 0
-is returned.
-
-The returned cache is not referenced, so if it is to be stored, call addref().
-
-XXX thread There is a potential future race condition in this and all the cache()
-functions. As the QDeclarativePropertyCache is returned unreferenced, when called
-from the loader thread, it is possible that the cache will have been dereferenced
-and deleted before the loader thread has a chance to use or reference it. This
-can't currently happen as the cache holds a reference to the
-QDeclarativePropertyCache until the QDeclarativeEngine is destroyed.
-*/
-QDeclarativePropertyCache *QDeclarativeEnginePrivate::cache(QObject *obj)
-{
- if (!obj || QObjectPrivate::get(obj)->metaObject || QObjectPrivate::get(obj)->wasDeleted)
- return 0;
-
- Locker locker(this);
- const QMetaObject *mo = obj->metaObject();
- QDeclarativePropertyCache *rv = propertyCache.value(mo);
- if (!rv) rv = createCache(mo);
- return rv;
-}
-
-/*!
-Returns a QDeclarativePropertyCache for \a metaObject.
-
-As the cache is persisted for the life of the engine, \a metaObject must be
-a static "compile time" meta-object, or a meta-object that is otherwise known to
-exist for the lifetime of the QDeclarativeEngine.
-
-The returned cache is not referenced, so if it is to be stored, call addref().
-*/
-QDeclarativePropertyCache *QDeclarativeEnginePrivate::cache(const QMetaObject *metaObject)
-{
- Q_ASSERT(metaObject);
-
- Locker locker(this);
- QDeclarativePropertyCache *rv = propertyCache.value(metaObject);
- if (!rv) rv = createCache(metaObject);
- return rv;
-}
-
-/*!
-Returns a QDeclarativePropertyCache for \a type with \a minorVersion.
-
-The returned cache is not referenced, so if it is to be stored, call addref().
-*/
-QDeclarativePropertyCache *QDeclarativeEnginePrivate::cache(QDeclarativeType *type, int minorVersion, QDeclarativeError &error)
-{
- Q_ASSERT(type);
-
- if (minorVersion == -1 || !type->containsRevisionedAttributes())
- return cache(type->metaObject());
-
- Locker locker(this);
- QDeclarativePropertyCache *rv = typePropertyCache.value(qMakePair(type, minorVersion));
- if (!rv) rv = createCache(type, minorVersion, error);
- return rv;
-}
-
-QV8Engine *QDeclarativeEnginePrivate::getV8Engine(QDeclarativeEngine *e)
-{
- return e->d_func()->v8engine();
-}
-
-QDeclarativeEnginePrivate *QDeclarativeEnginePrivate::get(QDeclarativeEngine *e)
-{
- return e->d_func();
-}
-
-const QDeclarativeEnginePrivate *QDeclarativeEnginePrivate::get(const QDeclarativeEngine *e)
-{
- return e->d_func();
-}
-
-QDeclarativeEnginePrivate *QDeclarativeEnginePrivate::get(QDeclarativeContext *c)
-{
- return (c && c->engine()) ? QDeclarativeEnginePrivate::get(c->engine()) : 0;
-}
-
-QDeclarativeEnginePrivate *QDeclarativeEnginePrivate::get(QDeclarativeContextData *c)
-{
- return (c && c->engine) ? QDeclarativeEnginePrivate::get(c->engine) : 0;
-}
-
-QDeclarativeEngine *QDeclarativeEnginePrivate::get(QDeclarativeEnginePrivate *p)
-{
- return p->q_func();
-}
-
-void QDeclarativeEnginePrivate::captureProperty(QDeclarativeNotifier *n)
-{
- if (propertyCapture)
- propertyCapture->captureProperty(n);
-}
-
-void QDeclarativeEnginePrivate::captureProperty(QObject *o, int c, int n)
-{
- if (propertyCapture)
- propertyCapture->captureProperty(o, c, n);
-}
-
-QT_END_NAMESPACE
-
-#endif // QDECLARATIVEENGINE_P_H