Files
minecraft-launcher/javaruntime.h
T

87 lines
4.1 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#pragma once
#include <QDateTime>
#include <QList>
#include <QString>
#include <QUrl>
#include <optional>
// Откуда взялась сборка Java и что именно в ней лежит.
enum class JavaRuntimeKind {
Mojang, // «Java» — тот же рантайм, которым игру запускает официальный лаунчер
Jdk, // Eclipse Temurin JDK: компилятор и инструменты в комплекте
Jre // Eclipse Temurin JRE: только то, что нужно для запуска
};
QString javaKindKey(JavaRuntimeKind kind); // java | jdk | jre
std::optional<JavaRuntimeKind> javaKindFromKey(const QString &key);
QString javaKindTitle(JavaRuntimeKind kind);
// Строка каталога — то, что можно скачать.
struct JavaRuntimeEntry
{
QString id; // temurin-jdk-21.0.12.1_1 | mojang-java-runtime-delta
JavaRuntimeKind kind = JavaRuntimeKind::Jdk;
int major = 0; // 8, 17, 21…
QString version; // 21.0.12.1+1 | 21.0.7
QString component; // java-runtime-delta — только у сборок Mojang
QDateTime released;
QUrl url; // архив Temurin либо manifest.json компонента
QString checksum; // sha256 архива Temurin, sha1 манифеста Mojang
qint64 size = 0; // размер загрузки, 0 — неизвестен
QString archive; // zip | tar.gz | mojang
QString architecture; // x64 | aarch64 — на macOS бывает и не родная
bool lts = false;
bool isValid() const { return !id.isEmpty() && major > 0 && url.isValid(); }
};
// Сборка, уже распакованная в папке лаунчера.
struct InstalledJavaRuntime
{
QString id;
QString kind; // java | jdk | jre
int major = 0;
QString version;
QString javaPath; // абсолютный путь к java/java.exe
qint64 size = 0; // сколько заняло на диске по итогам установки
};
// Папка <root>/java: одна подпапка на сборку плюс её описание внутри. Отдельного
// индекса нет намеренно — удалённую вручную папку не пришлось бы вычищать ещё и
// из общего файла.
namespace JavaRuntimeStore {
QString dirFor(const QString &id);
// Всё, что лежит в <root>/java и на что нашлась java. Новые версии сверху.
QList<InstalledJavaRuntime> installed();
std::optional<InstalledJavaRuntime> find(const QString &id);
// Ищет bin/java в распакованном дереве: у Temurin на macOS это
// Contents/Home/bin, у Mojang — jre.bundle/Contents/Home/bin.
QString locateBinary(const QString &rootDir);
bool writeMeta(const InstalledJavaRuntime &runtime, QString *error);
bool remove(const QString &id, QString *error);
// Имя папки из идентификатора каталога: всё, кроме букв, цифр, точки, дефиса и
// подчёркивания, заменяется — идентификатор приходит из сети.
QString sanitizeId(const QString &id);
} // namespace JavaRuntimeStore
// Какая Java нужна какой версии игры. Точный ответ лежит в client.json
// (javaVersion.majorVersion) и берётся оттуда при запуске; эта таблица нужна
// раньше — когда версия ещё не скачана, а подсказку в каталоге показать надо.
namespace JavaRequirement {
// Минимальная мажорная версия Java для версии игры. 0 — разобрать не удалось.
int minimumFor(const QString &minecraftVersionId);
// «Minecraft 1.20.5 и новее» — подпись к строке каталога.
QString coverage(int javaMajor);
} // namespace JavaRequirement