35 if ( file.open( QIODevice::ReadOnly ) )
37 return file.readAll();
41 return missingContent;
46 if ( path.startsWith(
"base64:"_L1, Qt::CaseInsensitive ) )
48 const QByteArray base64 = path.mid( 7 ).toLocal8Bit();
49 return QByteArray::fromBase64( base64, QByteArray::OmitTrailingEquals );
57 return QByteArray::fromBase64( base64String.toLocal8Bit(), QByteArray::OmitTrailingEquals );
60 QString embeddedString;
63 return embeddedString.toUtf8();
68 if ( !path.contains(
"://"_L1 ) )
70 return missingContent;
73 const QUrl url( path );
76 return missingContent;
80 if ( url.scheme().compare(
"file"_L1, Qt::CaseInsensitive ) == 0 )
82 file.setFileName( url.toLocalFile() );
85 if ( file.open( QIODevice::ReadOnly ) )
87 return file.readAll();
92 return missingContent;
95 const QMutexLocker locker( &
mMutex );
98 if ( mPendingRemoteUrls.contains( path ) )
103 return fetchingContent;
108 for (
QgsTask *task : constActiveTasks )
111 if ( !task->description().endsWith( path ) )
123 if ( mRemoteContentCache.contains( path ) )
126 return *mRemoteContentCache[path];
137 if ( mRemoteContentCache.contains( path ) )
140 return *mRemoteContentCache[path];
143 mPendingRemoteUrls.insert( path );
145 QNetworkRequest request( url );
147 request.setAttribute( QNetworkRequest::CacheLoadControlAttribute, QNetworkRequest::PreferCache );
148 request.setAttribute( QNetworkRequest::CacheSaveControlAttribute,
true );
152 const QMutexLocker locker( &
mMutex );
154 QNetworkReply *reply = task->
reply();
159 invokeMethod(
const_cast< QgsAbstractContentCacheBase *
>( qobject_cast< const QgsAbstractContentCacheBase * >(
this ) ),
"onRemoteContentFetched", Qt::QueuedConnection, Q_ARG( QString, path ), Q_ARG(
bool,
false ) );
163 if ( reply->error() != QNetworkReply::NoError )
165 QgsMessageLog::logMessage( tr(
"%3 request failed [error: %1 - url: %2]" ).arg( reply->errorString(), path, mTypeString ), mTypeString );
171 const QVariant status = reply->attribute( QNetworkRequest::HttpStatusCodeAttribute );
174 const QVariant phrase = reply->attribute( QNetworkRequest::HttpReasonPhraseAttribute );
175 QgsMessageLog::logMessage( tr(
"%4 request error [status: %1 - reason phrase: %2] for %3" ).arg( status.toInt() ).arg( phrase.toString(), path, mTypeString ), mTypeString );
176 mRemoteContentCache.insert( path,
new QByteArray( missingContent ) );
182 mRemoteContentCache.insert( path,
new QByteArray( missingContent ) );
189 const QByteArray ba = reply->readAll();
194 mRemoteContentCache.insert( path,
new QByteArray( ba ) );
197 invokeMethod(
const_cast< QgsAbstractContentCacheBase *
>( qobject_cast< const QgsAbstractContentCacheBase * >(
this ) ),
"onRemoteContentFetched", Qt::QueuedConnection, Q_ARG( QString, path ), Q_ARG(
bool,
true ) );
207 if ( mRemoteContentCache.contains( path ) )
210 return *mRemoteContentCache[path];
214 return fetchingContent;
static bool parseEmbeddedStringData(const QString &path, QString *mimeType=nullptr, QString *data=nullptr)
Parses a path to determine if it represents a embedded string data, and if so, extracts the component...
virtual bool checkReply(QNetworkReply *reply, const QString &path) const
Runs additional checks on a network reply to ensure that the reply content is consistent with that re...
static bool parseBase64DataUrl(const QString &path, QString *mimeType=nullptr, QString *data=nullptr)
Parses a path to determine if it represents a base 64 encoded HTML data URL, and if so,...
QgsAbstractContentCacheBase(QObject *parent)
Constructor for QgsAbstractContentCacheBase, with the specified parent object.
QByteArray getContent(const QString &path, const QByteArray &missingContent, const QByteArray &fetchingContent, bool blocking=false) const
Gets the file content corresponding to the given path.
bool waitForTaskFinished(QgsNetworkContentFetcherTask *task) const
Blocks the current thread until the task finishes (or user's preset network timeout expires).
static void logMessage(const QString &message, const QString &tag=QString(), Qgis::MessageLevel level=Qgis::MessageLevel::Warning, bool notifyUser=true, const char *file=__builtin_FILE(), const char *function=__builtin_FUNCTION(), int line=__builtin_LINE(), Qgis::StringFormat format=Qgis::StringFormat::PlainText)
Adds a message to the log instance (and creates it if necessary).
Handles HTTP network content fetching in a background task.
void fetched()
Emitted when the network content has been fetched, regardless of whether the fetch was successful or ...
QNetworkReply * reply()
Returns the network reply.