Branch data Line data Source code
1 : : /*************************************************************************** 2 : : qgsarchive.cpp 3 : : ---------------- 4 : : 5 : : begin : July 07, 2017 6 : : copyright : (C) 2017 by Paul Blottiere 7 : : email : paul.blottiere@oslandia.com 8 : : ***************************************************************************/ 9 : : 10 : : /*************************************************************************** 11 : : * * 12 : : * This program is free software; you can redistribute it and/or modify * 13 : : * it under the terms of the GNU General Public License as published by * 14 : : * the Free Software Foundation; either version 2 of the License, or * 15 : : * (at your option) any later version. * 16 : : * * 17 : : ***************************************************************************/ 18 : : 19 : : #include "qgsarchive.h" 20 : : #include "qgsziputils.h" 21 : : #include "qgsmessagelog.h" 22 : : #include "qgsauxiliarystorage.h" 23 : : 24 : : 25 : : #ifdef Q_OS_WIN 26 : : #include <windows.h> 27 : : #endif 28 : : 29 : : #include <QStandardPaths> 30 : : #include <QUuid> 31 : : 32 : 5 : QgsArchive::QgsArchive() 33 : 5 : : mDir( new QTemporaryDir() ) 34 : 5 : { 35 : 5 : } 36 : : 37 : 0 : QgsArchive::QgsArchive( const QgsArchive &other ) 38 : 0 : : mFiles( other.mFiles ) 39 : 0 : , mDir( new QTemporaryDir() ) 40 : 0 : { 41 : 0 : } 42 : : 43 : 0 : QgsArchive &QgsArchive::operator=( const QgsArchive &other ) 44 : : { 45 : 0 : if ( this != &other ) 46 : : { 47 : 0 : mFiles = other.mFiles; 48 : 0 : mDir.reset( new QTemporaryDir() ); 49 : 0 : } 50 : : 51 : 0 : return *this; 52 : 0 : } 53 : : 54 : 0 : QString QgsArchive::dir() const 55 : : { 56 : 0 : return mDir->path(); 57 : : } 58 : : 59 : 8 : void QgsArchive::clear() 60 : : { 61 : 8 : mDir.reset( new QTemporaryDir() ); 62 : 8 : mFiles.clear(); 63 : 8 : } 64 : : 65 : 0 : bool QgsArchive::zip( const QString &filename ) 66 : : { 67 : 0 : QString tempPath = QStandardPaths::standardLocations( QStandardPaths::TempLocation ).at( 0 ); 68 : 0 : QString uuid = QUuid::createUuid().toString(); 69 : 0 : QFile tmpFile( tempPath + QDir::separator() + uuid ); 70 : : 71 : : // zip content 72 : 0 : if ( ! QgsZipUtils::zip( tmpFile.fileName(), mFiles ) ) 73 : : { 74 : 0 : QString err = QObject::tr( "Unable to zip content" ); 75 : 0 : QgsMessageLog::logMessage( err, QStringLiteral( "QgsArchive" ) ); 76 : 0 : return false; 77 : 0 : } 78 : : 79 : : // remove existing zip file 80 : 0 : if ( QFile::exists( filename ) ) 81 : 0 : QFile::remove( filename ); 82 : : 83 : : #ifdef Q_OS_WIN 84 : : // Clear temporary flag (see GH #32118) 85 : : DWORD dwAttrs; 86 : : dwAttrs = GetFileAttributes( tmpFile.fileName().toLocal8Bit( ).data( ) ); 87 : : SetFileAttributes( tmpFile.fileName().toLocal8Bit( ).data( ), dwAttrs & ~ FILE_ATTRIBUTE_TEMPORARY ); 88 : : #endif // Q_OS_WIN 89 : : 90 : : // save zip archive 91 : 0 : if ( ! tmpFile.rename( filename ) ) 92 : : { 93 : 0 : QString err = QObject::tr( "Unable to save zip file '%1'" ).arg( filename ); 94 : 0 : QgsMessageLog::logMessage( err, QStringLiteral( "QgsArchive" ) ); 95 : 0 : return false; 96 : 0 : } 97 : : 98 : 0 : return true; 99 : 0 : } 100 : : 101 : 0 : bool QgsArchive::unzip( const QString &filename ) 102 : : { 103 : 0 : clear(); 104 : 0 : return QgsZipUtils::unzip( filename, mDir->path(), mFiles ); 105 : 0 : } 106 : : 107 : 0 : void QgsArchive::addFile( const QString &file ) 108 : : { 109 : 0 : mFiles.append( file ); 110 : 0 : } 111 : : 112 : 0 : bool QgsArchive::removeFile( const QString &file ) 113 : : { 114 : 0 : bool rc = false; 115 : : 116 : 0 : if ( !file.isEmpty() && mFiles.contains( file ) && QFile::exists( file ) ) 117 : 0 : rc = QFile::remove( file ); 118 : : 119 : 0 : mFiles.removeOne( file ); 120 : : 121 : 0 : return rc; 122 : : } 123 : : 124 : 0 : QStringList QgsArchive::files() const 125 : : { 126 : 0 : return mFiles; 127 : : } 128 : : 129 : 0 : QString QgsProjectArchive::projectFile() const 130 : : { 131 : 0 : const auto constFiles = files(); 132 : 0 : for ( const QString &file : constFiles ) 133 : : { 134 : 0 : QFileInfo fileInfo( file ); 135 : 0 : if ( fileInfo.suffix().compare( QLatin1String( "qgs" ), Qt::CaseInsensitive ) == 0 ) 136 : 0 : return file; 137 : 0 : } 138 : : 139 : 0 : return QString(); 140 : 0 : } 141 : : 142 : 0 : bool QgsProjectArchive::unzip( const QString &filename ) 143 : : { 144 : 0 : if ( QgsArchive::unzip( filename ) ) 145 : 0 : return ! projectFile().isEmpty(); 146 : : else 147 : 0 : return false; 148 : 0 : } 149 : : 150 : 0 : bool QgsProjectArchive::clearProjectFile() 151 : : { 152 : 0 : return removeFile( projectFile() ); 153 : 0 : } 154 : : 155 : 0 : QString QgsProjectArchive::auxiliaryStorageFile() const 156 : : { 157 : 0 : const QString extension = QgsAuxiliaryStorage::extension(); 158 : : 159 : 0 : const QStringList fileList = files(); 160 : 0 : for ( const QString &file : fileList ) 161 : : { 162 : 0 : const QFileInfo fileInfo( file ); 163 : 0 : if ( fileInfo.suffix().compare( extension, Qt::CaseInsensitive ) == 0 ) 164 : 0 : return file; 165 : 0 : } 166 : : 167 : 0 : return QString(); 168 : 0 : }