23 #include "templatedpathresolver.h"
25 #include "configuration/doomseekerconfig.h"
27 #include <QCoreApplication>
29 #include <QProcessEnvironment>
34 #include <sys/types.h>
38 const QString TemplatedPathResolver::PROGDIR_TEMPLATE =
"$PROGDIR";
40 DClass<TemplatedPathResolver>
53 d->envVarsEnabled =
false;
54 d->userHomeEnabled =
true;
57 TemplatedPathResolver::~TemplatedPathResolver()
63 QString resolved = templatedPath;
66 if (d->userHomeEnabled && resolved.startsWith(
"~"))
69 const QRegularExpression separatorRegex(R
"([/\\])");
71 const QRegularExpression separatorRegex(
"/");
73 int separatorIdx = resolved.indexOf(separatorRegex);
75 QString username = resolved.mid(1, separatorIdx - 1);
77 if (username.isEmpty())
79 home = QDir::homePath();
83 home = QString(
"~%1").arg(username);
84 #ifdef DOOMSEEKER_TEMPLATED_PATH_RESOLVER_TILDEUSER
85 const struct passwd *pwent = getpwnam(username.toLatin1().constData());
94 resolved = home + resolved.mid(separatorIdx);
103 QRegularExpression envVarRegex(
"\\$([a-zA-Z_][a-zA-Z0-9_]*)");
105 while (d->progdirEnabled || d->envVarsEnabled)
107 QRegularExpressionMatch match;
108 int varIdx = resolved.indexOf(envVarRegex, offset, &match);
111 QString name = match.captured(1);
112 QString varValue =
"";
116 if (d->progdirEnabled && name == PROGDIR_TEMPLATE.mid(1))
118 varValue = QCoreApplication::applicationDirPath();
120 else if (d->envVarsEnabled && QProcessEnvironment::systemEnvironment().contains(name))
122 varValue = qgetenv(name.toUtf8());
124 else if (!d->envVarsEnabled)
126 varValue = QString(
"$%1").arg(name);
128 resolved = resolved.left(varIdx) + varValue + resolved.mid(varIdx + match.capturedLength());
129 offset = varIdx + varValue.length();
136 QStringList transformed;
137 for (
const QString &path : templatedPaths)
144 return d->progdirEnabled;
147 void TemplatedPathResolver::setProgdirEnabled(
bool enabled)
149 d->progdirEnabled = enabled;
154 return d->envVarsEnabled;
157 void TemplatedPathResolver::setEnvVarsEnabled(
bool enabled)
159 d->envVarsEnabled = enabled;
164 return d->userHomeEnabled;
167 void TemplatedPathResolver::setUserHomeEnabled(
bool enabled)
169 d->userHomeEnabled = enabled;
177 resolver.setEnvVarsEnabled(gConfig.doomseeker.bResolveTemplatedPathsPlaceholders);
178 resolver.setProgdirEnabled(gConfig.doomseeker.bResolveTemplatedPathsPlaceholders);
179 resolver.setUserHomeEnabled(
true);