| /**************************************************************************** |
| ** |
| ** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). |
| ** All rights reserved. |
| ** Contact: Nokia Corporation (qt-info@nokia.com) |
| ** |
| ** 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 QDECLARATIVETYPELOADER_P_H |
| #define QDECLARATIVETYPELOADER_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 <QtCore/qobject.h> |
| #include <QtNetwork/qnetworkreply.h> |
| #include <QtDeclarative/qdeclarativeerror.h> |
| #include <QtDeclarative/qdeclarativeengine.h> |
| #include <private/qdeclarativescriptparser_p.h> |
| #include <private/qdeclarativedirparser_p.h> |
| #include <private/qdeclarativeimport_p.h> |
| |
| QT_BEGIN_NAMESPACE |
| |
| class QDeclarativeScriptData; |
| class QDeclarativeQmldirData; |
| class QDeclarativeTypeLoader; |
| class QDeclarativeCompiledData; |
| class QDeclarativeComponentPrivate; |
| class QDeclarativeTypeData; |
| class QDeclarativeDataLoader; |
| |
| class Q_AUTOTEST_EXPORT QDeclarativeDataBlob : public QDeclarativeRefCount |
| { |
| public: |
| enum Status { |
| Null, // Prior to QDeclarativeDataLoader::load() |
| Loading, // Prior to data being received and dataReceived() being called |
| WaitingForDependencies, // While there are outstanding addDependency()s |
| Complete, // Finished |
| Error // Error |
| }; |
| |
| enum Type { |
| QmlFile, |
| JavaScriptFile, |
| QmldirFile |
| }; |
| |
| QDeclarativeDataBlob(const QUrl &, Type); |
| virtual ~QDeclarativeDataBlob(); |
| |
| Type type() const; |
| |
| Status status() const; |
| bool isNull() const; |
| bool isLoading() const; |
| bool isWaiting() const; |
| bool isComplete() const; |
| bool isError() const; |
| bool isCompleteOrError() const; |
| |
| qreal progress() const; |
| |
| QUrl url() const; |
| QUrl finalUrl() const; |
| |
| QList<QDeclarativeError> errors() const; |
| |
| void setError(const QDeclarativeError &); |
| void setError(const QList<QDeclarativeError> &errors); |
| |
| void addDependency(QDeclarativeDataBlob *); |
| |
| protected: |
| virtual void dataReceived(const QByteArray &) = 0; |
| |
| virtual void done(); |
| virtual void networkError(QNetworkReply::NetworkError); |
| |
| virtual void dependencyError(QDeclarativeDataBlob *); |
| virtual void dependencyComplete(QDeclarativeDataBlob *); |
| virtual void allDependenciesDone(); |
| |
| virtual void downloadProgressChanged(qreal); |
| |
| private: |
| friend class QDeclarativeDataLoader; |
| void tryDone(); |
| void cancelAllWaitingFor(); |
| void notifyAllWaitingOnMe(); |
| void notifyComplete(QDeclarativeDataBlob *); |
| |
| Type m_type; |
| Status m_status; |
| qreal m_progress; |
| |
| QUrl m_url; |
| QUrl m_finalUrl; |
| |
| // List of QDeclarativeDataBlob's that are waiting for me to complete. |
| QList<QDeclarativeDataBlob *> m_waitingOnMe; |
| |
| // List of QDeclarativeDataBlob's that I am waiting for to complete. |
| QList<QDeclarativeDataBlob *> m_waitingFor; |
| |
| // Manager that is currently fetching data for me |
| QDeclarativeDataLoader *m_manager; |
| int m_redirectCount:30; |
| bool m_inCallback:1; |
| bool m_isDone:1; |
| |
| QList<QDeclarativeError> m_errors; |
| }; |
| |
| class Q_AUTOTEST_EXPORT QDeclarativeDataLoader : public QObject |
| { |
| Q_OBJECT |
| public: |
| QDeclarativeDataLoader(QDeclarativeEngine *); |
| ~QDeclarativeDataLoader(); |
| |
| void load(QDeclarativeDataBlob *); |
| void loadWithStaticData(QDeclarativeDataBlob *, const QByteArray &); |
| |
| QDeclarativeEngine *engine() const; |
| |
| private slots: |
| void networkReplyFinished(); |
| void networkReplyProgress(qint64,qint64); |
| |
| private: |
| void setData(QDeclarativeDataBlob *, const QByteArray &); |
| |
| QDeclarativeEngine *m_engine; |
| typedef QHash<QNetworkReply *, QDeclarativeDataBlob *> NetworkReplies; |
| NetworkReplies m_networkReplies; |
| }; |
| |
| |
| class Q_AUTOTEST_EXPORT QDeclarativeTypeLoader : public QDeclarativeDataLoader |
| { |
| Q_OBJECT |
| public: |
| QDeclarativeTypeLoader(QDeclarativeEngine *); |
| ~QDeclarativeTypeLoader(); |
| |
| enum Option { |
| None, |
| PreserveParser |
| }; |
| Q_DECLARE_FLAGS(Options, Option) |
| |
| QDeclarativeTypeData *get(const QUrl &url); |
| QDeclarativeTypeData *get(const QByteArray &, const QUrl &url, Options = None); |
| void clearCache(); |
| |
| QDeclarativeScriptData *getScript(const QUrl &); |
| QDeclarativeQmldirData *getQmldir(const QUrl &); |
| private: |
| typedef QHash<QUrl, QDeclarativeTypeData *> TypeCache; |
| typedef QHash<QUrl, QDeclarativeScriptData *> ScriptCache; |
| typedef QHash<QUrl, QDeclarativeQmldirData *> QmldirCache; |
| |
| TypeCache m_typeCache; |
| ScriptCache m_scriptCache; |
| QmldirCache m_qmldirCache; |
| }; |
| |
| Q_DECLARE_OPERATORS_FOR_FLAGS(QDeclarativeTypeLoader::Options) |
| |
| class Q_AUTOTEST_EXPORT QDeclarativeTypeData : public QDeclarativeDataBlob |
| { |
| public: |
| struct TypeReference |
| { |
| TypeReference() : type(0), majorVersion(0), minorVersion(0), typeData(0) {} |
| |
| QDeclarativeParser::Location location; |
| QDeclarativeType *type; |
| int majorVersion; |
| int minorVersion; |
| QDeclarativeTypeData *typeData; |
| }; |
| |
| struct ScriptReference |
| { |
| ScriptReference() : script(0) {} |
| |
| QDeclarativeParser::Location location; |
| QString qualifier; |
| QDeclarativeScriptData *script; |
| }; |
| |
| QDeclarativeTypeData(const QUrl &, QDeclarativeTypeLoader::Options, QDeclarativeTypeLoader *); |
| ~QDeclarativeTypeData(); |
| |
| QDeclarativeTypeLoader *typeLoader() const; |
| |
| const QDeclarativeImports &imports() const; |
| const QDeclarativeScriptParser &parser() const; |
| |
| const QList<TypeReference> &resolvedTypes() const; |
| const QList<ScriptReference> &resolvedScripts() const; |
| |
| QDeclarativeCompiledData *compiledData() const; |
| |
| // Used by QDeclarativeComponent to get notifications |
| struct TypeDataCallback { |
| ~TypeDataCallback() {} |
| virtual void typeDataProgress(QDeclarativeTypeData *, qreal) {} |
| virtual void typeDataReady(QDeclarativeTypeData *) {} |
| }; |
| void registerCallback(TypeDataCallback *); |
| void unregisterCallback(TypeDataCallback *); |
| |
| protected: |
| virtual void done(); |
| virtual void dataReceived(const QByteArray &); |
| virtual void allDependenciesDone(); |
| virtual void downloadProgressChanged(qreal); |
| |
| private: |
| void resolveTypes(); |
| void compile(); |
| |
| QDeclarativeTypeLoader::Options m_options; |
| |
| QDeclarativeQmldirData *qmldirForUrl(const QUrl &); |
| |
| QDeclarativeScriptParser scriptParser; |
| QDeclarativeImports m_imports; |
| |
| QList<ScriptReference> m_scripts; |
| QList<QDeclarativeQmldirData *> m_qmldirs; |
| |
| QList<TypeReference> m_types; |
| bool m_typesResolved:1; |
| |
| QDeclarativeCompiledData *m_compiledData; |
| |
| QList<TypeDataCallback *> m_callbacks; |
| |
| QDeclarativeTypeLoader *m_typeLoader; |
| }; |
| |
| class Q_AUTOTEST_EXPORT QDeclarativeScriptData : public QDeclarativeDataBlob |
| { |
| public: |
| QDeclarativeScriptData(const QUrl &); |
| |
| QDeclarativeParser::Object::ScriptBlock::Pragmas pragmas() const; |
| QString scriptSource() const; |
| |
| protected: |
| virtual void dataReceived(const QByteArray &); |
| |
| private: |
| QDeclarativeParser::Object::ScriptBlock::Pragmas m_pragmas; |
| QString m_source; |
| }; |
| |
| class Q_AUTOTEST_EXPORT QDeclarativeQmldirData : public QDeclarativeDataBlob |
| { |
| public: |
| QDeclarativeQmldirData(const QUrl &); |
| |
| const QDeclarativeDirComponents &dirComponents() const; |
| |
| protected: |
| virtual void dataReceived(const QByteArray &); |
| |
| private: |
| QDeclarativeDirComponents m_components; |
| |
| }; |
| |
| QT_END_NAMESPACE |
| |
| #endif // QDECLARATIVETYPELOADER_P_H |