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, &QObject::deleteLater);
39 m_networkReplyProxy = new QQmlTypeLoaderNetworkReplyProxy(m_loader, threadObject());
40 QObject::connect(thread(), &QThread::finished, m_networkReplyProxy, &QObject::deleteLater);
41 }
42
43 return m_networkAccessManager;
44}
45
46QQmlTypeLoaderNetworkReplyProxy *QQmlTypeLoaderThread::networkReplyProxy() const
47{
48 Q_ASSERT(isThisThread());
49 Q_ASSERT(m_networkReplyProxy); // Must call networkAccessManager() first
50 return m_networkReplyProxy;
51}
52#endif // qml_network
53
54void QQmlTypeLoaderThread::load(const QQmlDataBlob::Ptr &b)
55{
56 callMethodInThread(&This::loadThread, b);
57}
58
59void QQmlTypeLoaderThread::loadAsync(const QQmlDataBlob::Ptr &b)
60{
61 postMethodToThread(&This::loadThread, b);
62}
63
64void QQmlTypeLoaderThread::loadWithStaticData(const QQmlDataBlob::Ptr &b, const QByteArray &d)
65{
66 callMethodInThread(&This::loadWithStaticDataThread, b, d);
67}
68
69void QQmlTypeLoaderThread::loadWithStaticDataAsync(const QQmlDataBlob::Ptr &b, const QByteArray &d)
70{
71 postMethodToThread(&This::loadWithStaticDataThread, b, d);
72}
73
74void QQmlTypeLoaderThread::loadWithCachedUnit(const QQmlDataBlob::Ptr &b, const QQmlPrivate::CachedQmlUnit *unit)
75{
76 callMethodInThread(&This::loadWithCachedUnitThread, b, unit);
77}
78
79void QQmlTypeLoaderThread::loadWithCachedUnitAsync(const QQmlDataBlob::Ptr &b, const QQmlPrivate::CachedQmlUnit *unit)
80{
81 postMethodToThread(&This::loadWithCachedUnitThread, b, unit);
82}
83
84void QQmlTypeLoaderThread::callCompleted(const QQmlDataBlob::Ptr &b)
85{
86 postMethodToMain(&This::callCompletedMain, b);
87}
88
89void QQmlTypeLoaderThread::callDownloadProgressChanged(const QQmlDataBlob::Ptr &b, qreal p)
90{
91 postMethodToMain(&This::callDownloadProgressChangedMain, b, p);
92}
93
94void QQmlTypeLoaderThread::initializeEngine(QQmlExtensionInterface *iface,
95 const char *uri)
96{
97 callMethodInMain(&This::initializeExtensionMain, iface, uri);
98}
99
100void QQmlTypeLoaderThread::initializeEngine(QQmlEngineExtensionInterface *iface,
101 const char *uri)
102{
103 callMethodInMain(&This::initializeEngineExtensionMain, iface, uri);
104}
105
106void QQmlTypeLoaderThread::drop(const QQmlDataBlob::Ptr &b)
107{
108 postMethodToThread(&This::dropThread, b);
109}
110
111void QQmlTypeLoaderThread::loadThread(const QQmlDataBlob::Ptr &b)
112{
113 m_loader->loadThread(b);
114}
115
116void QQmlTypeLoaderThread::loadWithStaticDataThread(const QQmlDataBlob::Ptr &b, const QByteArray &d)
117{
118 m_loader->loadWithStaticDataThread(b, d);
119}
120
121void QQmlTypeLoaderThread::loadWithCachedUnitThread(const QQmlDataBlob::Ptr &b, const QQmlPrivate::CachedQmlUnit *unit)
122{
123 m_loader->loadWithCachedUnitThread(b, unit);
124}
125
126void QQmlTypeLoaderThread::callCompletedMain(const QQmlDataBlob::Ptr &b)
127{
128#ifdef DATABLOB_DEBUG
129 qWarning("QQmlTypeLoaderThread: %s completed() callback", qPrintable(b->urlString()));
130#endif
131 b->completed();
132}
133
134void QQmlTypeLoaderThread::callDownloadProgressChangedMain(const QQmlDataBlob::Ptr &b, qreal p)
135{
136#ifdef DATABLOB_DEBUG
137 qWarning("QQmlTypeLoaderThread: %s downloadProgressChanged(%f) callback",
138 qPrintable(b->urlString()), p);
139#endif
140 b->downloadProgressChanged(p);
141}
142
143void QQmlTypeLoaderThread::initializeExtensionMain(QQmlExtensionInterface *iface,
144 const char *uri)
145{
146 // We can use m_engine because we're on the engine thread.
147 QQmlEngine *engine = m_loader->engine()->qmlEngine();
148 Q_ASSERT(engine && engine->thread() == QThread::currentThread());
149 iface->initializeEngine(engine, uri);
150}
151
152void QQmlTypeLoaderThread::initializeEngineExtensionMain(QQmlEngineExtensionInterface *iface,
153 const char *uri)
154{
155 // We can use m_engine because we're on the engine thread.
156 QQmlEngine *engine = m_loader->engine()->qmlEngine();
157 Q_ASSERT(engine && engine->thread() == QThread::currentThread());
158 iface->initializeEngine(engine, uri);
159}
160
161void QQmlTypeLoaderThread::dropThread(const QQmlDataBlob::Ptr &b)
162{
163 // Simply drop the reference to b
164 Q_UNUSED(b);
165}
166
167QT_END_NAMESPACE