6 #include <qsystemdetection.h>
12 #include <QTextStream>
24 namespace swift::misc::simulation::xplane
33 QString getLastExistingPathFromFile(
const QString &filePath)
35 const QFileInfo fileInfo(filePath);
36 if (!fileInfo.exists()) {
return {}; }
37 QFile file(fileInfo.absoluteFilePath());
38 if (!file.open(QIODevice::ReadOnly)) {
return {}; }
41 QTextStream ts(&file);
44 QString pathToCheck = ts.readLine();
45 if (QFileInfo::exists(pathToCheck)) { lastLine = pathToCheck; }
51 QString getWindowsLocalAppDataPath()
54 TCHAR szLocalAppDataPath[MAX_PATH];
55 if (SUCCEEDED(SHGetFolderPath(NULL, CSIDL_LOCAL_APPDATA, NULL, 0, szLocalAppDataPath)))
57 result = QString::fromWCharArray(szLocalAppDataPath);
65 static const QString xplaneInstallFile(
"x-plane_install.txt");
66 const QString xplaneInstallFilePath = xplaneDir(xplaneInstallFile);
67 return getLastExistingPathFromFile(xplaneInstallFilePath);
72 static const QString xplaneInstallFile(
"x-plane_install_10.txt");
73 const QString xplaneInstallFilePath = xplaneDir(xplaneInstallFile);
74 return getLastExistingPathFromFile(xplaneInstallFilePath);
79 static const QString xplaneInstallFile(
"x-plane_install_11.txt");
80 const QString xplaneInstallFilePath = xplaneDir(xplaneInstallFile);
81 return getLastExistingPathFromFile(xplaneInstallFilePath);
84 QString CXPlaneUtil::xplaneDir(
const QString &xplaneInstallFile)
90 #elif defined(Q_OS_LINUX)
91 static const QString xp(
".x-plane");
93 #elif defined(Q_OS_OSX)
94 static const QString lib(
"Library/Preferences");
101 static const QString dir = [] {
105 else {
return QString(); }
118 static const QString pd(
130 if (simulatorDir.isEmpty()) {
return QStringList(); }
131 return QStringList({ simulatorDir });
136 static const QString p(
"Resources/plugins");
142 static const QString p(
"xswiftbus");
154 const QString dirName = pluginDir.isEmpty() ?
xplaneRootDir() : pluginDir;
156 const QDir dir(dirName);
157 return dir.entryList(QDir::Dirs, QDir::Name | QDir::IgnoreCase);
168 static const QStringList empty;
175 if (!rootDir.isEmpty())
186 static const QString legacyPath(
"/Resources/plugins/xswiftbus/LegacyData");
190 if (!rootDir.isEmpty())
202 return (!xswiftBusPluginDir.isEmpty());
208 QStringList conflicts;
209 for (
const QString &file : files)
211 if (file.contains(
"swift", Qt::CaseInsensitive)) {
continue; }
212 if (file.contains(
"ivap", Qt::CaseInsensitive))
214 conflicts.push_back(file);
217 if (file.contains(
"XSquawkBox", Qt::CaseInsensitive))
219 conflicts.push_back(file);
229 const QDir directory(dirName);
230 if (!directory.exists()) {
return QStringList(); }
233 QStringList files = directory.entryList(
xplFileFilter(), QDir::Files, QDir::Name | QDir::IgnoreCase);
234 const QStringList dirs = directory.entryList(QDir::Dirs | QDir::NoDotAndDotDot, QDir::Name | QDir::IgnoreCase);
235 for (
const QString &dir : dirs)
239 if (subDirFiles.isEmpty()) {
continue; }
249 if (xswiftBusPluginDir.isEmpty()) {
return false; }
251 const QFileInfo fiLatestBuild =
253 if (!fiLatestBuild.lastModified().isValid()) {
return false; }
256 if (!fiLatestDeployed.lastModified().isValid()) {
return true; }
259 return fiLatestBuild.lastModified() > fiLatestDeployed.lastModified();
266 if (xswiftBusPluginDir.isEmpty()) {
return -1; }
269 xswiftBusPluginDir,
true);
274 static const QStringList filter({
"*.xpl" });
280 if (simDir.isEmpty())
283 u
"no simulator directory",
true);
287 if (modelDirectories.isEmpty()) {
return msgs; }
288 const QDir sd(simDir);
289 const bool simDirExists = sd.exists();
290 for (
const QString &modelDir : modelDirectories)
292 const bool exists = simDirExists ?
298 << modelDir << sd.absolutePath() :
300 << modelDir << sd.absolutePath();
static bool isSameOrSubDirectoryOf(const QString &testDir, const QString &parentDir)
Is "testDir" a subdirectory (possibly nested) of "parentDir" or the same directory.
static bool isSameOrSubDirectoryOfStringBased(const QString &testDir, const QString &parentDir)
Is "testDir" a subdirectory (possibly nested) of "parentDir" or the same directory.
static int copyDirectoryRecursively(const QString &fromDir, const QString &toDir, bool replaceOnConflict)
Copy directory recursively.
static bool isDirExisting(const QString &path)
Directory existing? Also checking UNC paths upfront.
static QFileInfo findLastModified(const QDir &dir, bool recursive, const QStringList &nameFilters={}, const QStringList &excludeDirectories={})
Returns path to the last modifed file in dir, optionally matching a wildcard, or empty string.
static QString appendFilePathsAndFixUnc(const QString &path1, const QString &path2)
Append file paths.
static QString appendFilePaths(const QString &path1, const QString &path2)
Append file paths.
static QString fixWindowsUncPath(const QString &filePath)
UNC file paths on Qt start with "/", but UNC file paths only work when they start with "//".
static const QString & matching()
Matching.
Derived & error(const char16_t(&format)[N])
Set the severity to error, providing a format string.
Derived & info(const char16_t(&format)[N])
Set the severity to info, providing a format string.
void push_back(const T &value)
Appends an element at the end of the sequence.
Streamable status message, e.g.
constexpr static auto SeverityWarning
Status severities.
Status messages, e.g. from Core -> GUI.
void addValidationCategory()
Validation category.
static const QString & getXSwiftBusBuildDirectory()
The build directory.
static bool hasXSwiftBusBuildAndPluginDir(const QString &xplaneRootDir)
Both directories, plugin and.
static CStatusMessageList validateModelDirectories(const QString &simDir, const QStringList &modelDirectories)
Validate the model directories.
static const QStringList & xplaneModelExcludeDirectoryPatterns()
Exclude directories for models.
static bool isXplaneRootDirExisting()
Is the xplaneRootDir existing?
static QStringList modelDirectoriesFromSimDir(const QString &simulatorDir)
Model directories from simultaor directory.
static const QStringList & getLogCategories()
Log categories.
static QStringList findAllXplFiles(const QString &pluginDir={})
static QStringList findConflictingPlugins(const QString &pluginDir={})
Finds conflicting plugins.
static const QString & xplaneRootDir()
XPlane root directory In case more then one XPlane version is found, the path to the highest version ...
static QString xswiftbusPluginDir(const QString &xplaneRootDir=CXPlaneUtil::xplaneRootDir())
xswiftbus plugin directory
static bool isXplanePluginDirDirExisting()
Is the xplanePluginDir existing?
static const QString & xswiftbusPathName()
xswiftbus path name
static const QStringList & xplaneModelDirectories()
Directories with models.
static bool hasNewerXSwiftBusBuild(const QString &xplaneRootDir=CXPlaneUtil::xplaneRootDir())
Newer xswiftbus build.
static QString xplane11Dir()
XPlane 11 directory.
static QString xswiftbusLegacyDir(const QString &xplaneRootDir=CXPlaneUtil::xplaneRootDir())
xswiftbus legacy directory
static QString xplane10Dir()
XPlane 10 directory.
static QString xplane9Dir()
XPlane 9 directory.
static int copyXSwiftBusBuildFiles(const QString &xplaneRootDir=CXPlaneUtil::xplaneRootDir())
Copy a xswiftbus build.
static const QString & xplanePluginPathName()
XPlane relative plugin path.
static QString pluginDirFromRootDir(const QString &rootDir=CXPlaneUtil::xplaneRootDir())
Plugin directory from given simulator directory.
static const QString & xplanePluginDir()
XPlane plugin directory In case more then one XPlane version is found, the path to the highest versio...
static QStringList pluginSubdirectories(const QString &pluginDir={})
All sub directories of the plugin directory.
static const QStringList & xplFileFilter()
Filter filter for xpl files.
Free functions in swift::misc.