Qt
Internal/Contributor docs for the Qt SDK. Note: These are NOT official API docs; those are found at https://doc.qt.io/
Loading...
Searching...
No Matches
qqmltypeloaderthread.cpp
Go to the documentation of this file.
1// Copyright (C) 2019 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// Qt-Security score:significant
4
5#include <private/qqmlengine_p.h>
6#include <private/qqmlextensionplugin_p.h>
7#include <private/qqmltypeloaderthread_p.h>
8
9#if QT_CONFIG(qml_network)
10#include <private/qqmltypeloadernetworkreplyproxy_p.h>
11#endif
12
13QT_BEGIN_NAMESPACE
14
15QQmlTypeLoaderThread::QQmlTypeLoaderThread(QQmlTypeLoader *loader)
16 : m_loader(loader)
17{
18}
19
20QQmlTypeLoaderThread::~QQmlTypeLoaderThread()
21{
22 // The thread has to be shutdown() first.
23#if QT_CONFIG(qml_type_loader_thread)
24 Q_ASSERT(!thread()->isRunning());
25#endif
26
27 // Discard all remaining messages.
28 // We don't need the lock anymore because the thread is dead.
29 discardMessages();
30}
31
32#if QT_CONFIG(qml_network)
33QNetworkAccessManager *QQmlTypeLoaderThread::networkAccessManager() const
34{
35 Q_ASSERT(isThisThread());
36 if (!m_networkAccessManager) {
37 m_networkAccessManager = m_loader->createNetworkAccessManager(nullptr);
38 QObject::connect(thread(), &QThread::finished, m_networkAccessManager,
39 [this]() { std::exchange(m_networkAccessManager, nullptr)->deleteLater(); });
40 m_networkReplyProxy = new QQmlTypeLoaderNetworkReplyProxy(m_loader, threadObject());
41 QObject::connect(thread(), &QThread::finished, m_networkReplyProxy,
42 [this]() { std::exchange(m_networkReplyProxy, nullptr)->deleteLater(); });
43 }
44
45 return m_networkAccessManager;
46}
47
48QQmlTypeLoaderNetworkReplyProxy *QQmlTypeLoaderThread::networkReplyProxy() const
49{
50 Q_ASSERT(isThisThread());
51 Q_ASSERT(m_networkReplyProxy); // Must call networkAccessManager() first
52 return m_networkReplyProxy;
53}
54#endif // qml_network
55
56void QQmlTypeLoaderThread::load(const QQmlDataBlob::Ptr &b)
57{
58 callMethodInThread(&This::loadThread, b);
59}
60
61void QQmlTypeLoaderThread::loadAsync(const QQmlDataBlob::Ptr &b)
62{
63 postMethodToThread(&This::loadThread, b);
64}
65
66void QQmlTypeLoaderThread::loadWithStaticData(const QQmlDataBlob::Ptr &b, const QByteArray &d)
67{
68 callMethodInThread(&This::loadWithStaticDataThread, b, d);
69}
70
71void QQmlTypeLoaderThread::loadWithStaticDataAsync(const QQmlDataBlob::Ptr &b, const QByteArray &d)
72{
73 postMethodToThread(&This::loadWithStaticDataThread, b, d);
74}
75
76void QQmlTypeLoaderThread::loadWithCachedUnit(const QQmlDataBlob::Ptr &b, const QQmlPrivate::CachedQmlUnit *unit)
77{
78 callMethodInThread(&This::loadWithCachedUnitThread, b, unit);
79}
80
81void QQmlTypeLoaderThread::loadWithCachedUnitAsync(const QQmlDataBlob::Ptr &b, const QQmlPrivate::CachedQmlUnit *unit)
82{
83 postMethodToThread(&This::loadWithCachedUnitThread, b, unit);
84}
85
86void QQmlTypeLoaderThread::callCompleted(const QQmlDataBlob::Ptr &b)
87{
88 postMethodToMain(&This::callCompletedMain, b);
89}
90
91void QQmlTypeLoaderThread::callDownloadProgressChanged(const QQmlDataBlob::Ptr &b, qreal p)
92{
93 postMethodToMain(&This::callDownloadProgressChangedMain, b, p);
94}
95
96void QQmlTypeLoaderThread::initializeEngine(QQmlExtensionInterface *iface,
97 const char *uri)
98{
99 callMethodInMain(&This::initializeExtensionMain, iface, uri);
100}
101
102void QQmlTypeLoaderThread::initializeEngine(QQmlEngineExtensionInterface *iface,
103 const char *uri)
104{
105 callMethodInMain(&This::initializeEngineExtensionMain, iface, uri);
106}
107
108void QQmlTypeLoaderThread::drop(const QQmlDataBlob::Ptr &b)
109{
110 postMethodToThread(&This::dropThread, b);
111}
112
113void QQmlTypeLoaderThread::loadThread(const QQmlDataBlob::Ptr &b)
114{
115 m_loader->loadThread(b);
116}
117
118void QQmlTypeLoaderThread::loadWithStaticDataThread(const QQmlDataBlob::Ptr &b, const QByteArray &d)
119{
120 m_loader->loadWithStaticDataThread(b, d);
121}
122
123void QQmlTypeLoaderThread::loadWithCachedUnitThread(const QQmlDataBlob::Ptr &b, const QQmlPrivate::CachedQmlUnit *unit)
124{
125 m_loader->loadWithCachedUnitThread(b, unit);
126}
127
128void QQmlTypeLoaderThread::callCompletedMain(const QQmlDataBlob::Ptr &b)
129{
130#ifdef DATABLOB_DEBUG
131 qWarning("QQmlTypeLoaderThread: %s completed() callback", qPrintable(b->urlString()));
132#endif
133 b->completed();
134}
135
136void QQmlTypeLoaderThread::callDownloadProgressChangedMain(const QQmlDataBlob::Ptr &b, qreal p)
137{
138#ifdef DATABLOB_DEBUG
139 qWarning("QQmlTypeLoaderThread: %s downloadProgressChanged(%f) callback",
140 qPrintable(b->urlString()), p);
141#endif
142 b->downloadProgressChanged(p);
143}
144
145void QQmlTypeLoaderThread::initializeExtensionMain(QQmlExtensionInterface *iface,
146 const char *uri)
147{
148 // We can use m_engine because we're on the engine thread.
149 QQmlEngine *engine = m_loader->engine()->qmlEngine();
150 Q_ASSERT(engine && engine->thread() == QThread::currentThread());
151 iface->initializeEngine(engine, uri);
152}
153
154void QQmlTypeLoaderThread::initializeEngineExtensionMain(QQmlEngineExtensionInterface *iface,
155 const char *uri)
156{
157 // We can use m_engine because we're on the engine thread.
158 QQmlEngine *engine = m_loader->engine()->qmlEngine();
159 Q_ASSERT(engine && engine->thread() == QThread::currentThread());
160 iface->initializeEngine(engine, uri);
161}
162
163void QQmlTypeLoaderThread::dropThread(const QQmlDataBlob::Ptr &b)
164{
165 // Simply drop the reference to b
166 Q_UNUSED(b);
167}
168
169QT_END_NAMESPACE