#include "launcherpaths.h" #include #include #include namespace { const QString kFolderName = QStringLiteral("galeonLauncher"); QString translate(const char *text) { return QCoreApplication::translate("LauncherPaths", text); } } // 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::versionsFile() { return rootDir() + QStringLiteral("/versions.json"); } QString LauncherPaths::runtimeDir() { return rootDir() + QStringLiteral("/runtime"); } QString LauncherPaths::cacheDir() { return rootDir() + QStringLiteral("/cache"); } QString LauncherPaths::versionManifestFile() { return cacheDir() + QStringLiteral("/version_manifest.json"); } bool LauncherPaths::ensureRootExists(QString *error) { const QStringList required{rootDir(), runtimeDir(), cacheDir()}; for (const QString &path : required) { if (!QDir().mkpath(path)) { if (error) *error = translate("не удалось создать %1").arg(QDir::toNativeSeparators(path)); return false; } // mkpath отвечает true и для существующего каталога, в который нельзя писать, // и для подсунутого вместо папки файла — тогда все сохранения провалились бы молча. const QFileInfo info(path); if (!info.isDir() || !info.isWritable()) { if (error) *error = translate("нет доступа на запись в %1").arg(QDir::toNativeSeparators(path)); return false; } } return true; }