QGIS API Documentation 3.37.0-Master (fdefdf9c27f)
qgssourcecache.cpp
Go to the documentation of this file.
1/***************************************************************************
2 qgssourcecache.cpp
3 -----------------
4 begin : July 2020
5 copyright : (C) 2020 by Mathieu Pellerin
6 email : nirvn dot asia at gmail dot com
7 ***************************************************************************/
8
9/***************************************************************************
10 * *
11 * This program is free software; you can redistribute it and/or modify *
12 * it under the terms of the GNU General Public License as published by *
13 * the Free Software Foundation; either version 2 of the License, or *
14 * (at your option) any later version. *
15 * *
16 ***************************************************************************/
17
18#include "qgssourcecache.h"
20
21#include "qgis.h"
22#include "qgslogger.h"
23
24#include <QFile>
25#include <QBuffer>
26#include <QTemporaryDir>
27
29
30QgsSourceCacheEntry::QgsSourceCacheEntry( const QString &path )
32{
33}
34
35bool QgsSourceCacheEntry::isEqual( const QgsAbstractContentCacheEntry *other ) const
36{
37 const QgsSourceCacheEntry *otherSource = dynamic_cast< const QgsSourceCacheEntry * >( other );
38 // cheapest checks first!
39 if ( !otherSource || otherSource->filePath != filePath )
40 return false;
41
42 return true;
43}
44
45int QgsSourceCacheEntry::dataSize() const
46{
47 return filePath.size();
48}
49
50void QgsSourceCacheEntry::dump() const
51{
52 QgsDebugMsgLevel( QStringLiteral( "path: %1" ).arg( path ), 3 );
53}
54
56
58 : QgsAbstractContentCache< QgsSourceCacheEntry >( parent, QObject::tr( "Source" ) )
59{
60 temporaryDir.reset( new QTemporaryDir() );
61
63}
64
65QString QgsSourceCache::localFilePath( const QString &path, bool blocking )
66{
67 const QString file = path.trimmed();
68 if ( file.isEmpty() )
69 return QString();
70
71 const QMutexLocker locker( &mMutex );
72
73 QgsSourceCacheEntry *currentEntry = findExistingEntry( new QgsSourceCacheEntry( file ) );
74
75 //if current entry's temporary file is empty, create it
76 if ( currentEntry->filePath.isEmpty() )
77 {
78 bool isBroken;
79 const QString filePath = fetchSource( file, isBroken, blocking );
80 currentEntry->filePath = filePath;
81 }
82
83 return currentEntry->filePath;
84}
85
86QString QgsSourceCache::fetchSource( const QString &path, bool &isBroken, bool blocking ) const
87{
88 QString filePath;
89
90 if ( !path.startsWith( QLatin1String( "base64:" ) ) && QFile::exists( path ) )
91 {
92 filePath = path;
93 }
94 else
95 {
96 const QByteArray ba = getContent( path, QByteArray( "broken" ), QByteArray( "fetching" ), blocking );
97
98 if ( ba == "broken" )
99 {
100 isBroken = true;
101 }
102 else
103 {
104 int id = 1;
105 filePath = temporaryDir->filePath( QString::number( id ) );
106 while ( QFile::exists( filePath ) )
107 filePath = temporaryDir->filePath( QString::number( ++id ) );
108
109 QFile file( filePath );
110 file.open( QIODevice::WriteOnly );
111 file.write( ba );
112 file.close();
113 }
114 }
115
116 return filePath;
117}
118
119template class QgsAbstractContentCache<QgsSourceCacheEntry>; // clazy:exclude=missing-qobject-macro
void remoteContentFetched(const QString &url)
Emitted when the cache has finished retrieving content from a remote url.
Base class for entries in a QgsAbstractContentCache.
Abstract base class for file content caches, such as SVG or raster image caches.
QByteArray getContent(const QString &path, const QByteArray &missingContent, const QByteArray &fetchingContent, bool blocking=false) const
Gets the file content corresponding to the given path.
QgsSourceCacheEntry * findExistingEntry(QgsSourceCacheEntry *entryTemplate)
Returns the existing entry from the cache which matches entryTemplate (deleting entryTemplate when do...
QgsSourceCache(QObject *parent=nullptr)
Constructor for QgsSourceCache, with the specified parent object.
void remoteSourceFetched(const QString &url)
Emitted when the cache has finished retrieving a 3D model from a remote url.
QString localFilePath(const QString &path, bool blocking=false)
Returns a local file path reflecting the content of a specified source path.
#define QgsDebugMsgLevel(str, level)
Definition: qgslogger.h:39