forked from qt-creator/qt-creator
Android: Make validation of downloaded SDK package an async task
Execution moved into a second thread. Progress dialog now shows a distinct progress phase. Change-Id: I933f823c9bfea562d9d3cee5d98990444073b4fe Reviewed-by: Jarek Kobus <jaroslaw.kobus@qt.io>
This commit is contained in:
@@ -6,15 +6,19 @@
|
|||||||
#include "androidsdkdownloader.h"
|
#include "androidsdkdownloader.h"
|
||||||
#include "androidtr.h"
|
#include "androidtr.h"
|
||||||
|
|
||||||
|
#include <coreplugin/icore.h>
|
||||||
|
|
||||||
|
#include <extensionsystem/pluginmanager.h>
|
||||||
|
|
||||||
#include <solutions/tasking/barrier.h>
|
#include <solutions/tasking/barrier.h>
|
||||||
#include <solutions/tasking/networkquery.h>
|
#include <solutions/tasking/networkquery.h>
|
||||||
|
|
||||||
|
#include <utils/async.h>
|
||||||
#include <utils/filepath.h>
|
#include <utils/filepath.h>
|
||||||
|
#include <utils/futuresynchronizer.h>
|
||||||
#include <utils/networkaccessmanager.h>
|
#include <utils/networkaccessmanager.h>
|
||||||
#include <utils/unarchiver.h>
|
#include <utils/unarchiver.h>
|
||||||
|
|
||||||
#include <coreplugin/icore.h>
|
|
||||||
|
|
||||||
#include <QCryptographicHash>
|
#include <QCryptographicHash>
|
||||||
#include <QLoggingCategory>
|
#include <QLoggingCategory>
|
||||||
#include <QMessageBox>
|
#include <QMessageBox>
|
||||||
@@ -73,16 +77,16 @@ static std::optional<QString> saveToDisk(const FilePath &filename, QIODevice *da
|
|||||||
return {};
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: Make it a separate async task in a chain?
|
static void validateFileIntegrity(QPromise<void> &promise, const FilePath &fileName,
|
||||||
static bool verifyFileIntegrity(const FilePath fileName, const QByteArray &sha256)
|
const QByteArray &sha256)
|
||||||
{
|
{
|
||||||
QFile file(fileName.toString());
|
QFile file(fileName.toString());
|
||||||
if (file.open(QFile::ReadOnly)) {
|
if (file.open(QFile::ReadOnly)) {
|
||||||
QCryptographicHash hash(QCryptographicHash::Sha256);
|
QCryptographicHash hash(QCryptographicHash::Sha256);
|
||||||
if (hash.addData(&file))
|
if (hash.addData(&file) && hash.result() == sha256)
|
||||||
return hash.result() == sha256;
|
return;
|
||||||
}
|
}
|
||||||
return false;
|
promise.future().cancel();
|
||||||
}
|
}
|
||||||
|
|
||||||
GroupItem downloadSdkRecipe()
|
GroupItem downloadSdkRecipe()
|
||||||
@@ -161,17 +165,25 @@ GroupItem downloadSdkRecipe()
|
|||||||
}
|
}
|
||||||
storage->sdkFileName = sdkFileName;
|
storage->sdkFileName = sdkFileName;
|
||||||
};
|
};
|
||||||
|
const auto onValidationSetup = [storage](Async<void> &async) {
|
||||||
|
if (!storage->sdkFileName)
|
||||||
|
return SetupResult::StopWithError;
|
||||||
|
async.setConcurrentCallData(validateFileIntegrity, *storage->sdkFileName,
|
||||||
|
androidConfig().getSdkToolsSha256());
|
||||||
|
async.setFutureSynchronizer(ExtensionSystem::PluginManager::futureSynchronizer());
|
||||||
|
storage->progressDialog->setRange(0, 0);
|
||||||
|
storage->progressDialog->setLabelText(Tr::tr("Verifying package integrity..."));
|
||||||
|
return SetupResult::Continue;
|
||||||
|
};
|
||||||
|
const auto onValidationDone = [](DoneWith result) {
|
||||||
|
if (result != DoneWith::Error)
|
||||||
|
return;
|
||||||
|
logError(Tr::tr("Verifying the integrity of the downloaded file has failed."));
|
||||||
|
};
|
||||||
const auto onUnarchiveSetup = [storage](Unarchiver &unarchiver) {
|
const auto onUnarchiveSetup = [storage](Unarchiver &unarchiver) {
|
||||||
storage->progressDialog->setRange(0, 0);
|
storage->progressDialog->setRange(0, 0);
|
||||||
storage->progressDialog->setLabelText(Tr::tr("Unarchiving SDK Tools package..."));
|
storage->progressDialog->setLabelText(Tr::tr("Unarchiving SDK Tools package..."));
|
||||||
if (!storage->sdkFileName)
|
|
||||||
return SetupResult::StopWithError;
|
|
||||||
const FilePath sdkFileName = *storage->sdkFileName;
|
const FilePath sdkFileName = *storage->sdkFileName;
|
||||||
if (!verifyFileIntegrity(sdkFileName, androidConfig().getSdkToolsSha256())) {
|
|
||||||
logError(Tr::tr("Verifying the integrity of the downloaded file has failed."));
|
|
||||||
return SetupResult::StopWithError;
|
|
||||||
}
|
|
||||||
const auto sourceAndCommand = Unarchiver::sourceAndCommand(sdkFileName);
|
const auto sourceAndCommand = Unarchiver::sourceAndCommand(sdkFileName);
|
||||||
if (!sourceAndCommand) {
|
if (!sourceAndCommand) {
|
||||||
logError(sourceAndCommand.error());
|
logError(sourceAndCommand.error());
|
||||||
@@ -206,6 +218,7 @@ GroupItem downloadSdkRecipe()
|
|||||||
Group {
|
Group {
|
||||||
onGroupSetup(onSetup),
|
onGroupSetup(onSetup),
|
||||||
NetworkQueryTask(onQuerySetup, onQueryDone),
|
NetworkQueryTask(onQuerySetup, onQueryDone),
|
||||||
|
AsyncTask<void>(onValidationSetup, onValidationDone),
|
||||||
UnarchiverTask(onUnarchiveSetup, onUnarchiverDone)
|
UnarchiverTask(onUnarchiveSetup, onUnarchiverDone)
|
||||||
},
|
},
|
||||||
BarrierTask(onCanceled, [] { return DoneResult::Error; })
|
BarrierTask(onCanceled, [] { return DoneResult::Error; })
|
||||||
|
|||||||
Reference in New Issue
Block a user