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