37class Q_QML_EXPORT
QQmlDataBlob :
public QQmlRefCounted<QQmlDataBlob>
40 using Ptr = QQmlRefPointer<QQmlDataBlob>;
45 WaitingForDependencies,
46 ResolvingDependencies,
52 QmlFile = QQmlAbstractUrlInterceptor::QmlFile,
53 JavaScriptFile = QQmlAbstractUrlInterceptor::JavaScriptFile,
54 QmldirFile = QQmlAbstractUrlInterceptor::QmldirFile
57 QQmlDataBlob(
const QUrl &, Type, QQmlTypeLoader* manager);
58 virtual ~QQmlDataBlob();
62 QQmlTypeLoader *typeLoader()
const {
return m_typeLoader; }
63 void resetTypeLoader() { m_typeLoader =
nullptr; }
67 Status status()
const;
69 bool isLoading()
const;
70 bool isWaiting()
const;
71 bool isComplete()
const;
73 bool isCompleteOrError()
const;
76 qreal progress()
const;
79 QString urlString()
const;
80 QUrl finalUrl()
const;
81 QString finalUrlString()
const;
83 QList<QQmlError> errors()
const;
85 class SourceCodeData {
87 QString readAll(QString *error)
const;
88 QDateTime sourceTimeStamp()
const;
91 bool isCacheable()
const {
return !hasStaticData; }
94 return hasInlineSourceCode || !fileInfo.filePath().isEmpty();
98 friend class QQmlDataBlob;
99 friend class QQmlTypeLoader;
100 QString inlineSourceCode;
102 bool hasInlineSourceCode =
false;
103 bool hasStaticData =
false;
106 template<
typename Loader = QQmlTypeLoader>
107 void assertTypeLoaderThreadIfRunning()
const
109 const Loader *loader = m_typeLoader;
110 Q_ASSERT(!loader || !loader->thread() || loader->thread()->isThisThread());
113 template<
typename Loader = QQmlTypeLoader>
114 void assertTypeLoaderThread()
const
116 const Loader *loader = m_typeLoader;
117 Q_ASSERT(loader && loader->thread() && loader->thread()->isThisThread());
120 template<
typename Loader = QQmlTypeLoader>
121 void assertEngineThreadIfRunning()
const
123 const Loader *loader = m_typeLoader;
124 Q_ASSERT(!loader || !loader->thread() || loader->thread()->isParentThread());
127 template<
typename Loader = QQmlTypeLoader>
128 void assertEngineThread()
const
130 const Loader *loader = m_typeLoader;
131 Q_ASSERT(loader && loader->thread() && loader->thread()->isParentThread());
136 void setError(
const QQmlError &);
137 void setError(
const QList<QQmlError> &errors);
138 void setError(
const QQmlJS::DiagnosticMessage &error);
139 void setError(
const QString &description);
140 void addDependency(
const QQmlDataBlob::Ptr &);
143 virtual void dataReceived(
const SourceCodeData &) = 0;
144 virtual void initializeFromCachedUnit(
const QQmlPrivate::CachedQmlUnit *) = 0;
146#if QT_CONFIG(qml_network)
147 virtual void networkError(QNetworkReply::NetworkError);
149 virtual void dependencyError(
const QQmlDataBlob::Ptr &);
150 virtual void dependencyComplete(
const QQmlDataBlob::Ptr &);
151 virtual void allDependenciesDone();
154 virtual void downloadProgressChanged(qreal);
155 virtual void completed();
159 QQmlTypeLoader *m_typeLoader;
162 friend class QQmlTypeLoader;
163 friend class QQmlTypeLoaderThread;
166 void cancelAllWaitingFor();
167 void notifyAllWaitingOnMe();
168 void notifyComplete(
const QQmlDataBlob::Ptr &);
170 bool setStatus(Status status);
171 bool setIsAsync(
bool async) {
return m_data.setIsAsync(async); }
172 bool setProgress(qreal progress) {
return m_data.setProgress(progress); }
176 friend bool QQmlDataBlob::setStatus(Status);
177 friend bool QQmlDataBlob::setIsAsync(
bool);
178 friend bool QQmlDataBlob::setProgress(qreal);
185 inline QQmlDataBlob::Status status()
const
187 return QQmlDataBlob::Status((_p.loadAcquire() & StatusMask) >> StatusShift);
190 inline bool isAsync()
const
192 return _p.loadAcquire() & AsyncMask;
195 inline qreal progress()
const
197 return quint8((_p.loadAcquire() & ProgressMask) >> ProgressShift) /
float(0xFF);
202 StatusMask = 0x0000FFFF,
204 ProgressMask = 0x00FF0000,
206 AsyncMask = 0x80000000,
211 inline bool setStatus(QQmlDataBlob::Status status)
214 int d = _p.loadAcquire();
215 int nd = (d & ~StatusMask) | ((status << StatusShift) & StatusMask);
218 if (_p.testAndSetRelease(d, nd))
222 Q_UNREACHABLE_RETURN(
false);
225 inline bool setIsAsync(
bool v)
228 int d = _p.loadAcquire();
229 int nd = (d & ~AsyncMask) | (v ? AsyncMask : NoMask);
232 if (_p.testAndSetRelease(d, nd))
236 Q_UNREACHABLE_RETURN(
false);
239 inline bool setProgress(qreal progress)
241 quint8 v = 0xFF * progress;
243 int d = _p.loadAcquire();
244 int nd = (d & ~ProgressMask) | ((v << ProgressShift) & ProgressMask);
247 if (_p.testAndSetRelease(d, nd))
250 Q_UNREACHABLE_RETURN(
false);
262 QList<QQmlError> m_errors;
268 mutable QString m_urlString;
269 mutable QString m_finalUrlString;
273 QList<QQmlDataBlob *> m_waitingOnMe;
277 QVector<QQmlRefPointer<QQmlDataBlob>> m_waitingFor;
279 int m_redirectCount:30;