From 5560d6cb789500b01c7070c7b0d450e92f85f11e Mon Sep 17 00:00:00 2001 From: Klaus Basan Date: Thu, 2 Nov 2017 20:07:13 +0100 Subject: [PATCH] Ref T180, support for SimConnect.ini files and some renamings in CSimConnectUtilities --- .../simulation/fsx/simconnectutilities.cpp | 88 +++++++++++++++++-- .../simulation/fsx/simconnectutilities.h | 33 +++++-- .../fsxcommon/simulatorfsxcommon.cpp | 2 +- 3 files changed, 111 insertions(+), 12 deletions(-) diff --git a/src/blackmisc/simulation/fsx/simconnectutilities.cpp b/src/blackmisc/simulation/fsx/simconnectutilities.cpp index f5760c1ba..5e7cca16c 100644 --- a/src/blackmisc/simulation/fsx/simconnectutilities.cpp +++ b/src/blackmisc/simulation/fsx/simconnectutilities.cpp @@ -17,6 +17,7 @@ #include #include #include +#include using namespace BlackMisc::Aviation; using namespace BlackMisc::PhysicalQuantities; @@ -36,14 +37,27 @@ namespace BlackMisc return fn; } - QString CSimConnectUtilities::getLocalSimConnectCfgFilename() + const QString &CSimConnectUtilities::getSwiftLocalSimConnectCfgFilename() { - return CFileUtils::appendFilePaths(QCoreApplication::applicationDirPath(), simConnectFilename()); + static const QString n = CFileUtils::appendFilePaths(QCoreApplication::applicationDirPath(), simConnectFilename()); + return n; } - bool CSimConnectUtilities::hasLocalSimConnectCfgFilename() + const QString &CSimConnectUtilities::getUserSimConnectCfgFilename() { - const QFile f(getLocalSimConnectCfgFilename()); + static const QString n = CFileUtils::appendFilePaths(QStandardPaths::locate(QStandardPaths::DocumentsLocation, "", QStandardPaths::LocateDirectory), simConnectFilename()); + return n; + } + + bool CSimConnectUtilities::hasSwiftLocalSimConnectCfgFile() + { + const QFile f(getSwiftLocalSimConnectCfgFilename()); + return f.exists(); + } + + bool CSimConnectUtilities::hasUserSimConnectCfgFile() + { + const QFile f(getUserSimConnectCfgFilename()); return f.exists(); } @@ -89,7 +103,7 @@ namespace BlackMisc return sc; } - const QString CSimConnectUtilities::resolveEnumToString(const DWORD id, const char *enumName) + QString CSimConnectUtilities::resolveEnumToString(const DWORD id, const char *enumName) { const int i = CSimConnectUtilities::staticMetaObject.indexOfEnumerator(enumName); if (i < 0) return QString("No enumerator for %1").arg(enumName); @@ -98,6 +112,12 @@ namespace BlackMisc return (k) ? QLatin1String(k) : QString("Id %1 not found for %2").arg(id).arg(enumName); } + const QString &CSimConnectUtilities::simConnectIniFilename() + { + static const QString n("SimConnect.ini"); + return n; + } + const QString CSimConnectUtilities::simConnectExceptionToString(const DWORD id) { return CSimConnectUtilities::resolveEnumToString(id, "SIMCONNECT_EXCEPTION"); @@ -109,6 +129,64 @@ namespace BlackMisc return beautify ? sf.replace('_', ' ') : sf; } + QStringList CSimConnectUtilities::getSimConnectIniFileDirectories() + { + const QString docDir = QStandardPaths::locate(QStandardPaths::DocumentsLocation, "", QStandardPaths::LocateDirectory); + if (docDir.isEmpty()) return QStringList(); + + QDir directory(docDir); + directory.setFilter(QDir::Dirs | QDir::NoDotAndDotDot | QDir::NoSymLinks); + const QStringList dirList = directory.entryList(); + QStringList simDirs; + for (const QString &dir : dirList) + { + if (dir.contains("Flight Simulator", Qt::CaseInsensitive) || dir.contains("Prepar3D", Qt::CaseInsensitive)) + { + simDirs.push_back(CFileUtils::appendFilePaths(docDir, dir)); + } + } + + // gets the latest P3D as first + simDirs.sort(); + std::reverse(std::begin(simDirs), std::end(simDirs)); + return simDirs; + } + + QStringList CSimConnectUtilities::getSimConnectIniFiles() + { + QStringList files; + for (const QString &dir : getSimConnectIniFileDirectories()) + { + const QFileInfo f(CFileUtils::appendFilePaths(dir, simConnectIniFilename())); + if (f.exists()) { files.push_back(f.absoluteFilePath()); } + } + return files; + } + + QString CSimConnectUtilities::getSimConnectIniFileDirectory(CSimulatorInfo &simulator) + { + static const QString docDir = QStandardPaths::locate(QStandardPaths::DocumentsLocation, "", QStandardPaths::LocateDirectory); + if (docDir.isEmpty()) { return ""; } + if (!simulator.isSingleSimulator() || !simulator.isFsxP3DFamily()) return ""; + + const QString iniDir = CFileUtils::appendFilePaths(docDir, simulator.p3d() ? "Prepar3D v4 Files" : "Flight Simulator X Files"); + if (getSimConnectIniFileDirectories().isEmpty()) { return iniDir; } + + for (const QString &dir : getSimConnectIniFileDirectories()) + { + if (simulator.p3d()) + { + if (dir.contains("Prepar3D", Qt::CaseInsensitive)) { return dir; } + } + else if (simulator.fsx()) + { + if (dir.contains("Flight Simulator", Qt::CaseInsensitive)) { return dir; } + } + } + + return iniDir; + } + int CSimConnectUtilities::lightsToLightStates(const CAircraftLights &lights) { int lightMask = 0; diff --git a/src/blackmisc/simulation/fsx/simconnectutilities.h b/src/blackmisc/simulation/fsx/simconnectutilities.h index 6be9917d9..a841d6757 100644 --- a/src/blackmisc/simulation/fsx/simconnectutilities.h +++ b/src/blackmisc/simulation/fsx/simconnectutilities.h @@ -12,10 +12,12 @@ #ifndef BLACKMISC_SIMULATION_FSX_SIMCONNECTUTILITIES_H #define BLACKMISC_SIMULATION_FSX_SIMCONNECTUTILITIES_H +#include "blackmisc/simulation/simulatorinfo.h" #include "blackmisc/aviation/aircraftlights.h" #include "blackmisc/weather/gridpoint.h" #include "blackmisc/blackmiscexport.h" #include "blackmisc/windllutils.h" +#include "simconnectutilities.h" #include #include @@ -50,14 +52,20 @@ namespace BlackMisc //! Filename of the file static const QString &simConnectFilename(); - //! Path to local config file - static QString getLocalSimConnectCfgFilename(); + //! Path to swift local config file (generated by us, in swift dir) + static const QString &getSwiftLocalSimConnectCfgFilename(); - //! Path to local config file - static bool hasLocalSimConnectCfgFilename(); + //! Path to user's config file + static const QString &getUserSimConnectCfgFilename(); + + //! Has a swift local config file + static bool hasSwiftLocalSimConnectCfgFile(); + + //! Has a user config file + static bool hasUserSimConnectCfgFile(); //! The simconnect.cfg as settings (or nullptr settings if no such file) - static QSharedPointer simConnectFileAsSettings(const QString &fileName = getLocalSimConnectCfgFilename()); + static QSharedPointer simConnectFileAsSettings(const QString &fileName = getSwiftLocalSimConnectCfgFilename()); //! IP address from settings (of simconnect.cfg), "" if not available static QString ipAddress(const QSettings *simConnectSettings); @@ -89,6 +97,16 @@ namespace BlackMisc //! \return static const QString simConnectSurfaceTypeToString(const DWORD type, bool beautify = true); + //! For all P3D and FSX simulators + //! \remark reevaluating directories every time + static QStringList getSimConnectIniFileDirectories(); + + //! For all P3D and FSX simulators + static QStringList getSimConnectIniFiles(); + + //! Directory where SimConnect.ini is located + static QString getSimConnectIniFileDirectory(Simulation::CSimulatorInfo &simulator); + //! SimConnect surfaces. //! \sa http://msdn.microsoft.com/en-us/library/cc526981.aspx#AircraftFlightInstrumentationData enum SIMCONNECT_SURFACE @@ -190,6 +208,9 @@ namespace BlackMisc //! Get info about SimConnect DLL static BlackMisc::CWinDllUtils::DLLInfo simConnectDllInfo(); + //! SimConnect.ini file name + static const QString &simConnectIniFilename(); + //! Register metadata static void registerMetadata(); @@ -199,7 +220,7 @@ namespace BlackMisc //! \param id enum element //! \param enumName name of the resolved enum //! \return enum element's name - static const QString resolveEnumToString(const DWORD id, const char *enumName); + static QString resolveEnumToString(const DWORD id, const char *enumName); static QString windsToSimConnectMetar(const BlackMisc::Weather::CWindLayerList &windLayers); static QString visibilitiesToSimConnectMetar(const BlackMisc::Weather::CVisibilityLayerList &visibilityLayers); diff --git a/src/plugins/simulator/fsxcommon/simulatorfsxcommon.cpp b/src/plugins/simulator/fsxcommon/simulatorfsxcommon.cpp index 1b7c70bf8..9abfb4df2 100644 --- a/src/plugins/simulator/fsxcommon/simulatorfsxcommon.cpp +++ b/src/plugins/simulator/fsxcommon/simulatorfsxcommon.cpp @@ -1409,7 +1409,7 @@ namespace BlackSimPlugin const QString fsxPath = CFsCommonUtil::fsxDirFromRegistry(); // can be empty for remote FSX if (!fsxPath.isEmpty()) { s.setSimulatorInstallationDirectory(fsxPath); } - s.setValue("fsx/simConnectCfgFilename", CSimConnectUtilities::getLocalSimConnectCfgFilename()); + s.setValue("fsx/simConnectCfgFilename", CSimConnectUtilities::getSwiftLocalSimConnectCfgFilename()); s.setValue("fsx/simConnectVersion", m_simConnectVersion); m_simulatorInternals = s; }