/* SPDX-FileCopyrightText: 2026 Project Tick * SPDX-FileContributor: Project Tick * SPDX-License-Identifier: GPL-3.0-or-later * * MeshMC - A Custom Launcher for Minecraft * Copyright (C) 2026 Project Tick * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #pragma once #include #include #include #include #include namespace JavaDownload { struct RuntimeVersion { int major = 0; int minor = 0; int security = 0; int build = 0; QString toString() const { if (build > 0) return QString("%1.%2.%3+%4") .arg(major) .arg(minor) .arg(security) .arg(build); return QString("%1.%2.%3").arg(major).arg(minor).arg(security); } }; struct RuntimeEntry { QString name; QString url; QString checksumHash; QString checksumType; QString downloadType; QString packageType; QString releaseTime; QString runtimeOS; QString vendor; RuntimeVersion version; }; struct JavaVersionInfo { QString uid; QString versionId; QString name; QString sha256; QString releaseTime; bool recommended = false; }; struct JavaProviderInfo { QString uid; QString name; QString iconName; static QList availableProviders() { return { {"net.adoptium.java", "Eclipse Adoptium", "adoptium"}, {"com.azul.java", "Azul Zulu", "azul"}, {"com.ibm.java", "IBM Semeru (OpenJ9)", "openj9_hex_custom"}, {"net.minecraft.java", "Mojang", "mojang"}, }; } }; inline QString currentRuntimeOS() { #if defined(Q_OS_LINUX) #if defined(__aarch64__) return "linux-arm64"; #elif defined(__riscv) return "linux-riscv64"; #else return "linux-x64"; #endif #elif defined(Q_OS_MACOS) #if defined(__aarch64__) return "mac-os-arm64"; #else return "mac-os-x64"; #endif #elif defined(Q_OS_WIN) #if defined(__aarch64__) || defined(_M_ARM64) return "windows-arm64"; #else return "windows-x64"; #endif #else return "unknown"; #endif } inline RuntimeEntry parseRuntimeEntry(const QJsonObject& obj) { RuntimeEntry entry; entry.name = obj["name"].toString(); entry.url = obj["url"].toString(); entry.downloadType = obj["downloadType"].toString(); entry.packageType = obj["packageType"].toString(); entry.releaseTime = obj["releaseTime"].toString(); entry.runtimeOS = obj["runtimeOS"].toString(); entry.vendor = obj["vendor"].toString(); auto checksum = obj["checksum"].toObject(); entry.checksumHash = checksum["hash"].toString(); entry.checksumType = checksum["type"].toString(); auto ver = obj["version"].toObject(); entry.version.major = ver["major"].toInt(); entry.version.minor = ver["minor"].toInt(); entry.version.security = ver["security"].toInt(); entry.version.build = ver["build"].toInt(); return entry; } inline QList parseRuntimes(const QJsonObject& obj) { QList entries; auto arr = obj["runtimes"].toArray(); for (const auto& val : arr) { entries.append(parseRuntimeEntry(val.toObject())); } return entries; } inline QList parseVersionIndex(const QJsonObject& obj, const QString& uid) { QList versions; auto arr = obj["versions"].toArray(); for (const auto& val : arr) { auto vObj = val.toObject(); JavaVersionInfo info; info.uid = uid; info.versionId = vObj["version"].toString(); info.sha256 = vObj["sha256"].toString(); info.releaseTime = vObj["releaseTime"].toString(); info.recommended = vObj["recommended"].toBool(false); info.name = obj["name"].toString(); versions.append(info); } return versions; } } // namespace JavaDownload