38class Q_QML_EXPORT
QQmlDataBlob :
public QQmlRefCounted<QQmlDataBlob>
41 using Ptr = QQmlRefPointer<QQmlDataBlob>;
46 WaitingForDependencies,
47 ResolvingDependencies,
53 QmlFile = QQmlAbstractUrlInterceptor::QmlFile,
54 JavaScriptFile = QQmlAbstractUrlInterceptor::JavaScriptFile,
55 QmldirFile = QQmlAbstractUrlInterceptor::QmldirFile
58 QQmlDataBlob(
const QUrl &, Type, QQmlTypeLoader* manager);
59 virtual ~QQmlDataBlob();
63 QQmlTypeLoader *typeLoader()
const {
return m_typeLoader; }
64 void resetTypeLoader() { m_typeLoader =
nullptr; }
68 Status status()
const;
70 bool isLoading()
const;
71 bool isWaiting()
const;
72 bool isComplete()
const;
74 bool isCompleteOrError()
const;
77 qreal progress()
const;
80 QString urlString()
const;
81 QUrl finalUrl()
const;
82 QString finalUrlString()
const;
84 QList<QQmlError> errors()
const;
86 class SourceCodeData {
88 QString readAll(QString *error)
const;
89 QDateTime sourceTimeStamp()
const;
90 QByteArray checksum()
const;
93 bool isCacheable()
const {
return !hasStaticData; }
96 return hasInlineSourceCode || !fileInfo.filePath().isEmpty();
100 friend class QQmlDataBlob;
101 friend class QQmlTypeLoader;
102 QString inlineSourceCode;
104 bool hasInlineSourceCode =
false;
105 bool hasStaticData =
false;
108 template<
typename Loader = QQmlTypeLoader>
109 void assertTypeLoaderThreadIfRunning()
const
111 const Loader *loader = m_typeLoader;
112 Q_ASSERT(!loader || !loader->thread() || loader->thread()->isThisThread());
115 template<
typename Loader = QQmlTypeLoader>
116 void assertTypeLoaderThread()
const
118 const Loader *loader = m_typeLoader;
119 Q_ASSERT(loader && loader->thread() && loader->thread()->isThisThread());
122 template<
typename Loader = QQmlTypeLoader>
123 void assertEngineThreadIfRunning()
const
125 const Loader *loader = m_typeLoader;
126 Q_ASSERT(!loader || !loader->thread() || loader->thread()->isParentThread());
129 template<
typename Loader = QQmlTypeLoader>
130 void assertEngineThread()
const
132 const Loader *loader = m_typeLoader;
133 Q_ASSERT(loader && loader->thread() && loader->thread()->isParentThread());
138 void setError(
const QQmlError &);
139 void setError(
const QList<QQmlError> &errors);
140 void setError(
const QQmlJS::DiagnosticMessage &error);
141 void setError(
const QString &description);
142 void addDependency(
const QQmlDataBlob::Ptr &);
145 virtual void dataReceived(
const SourceCodeData &) = 0;
146 virtual void initializeFromCachedUnit(
const QQmlPrivate::CachedQmlUnit *) = 0;
148#if QT_CONFIG(qml_network)
149 virtual void networkError(QNetworkReply::NetworkError);
151 virtual void dependencyError(
const QQmlDataBlob::Ptr &);
152 virtual void dependencyComplete(
const QQmlDataBlob::Ptr &);
153 virtual void allDependenciesDone();
156 virtual void downloadProgressChanged(qreal);
157 virtual void completed();
161 QQmlTypeLoader *m_typeLoader;
164 friend class QQmlTypeLoader;
165 friend class QQmlTypeLoaderThread;
168 void cancelAllWaitingFor();
169 void notifyAllWaitingOnMe();
170 void notifyComplete(
const QQmlDataBlob::Ptr &);
172 bool setStatus(Status status);
173 bool setIsAsync(
bool async) {
return m_data.setIsAsync(async); }
174 bool setProgress(qreal progress) {
return m_data.setProgress(progress); }
178 friend bool QQmlDataBlob::setStatus(Status);
179 friend bool QQmlDataBlob::setIsAsync(
bool);
180 friend bool QQmlDataBlob::setProgress(qreal);
187 inline QQmlDataBlob::Status status()
const
189 return QQmlDataBlob::Status((_p.loadAcquire() & StatusMask) >> StatusShift);
192 inline bool isAsync()
const
194 return _p.loadAcquire() & AsyncMask;
197 inline qreal progress()
const
199 return quint8((_p.loadAcquire() & ProgressMask) >> ProgressShift) /
float(0xFF);
204 StatusMask = 0x0000FFFF,
206 ProgressMask = 0x00FF0000,
208 AsyncMask = 0x80000000,
213 inline bool setStatus(QQmlDataBlob::Status status)
216 int d = _p.loadAcquire();
217 int nd = (d & ~StatusMask) | ((status << StatusShift) & StatusMask);
220 if (_p.testAndSetRelease(d, nd))
224 Q_UNREACHABLE_RETURN(
false);
227 inline bool setIsAsync(
bool v)
230 int d = _p.loadAcquire();
231 int nd = (d & ~AsyncMask) | (v ? AsyncMask : NoMask);
234 if (_p.testAndSetRelease(d, nd))
238 Q_UNREACHABLE_RETURN(
false);
241 inline bool setProgress(qreal progress)
243 quint8 v = 0xFF * progress;
245 int d = _p.loadAcquire();
246 int nd = (d & ~ProgressMask) | ((v << ProgressShift) & ProgressMask);
249 if (_p.testAndSetRelease(d, nd))
252 Q_UNREACHABLE_RETURN(
false);
264 QList<QQmlError> m_errors;
270 mutable QString m_urlString;
271 mutable QString m_finalUrlString;
275 QList<QQmlDataBlob *> m_waitingOnMe;
279 QList<QQmlRefPointer<QQmlDataBlob>> m_waitingFor;
281 int m_redirectCount:30;