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;
92 bool isCacheable()
const {
return !hasStaticData; }
95 return hasInlineSourceCode || !fileInfo.filePath().isEmpty();
99 friend class QQmlDataBlob;
100 friend class QQmlTypeLoader;
101 QString inlineSourceCode;
103 bool hasInlineSourceCode =
false;
104 bool hasStaticData =
false;
107 template<
typename Loader = QQmlTypeLoader>
108 void assertTypeLoaderThreadIfRunning()
const
110 const Loader *loader = m_typeLoader;
111 Q_ASSERT(!loader || !loader->thread() || loader->thread()->isThisThread());
114 template<
typename Loader = QQmlTypeLoader>
115 void assertTypeLoaderThread()
const
117 const Loader *loader = m_typeLoader;
118 Q_ASSERT(loader && loader->thread() && loader->thread()->isThisThread());
121 template<
typename Loader = QQmlTypeLoader>
122 void assertEngineThreadIfRunning()
const
124 const Loader *loader = m_typeLoader;
125 Q_ASSERT(!loader || !loader->thread() || loader->thread()->isParentThread());
128 template<
typename Loader = QQmlTypeLoader>
129 void assertEngineThread()
const
131 const Loader *loader = m_typeLoader;
132 Q_ASSERT(loader && loader->thread() && loader->thread()->isParentThread());
137 void setError(
const QQmlError &);
138 void setError(
const QList<QQmlError> &errors);
139 void setError(
const QQmlJS::DiagnosticMessage &error);
140 void setError(
const QString &description);
141 void addDependency(
const QQmlDataBlob::Ptr &);
144 virtual void dataReceived(
const SourceCodeData &) = 0;
145 virtual void initializeFromCachedUnit(
const QQmlPrivate::CachedQmlUnit *) = 0;
147#if QT_CONFIG(qml_network)
148 virtual void networkError(QNetworkReply::NetworkError);
150 virtual void dependencyError(
const QQmlDataBlob::Ptr &);
151 virtual void dependencyComplete(
const QQmlDataBlob::Ptr &);
152 virtual void allDependenciesDone();
155 virtual void downloadProgressChanged(qreal);
156 virtual void completed();
160 QQmlTypeLoader *m_typeLoader;
163 friend class QQmlTypeLoader;
164 friend class QQmlTypeLoaderThread;
167 void cancelAllWaitingFor();
168 void notifyAllWaitingOnMe();
169 void notifyComplete(
const QQmlDataBlob::Ptr &);
171 bool setStatus(Status status);
172 bool setIsAsync(
bool async) {
return m_data.setIsAsync(async); }
173 bool setProgress(qreal progress) {
return m_data.setProgress(progress); }
177 friend bool QQmlDataBlob::setStatus(Status);
178 friend bool QQmlDataBlob::setIsAsync(
bool);
179 friend bool QQmlDataBlob::setProgress(qreal);
186 inline QQmlDataBlob::Status status()
const
188 return QQmlDataBlob::Status((_p.loadAcquire() & StatusMask) >> StatusShift);
191 inline bool isAsync()
const
193 return _p.loadAcquire() & AsyncMask;
196 inline qreal progress()
const
198 return quint8((_p.loadAcquire() & ProgressMask) >> ProgressShift) /
float(0xFF);
203 StatusMask = 0x0000FFFF,
205 ProgressMask = 0x00FF0000,
207 AsyncMask = 0x80000000,
212 inline bool setStatus(QQmlDataBlob::Status status)
215 int d = _p.loadAcquire();
216 int nd = (d & ~StatusMask) | ((status << StatusShift) & StatusMask);
219 if (_p.testAndSetRelease(d, nd))
223 Q_UNREACHABLE_RETURN(
false);
226 inline bool setIsAsync(
bool v)
229 int d = _p.loadAcquire();
230 int nd = (d & ~AsyncMask) | (v ? AsyncMask : NoMask);
233 if (_p.testAndSetRelease(d, nd))
237 Q_UNREACHABLE_RETURN(
false);
240 inline bool setProgress(qreal progress)
242 quint8 v = 0xFF * progress;
244 int d = _p.loadAcquire();
245 int nd = (d & ~ProgressMask) | ((v << ProgressShift) & ProgressMask);
248 if (_p.testAndSetRelease(d, nd))
251 Q_UNREACHABLE_RETURN(
false);
263 QList<QQmlError> m_errors;
269 mutable QString m_urlString;
270 mutable QString m_finalUrlString;
274 QList<QQmlDataBlob *> m_waitingOnMe;
278 QList<QQmlRefPointer<QQmlDataBlob>> m_waitingFor;
280 int m_redirectCount:30;