#include "launcherpaths.h" #include "localization.h" #include #include namespace { const QString kFolderName = QStringLiteral("galeonLauncher"); } // namespace QString LauncherPaths::containerDir() { #if defined(Q_OS_WIN) return QDir::homePath() + QStringLiteral("/AppData/Roaming"); #elif defined(Q_OS_MACOS) return QDir::homePath() + QStringLiteral("/Library/Application Support"); #else // Linux и прочие Unix-системы return QDir::homePath(); #endif } QString LauncherPaths::rootDir() { return containerDir() + u'/' + kFolderName; } QString LauncherPaths::defaultMinecraftDir() { #if defined(Q_OS_MACOS) // На macOS папка игры исторически без точки. return containerDir() + QStringLiteral("/minecraft"); #else return containerDir() + QStringLiteral("/.minecraft"); #endif } QString LauncherPaths::settingsFile() { return rootDir() + QStringLiteral("/settings.json"); } QString LauncherPaths::profilesFile() { return rootDir() + QStringLiteral("/profiles.json"); } QString LauncherPaths::customBuildsFile() { return rootDir() + QStringLiteral("/customBuilds.json"); } QString LauncherPaths::legacyCustomBuildsFile() { return rootDir() + QStringLiteral("/versions.json"); } QString LauncherPaths::buildStorageDir() { return rootDir() + QStringLiteral("/builds"); } QString LauncherPaths::buildDir(int buildId) { return buildStorageDir() + u'/' + QString::number(buildId); } QString LauncherPaths::seasonalStateFile(int buildId) { return buildDir(buildId) + QStringLiteral("/season.json"); } QString LauncherPaths::runtimeDir() { return rootDir() + QStringLiteral("/runtime"); } QString LauncherPaths::javaDir() { return rootDir() + QStringLiteral("/java"); } QString LauncherPaths::javaCatalogFile() { return cacheDir() + QStringLiteral("/java_runtimes.json"); } QString LauncherPaths::javaDownloadDir() { return cacheDir() + QStringLiteral("/java"); } QString LauncherPaths::cacheDir() { return rootDir() + QStringLiteral("/cache"); } QString LauncherPaths::versionManifestFile() { return cacheDir() + QStringLiteral("/version_manifest.json"); } QString LauncherPaths::seasonalCatalogFile() { return cacheDir() + QStringLiteral("/seasonal_builds.json"); } QString LauncherPaths::loaderCacheFile(const QString &loaderKey) { return cacheDir() + QStringLiteral("/loader_") + loaderKey + QStringLiteral(".json"); } QString LauncherPaths::loaderDownloadDir() { return cacheDir() + QStringLiteral("/loaders"); } bool LauncherPaths::ensureRootExists(QString *error) { const QStringList required{rootDir(), runtimeDir(), cacheDir(), loaderDownloadDir(), buildStorageDir(), javaDir(), javaDownloadDir()}; for (const QString &path : required) { if (!QDir().mkpath(path)) { if (error) *error = Loc::text("storage.error.createFailed").arg(QDir::toNativeSeparators(path)); return false; } // mkpath отвечает true и для существующего каталога, в который нельзя писать, // и для подсунутого вместо папки файла — тогда все сохранения провалились бы молча. const QFileInfo info(path); if (!info.isDir() || !info.isWritable()) { if (error) *error = Loc::text("storage.error.notWritable").arg(QDir::toNativeSeparators(path)); return false; } } return true; }