From 57178c75f9f5ba2f0f41f6bbaeb4a22d23b8485f Mon Sep 17 00:00:00 2001 From: Klaus Basan Date: Mon, 17 Sep 2018 02:53:49 +0200 Subject: [PATCH] Ref T357, function to copy FSX terrain probe, also in context for remote UI --- src/blackcore/context/contextsimulator.h | 7 ++- src/blackcore/context/contextsimulatorempty.h | 7 +++ .../context/contextsimulatorimpl.cpp | 30 +++++++++++++ src/blackcore/context/contextsimulatorimpl.h | 1 + .../context/contextsimulatorproxy.cpp | 5 +++ src/blackcore/context/contextsimulatorproxy.h | 1 + .../simulation/fscommon/fscommonutil.cpp | 43 ++++++++++++++++++- .../simulation/fscommon/fscommonutil.h | 3 ++ 8 files changed, 93 insertions(+), 4 deletions(-) diff --git a/src/blackcore/context/contextsimulator.h b/src/blackcore/context/contextsimulator.h index 2e5391131..aff9781be 100644 --- a/src/blackcore/context/contextsimulator.h +++ b/src/blackcore/context/contextsimulator.h @@ -248,10 +248,10 @@ namespace BlackCore //! Request weather grid. Argument identifier is past in the signal to identify the requestor virtual void requestWeatherGrid(const BlackMisc::Weather::CWeatherGrid &weatherGrid, const BlackMisc::CIdentifier &identifier) = 0; - //! Repeat all mappings + //! Repeat all matchings virtual int doMatchingsAgain() = 0; - //! Repeat the mapping + //! Repeat the matching virtual bool doMatchingAgain(const BlackMisc::Aviation::CCallsign &callsign) = 0; //! Current matching statistics @@ -263,6 +263,9 @@ namespace BlackCore //! Get matching setup virtual BlackMisc::Simulation::CAircraftMatcherSetup getMatchingSetup() const = 0; + //! Copy the terrain probe + virtual BlackMisc::CStatusMessageList copyFsxTerrainProbe(const BlackMisc::Simulation::CSimulatorInfo &simulator) = 0; + protected: //! Constructor IContextSimulator(CCoreFacadeConfig::ContextMode mode, CCoreFacade *runtime) : CContext(mode, runtime) {} diff --git a/src/blackcore/context/contextsimulatorempty.h b/src/blackcore/context/contextsimulatorempty.h index 4547c0fae..e725767c9 100644 --- a/src/blackcore/context/contextsimulatorempty.h +++ b/src/blackcore/context/contextsimulatorempty.h @@ -331,6 +331,13 @@ namespace BlackCore { return BlackMisc::Simulation::CAircraftMatcherSetup(); } + + //! \copydoc IContextSimulator::copyFsxTerrainProbe + virtual BlackMisc::CStatusMessageList copyFsxTerrainProbe(const BlackMisc::Simulation::CSimulatorInfo &simulator) override + { + Q_UNUSED(simulator); + return BlackMisc::CStatusMessageList(); + } }; } // namespace } // namespace diff --git a/src/blackcore/context/contextsimulatorimpl.cpp b/src/blackcore/context/contextsimulatorimpl.cpp index ef0a674cf..2872a376a 100644 --- a/src/blackcore/context/contextsimulatorimpl.cpp +++ b/src/blackcore/context/contextsimulatorimpl.cpp @@ -18,6 +18,7 @@ #include "blackcore/pluginmanagersimulator.h" #include "blackcore/simulator.h" #include "blackmisc/simulation/xplane/xplaneutil.h" +#include "blackmisc/simulation/fscommon/fscommonutil.h" #include "blackmisc/simulation/matchingutils.h" #include "blackmisc/aviation/callsign.h" #include "blackmisc/compare.h" @@ -48,6 +49,7 @@ using namespace BlackMisc::Aviation; using namespace BlackMisc::Network; using namespace BlackMisc::Simulation; using namespace BlackMisc::Simulation::XPlane; +using namespace BlackMisc::Simulation::FsCommon; using namespace BlackMisc::Geo; using namespace BlackMisc::Simulation; using namespace BlackMisc::Simulation::Settings; @@ -811,6 +813,34 @@ namespace BlackCore return m_aircraftMatcher.getSetup(); } + CStatusMessageList CContextSimulator::copyFsxTerrainProbe(const CSimulatorInfo &simulator) + { + if (m_debugEnabled) { CLogMessage(this, CLogCategory::contextSlot()).debug() << Q_FUNC_INFO << simulator.toQString(); } + + CStatusMessageList msgs; + if (!simulator.isFsxP3DFamily()) + { + msgs.push_back(CStatusMessage(this, CStatusMessage::SeverityError, "Wrong simulator " + simulator.toQString())); + return msgs; + } + + const QStringList modelDirs = m_simulatorSettings.getModelDirectoriesOrDefault(simulator); + if (modelDirs.isEmpty() || modelDirs.front().isEmpty()) + { + msgs.push_back(CStatusMessage(this, CStatusMessage::SeverityError, "No model directory")); + return msgs; + } + + const int copied = CFsCommonUtil::copyFsxTerrainProbeFiles(modelDirs.front(), msgs); + if (copied < 1 && !msgs.hasWarningOrErrorMessages()) + { + msgs.push_back(CStatusMessage(this, CStatusMessage::SeverityError, "No files copied")); + return msgs; + } + + return msgs; + } + bool CContextSimulator::parseCommandLine(const QString &commandLine, const CIdentifier &originator) { Q_UNUSED(originator); diff --git a/src/blackcore/context/contextsimulatorimpl.h b/src/blackcore/context/contextsimulatorimpl.h index 720735839..8bfbc1b8f 100644 --- a/src/blackcore/context/contextsimulatorimpl.h +++ b/src/blackcore/context/contextsimulatorimpl.h @@ -112,6 +112,7 @@ namespace BlackCore virtual BlackMisc::Simulation::CMatchingStatistics getCurrentMatchingStatistics(bool missingOnly) const override; virtual void setMatchingSetup(const BlackMisc::Simulation::CAircraftMatcherSetup &setup) override; virtual BlackMisc::Simulation::CAircraftMatcherSetup getMatchingSetup() const override; + virtual BlackMisc::CStatusMessageList copyFsxTerrainProbe(const BlackMisc::Simulation::CSimulatorInfo &simulator) override; //! @} //! \addtogroup swiftdotcommands diff --git a/src/blackcore/context/contextsimulatorproxy.cpp b/src/blackcore/context/contextsimulatorproxy.cpp index a16b80f12..92a81f444 100644 --- a/src/blackcore/context/contextsimulatorproxy.cpp +++ b/src/blackcore/context/contextsimulatorproxy.cpp @@ -295,5 +295,10 @@ namespace BlackCore { return m_dBusInterface->callDBusRet(QLatin1String("getMatchingSetup")); } + + CStatusMessageList CContextSimulatorProxy::copyFsxTerrainProbe(const CSimulatorInfo &simulator) + { + return m_dBusInterface->callDBusRet(QLatin1String("copyFsxTerrainProbe"), simulator); + } } // namespace } // namespace diff --git a/src/blackcore/context/contextsimulatorproxy.h b/src/blackcore/context/contextsimulatorproxy.h index 8e71014c3..8316eafae 100644 --- a/src/blackcore/context/contextsimulatorproxy.h +++ b/src/blackcore/context/contextsimulatorproxy.h @@ -97,6 +97,7 @@ namespace BlackCore virtual BlackMisc::Simulation::CMatchingStatistics getCurrentMatchingStatistics(bool missingOnly) const override; virtual void setMatchingSetup(const BlackMisc::Simulation::CAircraftMatcherSetup &setup) override; virtual BlackMisc::Simulation::CAircraftMatcherSetup getMatchingSetup() const override; + virtual BlackMisc::CStatusMessageList copyFsxTerrainProbe(const BlackMisc::Simulation::CSimulatorInfo &simulator) override; //! @} private: diff --git a/src/blackmisc/simulation/fscommon/fscommonutil.cpp b/src/blackmisc/simulation/fscommon/fscommonutil.cpp index cdd730d85..4d2ddfe9a 100644 --- a/src/blackmisc/simulation/fscommon/fscommonutil.cpp +++ b/src/blackmisc/simulation/fscommon/fscommonutil.cpp @@ -7,9 +7,10 @@ * contained in the LICENSE file. */ -#include "blackconfig/buildconfig.h" -#include "blackmisc/fileutils.h" #include "blackmisc/simulation/fscommon/fscommonutil.h" +#include "blackmisc/directoryutils.h" +#include "blackmisc/fileutils.h" +#include "blackconfig/buildconfig.h" #include #include @@ -347,6 +348,44 @@ namespace BlackMisc } return false; } + + int CFsCommonUtil::copyFsxTerrainProbeFiles(const QString &simObjectDir, CStatusMessageList &messages) + { + static const CLogCategoryList cats({ CLogCategory::validation(), CLogCategory::driver() }); + messages.clear(); + if (!CDirectoryUtils::existsUnemptyDirectory(CDirectoryUtils::shareTerrainProbeDirectory())) + { + messages.push_back(CStatusMessage(cats, CStatusMessage::SeverityError, QString("No terrain probe source files in '%1'").arg(CDirectoryUtils::shareTerrainProbeDirectory()))); + return -1; + } + + if (simObjectDir.isEmpty()) + { + messages.push_back(CStatusMessage(cats, CStatusMessage::SeverityError, "No simObject directory")); + return -1; + } + + QString targetDir = CFileUtils::appendFilePathsAndFixUnc(simObjectDir, "Misc"); + QDir td(targetDir); + if (!td.exists()) + { + messages.push_back(CStatusMessage(cats, CStatusMessage::SeverityError, QString("Cannot access target directory '%1'").arg(targetDir))); + return -1; + } + + const QString lastSegment = CFileUtils::lastPathSegment(CDirectoryUtils::shareTerrainProbeDirectory()); + targetDir = CFileUtils::appendFilePathsAndFixUnc(targetDir, lastSegment); + const bool hasDir = td.mkpath(targetDir); + if (!hasDir) + { + messages.push_back(CStatusMessage(cats, CStatusMessage::SeverityError, QString("Cannot create target directory '%1'").arg(targetDir))); + return -1; + } + + const int copied = CDirectoryUtils::copyDirectoryRecursively(CDirectoryUtils::shareTerrainProbeDirectory(), targetDir, true); + messages.push_back(CStatusMessage(cats, CStatusMessage::SeverityInfo, QString("Copied %1 files from '%2' to '%3'").arg(copied).arg(CDirectoryUtils::shareTerrainProbeDirectory(), targetDir))); + return copied; + } } // namespace } // namespace } // namespace diff --git a/src/blackmisc/simulation/fscommon/fscommonutil.h b/src/blackmisc/simulation/fscommon/fscommonutil.h index 32c4115cb..57ce0bf85 100644 --- a/src/blackmisc/simulation/fscommon/fscommonutil.h +++ b/src/blackmisc/simulation/fscommon/fscommonutil.h @@ -90,6 +90,9 @@ namespace BlackMisc //! Adjust file directory static bool adjustFileDirectory(CAircraftModel &model, const QStringList &simObjectsDirectories); + + //! Copy the terrain probe + static int copyFsxTerrainProbeFiles(const QString &simObjectDir, CStatusMessageList &messages); }; } // namespace } // namespace