/** * Return a new URL with a new key=value pair. * * @param pszURL the URL. * @param pszKey the key to find. * @param pszValue the value of the key (may be NULL to unset an existing KVP). * @return the modified URL. * @since GDAL 1.9.0 */ CPLString CPLURLAddKVP(const char* pszURL, const char* pszKey, const char* pszValue) { CPLString osURL(pszURL); if (strchr(osURL, '?') == NULL) osURL += "?"; pszURL = osURL.c_str(); CPLString osKey(pszKey); osKey += "="; size_t nKeyPos = osURL.ifind(osKey); if (nKeyPos != std::string::npos) { CPLString osNewURL(osURL); osNewURL.resize(nKeyPos); if (pszValue) { if (osNewURL[osNewURL.size()-1] != '&' && osNewURL[osNewURL.size()-1] != '?') osNewURL += '&'; osNewURL += osKey; osNewURL += pszValue; } const char* pszNext = strchr(pszURL + nKeyPos, '&'); if (pszNext) { if (osNewURL[osNewURL.size()-1] == '&' || osNewURL[osNewURL.size()-1] == '?' ) osNewURL += pszNext + 1; else osNewURL += pszNext; } return osNewURL; } else { if (pszValue) { if (osURL[osURL.size()-1] != '&' && osURL[osURL.size()-1] != '?') osURL += '&'; osURL += osKey; osURL += pszValue; } return osURL; } }
/** * Return the value matching a key from a key=value pair in a URL. * * @param pszURL the URL. * @param pszKey the key to find. * @return the value of empty string if not found. * @since GDAL 1.9.0 */ CPLString CPLURLGetValue(const char* pszURL, const char* pszKey) { CPLString osKey(pszKey); osKey += "="; size_t nKeyPos = CPLString(pszURL).ifind(osKey); if (nKeyPos != std::string::npos) { CPLString osValue(pszURL + nKeyPos + strlen(osKey)); const char* pszValue = osValue.c_str(); const char* pszSep = strchr(pszValue, '&'); if (pszSep) { osValue.resize(pszSep - pszValue); } return osValue; } return ""; }
static bool matches(const QJsonObject &object, const QString &osName, const QVersionNumber &kernelVersion, const QOpenGLConfig::Gpu &gpu) { const OsTypeTerm os = OsTypeTerm::fromJson(object.value(osKey())); if (!os.isNull() && !os.matches(osName, kernelVersion)) return false; const QJsonValue exceptionsV = object.value(exceptionsKey()); if (exceptionsV.isArray()) { const QJsonArray exceptionsA = exceptionsV.toArray(); for (JsonArrayConstIt it = exceptionsA.constBegin(), cend = exceptionsA.constEnd(); it != cend; ++it) { if (matches(it->toObject(), osName, kernelVersion, gpu)) return false; } } const QJsonValue vendorV = object.value(vendorIdKey()); if (vendorV.isString()) { if (gpu.vendorId != vendorV.toString().toUInt(Q_NULLPTR, /* base */ 0)) return false; } else { if (object.contains(glVendorKey())) { const QByteArray glVendorV = object.value(glVendorKey()).toString().toUtf8(); if (!gpu.glVendor.contains(glVendorV)) return false; } } if (gpu.deviceId) { const QJsonValue deviceIdV = object.value(deviceIdKey()); switch (deviceIdV.type()) { case QJsonValue::Array: if (!contains(deviceIdV.toArray(), gpu.deviceId)) return false; break; case QJsonValue::Undefined: case QJsonValue::Null: break; default: qWarning().noquote() << msgSyntaxWarning(object, QLatin1String("Device ID must be of type array.")); } } if (!gpu.driverVersion.isNull()) { const QJsonValue driverVersionV = object.value(driverVersionKey()); switch (driverVersionV.type()) { case QJsonValue::Object: if (!VersionTerm::fromJson(driverVersionV).matches(gpu.driverVersion)) return false; break; case QJsonValue::Undefined: case QJsonValue::Null: break; default: qWarning().noquote() << msgSyntaxWarning(object, QLatin1String("Driver version must be of type object.")); } } return true; }