Qt
Internal/Contributor docs for the Qt SDK. <b>Note:</b> These are NOT official API docs; those are found <a href='https://doc.qt.io/'>here</a>.
Loading...
Searching...
No Matches
qqmltypeloader_p.h
Go to the documentation of this file.
1// Copyright (C) 2016 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
3
4#ifndef QQMLTYPELOADER_P_H
5#define QQMLTYPELOADER_P_H
6
7//
8// W A R N I N G
9// -------------
10//
11// This file is not part of the Qt API. It exists purely as an
12// implementation detail. This header file may change from version to
13// version without notice, or even be removed.
14//
15// We mean it.
16//
17
18#include <private/qqmldatablob_p.h>
19#include <private/qqmlimport_p.h>
20#include <private/qqmlmetatype_p.h>
21#include <private/qv4compileddata_p.h>
22
23#include <QtQml/qtqmlglobal.h>
24#include <QtQml/qqmlerror.h>
25
26#include <QtCore/qcache.h>
27#include <QtCore/qmutex.h>
28
29#include <memory>
30
32
33class QQmlScriptBlob;
34class QQmlQmldirData;
35class QQmlTypeData;
38class QQmlProfiler;
40class QQmlEngine;
41
42class Q_QML_EXPORT QQmlTypeLoader
43{
45public:
46 using ChecksumCache = QHash<quintptr, QByteArray>;
47 enum Mode { PreferSynchronous, Asynchronous, Synchronous };
48
49 class Q_QML_EXPORT Blob : public QQmlDataBlob
50 {
51 public:
53 ~Blob() override;
54
55 const QQmlImports *imports() const { return m_importCache.data(); }
56
57 void setCachedUnitStatus(QQmlMetaType::CachedUnitLookupError status) { m_cachedUnitStatus = status; }
58
78 using PendingImportPtr = std::shared_ptr<PendingImport>;
79
80 void importQmldirScripts(const PendingImportPtr &import, const QQmlTypeLoaderQmldirContent &qmldir, const QUrl &qmldirUrl);
81
82 protected:
83 bool addImport(const QV4::CompiledData::Import *import, QQmlImports::ImportFlags,
84 QList<QQmlError> *errors);
85 bool addImport(PendingImportPtr import, QList<QQmlError> *errors);
86
87 bool fetchQmldir(const QUrl &url, PendingImportPtr import, int priority, QList<QQmlError> *errors);
88 bool updateQmldir(const QQmlRefPointer<QQmlQmldirData> &data, const PendingImportPtr &import, QList<QQmlError> *errors);
89
90 private:
91 bool addScriptImport(const PendingImportPtr &import);
92 bool addFileImport(const PendingImportPtr &import, QList<QQmlError> *errors);
93 bool addLibraryImport(const PendingImportPtr &import, QList<QQmlError> *errors);
94
95 virtual bool qmldirDataAvailable(const QQmlRefPointer<QQmlQmldirData> &, QList<QQmlError> *);
96
97 virtual void scriptImported(const QQmlRefPointer<QQmlScriptBlob> &, const QV4::CompiledData::Location &, const QString &, const QString &) {}
98
99 void dependencyComplete(QQmlDataBlob *) override;
100
101 bool loadImportDependencies(
102 const PendingImportPtr &currentImport, const QString &qmldirUri,
103 QQmlImports::ImportFlags flags, QList<QQmlError> *errors);
104
105 protected:
106 bool loadDependentImports(
107 const QList<QQmlDirParser::Import> &imports, const QString &qualifier,
108 QTypeRevision version, quint16 precedence, QQmlImports::ImportFlags flags,
109 QList<QQmlError> *errors);
110 virtual QString stringAt(int) const { return QString(); }
111
112 bool isDebugging() const;
113 bool readCacheFile() const;
114 bool writeCacheFile() const;
115 QQmlMetaType::CacheMode aotCacheMode() const;
116
117 QQmlRefPointer<QQmlImports> m_importCache;
118 QVector<PendingImportPtr> m_unresolvedImports;
119 QVector<QQmlRefPointer<QQmlQmldirData>> m_qmldirs;
121 };
122
125
126 template<
127 typename Engine,
128 typename EnginePrivate = QQmlEnginePrivate,
129 typename = std::enable_if_t<std::is_same_v<Engine, QQmlEngine>>>
130 static QQmlTypeLoader *get(Engine *engine)
131 {
132 return get(EnginePrivate::get(engine));
133 }
134
135 template<
136 typename Engine,
137 typename = std::enable_if_t<std::is_same_v<Engine, QQmlEnginePrivate>>>
138 static QQmlTypeLoader *get(Engine *engine)
139 {
140 return &engine->typeLoader;
141 }
142
143 QQmlImportDatabase *importDatabase() const;
144 ChecksumCache *checksumCache() { return &m_checksumCache; }
145 const ChecksumCache *checksumCache() const { return &m_checksumCache; }
146
147 static QUrl normalize(const QUrl &unNormalizedUrl);
148
149 QQmlRefPointer<QQmlTypeData> getType(const QUrl &unNormalizedUrl, Mode mode = PreferSynchronous);
150 QQmlRefPointer<QQmlTypeData> getType(const QByteArray &, const QUrl &url, Mode mode = PreferSynchronous);
151
152 void injectScript(const QUrl &relativeUrl, const QV4::Value &value);
153 QQmlRefPointer<QQmlScriptBlob> injectedScript(const QUrl &relativeUrl);
154
155 QQmlRefPointer<QQmlScriptBlob> getScript(const QUrl &unNormalizedUrl);
156 QQmlRefPointer<QQmlQmldirData> getQmldir(const QUrl &);
157
159 bool fileExists(const QString &path, const QString &file);
160 bool directoryExists(const QString &path);
161
162 const QQmlTypeLoaderQmldirContent qmldirContent(const QString &filePath);
163 void setQmldirContent(const QString &filePath, const QString &content);
164
165 void clearCache();
166 void trimCache();
167
168 bool isTypeLoaded(const QUrl &url) const;
169 bool isScriptLoaded(const QUrl &url) const;
170
171 void lock() { m_mutex.lock(); }
172 void unlock() { m_mutex.unlock(); }
173
174 void load(QQmlDataBlob *, Mode = PreferSynchronous);
175 void loadWithStaticData(QQmlDataBlob *, const QByteArray &, Mode = PreferSynchronous);
176 void loadWithCachedUnit(QQmlDataBlob *blob, const QQmlPrivate::CachedQmlUnit *unit, Mode mode = PreferSynchronous);
177
178 QQmlEngine *engine() const;
179 void initializeEngine(QQmlEngineExtensionInterface *, const char *);
180 void initializeEngine(QQmlExtensionInterface *, const char *);
181 void invalidate();
182
183#if !QT_CONFIG(qml_debug)
184 quintptr profiler() const { return 0; }
186#else
187 QQmlProfiler *profiler() const { return m_profiler.data(); }
188 void setProfiler(QQmlProfiler *profiler);
189#endif // QT_CONFIG(qml_debug)
190
191
192private:
193 friend class QQmlDataBlob;
195#if QT_CONFIG(qml_network)
197#endif // qml_network
198
199 void shutdownThread();
200
201 void loadThread(const QQmlDataBlob::Ptr &);
202 void loadWithStaticDataThread(const QQmlDataBlob::Ptr &, const QByteArray &);
203 void loadWithCachedUnitThread(const QQmlDataBlob::Ptr &blob, const QQmlPrivate::CachedQmlUnit *unit);
204#if QT_CONFIG(qml_network)
205 void networkReplyFinished(QNetworkReply *);
206 void networkReplyProgress(QNetworkReply *, qint64, qint64);
207
208 typedef QHash<QNetworkReply *, QQmlDataBlob::Ptr> NetworkReplies;
209#endif
210
211 void setData(const QQmlDataBlob::Ptr &, const QByteArray &);
212 void setData(const QQmlDataBlob::Ptr &, const QString &fileName);
214 void setCachedUnit(const QQmlDataBlob::Ptr &blob, const QQmlPrivate::CachedQmlUnit *unit);
215
216 typedef QHash<QUrl, QQmlTypeData *> TypeCache;
217 typedef QHash<QUrl, QQmlScriptBlob *> ScriptCache;
218 typedef QHash<QUrl, QQmlQmldirData *> QmldirCache;
219 typedef QCache<QString, QCache<QString, bool> > ImportDirCache;
220 typedef QStringHash<QQmlTypeLoaderQmldirContent *> ImportQmlDirCache;
221
222 QQmlEngine *m_engine;
223 QQmlTypeLoaderThread *m_thread;
224 QMutex &m_mutex;
225
226#if QT_CONFIG(qml_debug)
227 QScopedPointer<QQmlProfiler> m_profiler;
228#endif
229
230#if QT_CONFIG(qml_network)
231 NetworkReplies m_networkReplies;
232#endif
233 TypeCache m_typeCache;
234 int m_typeCacheTrimThreshold;
235 ScriptCache m_scriptCache;
236 QmldirCache m_qmldirCache;
237 ImportDirCache m_importDirCache;
238 ImportQmlDirCache m_importQmlDirCache;
239 ChecksumCache m_checksumCache;
240
241 template<typename Loader>
242 void doLoad(const Loader &loader, QQmlDataBlob *blob, Mode mode);
243 void updateTypeCacheTrimThreshold();
244
245 friend struct PlainLoader;
246 friend struct CachedLoader;
247 friend struct StaticLoader;
248};
249
251
252#endif // QQMLTYPELOADER_P_H
\inmodule QtCore
Definition qbytearray.h:57
\inmodule QtCore
Definition qmutex.h:281
The QNetworkReply class contains the data and headers for a request sent with QNetworkAccessManager.
The QQmlDataBlob encapsulates a data request that can be issued to a QQmlTypeLoader.
Type
This enum describes the type of the data blob.
The QQmlEngine class provides an environment for instantiating QML components.
Definition qqmlengine.h:57
The QQmlImportDatabase class manages the QML imports for a QQmlEngine.
The QQmlImports class encapsulates one QML document's import statements.
std::shared_ptr< PendingImport > PendingImportPtr
virtual void scriptImported(const QQmlRefPointer< QQmlScriptBlob > &, const QV4::CompiledData::Location &, const QString &, const QString &)
virtual QString stringAt(int) const
const QQmlImports * imports() const
void setCachedUnitStatus(QQmlMetaType::CachedUnitLookupError status)
QVector< QQmlRefPointer< QQmlQmldirData > > m_qmldirs
QVector< PendingImportPtr > m_unresolvedImports
QQmlRefPointer< QQmlImports > m_importCache
The QQmlTypeLoader class abstracts loading files and their dependencies over the network.
quintptr profiler() const
static QQmlTypeLoader * get(Engine *engine)
ChecksumCache * checksumCache()
const ChecksumCache * checksumCache() const
void setProfiler(quintptr)
static QQmlTypeLoader * get(Engine *engine)
\macro QT_RESTRICTED_CAST_FROM_ASCII
Definition qstring.h:129
\inmodule QtCore
\inmodule QtCore
Definition qurl.h:94
p1 load("image.bmp")
Combined button and popup list for selecting options.
#define Q_DECLARE_TR_FUNCTIONS(context)
static QDBusError::ErrorType get(const char *name)
static Q_CONSTINIT QBasicAtomicInt isDebugging
EGLOutputLayerEXT EGLint EGLAttrib value
[5]
static QT_BEGIN_NAMESPACE bool fileExists(const wchar_t *fileName)
GLenum mode
GLint GLsizei GLsizei GLenum GLenum GLsizei void * data
GLenum type
GLbitfield flags
GLsizei const GLchar *const * path
static void normalize(double &x, double &y)
static QString absoluteFilePath(const Options *options, const QString &relativeFileName)
Definition main.cpp:1902
unsigned short quint16
Definition qtypes.h:48
size_t quintptr
Definition qtypes.h:167
long long qint64
Definition qtypes.h:60
unsigned char quint8
Definition qtypes.h:46
QFile file
[0]
QUrl url("example.com")
[constructor-url-reference]
mimeData setData("text/csv", csvData)
QJSEngine engine
[0]
QV4::CompiledData::Location location