diff options
author | Eike Ziller <eike.ziller@qt.io> | 2020-05-27 14:08:49 +0200 |
---|---|---|
committer | Eike Ziller <eike.ziller@qt.io> | 2020-05-29 12:39:49 +0000 |
commit | cc8148606a5c5d5817e5366f0ce21ed2568025f5 (patch) | |
tree | 46028e64a919fcd300efbbe19ce28b40700049af /src/libs | |
parent | 9ee693ee229d28bd618e8dd44bc6b12750d43a29 (diff) | |
download | qt-creator-cc8148606a5c5d5817e5366f0ce21ed2568025f5.tar.gz |
Move unarchiving code out of the plugin dialog code
Change-Id: I2b6510ae527d57a06692336cfd7b0434cdcbda51
Reviewed-by: Alessandro Portale <alessandro.portale@qt.io>
Diffstat (limited to 'src/libs')
-rw-r--r-- | src/libs/utils/CMakeLists.txt | 1 | ||||
-rw-r--r-- | src/libs/utils/archive.cpp | 124 | ||||
-rw-r--r-- | src/libs/utils/archive.h | 42 | ||||
-rw-r--r-- | src/libs/utils/utils-lib.pri | 6 | ||||
-rw-r--r-- | src/libs/utils/utils.qbs | 2 |
5 files changed, 173 insertions, 2 deletions
diff --git a/src/libs/utils/CMakeLists.txt b/src/libs/utils/CMakeLists.txt index ee001a311d..a474b5c2f4 100644 --- a/src/libs/utils/CMakeLists.txt +++ b/src/libs/utils/CMakeLists.txt @@ -10,6 +10,7 @@ add_qtc_library(Utils algorithm.h ansiescapecodehandler.cpp ansiescapecodehandler.h appmainwindow.cpp appmainwindow.h + archive.cpp archive.h basetreeview.cpp basetreeview.h benchmarker.cpp benchmarker.h buildablehelperlibrary.cpp buildablehelperlibrary.h diff --git a/src/libs/utils/archive.cpp b/src/libs/utils/archive.cpp new file mode 100644 index 0000000000..daab53451f --- /dev/null +++ b/src/libs/utils/archive.cpp @@ -0,0 +1,124 @@ +/**************************************************************************** +** +** Copyright (C) 2020 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of Qt Creator. +** +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3 as published by the Free Software +** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-3.0.html. +** +****************************************************************************/ + +#include "archive.h" + +#include "algorithm.h" +#include "checkablemessagebox.h" +#include "environment.h" +#include "mimetypes/mimedatabase.h" +#include "qtcassert.h" +#include "synchronousprocess.h" + +#include <QDir> +#include <QPushButton> + +namespace { + +struct Tool +{ + Utils::FilePath executable; + QStringList arguments; +}; + +Utils::optional<Tool> unzipTool(const Utils::FilePath &src, const Utils::FilePath &dest) +{ + const Utils::FilePath unzip = Utils::Environment::systemEnvironment().searchInPath( + Utils::HostOsInfo::withExecutableSuffix("unzip")); + if (!unzip.isEmpty()) + return Tool{unzip, {"-o", src.toString(), "-d", dest.toString()}}; + + const Utils::FilePath sevenzip = Utils::Environment::systemEnvironment().searchInPath( + Utils::HostOsInfo::withExecutableSuffix("7z")); + if (!sevenzip.isEmpty()) + return Tool{sevenzip, {"x", QString("-o") + dest.toString(), "-y", src.toString()}}; + + const Utils::FilePath cmake = Utils::Environment::systemEnvironment().searchInPath( + Utils::HostOsInfo::withExecutableSuffix("cmake")); + if (!cmake.isEmpty()) + return Tool{cmake, {"-E", "tar", "xvf", src.toString()}}; + + return {}; +} + +} // namespace + +namespace Utils { + +bool Archive::supportsFile(const FilePath &filePath, QString *reason) +{ + const QList<MimeType> mimeType = mimeTypesForFileName(filePath.toString()); + if (!anyOf(mimeType, [](const MimeType &mt) { return mt.inherits("application/zip"); })) { + if (reason) + *reason = tr("File format not supported."); + return false; + } + if (!unzipTool({}, {})) { + if (reason) + *reason = tr("Could not find unzip, 7z, or cmake executable in PATH."); + return false; + } + return true; +} + +bool Archive::unarchive(const FilePath &src, const FilePath &dest, QWidget *parent) +{ + const Utils::optional<Tool> tool = unzipTool(src, dest); + QTC_ASSERT(tool, return false); + const QString workingDirectory = dest.toFileInfo().absoluteFilePath(); + QDir(workingDirectory).mkpath("."); + CheckableMessageBox box(parent); + box.setIcon(QMessageBox::Information); + box.setWindowTitle(tr("Unzipping File")); + box.setText(tr("Unzipping \"%1\" to \"%2\".").arg(src.toUserOutput(), dest.toUserOutput())); + box.setStandardButtons(QDialogButtonBox::Ok | QDialogButtonBox::Cancel); + box.button(QDialogButtonBox::Ok)->setEnabled(false); + box.setCheckBoxVisible(false); + box.setDetailedText( + tr("Running %1\nin \"%2\".\n\n", "Running <cmd> in <workingdirectory>") + .arg(CommandLine(tool->executable, tool->arguments).toUserOutput(), workingDirectory)); + QProcess process; + process.setProcessChannelMode(QProcess::MergedChannels); + QObject::connect(&process, &QProcess::readyReadStandardOutput, &box, [&box, &process]() { + box.setDetailedText(box.detailedText() + QString::fromUtf8(process.readAllStandardOutput())); + }); + QObject::connect(&process, + QOverload<int, QProcess::ExitStatus>::of(&QProcess::finished), + [&box](int, QProcess::ExitStatus) { + box.button(QDialogButtonBox::Ok)->setEnabled(true); + box.button(QDialogButtonBox::Cancel)->setEnabled(false); + }); + QObject::connect(&box, &QMessageBox::rejected, &process, [&process] { + SynchronousProcess::stopProcess(process); + }); + process.setProgram(tool->executable.toString()); + process.setArguments(tool->arguments); + process.setWorkingDirectory(workingDirectory); + process.start(QProcess::ReadOnly); + box.exec(); + return process.exitStatus() == QProcess::NormalExit && process.exitCode() == 0; +} + +} // namespace Utils diff --git a/src/libs/utils/archive.h b/src/libs/utils/archive.h new file mode 100644 index 0000000000..1447b9898a --- /dev/null +++ b/src/libs/utils/archive.h @@ -0,0 +1,42 @@ +/**************************************************************************** +** +** Copyright (C) 2020 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of Qt Creator. +** +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3 as published by the Free Software +** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-3.0.html. +** +****************************************************************************/ + +#pragma once + +#include "utils_global.h" + +#include "fileutils.h" + +namespace Utils { + +class QTCREATOR_UTILS_EXPORT Archive +{ + Q_DECLARE_TR_FUNCTIONS(Utils::Archive) +public: + static bool supportsFile(const FilePath &filePath, QString *reason = nullptr); + static bool unarchive(const FilePath &src, const FilePath &dest, QWidget *parent); +}; + +} // namespace Utils diff --git a/src/libs/utils/utils-lib.pri b/src/libs/utils/utils-lib.pri index 69db3b63a0..42cab2704d 100644 --- a/src/libs/utils/utils-lib.pri +++ b/src/libs/utils/utils-lib.pri @@ -133,7 +133,8 @@ SOURCES += \ $$PWD/namevaluevalidator.cpp \ $$PWD/camelcasecursor.cpp \ $$PWD/infolabel.cpp \ - $$PWD/overlaywidget.cpp + $$PWD/overlaywidget.cpp \ + $$PWD/archive.cpp HEADERS += \ $$PWD/environmentfwd.h \ @@ -281,7 +282,8 @@ HEADERS += \ $$PWD/namevaluevalidator.h \ $$PWD/camelcasecursor.h \ $$PWD/infolabel.h \ - $$PWD/overlaywidget.h + $$PWD/overlaywidget.h \ + $$PWD/archive.h FORMS += $$PWD/filewizardpage.ui \ $$PWD/projectintropage.ui \ diff --git a/src/libs/utils/utils.qbs b/src/libs/utils/utils.qbs index 2c1b098c9e..1724da6e48 100644 --- a/src/libs/utils/utils.qbs +++ b/src/libs/utils/utils.qbs @@ -44,6 +44,8 @@ Project { "ansiescapecodehandler.h", "appmainwindow.cpp", "appmainwindow.h", + "archive.cpp", + "archive.h", "basetreeview.cpp", "basetreeview.h", "benchmarker.cpp", |