8 #include <QCoreApplication>
10 #include <QRegularExpression>
12 #include <QStandardPaths>
21 using namespace swift::config;
25 QString binDirectoryImpl()
27 QString appDirectoryString(qApp->applicationDirPath());
28 if (appDirectoryString.endsWith(
"Contents/MacOS")) { appDirectoryString +=
"/../../.."; }
29 QDir appDirectory(appDirectoryString);
30 return appDirectory.absolutePath();
33 const QString &CSwiftDirectories::binDirectory()
35 static const QString binDir(binDirectoryImpl());
39 const QString &CSwiftDirectories::pluginsDirectory()
41 static const QString pDir(CFileUtils::appendFilePaths(binDirectory(),
"plugins"));
45 const QString &CSwiftDirectories::audioPluginDirectory()
47 static const QString pDir(CFileUtils::appendFilePaths(binDirectory(),
"audio"));
51 const QString &CSwiftDirectories::getXSwiftBusBuildDirectory()
55 static const QString e;
60 static const QString bd = [] {
61 QDir dir(binDirectory());
62 if (!dir.cdUp()) {
return QString(); }
63 if (!dir.cd(
"xswiftbus")) {
return QString(); }
64 return dir.absolutePath();
69 QString CSwiftDirectories::executableFilePath(
const QString &executable)
71 Q_ASSERT_X(!executable.isEmpty(), Q_FUNC_INFO,
"Missing executable file path");
73 QString s = CFileUtils::appendFilePaths(binDirectory(), executable);
77 const QDir dir(s + QLatin1String(
".app/Contents/MacOS"));
78 if (dir.exists()) { s += QLatin1String(
".app/Contents/MacOS/") + executable; }
84 QString normalizedApplicationDirectoryImpl()
86 QString appDir = CSwiftDirectories::binDirectory();
87 Q_ASSERT(appDir.size() > 0);
89 if (appDir.at(0) ==
'/') { appDir.remove(0, 1); }
90 return QUrl::toPercentEncoding(appDir);
93 const QString &CSwiftDirectories::normalizedApplicationDirectory()
95 static const QString appDir(normalizedApplicationDirectoryImpl());
99 const QString &CSwiftDirectories::applicationDataDirectory()
101 static const QString p = CFileUtils::appendFilePaths(
102 QStandardPaths::writableLocation(QStandardPaths::GenericDataLocation),
"/org.swift-project/");
106 const QFileInfoList &CSwiftDirectories::applicationDataDirectories()
108 static QFileInfoList fileInfoList = currentApplicationDataDirectories();
112 QFileInfoList CSwiftDirectories::currentApplicationDataDirectories()
114 const QDir swiftAppData(applicationDataDirectory());
115 if (!swiftAppData.isReadable()) {
return QFileInfoList(); }
116 return swiftAppData.entryInfoList({}, QDir::Dirs | QDir::NoDotAndDotDot, QDir::Time);
119 int CSwiftDirectories::applicationDataDirectoriesCount() {
return applicationDataDirectories().size(); }
121 QStringList CSwiftDirectories::applicationDataDirectoryList(
bool withoutCurrent,
bool decodedDirName)
124 for (
const QFileInfo &info : applicationDataDirectories())
126 if (withoutCurrent && info.filePath().contains(normalizedApplicationDirectory(), Qt::CaseInsensitive))
128 dirs.append(decodedDirName ? CDirectoryUtils::decodeNormalizedDirectory(info.filePath()) : info.filePath());
133 const QString &CSwiftDirectories::normalizedApplicationDataDirectory()
135 static const QString p =
136 CFileUtils::appendFilePaths(applicationDataDirectory(), normalizedApplicationDirectory());
140 const QString &CSwiftDirectories::logDirectory()
142 static const QString p = CFileUtils::appendFilePaths(normalizedApplicationDataDirectory(),
"/logs");
146 QString getSwiftShareDirImpl()
148 QDir dir(CSwiftDirectories::binDirectory());
149 const bool success = dir.cd(
"../share");
152 Q_ASSERT_X(dir.exists(), Q_FUNC_INFO,
"missing dir");
153 return dir.absolutePath();
155 Q_ASSERT_X(
false, Q_FUNC_INFO,
"missing dir");
159 const QString &CSwiftDirectories::shareDirectory()
161 static const QString s(getSwiftShareDirImpl());
165 const QString &CSwiftDirectories::shareTestDirectory()
167 static const QString test(CFileUtils::appendFilePaths(shareDirectory(),
"test"));
171 const QString &CSwiftDirectories::shareTerrainProbeDirectory()
173 static const QString tpd(CFileUtils::appendFilePaths(shareDirectory(),
"simulator/swiftTerrainProbe"));
177 const QString &CSwiftDirectories::shareMatchingScriptDirectory()
179 static const QString ms(CFileUtils::appendFilePaths(shareDirectory(),
"matchingscript"));
183 const QString &CSwiftDirectories::bootstrapFileName()
185 static const QString n(
"bootstrap.json");
189 QString getBootstrapResourceFileImpl()
191 const QString d(CSwiftDirectories::shareDirectory());
192 if (d.isEmpty()) {
return {}; }
194 QDir::cleanPath(d + QDir::separator() +
"shared/bootstrap/" + CSwiftDirectories::bootstrapFileName()));
195 Q_ASSERT_X(file.exists(), Q_FUNC_INFO,
"missing bootstrap file");
196 return QFileInfo(file).absoluteFilePath();
199 const QString &CSwiftDirectories::bootstrapResourceFilePath()
201 static const QString s(getBootstrapResourceFileImpl());
205 QString getSwiftStaticDbFilesDirImpl()
207 const QString d(CSwiftDirectories::shareDirectory());
208 if (d.isEmpty()) {
return {}; }
209 const QDir dir(QDir::cleanPath(d + QDir::separator() +
"shared/dbdata"));
210 Q_ASSERT_X(dir.exists(), Q_FUNC_INFO,
"missing dir");
211 return dir.absolutePath();
214 const QString &CSwiftDirectories::staticDbFilesDirectory()
216 static const QString s(getSwiftStaticDbFilesDirImpl());
220 QString getSoundFilesDirImpl()
222 const QString d(CSwiftDirectories::shareDirectory());
223 if (d.isEmpty()) {
return {}; }
224 const QDir dir(QDir::cleanPath(d + QDir::separator() +
"sounds"));
225 Q_ASSERT_X(dir.exists(), Q_FUNC_INFO,
"missing dir");
226 return dir.absolutePath();
229 const QString &CSwiftDirectories::soundFilesDirectory()
231 static const QString s(getSoundFilesDirImpl());
235 QString getStylesheetsDirImpl()
237 const QString d(CSwiftDirectories::shareDirectory());
238 if (d.isEmpty()) {
return {}; }
239 const QDir dir(QDir::cleanPath(d + QDir::separator() +
"qss"));
240 Q_ASSERT_X(dir.exists(), Q_FUNC_INFO,
"missing dir");
241 return dir.absolutePath();
244 const QString &CSwiftDirectories::stylesheetsDirectory()
246 static const QString s(getStylesheetsDirImpl());
250 QString getHtmlDirImpl()
252 const QString d(CSwiftDirectories::shareDirectory());
253 const QDir dir(QDir::cleanPath(d + QDir::separator() +
"html"));
254 Q_ASSERT_X(dir.exists(), Q_FUNC_INFO,
"missing dir");
255 return dir.absolutePath();
258 const QString &CSwiftDirectories::htmlDirectory()
260 static const QString s(getHtmlDirImpl());
264 QString getLegalDirImpl()
266 const QString d(CSwiftDirectories::shareDirectory());
267 const QDir dir(QDir::cleanPath(d + QDir::separator() +
"legal"));
268 Q_ASSERT_X(dir.exists(), Q_FUNC_INFO,
"missing dir");
269 return dir.absolutePath();
272 const QString &CSwiftDirectories::legalDirectory()
274 static const QString s(getLegalDirImpl());
278 const QString &CSwiftDirectories::aboutFilePath()
280 static const QString about = QDir::cleanPath(legalDirectory() + QDir::separator() +
"about.html");
284 QString testFilesDirImpl()
286 const QString d(CSwiftDirectories::shareDirectory());
287 if (d.isEmpty()) {
return {}; }
288 const QDir dir(QDir::cleanPath(d + QDir::separator() +
"test"));
289 Q_ASSERT_X(dir.exists(), Q_FUNC_INFO,
"missing dir");
290 return dir.absolutePath();
293 const QString &CSwiftDirectories::testFilesDirectory()
295 static QString s(testFilesDirImpl());
299 const QString &CSwiftDirectories::htmlTemplateFilePath()
301 static const QString s(htmlDirectory() + QDir::separator() +
"swifttemplate.html");
305 QString getDocumentationDirectoryImpl()
307 const QStringList pathes(QStandardPaths::standardLocations(QStandardPaths::DocumentsLocation));
308 QString d = pathes.first();
309 d = QDir::cleanPath(CFileUtils::appendFilePaths(d,
"swift"));
311 if (dir.exists()) {
return dir.absolutePath(); }
312 return pathes.first();
315 const QString &CSwiftDirectories::documentationDirectory()
317 static const QString d(getDocumentationDirectoryImpl());
321 const QString &CSwiftDirectories::crashpadDirectory()
323 static const QString p = CFileUtils::appendFilePaths(normalizedApplicationDataDirectory(),
"/crashpad");
327 const QString &CSwiftDirectories::crashpadDatabaseDirectory()
329 static const QString p = CFileUtils::appendFilePaths(crashpadDirectory(),
"/database");
333 const QString &CSwiftDirectories::crashpadMetricsDirectory()
335 static const QString p = CFileUtils::appendFilePaths(crashpadDirectory(),
"/metrics");
339 QStringList CSwiftDirectories::verifyRuntimeDirectoriesAndFiles()
342 QDir d(binDirectory());
343 if (!d.isReadable()) { failed.append(d.absolutePath()); }
345 d = QDir(stylesheetsDirectory());
346 if (!d.isReadable()) { failed.append(d.absolutePath()); }
348 d = QDir(applicationDataDirectory());
349 if (!d.isReadable()) { failed.append(d.absolutePath()); }
353 if (!QFile::exists(fn)) { failed.append(fn); }
356 if (!QFile::exists(fn)) { failed.append(fn); }
359 if (!QFile::exists(fn)) { failed.append(fn); }
364 QString CSwiftDirectories::soundFilePathOrDefaultPath(
const QString &directory,
const QString &fileName)
366 if (!directory.isEmpty())
368 const QString fp = CFileUtils::appendFilePathsAndFixUnc(directory, fileName);
369 const QFileInfo fi(fp);
370 if (fi.exists()) {
return fi.absoluteFilePath(); }
372 const QString fp = CFileUtils::appendFilePathsAndFixUnc(CSwiftDirectories::soundFilesDirectory(), fileName);
373 const QFileInfo fi(fp);
374 return (fi.exists()) ? fi.absoluteFilePath() : QString();
static constexpr bool isRunningOnMacOSPlatform()
Running on MacOS platform?
static bool isLocalDeveloperDebugBuild()
Local build for developers.
static constexpr bool isRunningOnWindowsNtPlatform()
Running on Windows NT platform?
static const QString & swiftCoreExecutableName()
Executable name for swift core, no(!) appendix.
static const QString & swiftGuiExecutableName()
Executable name for swift GUI, no(!) appendix.
static const QString & swiftDataExecutableName()
Executable name for swift data, no(!) appendix.
Free functions in swift::misc.