QGIS API Documentation 3.99.0-Master (d270888f95f)
Loading...
Searching...
No Matches
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"
19
20#include <memory>
21
22#include "qgis.h"
24#include "qgslogger.h"
25
26#include <QBuffer>
27#include <QFile>
28#include <QString>
29#include <QTemporaryDir>
30
31#include "moc_qgssourcecache.cpp"
32
33using namespace Qt::StringLiterals;
34
36
37QgsSourceCacheEntry::QgsSourceCacheEntry( const QString &path )
39{
40}
41
42bool QgsSourceCacheEntry::isEqual( const QgsAbstractContentCacheEntry *other ) const
43{
44 const QgsSourceCacheEntry *otherSource = dynamic_cast< const QgsSourceCacheEntry * >( other );
45 // cheapest checks first!
46 if ( !otherSource || otherSource->filePath != filePath )
47 return false;
48
49 return true;
50}
51
52int QgsSourceCacheEntry::dataSize() const
53{
54 return filePath.size();
55}
56
57void QgsSourceCacheEntry::dump() const
58{
59 QgsDebugMsgLevel( u"path: %1"_s.arg( path ), 3 );
60}
61
63
65 : QgsAbstractContentCache< QgsSourceCacheEntry >( parent, QObject::tr( "Source" ) )
66{
67 temporaryDir = std::make_unique<QTemporaryDir>( );
68
70}
71
72QString QgsSourceCache::localFilePath( const QString &path, bool blocking )
73{
74 const QString file = path.trimmed();
75 if ( file.isEmpty() )
76 return QString();
77
78 const QMutexLocker locker( &mMutex );
79
80 QgsSourceCacheEntry *currentEntry = findExistingEntry( new QgsSourceCacheEntry( file ) );
81
82 //if current entry's temporary file is empty, create it
83 if ( currentEntry->filePath.isEmpty() )
84 {
85 bool isBroken;
86 const QString filePath = fetchSource( file, isBroken, blocking );
87 currentEntry->filePath = filePath;
88 }
89
90 return currentEntry->filePath;
91}
92
93QString QgsSourceCache::fetchSource( const QString &path, bool &isBroken, bool blocking ) const
94{
95 QString filePath;
96
97 if ( !path.startsWith( "base64:"_L1 ) && QFile::exists( path ) )
98 {
99 filePath = path;
100 }
101 else
102 {
103 const QByteArray ba = getContent( path, QByteArray( "broken" ), QByteArray( "fetching" ), blocking );
104
105 if ( ba == "broken" )
106 {
107 isBroken = true;
108 }
109 else
110 {
111 int id = 1;
112 filePath = temporaryDir->filePath( QString::number( id ) );
113 while ( QFile::exists( filePath ) )
114 filePath = temporaryDir->filePath( QString::number( ++id ) );
115
116 QFile file( filePath );
117 if ( !file.open( QIODevice::WriteOnly ) )
118 {
119 QgsDebugError( u"Can't open file %1"_s.arg( filePath ) );
120 return QString();
121 }
122 file.write( ba );
123 file.close();
124 }
125 }
126
127 return filePath;
128}
129
130template 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
QgsSourceCacheEntry * findExistingEntry(QgsSourceCacheEntry *entryTemplate)
QgsAbstractContentCache(QObject *parent=nullptr, const QString &typeString=QString(), long maxCacheSize=20000000, int fileModifiedCheckTimeout=30000)
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:63
#define QgsDebugError(str)
Definition qgslogger.h:59