mirror of
https://github.com/swift-project/pilotclient.git
synced 2026-04-26 18:55:38 +08:00
Ref T131, XPlane utility functions
* find XPL files * newer build files * conflicting files? * some renamings
This commit is contained in:
@@ -567,7 +567,7 @@ namespace BlackMisc
|
|||||||
|
|
||||||
const QString CXPlaneSimulatorSettings::getPluginDirOrDefault() const
|
const QString CXPlaneSimulatorSettings::getPluginDirOrDefault() const
|
||||||
{
|
{
|
||||||
return CFileUtils::appendFilePathsAndFixUnc(this->getSimulatorDirectoryOrDefault(), CXPlaneUtil::xplanePluginPath());
|
return CFileUtils::appendFilePathsAndFixUnc(this->getSimulatorDirectoryOrDefault(), CXPlaneUtil::xplanePluginPathName());
|
||||||
}
|
}
|
||||||
} // ns
|
} // ns
|
||||||
} // ns
|
} // ns
|
||||||
|
|||||||
@@ -9,6 +9,7 @@
|
|||||||
|
|
||||||
#include "blackmisc/simulation/xplane/xplaneutil.h"
|
#include "blackmisc/simulation/xplane/xplaneutil.h"
|
||||||
#include "blackmisc/fileutils.h"
|
#include "blackmisc/fileutils.h"
|
||||||
|
#include "blackmisc/directoryutils.h"
|
||||||
#include "qsystemdetection.h"
|
#include "qsystemdetection.h"
|
||||||
#include <QDir>
|
#include <QDir>
|
||||||
#include <QFile>
|
#include <QFile>
|
||||||
@@ -91,7 +92,7 @@ namespace BlackMisc
|
|||||||
{
|
{
|
||||||
//! \fixme KB 8/17 we could also use the runtime CBuildConfig decision here, which looks nicer (I personally always try to avoid ifdef)
|
//! \fixme KB 8/17 we could also use the runtime CBuildConfig decision here, which looks nicer (I personally always try to avoid ifdef)
|
||||||
#if defined(Q_OS_WIN)
|
#if defined(Q_OS_WIN)
|
||||||
return CFileUtils::appendFilePaths(getWindowsLocalAppDataPath(), xplaneInstallFile);
|
return CFileUtils::appendFilePathsAndFixUnc(getWindowsLocalAppDataPath(), xplaneInstallFile);
|
||||||
#elif defined (Q_OS_LINUX)
|
#elif defined (Q_OS_LINUX)
|
||||||
static const QString xp(".x-plane");
|
static const QString xp(".x-plane");
|
||||||
return CFileUtils::appendFilePaths(QDir::homePath(), xp, xplaneInstallFile);
|
return CFileUtils::appendFilePaths(QDir::homePath(), xp, xplaneInstallFile);
|
||||||
@@ -121,13 +122,13 @@ namespace BlackMisc
|
|||||||
|
|
||||||
const QString &CXPlaneUtil::xplanePluginDir()
|
const QString &CXPlaneUtil::xplanePluginDir()
|
||||||
{
|
{
|
||||||
static const QString pd(xplaneRootDir().isEmpty() ? "" : CFileUtils::appendFilePaths(xplaneRootDir(), xplanePluginPath()));
|
static const QString pd(xplaneRootDir().isEmpty() ? "" : CFileUtils::appendFilePaths(xplaneRootDir(), xplanePluginPathName()));
|
||||||
return pd;
|
return pd;
|
||||||
}
|
}
|
||||||
|
|
||||||
QString CXPlaneUtil::pluginDirFromSimDir(const QString &simulatorDir)
|
QString CXPlaneUtil::pluginDirFromRootDir(const QString &rootDir)
|
||||||
{
|
{
|
||||||
return CFileUtils::appendFilePaths(simulatorDir, xplanePluginPath());
|
return CFileUtils::appendFilePathsAndFixUnc(rootDir, xplanePluginPathName());
|
||||||
}
|
}
|
||||||
|
|
||||||
QStringList CXPlaneUtil::modelDirectoriesFromSimDir(const QString &simulatorDir)
|
QStringList CXPlaneUtil::modelDirectoriesFromSimDir(const QString &simulatorDir)
|
||||||
@@ -135,9 +136,15 @@ namespace BlackMisc
|
|||||||
return QStringList({ simulatorDir });
|
return QStringList({ simulatorDir });
|
||||||
}
|
}
|
||||||
|
|
||||||
QString CXPlaneUtil::xplanePluginPath()
|
const QString &CXPlaneUtil::xplanePluginPathName()
|
||||||
{
|
{
|
||||||
static const QString p("/Resources/plugins");
|
static const QString p("Resources/plugins");
|
||||||
|
return p;
|
||||||
|
}
|
||||||
|
|
||||||
|
const QString &CXPlaneUtil::xswiftbusPathName()
|
||||||
|
{
|
||||||
|
static const QString p("xswiftbus");
|
||||||
return p;
|
return p;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -147,9 +154,17 @@ namespace BlackMisc
|
|||||||
return exists;
|
return exists;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
QStringList CXPlaneUtil::pluginSubdirectories(const QString &pluginDir)
|
||||||
|
{
|
||||||
|
const QString dirName = pluginDir.isEmpty() ? xplaneRootDir() : pluginDir;
|
||||||
|
const QDir dir(dirName);
|
||||||
|
if (!dir.exists()) { return QStringList(); }
|
||||||
|
return dir.entryList(QDir::Dirs, QDir::Name | QDir::IgnoreCase);
|
||||||
|
}
|
||||||
|
|
||||||
const QStringList &CXPlaneUtil::xplaneModelDirectories()
|
const QStringList &CXPlaneUtil::xplaneModelDirectories()
|
||||||
{
|
{
|
||||||
static const QStringList dirs = xplaneRootDir().isEmpty() ? QStringList() : QStringList({xplaneRootDir()});
|
static const QStringList dirs = xplaneRootDir().isEmpty() ? QStringList() : QStringList({ xplaneRootDir() });
|
||||||
return dirs;
|
return dirs;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -159,22 +174,29 @@ namespace BlackMisc
|
|||||||
return empty;
|
return empty;
|
||||||
}
|
}
|
||||||
|
|
||||||
QString CXPlaneUtil::xswiftbusLegacyDir(const QString &rootDir)
|
QString CXPlaneUtil::xswiftbusPluginDir(const QString &xplaneRootDir)
|
||||||
|
{
|
||||||
|
const QString rootDir = xplaneRootDir.isEmpty() ? CXPlaneUtil::xplaneRootDir() : xplaneRootDir;
|
||||||
|
if (!rootDir.isEmpty())
|
||||||
|
{
|
||||||
|
const QString xswiftbusDir = CFileUtils::appendFilePathsAndFixUnc(CXPlaneUtil::pluginDirFromRootDir(xplaneRootDir), CXPlaneUtil::xswiftbusPathName());
|
||||||
|
if (QDir(xswiftbusDir).exists())
|
||||||
|
{
|
||||||
|
return xswiftbusDir;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return {};
|
||||||
|
}
|
||||||
|
|
||||||
|
QString CXPlaneUtil::xswiftbusLegacyDir(const QString &xplaneRootDir)
|
||||||
{
|
{
|
||||||
static const QString legacyPath("/Resources/plugins/xswiftbus/LegacyData");
|
static const QString legacyPath("/Resources/plugins/xswiftbus/LegacyData");
|
||||||
// Return the first non empty path, we can find.
|
// Return the first non empty path, we can find.
|
||||||
|
|
||||||
|
const QString rootDir = xplaneRootDir.isEmpty() ? CXPlaneUtil::xplaneRootDir() : xplaneRootDir;
|
||||||
if (!rootDir.isEmpty())
|
if (!rootDir.isEmpty())
|
||||||
{
|
{
|
||||||
const QString xswiftbusLegacy = CFileUtils::appendFilePaths(rootDir, legacyPath);
|
const QString xswiftbusLegacy = CFileUtils::appendFilePathsAndFixUnc(xplaneRootDir, legacyPath);
|
||||||
if (QDir(xswiftbusLegacy).exists())
|
|
||||||
{
|
|
||||||
return xswiftbusLegacy;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
for (auto func : {&CXPlaneUtil::xplane11Dir, &CXPlaneUtil::xplane10Dir, &CXPlaneUtil::xplane9Dir})
|
|
||||||
{
|
|
||||||
const QString xswiftbusLegacy = CFileUtils::appendFilePaths(func(), legacyPath);
|
|
||||||
if (QDir(xswiftbusLegacy).exists())
|
if (QDir(xswiftbusLegacy).exists())
|
||||||
{
|
{
|
||||||
return xswiftbusLegacy;
|
return xswiftbusLegacy;
|
||||||
@@ -182,6 +204,72 @@ namespace BlackMisc
|
|||||||
}
|
}
|
||||||
return {};
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
QStringList CXPlaneUtil::findConflictingPlugins(const QString &pluginDir)
|
||||||
|
{
|
||||||
|
const QStringList files = findAllXplFiles(pluginDir);
|
||||||
|
QStringList conflicts;
|
||||||
|
for (const QString &file : files)
|
||||||
|
{
|
||||||
|
if (file.contains("swift", Qt::CaseInsensitive)) { continue; }
|
||||||
|
if (file.contains("ivap", Qt::CaseInsensitive)) { conflicts.push_back(file); continue; }
|
||||||
|
if (file.contains("XSquawkBox", Qt::CaseInsensitive)) { conflicts.push_back(file); continue; }
|
||||||
|
}
|
||||||
|
return conflicts;
|
||||||
|
}
|
||||||
|
|
||||||
|
QStringList CXPlaneUtil::findAllXplFiles(const QString &pluginDir)
|
||||||
|
{
|
||||||
|
const QString dirName = CFileUtils::fixWindowsUncPath(pluginDir.isEmpty() ? xplaneRootDir() : pluginDir);
|
||||||
|
const QDir directory(dirName);
|
||||||
|
if (!directory.exists()) { return QStringList(); }
|
||||||
|
|
||||||
|
// this finds the current levels XPLs
|
||||||
|
QStringList files = directory.entryList(xplFileFilter(), QDir::Files, QDir::Name | QDir::IgnoreCase);
|
||||||
|
const QStringList dirs = directory.entryList(QDir::Dirs | QDir::NoDotAndDotDot, QDir::Name | QDir::IgnoreCase);
|
||||||
|
for (const QString &dir : dirs)
|
||||||
|
{
|
||||||
|
const QString subDir = CFileUtils::appendFilePaths(dirName, dir);
|
||||||
|
const QStringList subDirFiles = CXPlaneUtil::findAllXplFiles(subDir);
|
||||||
|
if (subDirFiles.isEmpty()) { continue; }
|
||||||
|
for (const QString &file : subDirFiles)
|
||||||
|
{
|
||||||
|
files.push_back(CFileUtils::appendFilePaths(dir, file));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return files;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool CXPlaneUtil::hasNewerXSwiftBusBuild(const QString &xplaneRootDir)
|
||||||
|
{
|
||||||
|
if (CDirectoryUtils::getXSwiftBusBuildDirectory().isEmpty()) { return false; }
|
||||||
|
const QString xswiftBusPluginDir = CXPlaneUtil::xswiftbusPluginDir(xplaneRootDir);
|
||||||
|
if (xswiftBusPluginDir.isEmpty()) { return false; }
|
||||||
|
|
||||||
|
const QFileInfo fiLatestBuild = CFileUtils::findNewestFile(CDirectoryUtils::getXSwiftBusBuildDirectory(), true, xplFileFilter());
|
||||||
|
if (!fiLatestBuild.lastModified().isValid()) { return false; }
|
||||||
|
|
||||||
|
const QFileInfo fiLatestDeployed = CFileUtils::findNewestFile(xswiftBusPluginDir, true, xplFileFilter());
|
||||||
|
if (!fiLatestDeployed.lastModified().isValid()) { return true; } // not yet existing
|
||||||
|
|
||||||
|
// newer?
|
||||||
|
return fiLatestBuild.lastModified() > fiLatestDeployed.lastModified();
|
||||||
|
}
|
||||||
|
|
||||||
|
int CXPlaneUtil::copyXSwiftBusBuildFiles(const QString &xplaneRootDir)
|
||||||
|
{
|
||||||
|
if (CDirectoryUtils::getXSwiftBusBuildDirectory().isEmpty()) { return -1; }
|
||||||
|
const QString xswiftBusPluginDir = CXPlaneUtil::xswiftbusPluginDir(xplaneRootDir);
|
||||||
|
if (xswiftBusPluginDir.isEmpty()) { return -1; }
|
||||||
|
|
||||||
|
return CDirectoryUtils::copyDirectoryRecursively(CDirectoryUtils::getXSwiftBusBuildDirectory(), xswiftBusPluginDir, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
const QStringList &CXPlaneUtil::xplFileFilter()
|
||||||
|
{
|
||||||
|
static const QStringList filter({"*.xpl"});
|
||||||
|
return filter;
|
||||||
|
}
|
||||||
} // namespace
|
} // namespace
|
||||||
} // namespace
|
} // namespace
|
||||||
} // namespace
|
} // namespace
|
||||||
|
|||||||
@@ -14,7 +14,7 @@
|
|||||||
|
|
||||||
#include "blackmisc/blackmiscexport.h"
|
#include "blackmisc/blackmiscexport.h"
|
||||||
|
|
||||||
#include <QString>
|
#include <QStringList>
|
||||||
|
|
||||||
namespace BlackMisc
|
namespace BlackMisc
|
||||||
{
|
{
|
||||||
@@ -50,25 +50,52 @@ namespace BlackMisc
|
|||||||
static const QString &xplanePluginDir();
|
static const QString &xplanePluginDir();
|
||||||
|
|
||||||
//! Plugin directory from given simulator directory
|
//! Plugin directory from given simulator directory
|
||||||
static QString pluginDirFromSimDir(const QString &simulatorDir);
|
static QString pluginDirFromRootDir(const QString &rootDir = CXPlaneUtil::xplaneRootDir());
|
||||||
|
|
||||||
//! Model directories from simultaor directory
|
//! Model directories from simultaor directory
|
||||||
static QStringList modelDirectoriesFromSimDir(const QString &simulatorDir);
|
static QStringList modelDirectoriesFromSimDir(const QString &simulatorDir);
|
||||||
|
|
||||||
//! XPlane relative plugin path
|
|
||||||
static QString xplanePluginPath();
|
|
||||||
|
|
||||||
//! Is the xplanePluginDir existing?
|
//! Is the xplanePluginDir existing?
|
||||||
static bool isXplanePluginDirDirExisting();
|
static bool isXplanePluginDirDirExisting();
|
||||||
|
|
||||||
|
//! All sub directories of the plugin directory
|
||||||
|
//! \remark uses CXPlaneUtil::xplanePluginPath as default
|
||||||
|
static QStringList pluginSubdirectories(const QString &pluginDir = {});
|
||||||
|
|
||||||
//! Directories with models
|
//! Directories with models
|
||||||
static const QStringList &xplaneModelDirectories();
|
static const QStringList &xplaneModelDirectories();
|
||||||
|
|
||||||
//! Exclude directories for models
|
//! Exclude directories for models
|
||||||
static const QStringList &xplaneModelExcludeDirectoryPatterns();
|
static const QStringList &xplaneModelExcludeDirectoryPatterns();
|
||||||
|
|
||||||
|
//! XSwiftBus plugin directory
|
||||||
|
static QString xswiftbusPluginDir(const QString &xplaneRootDir = CXPlaneUtil::xplaneRootDir());
|
||||||
|
|
||||||
//! XSwiftBus legacy directory
|
//! XSwiftBus legacy directory
|
||||||
static QString xswiftbusLegacyDir(const QString &rootDir);
|
static QString xswiftbusLegacyDir(const QString &xplaneRootDir = CXPlaneUtil::xplaneRootDir());
|
||||||
|
|
||||||
|
//! Finds conflicting plugins
|
||||||
|
//! \remark uses CXPlaneUtil::xplanePluginPath as default
|
||||||
|
static QStringList findConflictingPlugins(const QString &pluginDir = {});
|
||||||
|
|
||||||
|
//! \remark uses CXPlaneUtil::xplanePluginPath as default
|
||||||
|
static QStringList findAllXplFiles(const QString &pluginDir = {});
|
||||||
|
|
||||||
|
//! Newer XSwiftBus build
|
||||||
|
static bool hasNewerXSwiftBusBuild(const QString &xplaneRootDir = CXPlaneUtil::xplaneRootDir());
|
||||||
|
|
||||||
|
//! Copy a XSwiftBus build
|
||||||
|
//! \remark only copying in a local build environment
|
||||||
|
static int copyXSwiftBusBuildFiles(const QString &xplaneRootDir = CXPlaneUtil::xplaneRootDir());
|
||||||
|
|
||||||
|
//! XPlane relative plugin path
|
||||||
|
static const QString &xplanePluginPathName();
|
||||||
|
|
||||||
|
//! XSwiftBus path name
|
||||||
|
static const QString &xswiftbusPathName();
|
||||||
|
|
||||||
|
//! Filter filter for xpl files
|
||||||
|
static const QStringList &xplFileFilter();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
//! Concatenates dirs for used OS
|
//! Concatenates dirs for used OS
|
||||||
|
|||||||
Reference in New Issue
Block a user