diff --git a/src/tools/sdktool/findkeyoperation.cpp b/src/tools/sdktool/findkeyoperation.cpp index ac2b61648f1..8f379367454 100644 --- a/src/tools/sdktool/findkeyoperation.cpp +++ b/src/tools/sdktool/findkeyoperation.cpp @@ -96,6 +96,19 @@ bool FindKeyOperation::test() const testMap.insert(QLatin1String("testint"), 23); testMap.insert(QLatin1String("testbool"), true); + subKeys.clear(); + QVariantList list1; + list1.append(QLatin1String("ignore this")); + list1.append(QLatin1String("ignore this2")); + QVariantList list2; + list2.append(QLatin1String("somevalue")); + subKeys.insert(QLatin1String("findMe"), QLatin1String("FindInList")); + list2.append(subKeys); + list2.append(QLatin1String("someothervalue")); + list1.append(QVariant(list2)); + + testMap.insert(QLatin1String("aList"), list1); + QStringList result; result = findKey(testMap, QLatin1String("missing")); if (!result.isEmpty()) @@ -112,22 +125,36 @@ bool FindKeyOperation::test() const || !result.contains(QLatin1String("testbool"))) return false; + result = findKey(testMap, QLatin1String("findMe")); + if (result.count() != 1 + || !result.contains(QLatin1String("aList[2][1]/findMe"))) + return false; + return true; } #endif -QStringList FindKeyOperation::findKey(const QVariantMap &map, const QString &key) +QStringList FindKeyOperation::findKey(const QVariant &in, const QString &key, const QString &prefix) { QStringList result; - for (QVariantMap::const_iterator i = map.begin(); i != map.end(); ++i) { - if (i.key() == key) { - result << key; - continue; + if (in.type() == QVariant::Map) { + QVariantMap map = in.toMap(); + for (QVariantMap::const_iterator i = map.begin(); i != map.end(); ++i) { + QString pfx = prefix; + if (!pfx.isEmpty()) + pfx.append(QLatin1Char('/')); + if (i.key() == key) { + result << pfx + key; + } else { + pfx.append(i.key()); + result.append(findKey(i.value(), key, pfx)); + } } - if (i.value().type() == QVariant::Map) { - QStringList subKeyList = findKey(i.value().toMap(), key); - foreach (const QString &subKey, subKeyList) - result << i.key() + QLatin1Char('/') + subKey; + } else if (in.type() == QVariant::List) { + QVariantList list = in.toList(); + for (int pos = 0; pos < list.count(); ++pos) { + QString pfx = prefix + QLatin1Char('[') + QString::number(pos) + QLatin1String("]"); + result.append(findKey(list.at(pos), key, pfx)); } } return result; diff --git a/src/tools/sdktool/findkeyoperation.h b/src/tools/sdktool/findkeyoperation.h index 2c210e2b9dd..902e8857b5e 100644 --- a/src/tools/sdktool/findkeyoperation.h +++ b/src/tools/sdktool/findkeyoperation.h @@ -47,7 +47,8 @@ public: bool test() const; #endif - static QStringList findKey(const QVariantMap &map, const QString &key); + static QStringList findKey(const QVariant &in, const QString &key, + const QString &prefix = QString()); private: QString m_file; diff --git a/src/tools/sdktool/findvalueoperation.cpp b/src/tools/sdktool/findvalueoperation.cpp index 48947ee37b7..de5f16469f6 100644 --- a/src/tools/sdktool/findvalueoperation.cpp +++ b/src/tools/sdktool/findvalueoperation.cpp @@ -31,6 +31,10 @@ #include +// +#include +// + QString FindValueOperation::name() const { return QLatin1String("find"); @@ -95,12 +99,26 @@ bool FindValueOperation::test() const cur.insert(QLatin1String("testint2"), 53); subKeys.insert(QLatin1String("subsubkeys"), cur); subKeys.insert(QLatin1String("testbool"), true); + subKeys.insert(QLatin1String("testbool2"), false); subKeys.insert(QLatin1String("otherint"), 53); testMap.insert(QLatin1String("subkeys"), subKeys); subKeys.clear(); testMap.insert(QLatin1String("subkeys2"), subKeys); testMap.insert(QLatin1String("testint"), 23); + subKeys.clear(); + QVariantList list1; + list1.append(QLatin1String("ignore this")); + list1.append(QLatin1String("ignore this2")); + QVariantList list2; + list2.append(QLatin1String("somevalue")); + subKeys.insert(QLatin1String("findMe"), QLatin1String("FindInList")); + list2.append(subKeys); + list2.append(QLatin1String("someothervalue")); + list1.append(QVariant(list2)); + + testMap.insert(QLatin1String("aList"), list1); + QStringList result; result = findValues(testMap, QVariant(23)); if (result.count() != 1 @@ -117,25 +135,36 @@ bool FindValueOperation::test() const if (!result.isEmpty()) return false; + result = findValues(testMap, QVariant(QString::fromLatin1("FindInList"))); + if (result.count() != 1 + || !result.contains(QLatin1String("aList[2][1]/findMe"))) + return false; + return true; } #endif -QStringList FindValueOperation::findValues(const QVariantMap &map, const QVariant &value) +QStringList FindValueOperation::findValues(const QVariant &in, const QVariant &value, + const QString &prefix) { QStringList result; - if (!value.isValid()) - return result; - - for (QVariantMap::const_iterator i = map.begin(); i != map.end(); ++i) { - if (i.value() == value) - result << i.key(); - if (i.value().type() == QVariant::Map) { - const QStringList subKeys = findValues(i.value().toMap(), value); - foreach (const QString &subKey, subKeys) - result << i.key() + QLatin1Char('/') + subKey; + if (in.type() == value.type() && in == value) { + result << prefix; + } else if (in.type() == QVariant::Map) { + QVariantMap map = in.toMap(); + for (QVariantMap::const_iterator i = map.begin(); i != map.end(); ++i) { + QString pfx = prefix; + if (!pfx.isEmpty()) + pfx.append(QLatin1Char('/')); + pfx.append(i.key()); + result.append(findValues(i.value(), value, pfx)); + } + } else if (in.type() == QVariant::List) { + QVariantList list = in.toList(); + for (int pos = 0; pos < list.count(); ++pos) { + QString pfx = prefix + QLatin1Char('[') + QString::number(pos) + QLatin1String("]"); + result.append(findValues(list.at(pos), value, pfx)); } } - return result; } diff --git a/src/tools/sdktool/findvalueoperation.h b/src/tools/sdktool/findvalueoperation.h index de86d7d9855..4a3dd0461a1 100644 --- a/src/tools/sdktool/findvalueoperation.h +++ b/src/tools/sdktool/findvalueoperation.h @@ -47,7 +47,8 @@ public: bool test() const; #endif - static QStringList findValues(const QVariantMap &map, const QVariant &value); + static QStringList findValues(const QVariant &in, const QVariant &value, + const QString &prefix = QString()); private: QString m_file;