From 9e2554b660567d61ee742b2e26234b22eab7c425 Mon Sep 17 00:00:00 2001 From: Alessandro Portale Date: Mon, 20 Dec 2021 00:09:00 +0100 Subject: [PATCH] Use Utils::Archive instead of java's jar in AndroidSdkDownloader The exctraction of the downloaded commandlinetools zip file via java's jar tool did suddenly not work anymore on Windows. The exit code of jarExtractProc in AndroidSdkDownloader::extractSdk would be != 0. Instead of fixing the jar usage, this change replaces it with the recently added Utils::Archive. That has the advantage that it preserves the file permissions while exctracting, so that we can also get rid of setSdkFilesExecPermission. Another advantage is that the SDK can be extracted even before a jdk has been selected. Change-Id: I99cc2aff8e183108eb11dbf96f06557e5b299d56 Reviewed-by: hjk Reviewed-by: Assam Boudjelthia --- src/plugins/android/androidsdkdownloader.cpp | 64 +++++-------------- src/plugins/android/androidsdkdownloader.h | 5 +- src/plugins/android/androidsettingswidget.cpp | 10 +-- 3 files changed, 19 insertions(+), 60 deletions(-) diff --git a/src/plugins/android/androidsdkdownloader.cpp b/src/plugins/android/androidsdkdownloader.cpp index 28837ca8d4e..c9512b464a9 100644 --- a/src/plugins/android/androidsdkdownloader.cpp +++ b/src/plugins/android/androidsdkdownloader.cpp @@ -24,13 +24,13 @@ ****************************************************************************/ #include "androidsdkdownloader.h" -#include "utils/filepath.h" -#include "utils/qtcprocess.h" + +#include +#include + #include #include -#include -#include #include #include @@ -61,22 +61,7 @@ void AndroidSdkDownloader::sslErrors(const QList &sslErrors) } #endif -static void setSdkFilesExecPermission( const FilePath &sdkExtractPath) -{ - const FilePath filePath = sdkExtractPath / "tools"; - - filePath.iterateDirectory( - [](const FilePath &filePath) { - if (!filePath.fileName().contains('.')) { - QFlags currentPermissions = filePath.permissions(); - filePath.setPermissions(currentPermissions | QFileDevice::ExeOwner); - } - return true; - }, - {{"*"}, QDir::Files, QDirIterator::Subdirectories}); -} - -void AndroidSdkDownloader::downloadAndExtractSdk(const FilePath &jdkPath, const FilePath &sdkExtractPath) +void AndroidSdkDownloader::downloadAndExtractSdk(const FilePath &sdkExtractPath) { if (m_androidConfig.sdkToolsUrl().isEmpty()) { logError(tr("The SDK Tools download URL is empty.")); @@ -103,34 +88,16 @@ void AndroidSdkDownloader::downloadAndExtractSdk(const FilePath &jdkPath, const connect(m_progressDialog, &QProgressDialog::canceled, this, &AndroidSdkDownloader::cancel); - connect(this, &AndroidSdkDownloader::sdkPackageWriteFinished, this, [this, jdkPath, sdkExtractPath]() { - if (extractSdk(jdkPath, sdkExtractPath)) { - setSdkFilesExecPermission(sdkExtractPath); - emit sdkExtracted(); + connect(this, &AndroidSdkDownloader::sdkPackageWriteFinished, this, [this, sdkExtractPath]() { + if (Archive *archive = Archive::unarchive(m_sdkFilename, sdkExtractPath)) { + connect(archive, &Archive::finished, [this, sdkExtractPath](bool success){ + if (success) + emit sdkExtracted(); + }); } }); } -bool AndroidSdkDownloader::extractSdk(const FilePath &jdkPath, const FilePath &sdkExtractPath) -{ - QDir sdkDir = sdkExtractPath.toDir(); - if (!sdkDir.exists()) { - if (!sdkDir.mkpath(".")) { - logError(QString(tr("Could not create the SDK folder %1.")) - .arg(sdkExtractPath.toUserOutput())); - return false; - } - } - - QtcProcess jarExtractProc; - jarExtractProc.setWorkingDirectory(sdkExtractPath); - FilePath jarCmdPath(jdkPath / "/bin/jar"); - jarExtractProc.setCommand({jarCmdPath, {"xf", m_sdkFilename.path()}}); - jarExtractProc.runBlocking(); - - return jarExtractProc.exitCode() ? false : true; -} - bool AndroidSdkDownloader::verifyFileIntegrity() { QFile f(m_sdkFilename.toString()); @@ -170,7 +137,7 @@ void AndroidSdkDownloader::logError(const QString &error) emit sdkDownloaderError(error); } -QString AndroidSdkDownloader::getSaveFilename(const QUrl &url) +FilePath AndroidSdkDownloader::getSaveFilename(const QUrl &url) { QString path = url.path(); QString basename = QFileInfo(path).fileName(); @@ -186,9 +153,8 @@ QString AndroidSdkDownloader::getSaveFilename(const QUrl &url) basename += QString::number(i); } - QString fullPath = QStandardPaths::writableLocation(QStandardPaths::DownloadLocation) - + QDir::separator() + basename; - return fullPath; + return FilePath::fromString(QStandardPaths::writableLocation(QStandardPaths::DownloadLocation)) + / basename; } bool AndroidSdkDownloader::saveToDisk(const FilePath &filename, QIODevice *data) @@ -223,7 +189,7 @@ void AndroidSdkDownloader::downloadFinished(QNetworkReply *reply) if (isHttpRedirect(reply)) { cancelWithError(QString(tr("Download from %1 was redirected.")).arg(url.toString())); } else { - m_sdkFilename = FilePath::fromString(getSaveFilename(url)); + m_sdkFilename = getSaveFilename(url); if (saveToDisk(m_sdkFilename, reply) && verifyFileIntegrity()) emit sdkPackageWriteFinished(); else diff --git a/src/plugins/android/androidsdkdownloader.h b/src/plugins/android/androidsdkdownloader.h index a018d3d10cd..76375132397 100644 --- a/src/plugins/android/androidsdkdownloader.h +++ b/src/plugins/android/androidsdkdownloader.h @@ -43,7 +43,7 @@ class AndroidSdkDownloader : public QObject public: AndroidSdkDownloader(); - void downloadAndExtractSdk(const Utils::FilePath &jdkPath, const Utils::FilePath &sdkExtractPath); + void downloadAndExtractSdk(const Utils::FilePath &sdkExtractPath); static QString dialogTitle(); void cancel(); @@ -54,11 +54,10 @@ signals: void sdkDownloaderError(const QString &error); private: - static QString getSaveFilename(const QUrl &url); + static Utils::FilePath getSaveFilename(const QUrl &url); bool saveToDisk(const Utils::FilePath &filename, QIODevice *data); static bool isHttpRedirect(QNetworkReply *m_reply); - bool extractSdk(const Utils::FilePath &jdkPath, const Utils::FilePath &sdkExtractPath); bool verifyFileIntegrity(); void cancelWithError(const QString &error); void logError(const QString &error); diff --git a/src/plugins/android/androidsettingswidget.cpp b/src/plugins/android/androidsettingswidget.cpp index abbbe2dd871..fda3366a95f 100644 --- a/src/plugins/android/androidsettingswidget.cpp +++ b/src/plugins/android/androidsettingswidget.cpp @@ -712,14 +712,8 @@ void AndroidSettingsWidget::downloadSdk() .arg(m_ui.SDKLocationPathChooser->filePath().cleanPath().toUserOutput()); auto userInput = QMessageBox::information(this, AndroidSdkDownloader::dialogTitle(), message, QMessageBox::Yes | QMessageBox::No); - if (userInput == QMessageBox::Yes) { - if (m_androidSummary->rowsOk({JavaPathExistsAndWritableRow})) { - auto javaPath = m_ui.OpenJDKLocationPathChooser->filePath(); - m_sdkDownloader.downloadAndExtractSdk( - javaPath, - m_ui.SDKLocationPathChooser->filePath().cleanPath()); - } - } + if (userInput == QMessageBox::Yes) + m_sdkDownloader.downloadAndExtractSdk(m_ui.SDKLocationPathChooser->filePath().cleanPath()); } // AndroidSettingsPage