Branch data Line data Source code
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 "qgis.h" 21 : : #include "qgslogger.h" 22 : : 23 : : #include <QFile> 24 : : #include <QBuffer> 25 : : #include <QTemporaryDir> 26 : : 27 : : ///@cond PRIVATE 28 : : 29 : 0 : QgsSourceCacheEntry::QgsSourceCacheEntry( const QString &path ) 30 : 0 : : QgsAbstractContentCacheEntry( path ) 31 : 0 : { 32 : 0 : } 33 : : 34 : 0 : bool QgsSourceCacheEntry::isEqual( const QgsAbstractContentCacheEntry *other ) const 35 : : { 36 : 0 : const QgsSourceCacheEntry *otherSource = dynamic_cast< const QgsSourceCacheEntry * >( other ); 37 : : // cheapest checks first! 38 : 0 : if ( !otherSource || otherSource->filePath != filePath ) 39 : 0 : return false; 40 : : 41 : 0 : return true; 42 : 0 : } 43 : : 44 : 0 : int QgsSourceCacheEntry::dataSize() const 45 : : { 46 : 0 : return filePath.size(); 47 : : } 48 : : 49 : 0 : void QgsSourceCacheEntry::dump() const 50 : : { 51 : 0 : QgsDebugMsgLevel( QStringLiteral( "path: %1" ).arg( path ), 3 ); 52 : 0 : } 53 : : 54 : : ///@endcond 55 : : 56 : 10 : QgsSourceCache::QgsSourceCache( QObject *parent ) 57 : 5 : : QgsAbstractContentCache< QgsSourceCacheEntry >( parent, QObject::tr( "Source" ) ) 58 : 5 : { 59 : 5 : temporaryDir.reset( new QTemporaryDir() ); 60 : : 61 : 5 : connect( this, &QgsAbstractContentCacheBase::remoteContentFetched, this, &QgsSourceCache::remoteSourceFetched ); 62 : 5 : } 63 : : 64 : 0 : QString QgsSourceCache::localFilePath( const QString &path, bool blocking ) 65 : : { 66 : 0 : const QString file = path.trimmed(); 67 : 0 : if ( file.isEmpty() ) 68 : 0 : return QString(); 69 : : 70 : 0 : QMutexLocker locker( &mMutex ); 71 : : 72 : 0 : QgsSourceCacheEntry *currentEntry = findExistingEntry( new QgsSourceCacheEntry( file ) ); 73 : : 74 : : //if current entry's temporary file is empty, create it 75 : 0 : if ( currentEntry->filePath.isEmpty() ) 76 : : { 77 : : bool isBroken; 78 : 0 : QString filePath = fetchSource( file, isBroken, blocking ); 79 : 0 : currentEntry->filePath = filePath; 80 : 0 : } 81 : : 82 : 0 : return currentEntry->filePath; 83 : 0 : } 84 : : 85 : 0 : QString QgsSourceCache::fetchSource( const QString &path, bool &isBroken, bool blocking ) const 86 : : { 87 : 0 : QString filePath; 88 : : 89 : 0 : if ( !path.startsWith( QLatin1String( "base64:" ) ) && QFile::exists( path ) ) 90 : : { 91 : 0 : filePath = path; 92 : 0 : } 93 : : else 94 : : { 95 : 0 : QByteArray ba = getContent( path, QByteArray( "broken" ), QByteArray( "fetching" ), blocking ); 96 : : 97 : 0 : if ( ba == "broken" ) 98 : : { 99 : 0 : isBroken = true; 100 : 0 : } 101 : : else 102 : : { 103 : 0 : int id = 1; 104 : 0 : filePath = temporaryDir->filePath( QString::number( id ) ); 105 : 0 : while ( QFile::exists( filePath ) ) 106 : 0 : filePath = temporaryDir->filePath( QString::number( ++id ) ); 107 : : 108 : 0 : QFile file( filePath ); 109 : 0 : file.open( QIODevice::WriteOnly ); 110 : 0 : file.write( ba ); 111 : 0 : file.close(); 112 : 0 : } 113 : 0 : } 114 : : 115 : 0 : return filePath; 116 : 0 : }