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