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 QRegExp separatorRegex(R
"([/\\])");
71 const QRegExp separatorRegex(
"/");
73 int separatorIdx = separatorRegex.indexIn(resolved);
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 QRegExp envVarRegex(
"\\$([a-zA-Z_][a-zA-Z0-9_]*)");
105 while (d->progdirEnabled || d->envVarsEnabled)
107 int varIdx = envVarRegex.indexIn(resolved, offset);
110 QString name = envVarRegex.cap(1);
111 QString varValue =
"";
115 if (d->progdirEnabled && name == PROGDIR_TEMPLATE.mid(1))
117 varValue = QCoreApplication::applicationDirPath();
119 else if (d->envVarsEnabled && QProcessEnvironment::systemEnvironment().contains(name))
121 varValue = qgetenv(name.toUtf8());
123 else if (!d->envVarsEnabled)
125 varValue = QString(
"$%1").arg(name);
127 resolved = resolved.left(varIdx) + varValue + resolved.mid(varIdx + envVarRegex.matchedLength());
128 offset = varIdx + varValue.length();
135 QStringList transformed;
136 for (
const QString &path : templatedPaths)
143 return d->progdirEnabled;
146 void TemplatedPathResolver::setProgdirEnabled(
bool enabled)
148 d->progdirEnabled = enabled;
153 return d->envVarsEnabled;
156 void TemplatedPathResolver::setEnvVarsEnabled(
bool enabled)
158 d->envVarsEnabled = enabled;
163 return d->userHomeEnabled;
166 void TemplatedPathResolver::setUserHomeEnabled(
bool enabled)
168 d->userHomeEnabled = enabled;
176 resolver.setEnvVarsEnabled(gConfig.doomseeker.bResolveTemplatedPathsPlaceholders);
177 resolver.setProgdirEnabled(gConfig.doomseeker.bResolveTemplatedPathsPlaceholders);
178 resolver.setUserHomeEnabled(
true);