23 #include "pathfinder.h"
25 #include "configuration/doomseekerconfig.h"
26 #include "datapaths.h"
27 #include "fileseeker.h"
29 #include "pathfinder/filesearchpath.h"
30 #include "strings.hpp"
35 #include <QScopedPointer>
36 #include <QSharedPointer>
38 DClass<PathFinderResult>
41 QStringList foundFiles;
42 QStringList missingFiles;
53 PathFinderResult::~PathFinderResult()
69 return d->missingFiles;
74 return d->missingFiles;
82 QSharedPointer <QList<FileSearchPath> > searchPaths;
84 QString resolveDir(
const QString &dir)
86 QFileInfo fileInfo(dir);
87 if (fileInfo.isSymLink())
88 fileInfo = QFileInfo(fileInfo.symLinkTarget());
90 if (fileInfo.isBundle())
91 return fileInfo.absoluteFilePath() +
"/Contents/MacOS";
94 if (fileInfo.isFile())
95 return fileInfo.absoluteDir().absolutePath();
97 return fileInfo.absoluteFilePath();
108 d->searchPaths.reset(
new QList<FileSearchPath>());
109 d->searchPaths->append(gConfig.combinedWadseekPaths());
110 removeUnneededPaths();
115 d->searchPaths.reset(
new QList<FileSearchPath>());
116 for (
const QString &path : paths)
117 d->searchPaths->append(path);
118 removeUnneededPaths();
121 PathFinder::~PathFinder()
128 #if defined(Q_OS_WIN32)
130 << gDefaultDataPaths->workingDirectory()
131 << gDefaultDataPaths->workingDirectory() +
"/.."
135 paths <<
"/usr/bin" <<
"/usr/local/bin" <<
"/usr/share/bin"
136 <<
"/usr/games/" <<
"/usr/local/games/"
137 <<
"/usr/share/games/" << gDefaultDataPaths->workingDirectory() <<
".";
139 QStringList pathsCopy(paths);
140 for (
const QString &path : pathsCopy)
142 for (
const QString &suffix : suffixes)
152 d->searchPaths->prepend(d->resolveDir(dir));
153 removeUnneededPaths();
158 d->searchPaths->append(d->resolveDir(dir));
159 removeUnneededPaths();
164 if (d->searchPaths->count() == 0)
166 QScopedPointer<FileSeeker> seeker(FileSeeker::createSeeker(d->searchPaths));
167 QString result = seeker->findFile(fileName);
174 for (
const QString file : files)
177 if (filePath.isNull())
190 void PathFinder::removeUnneededPaths()
const
192 Qt::CaseSensitivity caseSensitivity;
194 caseSensitivity = Qt::CaseInsensitive;
196 caseSensitivity = Qt::CaseSensitive;
199 for (
int mainIterator = 0; mainIterator < d->searchPaths->length(); ++mainIterator)
201 for (
int subIterator = mainIterator + 1; subIterator < d->searchPaths->length(); ++subIterator)
203 const FileSearchPath &mainPath = d->searchPaths->at(mainIterator);
207 if (QDir(mainPath.path()).absolutePath().compare(QDir(subPath.path()).absolutePath(), caseSensitivity) == 0)
209 (*d->searchPaths.data())[mainIterator]
210 .setRecursive(mainPath.isRecursive() || subPath.isRecursive());
211 d->searchPaths->removeAt(subIterator);
217 if (mainPath.isRecursive() &&
218 QDir(subPath.path()).absolutePath().startsWith(QDir(mainPath.path()).absolutePath(), caseSensitivity))
220 d->searchPaths->removeAt(subIterator);
221 subIterator = mainIterator;
226 if (subPath.isRecursive() &&
227 QDir(mainPath.path()).absolutePath().startsWith(QDir(subPath.path()).absolutePath(), caseSensitivity))
229 d->searchPaths->removeAt(mainIterator);