QVariantMap AddDebuggerOperation::addDebugger(const QVariantMap &map, const QString &id, const QString &displayName, const quint32 &engine, const QString &binary, const QStringList &abis, const KeyValuePairList &extra) { // Sanity check: Make sure autodetection source is not in use already: QStringList valueKeys = FindValueOperation::findValue(map, QVariant(id)); bool hasId = false; foreach (const QString &k, valueKeys) { if (k.endsWith(QString(QLatin1Char('/')) + QLatin1String(ID))) { hasId = true; break; } } if (hasId) { std::cerr << "Error: Id " << qPrintable(id) << " already defined as debugger." << std::endl; return QVariantMap(); } // Find position to insert: bool ok; int count = GetOperation::get(map, QLatin1String(COUNT)).toInt(&ok); if (!ok || count < 0) { std::cerr << "Error: Count found in debuggers file seems wrong." << std::endl; return QVariantMap(); } const QString debugger = QString::fromLatin1(PREFIX) + QString::number(count); // remove data: QStringList toRemove; toRemove << QLatin1String(COUNT); QVariantMap cleaned = RmKeysOperation::rmKeys(map, toRemove); // Sanity check: Make sure displayName is unique. QStringList nameKeys = FindKeyOperation::findKey(map, QLatin1String(DISPLAYNAME)); QStringList nameList; foreach (const QString &nameKey, nameKeys) nameList << GetOperation::get(map, nameKey).toString(); const QString uniqueName = makeUnique(displayName, nameList); // insert data: KeyValuePairList data; data << KeyValuePair(QStringList() << debugger << QLatin1String(ID), QVariant(id)); data << KeyValuePair(QStringList() << debugger << QLatin1String(DISPLAYNAME), QVariant(uniqueName)); data << KeyValuePair(QStringList() << debugger << QLatin1String(AUTODETECTED), QVariant(true)); data << KeyValuePair(QStringList() << debugger << QLatin1String(ABIS), QVariant(abis)); data << KeyValuePair(QStringList() << debugger << QLatin1String(ENGINE_TYPE), QVariant(engine)); data << KeyValuePair(QStringList() << debugger << QLatin1String(BINARY), QVariant(binary)); data << KeyValuePair(QStringList() << QLatin1String(COUNT), QVariant(count + 1)); KeyValuePairList qtExtraList; foreach (const KeyValuePair &pair, extra) qtExtraList << KeyValuePair(QStringList() << debugger << pair.key, pair.value); data.append(qtExtraList); return AddKeysOperation::addKeys(cleaned, data); }
QVariantMap AddToolChainOperation::addToolChain(const QVariantMap &map, const QString &id, const QString &displayName, const QString &path, const QString &abi, const QString &supportedAbis, const KeyValuePairList &extra) { // Sanity check: Does the Id already exist? QStringList valueKeys = FindValueOperation::findValues(map, id); bool hasId = false; foreach (const QString &k, valueKeys) { if (k.endsWith(QString(QLatin1Char('/')) + QLatin1String(ID))) { hasId = true; break; } } if (hasId) { std::cerr << "Error: Id " << qPrintable(id) << " already defined for tool chains." << std::endl; return QVariantMap(); } // Find position to insert Tool Chain at: bool ok; int count = GetOperation::get(map, QLatin1String(COUNT)).toInt(&ok); if (!ok || count < 0) { std::cerr << "Error: Count found in toolchains file seems wrong." << std::endl; return QVariantMap(); } // Sanity check: Make sure displayName is unique. QStringList nameKeys = FindKeyOperation::findKey(map, QLatin1String(DISPLAYNAME)); QStringList nameList; foreach (const QString &nameKey, nameKeys) nameList << GetOperation::get(map, nameKey).toString(); const QString uniqueName = makeUnique(displayName, nameList); QVariantMap result = RmKeysOperation::rmKeys(map, QStringList() << QLatin1String(COUNT)); std::cout << "Registering ToolChain " << count << std::endl; const QString tc = QString::fromLatin1(PREFIX) + QString::number(count); KeyValuePairList data; data << KeyValuePair(QStringList() << tc << QLatin1String(ID), QVariant(id.toUtf8())); data << KeyValuePair(QStringList() << tc << QLatin1String(DISPLAYNAME), QVariant(uniqueName)); data << KeyValuePair(QStringList() << tc << QLatin1String(AUTODETECTED), QVariant(true)); data << KeyValuePair(QStringList() << tc << QLatin1String(PATH), QVariant(path)); data << KeyValuePair(QStringList() << tc << QLatin1String(TARGET_ABI), QVariant(abi)); QVariantList abis; QStringList abiStrings = supportedAbis.split(QLatin1Char(',')); foreach (const QString &s, abiStrings) abis << QVariant(s); data << KeyValuePair(QStringList() << tc << QLatin1String(SUPPORTED_ABIS), QVariant(abis)); KeyValuePairList tcExtraList; foreach (const KeyValuePair &pair, extra) tcExtraList << KeyValuePair(QStringList() << tc << pair.key, pair.value); data.append(tcExtraList); data << KeyValuePair(QLatin1String(COUNT), QVariant(count + 1)); return AddKeysOperation::addKeys(result, data); }
QVariantMap AddQtOperation::addQt(const QVariantMap &map, const QString &id, const QString &displayName, const QString &type, const QString &qmake, const KeyValuePairList &extra) { QString sdkId = extendId(id); // Sanity check: Make sure autodetection source is not in use already: if (exists(map, sdkId)) { std::cerr << "Error: Id " << qPrintable(id) << " already defined as Qt versions." << std::endl; return QVariantMap(); } // Find position to insert: int versionCount = 0; for (QVariantMap::const_iterator i = map.begin(); i != map.end(); ++i) { if (!i.key().startsWith(QLatin1String(PREFIX))) continue; QString number = i.key().mid(QString::fromLatin1(PREFIX).count()); bool ok; int count = number.toInt(&ok); if (ok && count >= versionCount) versionCount = count + 1; } const QString qt = QString::fromLatin1(PREFIX) + QString::number(versionCount); // Sanity check: Make sure displayName is unique. QStringList nameKeys = FindKeyOperation::findKey(map, QLatin1String(DISPLAYNAME)); QStringList nameList; foreach (const QString &nameKey, nameKeys) nameList << GetOperation::get(map, nameKey).toString(); const QString uniqueName = makeUnique(displayName, nameList); // Sanitize qmake path: QString saneQmake = QDir::cleanPath(QDir::fromNativeSeparators(qmake)); // insert data: KeyValuePairList data; data << KeyValuePair(QStringList() << qt << QLatin1String(ID), QVariant(-1)); data << KeyValuePair(QStringList() << qt << QLatin1String(DISPLAYNAME), QVariant(uniqueName)); data << KeyValuePair(QStringList() << qt << QLatin1String(AUTODETECTED), QVariant(true)); data << KeyValuePair(QStringList() << qt << QLatin1String(AUTODETECTION_SOURCE), QVariant(sdkId)); data << KeyValuePair(QStringList() << qt << QLatin1String(QMAKE), QVariant(saneQmake)); data << KeyValuePair(QStringList() << qt << QLatin1String(TYPE), QVariant(type)); KeyValuePairList qtExtraList; foreach (const KeyValuePair &pair, extra) qtExtraList << KeyValuePair(QStringList() << qt << pair.key, pair.value); data.append(qtExtraList); return AddKeysOperation::addKeys(map, data); }
QVariantMap AddKitOperation::addKit(const QVariantMap &map, const QVariantMap &tcMap, const QVariantMap &qtMap, const QVariantMap &devMap, const QString &id, const QString &displayName, const QString &icon, const QString &debuggerId, const quint32 &debuggerType, const QString &debugger, const QString &deviceType, const QString &device, const QString &sysRoot, const QHash<QString, QString> &tcs, const QString &qt, const QString &mkspec, const QStringList &env, const KeyValuePairList &extra) { // Sanity check: Make sure autodetection source is not in use already: QStringList valueKeys = FindValueOperation::findValue(map, QVariant(id)); bool hasId = false; foreach (const QString &k, valueKeys) { if (k.endsWith(QString('/') + ID)) { hasId = true; break; } } if (hasId) { std::cerr << "Error: Id " << qPrintable(id) << " already defined as kit." << std::endl; return QVariantMap(); } for (auto i = tcs.constBegin(); i != tcs.constEnd(); ++i) { if (!i.value().isEmpty() && !AddToolChainOperation::exists(tcMap, i.value())) { QRegExp abiRegExp = QRegExp("[a-z0-9_]+-[a-z0-9_]+-[a-z0-9_]+-[a-z0-9_]+-(8|16|32|64|128)bit"); if (!abiRegExp.exactMatch(i.value())) { std::cerr << "Error: Toolchain " << qPrintable(i.value()) << " for language " << qPrintable(i.key()) << " does not exist." << std::endl; return QVariantMap(); } } } QString qtId = qt; if (!qtId.isEmpty() && !qtId.startsWith("SDK.")) qtId = QString::fromLatin1("SDK.") + qt; if (!qtId.isEmpty() && !AddQtOperation::exists(qtMap, qtId)) { std::cerr << "Error: Qt " << qPrintable(qtId) << " does not exist." << std::endl; return QVariantMap(); } if (!device.isEmpty() && !AddDeviceOperation::exists(devMap, device)) { std::cerr << "Error: Device " << qPrintable(device) << " does not exist." << std::endl; return QVariantMap(); } // Find position to insert: bool ok; int count = GetOperation::get(map, COUNT).toInt(&ok); if (!ok || count < 0) { std::cerr << "Error: Count found in kits file seems wrong." << std::endl; return QVariantMap(); } const QString kit = QString::fromLatin1(PREFIX) + QString::number(count); QString defaultKit = GetOperation::get(map, DEFAULT).toString(); if (defaultKit.isEmpty()) defaultKit = id; // remove data: QVariantMap cleaned = RmKeysOperation::rmKeys(map, { COUNT, DEFAULT }); // Sanity check: Make sure displayName is unique. QStringList nameKeys = FindKeyOperation::findKey(map, DISPLAYNAME); QStringList nameList; foreach (const QString &nameKey, nameKeys) nameList << GetOperation::get(map, nameKey).toString(); const QString uniqueName = makeUnique(displayName, nameList); // insert data: KeyValuePairList data = { KeyValuePair({ kit, ID }, QVariant(id)), KeyValuePair({ kit, DISPLAYNAME }, QVariant(uniqueName)), KeyValuePair({ kit, ICON }, QVariant(icon)), KeyValuePair({ kit, AUTODETECTED }, QVariant(true)), KeyValuePair({ kit, SDK }, QVariant(true)) }; if (!debuggerId.isEmpty() || !debugger.isEmpty()) { if (debuggerId.isEmpty()) { data << KeyValuePair({ kit, DATA, DEBUGGER, DEBUGGER_ENGINE }, QVariant(debuggerType)); data << KeyValuePair({ kit, DATA, DEBUGGER, DEBUGGER_BINARY }, QVariant(debugger)); } else { data << KeyValuePair({ kit, DATA, DEBUGGER }, QVariant(debuggerId)); } } if (!deviceType.isNull()) data << KeyValuePair({ kit, DATA, DEVICE_TYPE }, QVariant(deviceType)); if (!device.isNull()) data << KeyValuePair({ kit, DATA, DEVICE_ID }, QVariant(device)); if (!sysRoot.isNull()) data << KeyValuePair({ kit, DATA, SYSROOT }, QVariant(sysRoot)); for (auto i = tcs.constBegin(); i != tcs.constEnd(); ++i) data << KeyValuePair({ kit, DATA, TOOLCHAIN, i.key() }, QVariant(i.value())); if (!qtId.isNull()) data << KeyValuePair({ kit, DATA, QT }, QVariant(qtId)); if (!mkspec.isNull()) data << KeyValuePair({ kit, DATA, MKSPEC }, QVariant(mkspec)); if (!env.isEmpty()) data << KeyValuePair({ kit, DATA, ENV }, QVariant(env)); data << KeyValuePair(DEFAULT, QVariant(defaultKit)); data << KeyValuePair(COUNT, QVariant(count + 1)); KeyValuePairList qtExtraList; foreach (const KeyValuePair &pair, extra) qtExtraList << KeyValuePair(QStringList() << kit << pair.key, pair.value); data.append(qtExtraList); return AddKeysOperation::addKeys(cleaned, data); }
bool AddKeysOperation::test() const { QVariantMap testMap; QVariantMap subKeys; subKeys.insert(QLatin1String("subsubkeys"), QVariantMap()); subKeys.insert(QLatin1String("testbool"), true); testMap.insert(QLatin1String("subkeys"), subKeys); subKeys.clear(); testMap.insert(QLatin1String("subkeys2"), subKeys); testMap.insert(QLatin1String("testint"), 23); KeyValuePairList data; data.append(KeyValuePair(QLatin1String("bool-true"), QString::fromLatin1("bool:trUe"))); data.append(KeyValuePair(QLatin1String("bool-false"), QString::fromLatin1("bool:false"))); data.append(KeyValuePair(QLatin1String("int"), QString::fromLatin1("int:42"))); data.append(KeyValuePair(QLatin1String("qstring"), QString::fromLatin1("QString:test string."))); data.append(KeyValuePair(QLatin1String("qbytearray"), QString::fromLatin1("QByteArray:test array."))); data.append(KeyValuePair(QLatin1String("subkeys/qbytearray"), QString::fromLatin1("QByteArray:test array."))); data.append(KeyValuePair(QLatin1String("subkeys/newsubkeys/qbytearray"), QString::fromLatin1("QByteArray:test array."))); data.append(KeyValuePair(QLatin1String("newsub/1/2/3/qbytearray"), QString::fromLatin1("QByteArray:test array."))); data.append(KeyValuePair(QLatin1String("newsub/1/2.1/3/qbytearray"), QString::fromLatin1("QByteArray:test array."))); QVariantMap result = addKeys(testMap, data); if (result.count() != 9) return false; // subkeys: QVariantMap cur = result.value(QLatin1String("subkeys")).toMap(); if (cur.count() != 4 || !cur.contains(QLatin1String("qbytearray")) || !cur.contains(QLatin1String("testbool")) || !cur.contains(QLatin1String("subsubkeys")) || !cur.contains(QLatin1String("newsubkeys"))) return false; // subkeys/newsubkeys: QVariantMap tmp = cur; cur = cur.value(QLatin1String("newsubkeys")).toMap(); if (cur.count() != 1 || !cur.contains(QLatin1String("qbytearray"))) return false; // subkeys/subsubkeys: cur = tmp.value(QLatin1String("subsubkeys")).toMap(); if (cur.count() != 0) return false; // newsub: cur = result.value(QLatin1String("newsub")).toMap(); if (cur.count() != 1 || !cur.contains(QLatin1String("1"))) return false; // newsub/1: cur = cur.value(QLatin1String("1")).toMap(); if (cur.count() != 2 || !cur.contains(QLatin1String("2")) || !cur.contains(QLatin1String("2.1"))) return false; // newsub/1/2: tmp = cur; cur = cur.value(QLatin1String("2")).toMap(); if (cur.count() != 1 || !cur.contains(QLatin1String("3"))) return false; // newsub/1/2/3: cur = cur.value(QLatin1String("3")).toMap(); if (cur.count() != 1 || !cur.contains(QLatin1String("qbytearray"))) return false; // newsub/1/2.1: cur = tmp.value(QLatin1String("2.1")).toMap(); if (cur.count() != 1 || !cur.contains(QLatin1String("3"))) return false; // newsub/1/2.1/3: cur = cur.value(QLatin1String("3")).toMap(); if (cur.count() != 1 || !cur.contains(QLatin1String("qbytearray"))) return false; // subkeys2: cur = result.value(QLatin1String("subkeys2")).toMap(); if (cur.count() != 0) return false; // values: if (!result.contains(QLatin1String("bool-true")) || !result.value(QLatin1String("bool-true")).toBool()) return false; if (!result.contains(QLatin1String("bool-false")) || result.value(QLatin1String("bool-false")).toBool()) return false; if (!result.contains(QLatin1String("int")) || result.value(QLatin1String("int")).toInt() != 42) return false; if (!result.contains(QLatin1String("qstring")) || result.value(QLatin1String("qstring")).toString() != QLatin1String("test string.")) return false; if (!result.contains(QLatin1String("qbytearray")) || result.value(QLatin1String("qbytearray")).toByteArray() != "test array.") return false; // Make sure we do not overwrite data: // preexisting: data.clear(); data.append(KeyValuePair(QLatin1String("testint"), QString::fromLatin1("int:4"))); result = addKeys(testMap, data); if (!result.isEmpty()) return false; data.clear(); data.append(KeyValuePair(QLatin1String("subkeys/testbool"), QString::fromLatin1("int:24"))); result = addKeys(testMap, data); if (!result.isEmpty()) return false; // data inserted before: data.clear(); data.append(KeyValuePair(QLatin1String("bool-true"), QString::fromLatin1("bool:trUe"))); data.append(KeyValuePair(QLatin1String("bool-true"), QString::fromLatin1("bool:trUe"))); result = addKeys(testMap, data); if (!result.isEmpty()) return false; return true; }
QVariantMap AddKitOperation::addKit(const QVariantMap &map, const QString &id, const QString &displayName, const QString &icon, const quint32 &debuggerType, const QString &debugger, const QByteArray &deviceType, const QString &sysRoot, const QString &tc, const QString &qt, const QString &mkspec, const KeyValuePairList &extra) { // Sanity check: Make sure autodetection source is not in use already: QStringList valueKeys = FindValueOperation::findValues(map, QVariant(id)); bool hasId = false; foreach (const QString &k, valueKeys) { if (k.endsWith(QString(QLatin1Char('/')) + QLatin1String(ID))) { hasId = true; break; } } if (hasId) { std::cerr << "Error: Id " << qPrintable(id) << " already defined as kit." << std::endl; return QVariantMap(); } // Find position to insert: bool ok; int count = GetOperation::get(map, QLatin1String(COUNT)).toInt(&ok); if (!ok || count < 0) { std::cerr << "Error: Count found in kits file seems wrong." << std::endl; return QVariantMap(); } const QString kit = QString::fromLatin1(PREFIX) + QString::number(count); int defaultKit = GetOperation::get(map, QLatin1String(DEFAULT)).toInt(&ok); if (!ok) { std::cerr << "Error: Default kit seems wrong." << std::endl; return QVariantMap(); } if (defaultKit < 0) defaultKit = 0; // remove data: QStringList toRemove; toRemove << QLatin1String(COUNT) << QLatin1String(DEFAULT); QVariantMap cleaned = RmKeysOperation::rmKeys(map, toRemove); // Sanity check: Make sure displayName is unique. QStringList nameKeys = FindKeyOperation::findKey(map, QLatin1String(DISPLAYNAME)); QStringList nameList; foreach (const QString nameKey, nameKeys) nameList << GetOperation::get(map, nameKey).toString(); const QString uniqueName = makeUnique(displayName, nameList); // insert data: KeyValuePairList data; data << KeyValuePair(QStringList() << kit << QLatin1String(ID), QVariant(id)); data << KeyValuePair(QStringList() << kit << QLatin1String(DISPLAYNAME), QVariant(uniqueName)); data << KeyValuePair(QStringList() << kit << QLatin1String(ICON), QVariant(icon)); data << KeyValuePair(QStringList() << kit << QLatin1String(AUTODETECTED), QVariant(true)); data << KeyValuePair(QStringList() << kit << QLatin1String(DATA) << QLatin1String(DEBUGGER) << QLatin1String(DEBUGGER_ENGINE), QVariant(debuggerType)); data << KeyValuePair(QStringList() << kit << QLatin1String(DATA) << QLatin1String(DEBUGGER) << QLatin1String(DEBUGGER_BINARY), QVariant(debugger)); data << KeyValuePair(QStringList() << kit << QLatin1String(DATA) << DEVICE_TYPE, QVariant(deviceType)); data << KeyValuePair(QStringList() << kit << QLatin1String(DATA) << SYSROOT, QVariant(sysRoot)); data << KeyValuePair(QStringList() << kit << QLatin1String(DATA) << TOOLCHAIN, QVariant(tc)); data << KeyValuePair(QStringList() << kit << QLatin1String(DATA) << QT, QVariant(qt)); data << KeyValuePair(QStringList() << kit << QLatin1String(DATA) << MKSPEC, QVariant(mkspec)); data << KeyValuePair(QStringList() << QLatin1String(DEFAULT), QVariant(defaultKit)); data << KeyValuePair(QStringList() << QLatin1String(COUNT), QVariant(count + 1)); KeyValuePairList qtExtraList; foreach (const KeyValuePair &pair, extra) qtExtraList << KeyValuePair(QStringList() << kit << pair.key, pair.value); data.append(qtExtraList); return AddKeysOperation::addKeys(cleaned, data); }