#pragma once #include #include #include #include #include // Откуда взялась сборка Java и что именно в ней лежит. enum class JavaRuntimeKind { Mojang, // «Java» — тот же рантайм, которым игру запускает официальный лаунчер Jdk, // Eclipse Temurin JDK: компилятор и инструменты в комплекте Jre // Eclipse Temurin JRE: только то, что нужно для запуска }; QString javaKindKey(JavaRuntimeKind kind); // java | jdk | jre std::optional 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; // сколько заняло на диске по итогам установки }; // Папка /java: одна подпапка на сборку плюс её описание внутри. Отдельного // индекса нет намеренно — удалённую вручную папку не пришлось бы вычищать ещё и // из общего файла. namespace JavaRuntimeStore { QString dirFor(const QString &id); // Всё, что лежит в /java и на что нашлась java. Новые версии сверху. QList installed(); std::optional 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