17SsuVariables::SsuVariables()
24 QStringList parts = section.split(
"-");
26 if (section.startsWith(
"var-"))
27 parts.insert(1,
"default");
29 parts.replace(0,
"default");
31 QString key = parts.join(
"-");
33 if (settings->childGroups().contains(key))
42 return "maximum-recursion-level-reached";
45 QRegExp regex(
"%\\([^%]*\\)", Qt::CaseSensitive, QRegExp::RegExp2);
46 regex.setMinimal(
true);
49 QString result(pattern);
51 while ((pos = regex.indexIn(result, pos)) != -1) {
52 QString match = regex.cap(0);
54 if (match.contains(
":")) {
62 QString variableName = match;
63 variableName.remove(0, 2);
65 if (variables->contains(variableName)) {
66 result.replace(match, variables->value(variableName));
67 pos += variables->value(variableName).length();
69 result.replace(match,
"");
75 if (regex.indexIn(result, 0) != -1)
76 result =
resolveString(result, variables, recursionDepth + 1);
83 QString variableValue;
86 if (filteredVariable.endsWith(
")"))
87 filteredVariable.chop(1);
88 if (filteredVariable.startsWith(
"%("))
89 filteredVariable.remove(0, 2);
92 int magic = filteredVariable.indexOf(
":");
95 if (magic == -1)
return filteredVariable;
97 QStringRef variableName(&filteredVariable, 0, magic);
98 QStringRef variableSub(&filteredVariable, magic + 2, filteredVariable.length() - magic - 2);
101 if (variables->contains(variableName.toString()))
102 variableValue = variables->value(variableName.toString());
106 if (filteredVariable.length() > magic + 1)
107 op = filteredVariable.at(magic + 1);
109 switch (op.toLatin1()) {
112 if (variableValue.isEmpty())
113 return variableSub.toString();
117 if (!variableValue.isEmpty())
118 return variableSub.toString();
123 QString sub = variableSub.toString();
124 QString a = sub.left(sub.indexOf(
"?"));
125 QString b = sub.right(sub.length() - sub.indexOf(
"?") - 1);
126 if (b.indexOf(
"|") == -1)
128 if (variableName == a)
129 return b.left(b.indexOf(
"|"));
131 return b.right(b.length() - b.indexOf(
"|") - 1);
136 return variableValue;
141 m_settings = settings;
152 if (m_settings != NULL)
153 return variable(m_settings, section, key);
160 QVariant value = readVariable(settings, section, key, 0);
164 if (value.type() == QMetaType::UnknownType) {
166 if (!dSection.isEmpty())
167 value = readVariable(settings, dSection, key, 0,
false);
175 if (m_settings != NULL)
182 if (dSection.isEmpty()) {
183 readSection(settings, section, storageHash, 0);
185 readSection(settings, dSection, storageHash, 0);
186 readSection(settings, section, storageHash, 0,
false);
194void SsuVariables::readSection(
SsuSettings *settings,
const QString §ion,
195 QHash<QString, QString> *storageHash,
int recursionDepth,
199 SsuLog::instance()->
print(LOG_WARNING,
200 QString(
"Maximum recursion depth for resolving section %1 from %2")
202 .arg(settings->fileName()));
206 if (settings->contains(section +
"/variables")) {
208 bool childLogOverride =
true;
209 if (section.startsWith(
"default-") || section.startsWith(
"var-default-"))
210 childLogOverride =
false;
212 QStringList sections = settings->value(section +
"/variables").toStringList();
213 foreach (
const QString §ion, sections) {
214 if (section.startsWith(
"var-"))
215 readSection(settings, section, storageHash, recursionDepth + 1, childLogOverride);
217 readSection(settings,
"var-" + section, storageHash,
218 recursionDepth + 1, childLogOverride);
222 settings->beginGroup(section);
223 if (settings->group() != section)
227 if (settings->contains(
"local"))
228 locals = settings->value(
"local").toStringList();
230 QStringList keys = settings->allKeys();
231 foreach (
const QString &key, keys) {
233 if (key.startsWith(
"_"))
236 if (locals.contains(key))
239 if (key ==
"variables" || key ==
"local")
242 if (storageHash->contains(key) && logOverride) {
243 SsuLog::instance()->
print(LOG_DEBUG,
244 QString(
"Variable %1 overwritten from %2::%3")
246 .arg(settings->fileName())
249 storageHash->insert(key, settings->value(key).toString());
251 settings->endGroup();
254QVariant SsuVariables::readVariable(
SsuSettings *settings,
const QString §ion,
const QString &key,
255 int recursionDepth,
bool logOverride)
257 Q_UNUSED(logOverride)
262 SsuLog::instance()->
print(LOG_WARNING,
263 QString(
"Maximum recursion depth for resolving %1 from %2::%3")
265 .arg(settings->fileName())
271 if (settings->contains(section +
"/" + key)) {
272 return settings->value(section +
"/" + key);
276 if (settings->contains(section +
"/variables")) {
278 bool childLogOverride =
true;
279 if (section.startsWith(
"default-") || section.startsWith(
"var-default-"))
280 childLogOverride =
false;
282 QStringList sections = settings->value(section +
"/variables").toStringList();
283 foreach (
const QString §ion, sections) {
284 if (section.startsWith(
"var-"))
285 value = readVariable(settings, section, key, recursionDepth + 1, childLogOverride);
287 value = readVariable(settings,
"var-" + section, key,
288 recursionDepth + 1, childLogOverride);
void print(int priority, const QString &message)
void setSettings(SsuSettings *settings)
QVariant variable(const QString §ion, const QString &key)
void variableSection(const QString §ion, QHash< QString, QString > *storageHash)
static QString resolveString(const QString &pattern, QHash< QString, QString > *variables, int recursionDepth=0)
static QString defaultSection(SsuSettings *settings, const QString §ion)
static QString resolveVariable(const QString &variable, QHash< QString, QString > *variables)
#define SSU_MAX_RECURSION
Maximum recursion level for resolving variables.