87 lines
4.1 KiB
C++
87 lines
4.1 KiB
C++
|
|
#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
|