From a07d18aa441d10e079bffa3502fb1406949eb203 Mon Sep 17 00:00:00 2001 From: Klaus Basan Date: Thu, 13 Sep 2018 01:57:53 +0200 Subject: [PATCH] Ref T348, util function to correct FSX/P3D model path Related: Ref T317 Ref T247 Ref T335 --- src/blackmisc/fileutils.cpp | 8 +++++ src/blackmisc/fileutils.h | 5 ++- .../simulation/fscommon/fscommonutil.cpp | 34 +++++++++++++++++++ .../simulation/fscommon/fscommonutil.h | 8 ++++- 4 files changed, 53 insertions(+), 2 deletions(-) diff --git a/src/blackmisc/fileutils.cpp b/src/blackmisc/fileutils.cpp index 6462f20b6..da87dd0c9 100644 --- a/src/blackmisc/fileutils.cpp +++ b/src/blackmisc/fileutils.cpp @@ -129,6 +129,14 @@ namespace BlackMisc return path.left(path.lastIndexOf('/')); } + QString CFileUtils::lastPathSegment(const QString &path) + { + if (path.isEmpty()) { return QStringLiteral(""); } + if (path.endsWith('/')) { return CFileUtils::lastPathSegment(path.left(path.length() - 1)); } + if (!path.contains('/')) { return path; } + return path.mid(path.lastIndexOf('/') + 1); + } + QString CFileUtils::appendFilePaths(const QString &path1, const QString &path2, const QString &path3) { return CFileUtils::appendFilePaths(CFileUtils::appendFilePaths(path1, path2), path3); diff --git a/src/blackmisc/fileutils.h b/src/blackmisc/fileutils.h index 1436a2777..75f627060 100644 --- a/src/blackmisc/fileutils.h +++ b/src/blackmisc/fileutils.h @@ -79,9 +79,12 @@ namespace BlackMisc //! \sa CNetworkUtils::buildUrl for URLs static QString appendFilePathsAndFixUnc(const QString &path1, const QString &path2, const QString &path3); - //! Strip file from path a/b/c.json a/b + //! Strip file from path a/b/c.json a/b, return path static QString stripFileFromPath(const QString &path); + //! Last path segment a/b/c => c + static QString lastPathSegment(const QString &path); + //! Normalize file path to Qt standard, e.g by turning \ to / static QString normalizeFilePathToQtStandard(const QString &filePath); diff --git a/src/blackmisc/simulation/fscommon/fscommonutil.cpp b/src/blackmisc/simulation/fscommon/fscommonutil.cpp index 66515b885..cdd730d85 100644 --- a/src/blackmisc/simulation/fscommon/fscommonutil.cpp +++ b/src/blackmisc/simulation/fscommon/fscommonutil.cpp @@ -17,6 +17,8 @@ #include #include #include +#include +#include using namespace BlackConfig; using namespace BlackMisc; @@ -313,6 +315,38 @@ namespace BlackMisc static const QStringList exclude; return exclude; } + + bool CFsCommonUtil::adjustFileDirectory(CAircraftModel &model, const QString &simObjectsDirectory) + { + if (model.hasExistingCorrespondingFile()) { return true; } + if (simObjectsDirectory.isEmpty()) { return false; } + if (!model.hasFileName()) { return false; } // we can do nothing here + + const QString simObjectsDirectoryFix = CFileUtils::fixWindowsUncPath(simObjectsDirectory); + const QDir dir(simObjectsDirectoryFix); + if (!dir.exists()) { return false; } + + const QString lastSegment = QStringLiteral("/") % CFileUtils::lastPathSegment(simObjectsDirectoryFix) % QStringLiteral("/"); + const int index = model.getFileName().lastIndexOf(lastSegment); + if (index < 0) { return false; } + const QString relPart = model.getFileName().mid(index + lastSegment.length()); + if (relPart.isEmpty()) { return false; } + const QString newFile = CFileUtils::appendFilePathsAndFixUnc(simObjectsDirectory, relPart); + const QFileInfo nf(newFile); + if (!nf.exists()) { return false; } + + model.setFileName(newFile); + return true; + } + + bool CFsCommonUtil::adjustFileDirectory(CAircraftModel &model, const QStringList &simObjectsDirectories) + { + for (const QString &simObjectDir : simObjectsDirectories) + { + if (CFsCommonUtil::adjustFileDirectory(model, simObjectDir)) { return true; } + } + return false; + } } // namespace } // namespace } // namespace diff --git a/src/blackmisc/simulation/fscommon/fscommonutil.h b/src/blackmisc/simulation/fscommon/fscommonutil.h index c7b32ea1e..32c4115cb 100644 --- a/src/blackmisc/simulation/fscommon/fscommonutil.h +++ b/src/blackmisc/simulation/fscommon/fscommonutil.h @@ -12,8 +12,8 @@ #ifndef BLACKMISC_SIMULATION_FSCOMMONUTIL_H #define BLACKMISC_SIMULATION_FSCOMMONUTIL_H +#include "blackmisc/simulation/aircraftmodel.h" #include "blackmisc/blackmiscexport.h" - #include class QStringList; @@ -84,6 +84,12 @@ namespace BlackMisc //! Exclude directories for aircraft objects static const QStringList &fs9AircraftObjectsExcludeDirectoryPatterns(); + + //! Adjust file directory + static bool adjustFileDirectory(CAircraftModel &model, const QString &simObjectsDirectory); + + //! Adjust file directory + static bool adjustFileDirectory(CAircraftModel &model, const QStringList &simObjectsDirectories); }; } // namespace } // namespace