cleanups
This commit is contained in:
+2
-34
@@ -22,20 +22,14 @@ namespace {
|
||||
|
||||
const QString kAdoptiumApi = QStringLiteral("https://api.adoptium.net/v3");
|
||||
|
||||
// Список компонентов рантайма Mojang. Ссылка зашита в официальный лаунчер и
|
||||
// меняется вместе с ним; сами компоненты обновляются по этому же адресу.
|
||||
const QString kMojangRuntimesUrl = QStringLiteral(
|
||||
"https://piston-meta.mojang.com/v1/products/java-runtime/"
|
||||
"2ec0cc96c44e5a76b9c8b7c39df7210883d12871/all.json");
|
||||
|
||||
// Сборки Java выходят раз в квартал, а не раз в неделю: суток кэша достаточно,
|
||||
// чтобы новая появилась в тот же день, и хватает на десяток открытий окна.
|
||||
constexpr qint64 kCacheTtlSeconds = 24 * 60 * 60;
|
||||
|
||||
constexpr int kTransferTimeoutMs = 20000;
|
||||
|
||||
// Сколько последних сборок каждой мажорной версии показывать. Больше трёх
|
||||
// смысла нет: старые патчи отличаются только исправлениями безопасности.
|
||||
constexpr int kReleasesPerMajor = 3;
|
||||
|
||||
QString adoptiumOs()
|
||||
@@ -63,7 +57,6 @@ QString adoptiumArch()
|
||||
return arch;
|
||||
}
|
||||
|
||||
// Ключ платформы в манифесте Mojang.
|
||||
QString mojangPlatform()
|
||||
{
|
||||
const QString arch = QSysInfo::currentCpuArchitecture();
|
||||
@@ -90,7 +83,6 @@ QNetworkRequest makeRequest(const QUrl &url)
|
||||
return request;
|
||||
}
|
||||
|
||||
// «1.8.0_504-b01» никто не узнаёт, а «8u504» — общепринятое имя той же сборки.
|
||||
QString displayVersion(const QJsonObject &versionData)
|
||||
{
|
||||
const int major = versionData.value(QStringLiteral("major")).toInt();
|
||||
@@ -138,8 +130,6 @@ std::optional<JavaRuntimeEntry> JavaRuntimeService::bestFor(int major) const
|
||||
if (major <= 0)
|
||||
return std::nullopt;
|
||||
|
||||
// Каталог уже отфильтрован по текущей ОС и архитектуре, поэтому здесь
|
||||
// остаётся выбрать из заведомо запускаемого.
|
||||
const auto rank = [](JavaRuntimeKind kind) {
|
||||
switch (kind) {
|
||||
case JavaRuntimeKind::Jdk:
|
||||
@@ -160,8 +150,6 @@ std::optional<JavaRuntimeEntry> JavaRuntimeService::bestFor(int major) const
|
||||
best = &entry;
|
||||
continue;
|
||||
}
|
||||
// Чем ближе мажорная версия к нужной, тем меньше шансов на сюрприз:
|
||||
// игра на Java 8 под Java 21 просто не стартует.
|
||||
if (entry.major != best->major) {
|
||||
if (entry.major < best->major)
|
||||
best = &entry;
|
||||
@@ -206,8 +194,6 @@ void JavaRuntimeService::ensureLoaded(Callback callback, bool forceRefresh)
|
||||
const bool fresh = hasData() && m_fetchedAt.isValid()
|
||||
&& m_fetchedAt.secsTo(QDateTime::currentDateTimeUtc()) < kCacheTtlSeconds;
|
||||
if (!forceRefresh && fresh) {
|
||||
// Колбэк, который то синхронный, то нет, ломает вызывающий код —
|
||||
// на попадании в кэш отвечаем через событийный цикл.
|
||||
if (callback)
|
||||
QTimer::singleShot(0, this, [callback = std::move(callback)] { callback(true, {}); });
|
||||
return;
|
||||
@@ -225,9 +211,6 @@ void JavaRuntimeService::startRefresh()
|
||||
m_incoming.clear();
|
||||
m_warnings.clear();
|
||||
m_ltsVersions.clear();
|
||||
|
||||
// Счётчик поднимаем на оба стартовых запроса разом: иначе ответ первого
|
||||
// успел бы обнулить его и завершить обновление раньше времени.
|
||||
m_outstanding = 2;
|
||||
emit refreshingChanged();
|
||||
|
||||
@@ -265,8 +248,6 @@ void JavaRuntimeService::requestAdoptiumReleases()
|
||||
return;
|
||||
}
|
||||
|
||||
// Запросы добавляем до того, как отчитается этот: иначе счётчик уйдёт
|
||||
// в ноль между двумя строчками.
|
||||
m_outstanding += majors.size();
|
||||
const QString arch = adoptiumArch();
|
||||
for (const int major : std::as_const(majors))
|
||||
@@ -298,8 +279,6 @@ void JavaRuntimeService::requestFeatureRelease(int major,
|
||||
connect(reply, &QNetworkReply::finished, this, [this, reply, major, allowFallback] {
|
||||
reply->deleteLater();
|
||||
|
||||
// 404 значит «под эту платформу такой сборки нет» — это не ошибка сети,
|
||||
// а нормальный ответ: Java 8 и 16 под Apple Silicon просто не собирали.
|
||||
const int status =
|
||||
reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt();
|
||||
QList<JavaRuntimeEntry> parsed;
|
||||
@@ -307,7 +286,6 @@ void JavaRuntimeService::requestFeatureRelease(int major,
|
||||
parsed = parseAdoptium(reply->readAll(), m_ltsVersions);
|
||||
|
||||
if (parsed.isEmpty() && allowFallback && (status == 404 || status == 200)) {
|
||||
// На Apple Silicon старые сборки берём под x64: Rosetta их запускает.
|
||||
m_outstanding += 1;
|
||||
requestFeatureRelease(major, QStringLiteral("x64"), false);
|
||||
requestFinished({});
|
||||
@@ -354,7 +332,6 @@ void JavaRuntimeService::finishRefresh()
|
||||
{
|
||||
m_outstanding = 0;
|
||||
const QString warning = m_warnings.join(QStringLiteral("; "));
|
||||
// Пустой разбор — испорченные ответы; хороший кэш ими не затираем.
|
||||
const bool ok = !m_incoming.isEmpty();
|
||||
if (ok) {
|
||||
applyEntries(std::exchange(m_incoming, {}));
|
||||
@@ -365,11 +342,8 @@ void JavaRuntimeService::finishRefresh()
|
||||
m_incoming.clear();
|
||||
m_warnings.clear();
|
||||
emit refreshingChanged();
|
||||
|
||||
// Колбэк может снова позвать ensureLoaded — список забираем себе заранее.
|
||||
const QList<Callback> pending = std::exchange(m_pending, {});
|
||||
for (const Callback &callback : pending) {
|
||||
// Сеть подвела, но старые данные есть — работаем на них.
|
||||
if (!ok && hasData())
|
||||
callback(true, warning.isEmpty() ? Loc::text("java.status.catalogFromCache") : warning);
|
||||
else
|
||||
@@ -400,13 +374,11 @@ QList<JavaRuntimeEntry> JavaRuntimeService::parseAdoptium(const QByteArray &payl
|
||||
const QJsonObject binary = binaryValue.toObject();
|
||||
const auto kind = javaKindFromKey(binary.value(QStringLiteral("image_type")).toString());
|
||||
if (!kind || *kind == JavaRuntimeKind::Mojang)
|
||||
continue; // testimage, debugimage, sources и прочее нам не нужно
|
||||
continue;
|
||||
|
||||
const QJsonObject package = binary.value(QStringLiteral("package")).toObject();
|
||||
const QUrl url(package.value(QStringLiteral("link")).toString());
|
||||
const QString archive = archiveKind(package.value(QStringLiteral("name")).toString());
|
||||
// Распаковать умеем только zip и tar.gz; https — потому что ссылку
|
||||
// мы получили из сети и открываем её же.
|
||||
if (archive.isEmpty() || url.scheme() != QLatin1String("https"))
|
||||
continue;
|
||||
|
||||
@@ -438,13 +410,12 @@ QList<JavaRuntimeEntry> JavaRuntimeService::parseMojang(const QByteArray &payloa
|
||||
const QJsonObject platform = root.value(mojangPlatform()).toObject();
|
||||
|
||||
for (auto it = platform.constBegin(); it != platform.constEnd(); ++it) {
|
||||
// minecraft-java-exe — это лаунчер игры, а не Java.
|
||||
if (it.key() == QLatin1String("minecraft-java-exe"))
|
||||
continue;
|
||||
|
||||
const QJsonArray variants = it.value().toArray();
|
||||
if (variants.isEmpty())
|
||||
continue; // компонента под эту платформу нет
|
||||
continue;
|
||||
|
||||
const QJsonObject variant = variants.first().toObject();
|
||||
const QJsonObject manifest = variant.value(QStringLiteral("manifest")).toObject();
|
||||
@@ -461,7 +432,6 @@ QList<JavaRuntimeEntry> JavaRuntimeService::parseMojang(const QByteArray &payloa
|
||||
entry.kind = JavaRuntimeKind::Mojang;
|
||||
entry.component = it.key();
|
||||
entry.version = version;
|
||||
// «8u51-cacert462b08» у jre-legacy, «21.0.7» у остальных.
|
||||
entry.major = version.startsWith(QLatin1String("8u"))
|
||||
? 8
|
||||
: version.section(u'.', 0, 0).toInt();
|
||||
@@ -506,7 +476,6 @@ bool JavaRuntimeService::readCache()
|
||||
return false;
|
||||
|
||||
const QJsonObject root = QJsonDocument::fromJson(file.readAll()).object();
|
||||
// Кэш платформозависим: папку лаунчера могли принести с другой машины.
|
||||
if (root.value(QStringLiteral("platform")).toString() != mojangPlatform())
|
||||
return false;
|
||||
|
||||
@@ -547,7 +516,6 @@ bool JavaRuntimeService::readCache()
|
||||
|
||||
void JavaRuntimeService::writeCache()
|
||||
{
|
||||
// Папку кэша могли удалить уже после запуска лаунчера.
|
||||
if (!LauncherPaths::ensureRootExists())
|
||||
return;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user