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