diff options
author | Paolo Angelelli <paolo.angelelli@qt.io> | 2018-03-19 13:36:25 +0100 |
---|---|---|
committer | Paolo Angelelli <paolo.angelelli@qt.io> | 2018-03-20 10:12:07 +0000 |
commit | 1ced79ad7cc256eb82113e3419cb09926ceae9c3 (patch) | |
tree | 64ad3f777fbf2b89075fb81fe4dcf63ee2128573 /src | |
parent | a7de94c0a26d46cd6547529ad558fc172e32e325 (diff) | |
download | qtlocation-1ced79ad7cc256eb82113e3419cb09926ceae9c3.tar.gz |
QGeoServiceProviderFactory: Restore binary compatibility to Qt 5.10
Added a new QGeoServiceProviderFactoryV2 to load plugins offering
a navigation manager engine.
To be able to still load plugins compiled against Qt 5.10, both factories
are considered when loading plugins, using the pointer to the V2 only
when accessing the newly exposed functionality.
Change-Id: I8e5e868737c77142e77caaacef278686565928df
Reviewed-by: Alex Blasche <alexander.blasche@qt.io>
Diffstat (limited to 'src')
-rw-r--r-- | src/location/maps/qgeoserviceprovider.cpp | 14 | ||||
-rw-r--r-- | src/location/maps/qgeoserviceprovider_p.h | 2 | ||||
-rw-r--r-- | src/location/maps/qgeoserviceproviderfactory.cpp | 27 | ||||
-rw-r--r-- | src/location/maps/qgeoserviceproviderfactory.h | 16 |
4 files changed, 51 insertions, 8 deletions
diff --git a/src/location/maps/qgeoserviceprovider.cpp b/src/location/maps/qgeoserviceprovider.cpp index fef4a826..79e27ff0 100644 --- a/src/location/maps/qgeoserviceprovider.cpp +++ b/src/location/maps/qgeoserviceprovider.cpp @@ -360,7 +360,9 @@ template <> QPlaceManagerEngine *createEngine<QPlaceManagerEngine>(QGeoServicePr } template <> QNavigationManagerEngine *createEngine<QNavigationManagerEngine>(QGeoServiceProviderPrivate *d_ptr) { - return d_ptr->factory->createNavigationManagerEngine(d_ptr->cleanedParameterMap, &(d_ptr->placeError), &(d_ptr->placeErrorString)); + if (!d_ptr->factoryV2) + return nullptr; + return d_ptr->factoryV2->createNavigationManagerEngine(d_ptr->cleanedParameterMap, &(d_ptr->placeError), &(d_ptr->placeErrorString)); } /* Template for generating the code for each of the geocodingManager(), @@ -656,7 +658,7 @@ void QGeoServiceProviderPrivate::unload() delete navigationManager; navigationManager = nullptr; - factory = 0; + factory = factoryV2 = nullptr; error = QGeoServiceProvider::NoError; errorString = QLatin1String(""); metaData = QJsonObject(); @@ -686,7 +688,7 @@ void QGeoServiceProviderPrivate::filterParameterMap() void QGeoServiceProviderPrivate::loadMeta() { - factory = 0; + factory = factoryV2 = nullptr; metaData = QJsonObject(); metaData.insert(QStringLiteral("index"), -1); error = QGeoServiceProvider::NotSupportedError; @@ -727,7 +729,7 @@ void QGeoServiceProviderPrivate::loadPlugin(const QVariantMap ¶meters) if (int(metaData.value(QStringLiteral("index")).toDouble()) < 0) { error = QGeoServiceProvider::NotSupportedError; errorString = QString(QLatin1String("The geoservices provider is not supported.")); - factory = 0; + factory = factoryV2 = nullptr; return; } @@ -737,7 +739,9 @@ void QGeoServiceProviderPrivate::loadPlugin(const QVariantMap ¶meters) int idx = int(metaData.value(QStringLiteral("index")).toDouble()); // load the actual plugin - factory = qobject_cast<QGeoServiceProviderFactory *>(loader()->instance(idx)); + QObject *instance = loader()->instance(idx); + factory = qobject_cast<QGeoServiceProviderFactory *>(instance); + factoryV2 = qobject_cast<QGeoServiceProviderFactoryV2 *>(instance); } QHash<QString, QJsonObject> QGeoServiceProviderPrivate::plugins(bool reload) diff --git a/src/location/maps/qgeoserviceprovider_p.h b/src/location/maps/qgeoserviceprovider_p.h index 1aaa498c..11b86bad 100644 --- a/src/location/maps/qgeoserviceprovider_p.h +++ b/src/location/maps/qgeoserviceprovider_p.h @@ -62,6 +62,7 @@ class QGeoRoutingManager; class QGeoMappingManager; class QGeoServiceProviderFactory; +class QGeoServiceProviderFactoryV2; class QGeoServiceProviderPrivate { @@ -82,6 +83,7 @@ public: Flags features(const char *enumName); QGeoServiceProviderFactory *factory; + QGeoServiceProviderFactoryV2 *factoryV2 = nullptr; QJsonObject metaData; QVariantMap parameterMap; diff --git a/src/location/maps/qgeoserviceproviderfactory.cpp b/src/location/maps/qgeoserviceproviderfactory.cpp index c8192a32..44ed3535 100644 --- a/src/location/maps/qgeoserviceproviderfactory.cpp +++ b/src/location/maps/qgeoserviceproviderfactory.cpp @@ -43,6 +43,7 @@ QT_BEGIN_NAMESPACE \inmodule QtLocation \ingroup QtLocation-impl \since 5.6 + \deprecated \brief The QGeoServiceProviderFactory class is a factory class used as the plugin interface for services related to geographical information. @@ -52,6 +53,8 @@ QT_BEGIN_NAMESPACE The other functions should be overridden if the plugin supports the associated set of functionality. + + \sa QGeoServiceProviderFactoryV2 */ /*! @@ -161,6 +164,28 @@ QPlaceManagerEngine *QGeoServiceProviderFactory::createPlaceManagerEngine(const } /*! + \class QGeoServiceProviderFactoryV2 + \inmodule QtLocation + \ingroup QtLocation-impl + \since 5.11 + + \brief The QGeoServiceProviderFactoryV2 class is a factory class used as the + plugin interface for services related to geographical information. + + Implementers must provide a unique combination of providerName() and + providerVersion() per plugin. + + The other functions should be overridden if the plugin supports the + associated set of functionality. +*/ + +/*! +\fn QGeoServiceProviderFactoryV2::~QGeoServiceProviderFactoryV2() + +Destroys this QGeoServiceProviderFactoryV2 instance. +*/ + +/*! Returns a new QNavigationManagerEngine instance, initialized with \a parameters, which implements navigation functionality. @@ -173,7 +198,7 @@ QPlaceManagerEngine *QGeoServiceProviderFactory::createPlaceManagerEngine(const The default implementation returns nullptr, which causes a QGeoServiceProvider::NotSupportedError in QGeoServiceProvider. */ -QNavigationManagerEngine *QGeoServiceProviderFactory::createNavigationManagerEngine(const QVariantMap ¶meters, QGeoServiceProvider::Error *error, QString *errorString) const +QNavigationManagerEngine *QGeoServiceProviderFactoryV2::createNavigationManagerEngine(const QVariantMap ¶meters, QGeoServiceProvider::Error *error, QString *errorString) const { Q_UNUSED(parameters) Q_UNUSED(error) diff --git a/src/location/maps/qgeoserviceproviderfactory.h b/src/location/maps/qgeoserviceproviderfactory.h index e1164189..1eb93a18 100644 --- a/src/location/maps/qgeoserviceproviderfactory.h +++ b/src/location/maps/qgeoserviceproviderfactory.h @@ -62,13 +62,25 @@ public: virtual QPlaceManagerEngine *createPlaceManagerEngine(const QVariantMap ¶meters, QGeoServiceProvider::Error *error, QString *errorString) const; +}; + +Q_DECLARE_INTERFACE(QGeoServiceProviderFactory, + "org.qt-project.qt.geoservice.serviceproviderfactory/5.0") + +class Q_LOCATION_EXPORT QGeoServiceProviderFactoryV2 : public QGeoServiceProviderFactory +{ +public: + virtual ~QGeoServiceProviderFactoryV2() {} + virtual QNavigationManagerEngine *createNavigationManagerEngine(const QVariantMap ¶meters, QGeoServiceProvider::Error *error, QString *errorString) const; }; -Q_DECLARE_INTERFACE(QGeoServiceProviderFactory, - "org.qt-project.qt.geoservice.serviceproviderfactory/5.0") +// Although not actually used for constructing a specialized loader, this is required for +// casting a QObject * into QGeoServiceProviderFactoryV2 * +Q_DECLARE_INTERFACE(QGeoServiceProviderFactoryV2, + "org.qt-project.qt.geoservice.serviceproviderfactoryV2/5.0") QT_END_NAMESPACE |