203QGeoServiceProvider::QGeoServiceProvider(
const QString &providerName,
204 const QVariantMap ¶meters,
205 bool allowExperimental)
206 : d_ptr(
new QGeoServiceProviderPrivate())
208 d_ptr->experimental = allowExperimental;
209 d_ptr->parameterMap = parameters;
211 if (providerName == QStringLiteral(
"nokia"))
212 d_ptr->providerName = QStringLiteral(
"here");
214 d_ptr->providerName = providerName;
232 const QMetaObject *mo = &QGeoServiceProvider::staticMetaObject;
233 const QMetaEnum en = mo->enumerator(
234 mo->indexOfEnumerator(enumName));
237
238 Flags ret =
typename Flags::enum_type(0);
239 if (
this->metaData.contains(QStringLiteral(
"Features"))
240 &&
this->metaData.value(QStringLiteral(
"Features")).isArray()) {
241 const QCborArray features =
this->metaData.value(QStringLiteral(
"Features")).toArray();
242 for (
const QCborValueConstRef v : features) {
243 int val = en.keyToValue(v.toString().toLatin1().constData());
244 if (v.isString() && val != -1) {
245 ret |=
typename Flags::enum_type(val);
324 QString *_errorString)
327 QGeoServiceProvider::Error &error = *_error;
328 QString &errorString = *_errorString;
329 Manager *manager =
nullptr;
333 loadPlugin(
this->parameterMap);
338 errorString =
this->errorString;
343 Engine *engine = createEngine<Engine>(
this);
347 engine->setManagerName(
348 metaData.value(QStringLiteral(
"Provider")).toString());
349 engine->setManagerVersion(
350 int(metaData.value(QStringLiteral(
"Version")).toDouble()));
351 manager =
new Manager(engine);
352 }
else if (error == QGeoServiceProvider::NoError) {
353 error = QGeoServiceProvider::NotSupportedError;
354 errorString = QLatin1String(
"The service provider does not support the %1 type.")
355 .arg(QLatin1String(Manager::staticMetaObject.className()));
358 if (error != QGeoServiceProvider::NoError) {
362 this->errorString = errorString;
366 manager->setLocale(locale);
370 this->error = QGeoServiceProvider::NoError;
371 this->errorString.clear();
398QGeoCodingManager *QGeoServiceProvider::geocodingManager()
const
400 if (!d_ptr->geocodingManager) {
401 d_ptr->geocodingManager.reset(d_ptr->manager<QGeoCodingManager, QGeoCodingManagerEngine>(
402 &(d_ptr->geocodeError), &(d_ptr->geocodeErrorString)));
403 if (!d_ptr->geocodingManager)
404 qDebug() << d_ptr->error <<
", " << d_ptr->errorString;
406 return d_ptr->geocodingManager.get();
431QGeoMappingManager *QGeoServiceProvider::mappingManager()
const
433 if (!d_ptr->mappingManager) {
434 d_ptr->mappingManager.reset(d_ptr->manager<QGeoMappingManager, QGeoMappingManagerEngine>(
435 &(d_ptr->mappingError), &(d_ptr->mappingErrorString)));
436 if (!d_ptr->mappingManager)
437 qDebug() << d_ptr->error <<
", " << d_ptr->errorString;
439 return d_ptr->mappingManager.get();
462QGeoRoutingManager *QGeoServiceProvider::routingManager()
const
464 if (!d_ptr->routingManager) {
465 d_ptr->routingManager.reset(d_ptr->manager<QGeoRoutingManager, QGeoRoutingManagerEngine>(
466 &(d_ptr->routingError), &(d_ptr->routingErrorString)));
467 if (!d_ptr->routingManager)
468 qDebug() << d_ptr->error <<
", " << d_ptr->errorString;
470 return d_ptr->routingManager.get();
489QPlaceManager *QGeoServiceProvider::placeManager()
const
491 if (!d_ptr->placeManager) {
492 d_ptr->placeManager.reset(d_ptr->manager<QPlaceManager, QPlaceManagerEngine>(
493 &(d_ptr->placeError), &(d_ptr->placeErrorString)));
494 if (!d_ptr->placeManager)
495 qDebug() << d_ptr->error <<
", " << d_ptr->errorString;
497 return d_ptr->placeManager.get();
673void QGeoServiceProvider::setLocale(
const QLocale &locale)
675 d_ptr->locale = locale;
676 d_ptr->localeSet =
true;
678 if (d_ptr->geocodingManager)
679 d_ptr->geocodingManager->setLocale(locale);
680 if (d_ptr->routingManager)
681 d_ptr->routingManager->setLocale(locale);
682 if (d_ptr->mappingManager)
683 d_ptr->mappingManager->setLocale(locale);
684 if (d_ptr->placeManager)
685 d_ptr->placeManager->setLocale(locale);
717 const auto availablePlugins = QGeoServiceProviderPrivate::plugins();
719 cleanedParameterMap = parameterMap;
720 for (
auto it = availablePlugins.keyBegin(), end = availablePlugins.keyEnd(); it != end; ++it) {
721 if (*it == providerName)
724 QVariantMap::iterator i = cleanedParameterMap.begin();
725 while (i != cleanedParameterMap.end()) {
727 if (i.key().startsWith(QString(*it + QLatin1Char(
'.'))))
728 i = cleanedParameterMap.erase(i);
738 metaData = QCborMap();
739 metaData.insert(QStringLiteral(
"index"), -1);
740 error = QGeoServiceProvider::NotSupportedError;
741 errorString = QString(QLatin1String(
"The geoservices provider %1 is not supported.")).arg(providerName);
743 const QList<QCborMap> candidates = QGeoServiceProviderPrivate::plugins().values(providerName);
745 int versionFound = -1;
750 for (qsizetype i = 0; i < candidates.size(); ++i) {
751 QCborMap meta = candidates[i];
752 if (meta.contains(QStringLiteral(
"Version"))
753 && meta.value(QStringLiteral(
"Version")).isInteger()
754 && meta.contains(QStringLiteral(
"Experimental"))
755 && meta.value(QStringLiteral(
"Experimental")).isBool()) {
756 int ver =
int(meta.value(QStringLiteral(
"Version")).toDouble());
757 if (ver > versionFound && !(!
experimental && meta.value(QStringLiteral(
"Experimental")).toBool())) {
765 error = QGeoServiceProvider::NoError;
766 errorString = QStringLiteral(
"");
767 metaData = candidates[idx];
773 Q_UNUSED(parameters);
775 if (
int(metaData.value(QStringLiteral(
"index")).toDouble()) < 0) {
776 error = QGeoServiceProvider::NotSupportedError;
777 errorString = QString(QLatin1String(
"The geoservices provider is not supported."));
782 error = QGeoServiceProvider::NoError;
783 errorString = QLatin1String(
"");
785 int idx =
int(metaData.value(QStringLiteral(
"index")).toDouble());
788 factory = qobject_cast<QGeoServiceProviderFactory *>(loader()->instance(idx));
790 error = QGeoServiceProvider::LoaderError;
791 errorString = QLatin1String(
"loader()->instance(idx) failed to return an instance. Set the environment variable QT_DEBUG_PLUGINS to see more details.");
814 QFactoryLoader *l = loader();
815 const QList<QPluginParsedMetaData> meta = l->metaData();
816 for (qsizetype i = 0; i < meta.size(); ++i) {
817 QCborMap obj = meta.at(i).value(QtPluginMetaDataKeys::MetaData).toMap();
818 obj.insert(QStringLiteral(
"index"), i);
819 list.insert(obj.value(QStringLiteral(
"Provider")).toString(), obj);