Apply most of the suggestions from @flowln

Signed-off-by: timoreo <contact@timoreo.fr>
This commit is contained in:
timoreo 2022-09-12 16:34:37 +02:00
parent 89f1b60538
commit 86e3518430
No known key found for this signature in database
GPG Key ID: 121A72C3512BA288
2 changed files with 197 additions and 179 deletions

View File

@ -9,7 +9,6 @@
#include "SysInfo.h" #include "SysInfo.h"
#include "net/ChecksumValidator.h" #include "net/ChecksumValidator.h"
#include "net/NetJob.h" #include "net/NetJob.h"
#include "quazip.h"
#include "ui/dialogs/ProgressDialog.h" #include "ui/dialogs/ProgressDialog.h"
// Quick & dirty struct to store files // Quick & dirty struct to store files
@ -25,28 +24,31 @@ void JavaDownloader::executeTask()
auto OS = m_OS; auto OS = m_OS;
auto isLegacy = m_isLegacy; auto isLegacy = m_isLegacy;
downloadMojangJavaList(OS, isLegacy);
}
void JavaDownloader::downloadMojangJavaList(const QString& OS, bool isLegacy)
{
auto netJob = new NetJob(QString("JRE::QueryVersions"), APPLICATION->network()); auto netJob = new NetJob(QString("JRE::QueryVersions"), APPLICATION->network());
auto response = new QByteArray(); auto response = new QByteArray();
setStatus(tr("Querying mojang meta")); setStatus(tr("Querying mojang meta"));
netJob->addNetAction(Net::Download::makeByteArray( netJob->addNetAction(Net::Download::makeByteArray(
QUrl("https://piston-meta.mojang.com/v1/products/java-runtime/2ec0cc96c44e5a76b9c8b7c39df7210883d12871/all.json"), response)); QUrl("https://piston-meta.mojang.com/v1/products/java-runtime/2ec0cc96c44e5a76b9c8b7c39df7210883d12871/all.json"), response));
QObject::connect(this, &Task::aborted, [isLegacy]{ connect(this, &Task::aborted,
QDir(FS::PathCombine("java",(isLegacy ? "java-legacy" : "java-current"))).removeRecursively(); [isLegacy] { QDir(FS::PathCombine("java", (isLegacy ? "java-legacy" : "java-current"))).removeRecursively(); });
});
QObject::connect(netJob, &NetJob::finished, [netJob, response, this] { connect(netJob, &NetJob::finished, [netJob, response, this] {
// delete so that it's not called on a deleted job // delete so that it's not called on a deleted job
QObject::disconnect(this, &Task::aborted, netJob, &NetJob::abort); disconnect(this, &Task::aborted, netJob, &NetJob::abort);
netJob->deleteLater(); netJob->deleteLater();
delete response; delete response;
}); });
QObject::connect(netJob, &NetJob::progress, this, &JavaDownloader::progress); connect(netJob, &NetJob::progress, this, &JavaDownloader::progress);
QObject::connect(netJob, &NetJob::failed, this, &JavaDownloader::emitFailed); connect(netJob, &NetJob::failed, this, &JavaDownloader::emitFailed);
QObject::connect(this, &Task::aborted, netJob, &NetJob::abort); connect(this, &Task::aborted, netJob, &NetJob::abort);
QObject::connect(netJob, &NetJob::succeeded, [response, OS, isLegacy, this, netJob] { connect(netJob, &NetJob::succeeded, [response, OS, isLegacy, this, netJob] {
QJsonParseError parse_error{}; QJsonParseError parse_error{};
QJsonDocument doc = QJsonDocument::fromJson(*response, &parse_error); QJsonDocument doc = QJsonDocument::fromJson(*response, &parse_error);
if (parse_error.error != QJsonParseError::NoError) { if (parse_error.error != QJsonParseError::NoError) {
@ -56,6 +58,18 @@ void JavaDownloader::executeTask()
} }
auto versionArray = Json::ensureArray(Json::ensureObject(doc.object(), OS), isLegacy ? "jre-legacy" : "java-runtime-gamma"); auto versionArray = Json::ensureArray(Json::ensureObject(doc.object(), OS), isLegacy ? "jre-legacy" : "java-runtime-gamma");
if (!versionArray.empty()) { if (!versionArray.empty()) {
parseMojangManifest(isLegacy, versionArray);
} else {
// mojang does not have a JRE for us, let's get azul zulu
downloadAzulMeta(OS, isLegacy, netJob);
}
});
netJob->start();
}
void JavaDownloader::parseMojangManifest(bool isLegacy, const QJsonArray& versionArray)
{
setStatus(tr("Downloading java from Mojang")); setStatus(tr("Downloading java from Mojang"));
auto url = versionArray[0].toObject()["manifest"].toObject()["url"].toString(); auto url = versionArray[0].toObject()["manifest"].toObject()["url"].toString();
auto download = new NetJob(QString("JRE::DownloadJava"), APPLICATION->network()); auto download = new NetJob(QString("JRE::DownloadJava"), APPLICATION->network());
@ -63,16 +77,16 @@ void JavaDownloader::executeTask()
download->addNetAction(Net::Download::makeByteArray(QUrl(url), files)); download->addNetAction(Net::Download::makeByteArray(QUrl(url), files));
QObject::connect(download, &NetJob::finished, [download, files, this] { connect(download, &NetJob::finished, [download, files, this] {
QObject::disconnect(this, &Task::aborted, download, &NetJob::abort); disconnect(this, &Task::aborted, download, &NetJob::abort);
download->deleteLater(); download->deleteLater();
delete files; delete files;
}); });
QObject::connect(download, &NetJob::progress, this, &JavaDownloader::progress); connect(download, &NetJob::progress, this, &JavaDownloader::progress);
QObject::connect(download, &NetJob::failed, this, &JavaDownloader::emitFailed); connect(download, &NetJob::failed, this, &JavaDownloader::emitFailed);
QObject::connect(this, &Task::aborted, download, &NetJob::abort); connect(this, &Task::aborted, download, &NetJob::abort);
QObject::connect(download, &NetJob::succeeded, [download, files, isLegacy, this] { connect(download, &NetJob::succeeded, [files, isLegacy, this] {
QJsonParseError parse_error{}; QJsonParseError parse_error{};
QJsonDocument doc = QJsonDocument::fromJson(*files, &parse_error); QJsonDocument doc = QJsonDocument::fromJson(*files, &parse_error);
if (parse_error.error != QJsonParseError::NoError) { if (parse_error.error != QJsonParseError::NoError) {
@ -80,8 +94,12 @@ void JavaDownloader::executeTask()
qWarning() << *files; qWarning() << *files;
return; return;
} }
downloadMojangJava(isLegacy, doc);
// valid json doc, begin making jre spot });
download->start();
}
void JavaDownloader::downloadMojangJava(bool isLegacy, const QJsonDocument& doc)
{ // valid json doc, begin making jre spot
auto output = FS::PathCombine(QString("java"), (isLegacy ? "java-legacy" : "java-current")); auto output = FS::PathCombine(QString("java"), (isLegacy ? "java-legacy" : "java-current"));
FS::ensureFolderPathExists(output); FS::ensureFolderPathExists(output);
std::vector<File> toDownload; std::vector<File> toDownload;
@ -109,33 +127,73 @@ void JavaDownloader::executeTask()
auto dl = Net::Download::makeFile(file.url, file.path); auto dl = Net::Download::makeFile(file.url, file.path);
dl->addValidator(new Net::ChecksumValidator(QCryptographicHash::Sha1, file.hash)); dl->addValidator(new Net::ChecksumValidator(QCryptographicHash::Sha1, file.hash));
if (file.isExec) { if (file.isExec) {
QObject::connect(dl.get(), &Net::Download::succeeded, [file] { connect(dl.get(), &Net::Download::succeeded,
QFile(file.path).setPermissions(QFile(file.path).permissions() | QFileDevice::Permissions(0x1111)); [file] { QFile(file.path).setPermissions(QFile(file.path).permissions() | QFileDevice::Permissions(0x1111)); });
});
} }
elementDownload->addNetAction(dl); elementDownload->addNetAction(dl);
} }
QObject::connect(elementDownload, &NetJob::finished, [elementDownload, this] { connect(elementDownload, &NetJob::finished, [elementDownload, this] {
QObject::disconnect(this, &Task::aborted, elementDownload, &NetJob::abort); disconnect(this, &Task::aborted, elementDownload, &NetJob::abort);
elementDownload->deleteLater(); elementDownload->deleteLater();
}); });
QObject::connect(elementDownload, &NetJob::progress, this, &JavaDownloader::progress); connect(elementDownload, &NetJob::progress, this, &JavaDownloader::progress);
QObject::connect(elementDownload, &NetJob::failed, this, &JavaDownloader::emitFailed); connect(elementDownload, &NetJob::failed, this, &JavaDownloader::emitFailed);
connect(this, &Task::aborted, elementDownload, &NetJob::abort);
QObject::connect(this, &Task::aborted, elementDownload, &NetJob::abort); connect(elementDownload, &NetJob::succeeded, [this] { emitSucceeded(); });
QObject::connect(elementDownload, &NetJob::succeeded, [this] { emitSucceeded(); });
elementDownload->start(); elementDownload->start();
}); }
download->start(); void JavaDownloader::downloadAzulMeta(const QString& OS, bool isLegacy, const NetJob* netJob)
} else { {
// mojang does not have a JRE for us, let's get azul zulu
setStatus(tr("Querying Azul meta")); setStatus(tr("Querying Azul meta"));
QString javaVersion = isLegacy ? QString("8.0") : QString("17.0"); QString javaVersion = isLegacy ? QString("8.0") : QString("17.0");
QString azulOS; QString azulOS;
QString arch; QString arch;
QString bitness; QString bitness;
mojangOStoAzul(OS, azulOS, arch, bitness);
auto metaResponse = new QByteArray();
auto downloadJob = new NetJob(QString("JRE::QueryAzulMeta"), APPLICATION->network());
downloadJob->addNetAction(
Net::Download::makeByteArray(QString("https://api.azul.com/zulu/download/community/v1.0/bundles/?"
"java_version=%1"
"&os=%2"
"&arch=%3"
"&hw_bitness=%4"
"&ext=zip" // as a zip for all os, even linux NOTE !! Linux ARM is .deb only !!
"&bundle_type=jre" // jre only
"&latest=true" // only get the one latest entry
)
.arg(javaVersion, azulOS, arch, bitness),
metaResponse));
connect(downloadJob, &NetJob::finished, [downloadJob, metaResponse, this] {
disconnect(this, &Task::aborted, downloadJob, &NetJob::abort);
downloadJob->deleteLater();
delete metaResponse;
});
connect(this, &Task::aborted, downloadJob, &NetJob::abort);
connect(netJob, &NetJob::failed, this, &JavaDownloader::emitFailed);
connect(downloadJob, &NetJob::progress, this, &JavaDownloader::progress);
connect(downloadJob, &NetJob::succeeded, [metaResponse, isLegacy, this] {
QJsonParseError parse_error{};
QJsonDocument doc = QJsonDocument::fromJson(*metaResponse, &parse_error);
if (parse_error.error != QJsonParseError::NoError) {
qWarning() << "Error while parsing JSON response at " << parse_error.offset << " reason: " << parse_error.errorString();
qWarning() << *metaResponse;
return;
}
auto array = doc.array();
if (!array.empty()) {
downloadAzulJava(isLegacy, array);
} else {
emitFailed(tr("No suitable JRE found"));
}
});
downloadJob->start();
}
void JavaDownloader::mojangOStoAzul(const QString& OS, QString& azulOS, QString& arch, QString& bitness)
{
if (OS == "mac-os-arm64") { if (OS == "mac-os-arm64") {
// macos arm64 // macos arm64
azulOS = "macos"; azulOS = "macos";
@ -157,39 +215,9 @@ void JavaDownloader::executeTask()
arch = "x86"; arch = "x86";
bitness = "64"; bitness = "64";
} }
auto metaResponse = new QByteArray();
auto downloadJob = new NetJob(QString("JRE::QueryAzulMeta"), APPLICATION->network());
downloadJob->addNetAction(
Net::Download::makeByteArray(QString("https://api.azul.com/zulu/download/community/v1.0/bundles/?"
"java_version=%1"
"&os=%2"
"&arch=%3"
"&hw_bitness=%4"
"&ext=zip" // as a zip for all os, even linux NOTE !! Linux ARM is .deb only !!
"&bundle_type=jre" // jre only
"&latest=true" // only get the one latest entry
)
.arg(javaVersion, azulOS, arch, bitness),
metaResponse));
QObject::connect(downloadJob, &NetJob::finished, [downloadJob, metaResponse, this] {
QObject::disconnect(this, &Task::aborted, downloadJob, &NetJob::abort);
downloadJob->deleteLater();
delete metaResponse;
});
QObject::connect(this, &Task::aborted, downloadJob, &NetJob::abort);
QObject::connect(netJob, &NetJob::failed, this, &JavaDownloader::emitFailed);
QObject::connect(downloadJob, &NetJob::progress, this, &JavaDownloader::progress);
QObject::connect(downloadJob, &NetJob::succeeded, [metaResponse, isLegacy, this, downloadJob] {
QJsonParseError parse_error{};
QJsonDocument doc = QJsonDocument::fromJson(*metaResponse, &parse_error);
if (parse_error.error != QJsonParseError::NoError) {
qWarning() << "Error while parsing JSON response at " << parse_error.offset << " reason: " << parse_error.errorString();
qWarning() << *metaResponse;
return;
} }
auto array = doc.array(); void JavaDownloader::downloadAzulJava(bool isLegacy, const QJsonArray& array)
if (!array.empty()) { { // JRE found ! download the zip
// JRE found ! download the zip
setStatus(tr("Downloading java from Azul")); setStatus(tr("Downloading java from Azul"));
auto downloadURL = QUrl(array[0].toObject()["url"].toString()); auto downloadURL = QUrl(array[0].toObject()["url"].toString());
auto download = new NetJob(QString("JRE::DownloadJava"), APPLICATION->network()); auto download = new NetJob(QString("JRE::DownloadJava"), APPLICATION->network());
@ -199,39 +227,21 @@ void JavaDownloader::executeTask()
temp->open(); temp->open();
temp->close(); temp->close();
download->addNetAction(Net::Download::makeFile(downloadURL, temp->fileName())); download->addNetAction(Net::Download::makeFile(downloadURL, temp->fileName()));
QObject::connect(download, &NetJob::finished, [download, this] { connect(download, &NetJob::finished, [download, this] {
QObject::disconnect(this, &Task::aborted, download, &NetJob::abort); disconnect(this, &Task::aborted, download, &NetJob::abort);
download->deleteLater(); download->deleteLater();
}); });
QObject::connect(download, &NetJob::progress, this, &JavaDownloader::progress); connect(download, &NetJob::progress, this, &JavaDownloader::progress);
QObject::connect(download, &NetJob::failed, this, &JavaDownloader::emitFailed); connect(download, &NetJob::failed, this, &JavaDownloader::emitFailed);
QObject::connect(this, &Task::aborted, download, &NetJob::abort); connect(this, &Task::aborted, download, &NetJob::abort);
QObject::connect(download, &NetJob::succeeded, [isLegacy, file = std::move(temp), downloadURL, this] { connect(download, &NetJob::succeeded, [isLegacy, file = std::move(temp), downloadURL, this] {
setStatus(tr("Extracting java")); setStatus(tr("Extracting java"));
auto output = FS::PathCombine(FS::PathCombine(QCoreApplication::applicationDirPath(), "java"), auto output = FS::PathCombine(QCoreApplication::applicationDirPath(), "java", isLegacy ? "java-legacy" : "java-current");
isLegacy ? "java-legacy" : "java-current");
// This should do all of the extracting and creating folders // This should do all of the extracting and creating folders
MMCZip::extractDir(file->fileName(), downloadURL.fileName().chopped(4), output); MMCZip::extractDir(file->fileName(), downloadURL.fileName().chopped(4), output);
emitSucceeded(); emitSucceeded();
}); });
download->start(); download->start();
} else {
emitFailed(tr("No suitable JRE found"));
}
});
downloadJob->start();
}
});
netJob->start();
}
void JavaDownloader::abortNetJob(NetJob* elementDownload)
{
if(elementDownload->isRunning()){
elementDownload->abort();
}else{
emit elementDownload->aborted();
}
} }
void JavaDownloader::showPrompts(QWidget* parent) void JavaDownloader::showPrompts(QWidget* parent)
{ {

View File

@ -17,5 +17,13 @@ class JavaDownloader : public Task {
private: private:
bool m_isLegacy; bool m_isLegacy;
const QString& m_OS; const QString& m_OS;
static void abortNetJob(NetJob* elementDownload);
void downloadMojangJavaList(const QString& OS, bool isLegacy);
void parseMojangManifest(bool isLegacy, const QJsonArray& versionArray);
void downloadMojangJava(bool isLegacy, const QJsonDocument& doc);
static void mojangOStoAzul(const QString& OS, QString& azulOS, QString& arch, QString& bitness) ;
void downloadAzulMeta(const QString& OS, bool isLegacy, const NetJob* netJob);
void downloadAzulJava(bool isLegacy, const QJsonArray& array);
}; };