3.3 KiB
VersionManifestService
versionmanifestservice.h, versionmanifestservice.cpp
Каталог версий Mojang. Скачивает version_manifest_v2.json, хранит его копию в папке лаунчера и
отвечает из неё, пока копия свежая.
Экземпляр держит LauncherBackend: из каталога он строит список для окна
выбора версии. VersionInstaller берёт из каталога ссылку на описание версии
через find().
RemoteVersionEntry
| Поле | Что это |
|---|---|
id |
1.21.8, 25w33a, b1.7.3 |
type |
release, snapshot, old_beta, old_alpha |
url |
адрес <id>.json |
sha1 |
хеш этого json |
releaseTime |
Записи без id или с адресом не по https отбрасываются. Список отсортирован по releaseTime,
новые сверху. При одинаковом времени сортировка идёт по id.
ensureLoaded(callback, forceRefresh = false)
Через этот метод сервис получает данные; других способов нет.
- При первом вызове читается кэш
<root>/cache/version_manifest.json. Если он разобрался, сразу испускаетсяversionsChanged, и окно показывает список ещё до ответа сети. - Если данные моложе 6 часов и
forceRefreshне задан, колбэк вызывается черезQTimer::singleShot(0)сok = true. Сеть не трогается. - Иначе колбэк встаёт в очередь. Если запрос уже идёт, второй не отправляется.
Ответ сети разбирается, кэш перезаписывается через QSaveFile, испускается versionsChanged, и
все колбэки из очереди получают результат.
Если сеть не ответила, но старые данные есть, колбэк получит ok = true и непустой warning:
работать можно, просто список, возможно, неполный. Если данных нет совсем, придёт ok = false.
Бэкенд показывает warning пользователю только во втором случае.
Таймаут запроса 20 секунд.
Остальное
versions()— весь список.find(id)— запись по id (через хеш-таблицу, а не перебором).hasData(),isRefreshing(),fetchedAt().refreshingChangedиспускается в начале и в конце запроса. Бэкенд превращает его вcatalogLoading.
Формат кэша
{
"fetchedAt": "2026-10-11T08:00:00Z",
"versions": [
{ "id": "1.21.8", "type": "release", "url": "https://...", "sha1": "...", "releaseTime": "..." }
]
}
Хранится только то, что нужно лаунчеру, а не весь манифест Mojang.
При создании этого документа использовался ИИ.