202QGeoServiceProvider::QGeoServiceProvider(
const QString &providerName,
203 const QVariantMap ¶meters,
204 bool allowExperimental)
205 : d_ptr(
new QGeoServiceProviderPrivate())
207 d_ptr->experimental = allowExperimental;
208 d_ptr->parameterMap = parameters;
210 if (providerName == QStringLiteral(
"nokia"))
211 d_ptr->providerName = QStringLiteral(
"here");
213 d_ptr->providerName = providerName;
231 const QMetaObject *mo = &QGeoServiceProvider::staticMetaObject;
232 const QMetaEnum en = mo->enumerator(
233 mo->indexOfEnumerator(enumName));
236
237 Flags ret =
typename Flags::enum_type(0);
238 if (
this->metaData.contains(QStringLiteral(
"Features"))
239 &&
this->metaData.value(QStringLiteral(
"Features")).isArray()) {
240 const QCborArray features =
this->metaData.value(QStringLiteral(
"Features")).toArray();
241 for (
const QCborValueConstRef v : features) {
242 int val = en.keyToValue(v.toString().toLatin1().constData());
243 if (v.isString() && val != -1) {
244 ret |=
typename Flags::enum_type(val);
323 QString *_errorString)
326 QGeoServiceProvider::Error &error = *_error;
327 QString &errorString = *_errorString;
328 Manager *manager =
nullptr;
332 loadPlugin(
this->parameterMap);
337 errorString =
this->errorString;
342 Engine *engine = createEngine<Engine>(
this);
346 engine->setManagerName(
347 metaData.value(QStringLiteral(
"Provider")).toString());
348 engine->setManagerVersion(
349 int(metaData.value(QStringLiteral(
"Version")).toDouble()));
350 manager =
new Manager(engine);
351 }
else if (error == QGeoServiceProvider::NoError) {
352 error = QGeoServiceProvider::NotSupportedError;
353 errorString = QLatin1String(
"The service provider does not support the %1 type.")
354 .arg(QLatin1String(Manager::staticMetaObject.className()));
357 if (error != QGeoServiceProvider::NoError) {
361 this->errorString = errorString;
364 if (manager && localeSet)
365 manager->setLocale(locale);
369 this->error = QGeoServiceProvider::NoError;
370 this->errorString.clear();
397QGeoCodingManager *QGeoServiceProvider::geocodingManager()
const
399 if (!d_ptr->geocodingManager) {
400 d_ptr->geocodingManager.reset(d_ptr->manager<QGeoCodingManager, QGeoCodingManagerEngine>(
401 &(d_ptr->geocodeError), &(d_ptr->geocodeErrorString)));
402 if (!d_ptr->geocodingManager)
403 qDebug() << d_ptr->error <<
", " << d_ptr->errorString;
405 return d_ptr->geocodingManager.get();
430QGeoMappingManager *QGeoServiceProvider::mappingManager()
const
432 if (!d_ptr->mappingManager) {
433 d_ptr->mappingManager.reset(d_ptr->manager<QGeoMappingManager, QGeoMappingManagerEngine>(
434 &(d_ptr->mappingError), &(d_ptr->mappingErrorString)));
435 if (!d_ptr->mappingManager)
436 qDebug() << d_ptr->error <<
", " << d_ptr->errorString;
438 return d_ptr->mappingManager.get();
461QGeoRoutingManager *QGeoServiceProvider::routingManager()
const
463 if (!d_ptr->routingManager) {
464 d_ptr->routingManager.reset(d_ptr->manager<QGeoRoutingManager, QGeoRoutingManagerEngine>(
465 &(d_ptr->routingError), &(d_ptr->routingErrorString)));
466 if (!d_ptr->routingManager)
467 qDebug() << d_ptr->error <<
", " << d_ptr->errorString;
469 return d_ptr->routingManager.get();
488QPlaceManager *QGeoServiceProvider::placeManager()
const
490 if (!d_ptr->placeManager) {
491 d_ptr->placeManager.reset(d_ptr->manager<QPlaceManager, QPlaceManagerEngine>(
492 &(d_ptr->placeError), &(d_ptr->placeErrorString)));
493 if (!d_ptr->placeManager)
494 qDebug() << d_ptr->error <<
", " << d_ptr->errorString;
496 return d_ptr->placeManager.get();
672void QGeoServiceProvider::setLocale(
const QLocale &locale)
674 d_ptr->locale = locale;
675 d_ptr->localeSet =
true;
677 if (d_ptr->geocodingManager)
678 d_ptr->geocodingManager->setLocale(locale);
679 if (d_ptr->routingManager)
680 d_ptr->routingManager->setLocale(locale);
681 if (d_ptr->mappingManager)
682 d_ptr->mappingManager->setLocale(locale);
683 if (d_ptr->placeManager)
684 d_ptr->placeManager->setLocale(locale);
716 const auto availablePlugins = QGeoServiceProviderPrivate::plugins();
718 cleanedParameterMap = parameterMap;
719 for (
auto it = availablePlugins.keyBegin(), end = availablePlugins.keyEnd(); it != end; ++it) {
720 if (*it == providerName)
723 QVariantMap::iterator i = cleanedParameterMap.begin();
724 while (i != cleanedParameterMap.end()) {
726 if (i.key().startsWith(QString(*it + QLatin1Char(
'.'))))
727 i = cleanedParameterMap.erase(i);
737 metaData = QCborMap();
738 metaData.insert(QStringLiteral(
"index"), -1);
739 error = QGeoServiceProvider::NotSupportedError;
740 errorString = QString(QLatin1String(
"The geoservices provider %1 is not supported.")).arg(providerName);
742 const QList<QCborMap> candidates = QGeoServiceProviderPrivate::plugins().values(providerName);
744 int versionFound = -1;
749 for (qsizetype i = 0; i < candidates.size(); ++i) {
750 QCborMap meta = candidates[i];
751 if (meta.contains(QStringLiteral(
"Version"))
752 && meta.value(QStringLiteral(
"Version")).isInteger()
753 && meta.contains(QStringLiteral(
"Experimental"))
754 && meta.value(QStringLiteral(
"Experimental")).isBool()) {
755 int ver =
int(meta.value(QStringLiteral(
"Version")).toDouble());
756 if (ver > versionFound && !(!
experimental && meta.value(QStringLiteral(
"Experimental")).toBool())) {
764 error = QGeoServiceProvider::NoError;
765 errorString = QStringLiteral(
"");
766 metaData = candidates[idx];
772 Q_UNUSED(parameters);
774 if (
int(metaData.value(QStringLiteral(
"index")).toDouble()) < 0) {
775 error = QGeoServiceProvider::NotSupportedError;
776 errorString = QString(QLatin1String(
"The geoservices provider is not supported."));
781 error = QGeoServiceProvider::NoError;
782 errorString = QLatin1String(
"");
784 int idx =
int(metaData.value(QStringLiteral(
"index")).toDouble());
787 factory = qobject_cast<QGeoServiceProviderFactory *>(loader()->instance(idx));
789 error = QGeoServiceProvider::LoaderError;
790 errorString = QLatin1String(
"loader()->instance(idx) failed to return an instance. Set the environment variable QT_DEBUG_PLUGINS to see more details.");
813 QFactoryLoader *l = loader();
814 const QList<QPluginParsedMetaData> meta = l->metaData();
815 for (qsizetype i = 0; i < meta.size(); ++i) {
816 QCborMap obj = meta.at(i).value(QtPluginMetaDataKeys::MetaData).toMap();
817 obj.insert(QStringLiteral(
"index"), i);
818 list.insert(obj.value(QStringLiteral(
"Provider")).toString(), obj);