diff options
Diffstat (limited to 'src/libs/installer/extractarchiveoperation.cpp')
-rw-r--r-- | src/libs/installer/extractarchiveoperation.cpp | 72 |
1 files changed, 47 insertions, 25 deletions
diff --git a/src/libs/installer/extractarchiveoperation.cpp b/src/libs/installer/extractarchiveoperation.cpp index e790920d1..ba0591c84 100644 --- a/src/libs/installer/extractarchiveoperation.cpp +++ b/src/libs/installer/extractarchiveoperation.cpp @@ -144,37 +144,18 @@ bool ExtractArchiveOperation::undoOperation() // For backward compatibility, check if "files" can be converted to QStringList. // If yes, files are listed in .dat instead of in a separate file. bool useStringListType(value(QLatin1String("files")).type() == QVariant::StringList); + QString targetDir = arguments().at(1); QStringList files; if (useStringListType) { files = value(QLatin1String("files")).toStringList(); - startUndoProcess(files); } else { - const QString filePath = value(QLatin1String("files")).toString(); - QString targetDir = arguments().at(1); - // Does not change target on non macOS platforms. - if (QInstaller::isInBundle(targetDir, &targetDir)) - targetDir = QDir::cleanPath(targetDir + QLatin1String("/..")); - QString fileName = replacePath(filePath, QLatin1String(scRelocatable), targetDir); - QFile file(fileName); - - if (file.open(QIODevice::ReadOnly)) { - QDataStream in(&file); - in >> files; - for (int i = 0; i < files.count(); ++i) - files[i] = replacePath(files.at(i), QLatin1String(scRelocatable), targetDir); - startUndoProcess(files); - QFileInfo fileInfo(file); - file.remove(); - QDir directory(fileInfo.absoluteDir()); - if (directory.exists() && directory.isEmpty()) - directory.rmdir(directory.path()); - } else { - setError(UserDefinedError); - setErrorString(tr("Cannot open file \"%1\" for reading: %2") - .arg(QDir::toNativeSeparators(file.fileName())).arg(file.errorString())); + if (!readDataFileContents(targetDir, &files)) return false; - } } + startUndoProcess(files); + if (!useStringListType) + deleteDataFile(m_relocatedDataFileName); + return true; } @@ -193,9 +174,50 @@ void ExtractArchiveOperation::startUndoProcess(const QStringList &files) thread->deleteLater(); } +void ExtractArchiveOperation::deleteDataFile(const QString &fileName) +{ + if (fileName.isEmpty()) { + qWarning() << Q_FUNC_INFO << "data file name cannot be empty."; + return; + } + QFile file(fileName); + QFileInfo fileInfo(file); + if (file.remove()) { + QDir directory(fileInfo.absoluteDir()); + if (directory.exists() && directory.isEmpty()) + directory.rmdir(directory.path()); + } else { + qWarning() << "Cannot remove data file" << file.fileName(); + } +} + bool ExtractArchiveOperation::testOperation() { return true; } +bool ExtractArchiveOperation::readDataFileContents(QString &targetDir, QStringList *resultList) +{ + const QString filePath = value(QLatin1String("files")).toString(); + // Does not change target on non macOS platforms. + if (QInstaller::isInBundle(targetDir, &targetDir)) + targetDir = QDir::cleanPath(targetDir + QLatin1String("/..")); + m_relocatedDataFileName = replacePath(filePath, QLatin1String(scRelocatable), targetDir); + QFile file(m_relocatedDataFileName); + + if (file.open(QIODevice::ReadOnly)) { + QDataStream in(&file); + in >> *resultList; + for (int i = 0; i < resultList->count(); ++i) + resultList->replace(i, replacePath(resultList->at(i), QLatin1String(scRelocatable), targetDir)); + + } else { + setError(UserDefinedError); + setErrorString(tr("Cannot open file \"%1\" for reading: %2") + .arg(QDir::toNativeSeparators(file.fileName())).arg(file.errorString())); + return false; + } + return true; +} + } // namespace QInstaller |