diff options
author | Aaron McCarthy <aaron.mccarthy@nokia.com> | 2011-07-29 15:58:22 +1000 |
---|---|---|
committer | Qt by Nokia <qt-info@nokia.com> | 2011-07-29 08:01:13 +0200 |
commit | 4031ad616e4e5987d8a1e56dbaa13ff81c147837 (patch) | |
tree | 94c22acb32f5180117ceabb81dc1536b293d9a3b | |
parent | 987252cc1892c84a5f95990890bd991c470dc55d (diff) |
Share QGeoServiceProvider within QML.
QGeoServiceProvider is designed to provide cached instances of manager
objects, allowing a single manager to be used for the entire
application. This feature was not being used for QML applications as
all of the declarative elements were creating a new QGeoServiceProvider
based on the data provided in the Plugin element. This happened even if
the same Plugin element was used.
This commit adds a QGeoServiceProvider member to the Plugin element
which should be shared by all users of the Plugin element.
Change-Id: Ife62d52178a69ed4a700542f14dae861d7eab4e4
Reviewed-on: http://codereview.qt.nokia.com/2374
Reviewed-by: Qt Sanity Bot <qt_sanity_bot@ovi.com>
Reviewed-by: Aaron McCarthy <aaron.mccarthy@nokia.com>
8 files changed, 92 insertions, 80 deletions
diff --git a/src/imports/location/qdeclarativegeocodemodel.cpp b/src/imports/location/qdeclarativegeocodemodel.cpp index 4e3b6d20..35e0d92e 100644 --- a/src/imports/location/qdeclarativegeocodemodel.cpp +++ b/src/imports/location/qdeclarativegeocodemodel.cpp @@ -55,8 +55,6 @@ QDeclarativeGeocodeModel::QDeclarativeGeocodeModel(QObject* parent) complete_(false), reply_(0), plugin_(0), - serviceProvider_(0), - searchManager_(0), boundingArea_(0), status_(QDeclarativeGeocodeModel::Null), coordinate_(0), @@ -70,8 +68,6 @@ QDeclarativeGeocodeModel::QDeclarativeGeocodeModel(QObject* parent) QDeclarativeGeocodeModel::~QDeclarativeGeocodeModel() { - if (serviceProvider_) - delete serviceProvider_; qDeleteAll(declarativePlaces_); declarativePlaces_.clear(); if (reply_) @@ -100,7 +96,18 @@ void QDeclarativeGeocodeModel::update() { if (!complete_) return; - if (!searchManager_) { + + if (!plugin_) { + qmlInfo(this) << tr("Cannot geocode, plugin not set."); + return; + } + + QGeoServiceProvider *serviceProvider = plugin_->sharedGeoServiceProvider(); + if (!serviceProvider) + return; + + QGeoSearchManager *searchManager = serviceProvider->searchManager(); + if (!searchManager) { qmlInfo(this) << tr("Cannot geocode, search manager (/plugin) not set."); return; } @@ -114,9 +121,7 @@ void QDeclarativeGeocodeModel::update() if (coordinate_) { setStatus(QDeclarativeGeocodeModel::Loading); - reply_ = searchManager_->reverseGeocode( - coordinate_->coordinate(), - boundingArea()); + reply_ = searchManager->reverseGeocode(coordinate_->coordinate(), boundingArea()); if (reply_->isFinished()) { if (reply_->error() == QGeoSearchReply::NoError) { searchFinished(reply_); @@ -126,9 +131,7 @@ void QDeclarativeGeocodeModel::update() } } else if (address_) { setStatus(QDeclarativeGeocodeModel::Loading); - reply_ = searchManager_->geocode( - address_->address(), - boundingArea()); + reply_ = searchManager->geocode(address_->address(), boundingArea()); if (reply_->isFinished()) { if (reply_->error() == QGeoSearchReply::NoError) { searchFinished(reply_); @@ -183,22 +186,16 @@ void QDeclarativeGeocodeModel::setPlugin(QDeclarativeGeoServiceProvider *plugin) plugin_ = plugin; if (complete_) emit pluginChanged(); - serviceProvider_ = new QGeoServiceProvider(plugin_->name(), - plugin_->parameterMap()); - searchManager_ = serviceProvider_->searchManager(); - if (!searchManager_ || serviceProvider_->error() != QGeoServiceProvider::NoError) { + QGeoServiceProvider *serviceProvider = plugin_->sharedGeoServiceProvider(); + QGeoSearchManager *searchManager = serviceProvider->searchManager(); + if (!searchManager || serviceProvider->error() != QGeoServiceProvider::NoError) { qmlInfo(this) << tr("Warning: Plugin does not support (reverse) geocoding."); - searchManager_ = 0; return; } - connect(searchManager_, - SIGNAL(finished(QGeoSearchReply*)), - this, - SLOT(searchFinished(QGeoSearchReply*))); - connect(searchManager_, - SIGNAL(error(QGeoSearchReply*, QGeoSearchReply::Error, QString)), - this, - SLOT(searchError(QGeoSearchReply*, QGeoSearchReply::Error, QString))); + connect(searchManager, SIGNAL(finished(QGeoSearchReply*)), + this, SLOT(searchFinished(QGeoSearchReply*))); + connect(searchManager, SIGNAL(error(QGeoSearchReply*,QGeoSearchReply::Error,QString)), + this, SLOT(searchError(QGeoSearchReply*,QGeoSearchReply::Error,QString))); } QDeclarativeGeoServiceProvider* QDeclarativeGeocodeModel::plugin() const diff --git a/src/imports/location/qdeclarativegeocodemodel_p.h b/src/imports/location/qdeclarativegeocodemodel_p.h index bf48b3d9..80aabfb3 100644 --- a/src/imports/location/qdeclarativegeocodemodel_p.h +++ b/src/imports/location/qdeclarativegeocodemodel_p.h @@ -150,8 +150,6 @@ private: QGeoSearchReply* reply_; QDeclarativeGeoServiceProvider* plugin_; - QGeoServiceProvider* serviceProvider_; - QGeoSearchManager* searchManager_; QPointer<QObject> boundingArea_; QGeoBoundingBox boundingBox_; QGeoBoundingCircle boundingCircle_; diff --git a/src/imports/location/qdeclarativegeoroutemodel.cpp b/src/imports/location/qdeclarativegeoroutemodel.cpp index 91beeca1..70d8b1cb 100644 --- a/src/imports/location/qdeclarativegeoroutemodel.cpp +++ b/src/imports/location/qdeclarativegeoroutemodel.cpp @@ -53,8 +53,6 @@ QDeclarativeGeoRouteModel::QDeclarativeGeoRouteModel(QObject *parent) complete_(false), plugin_(0), routeQuery_(0), - serviceProvider_(0), - routingManager_(0), reply_(0), autoUpdate_(false), status_(QDeclarativeGeoRouteModel::Null) @@ -68,8 +66,6 @@ QDeclarativeGeoRouteModel::QDeclarativeGeoRouteModel(QObject *parent) QDeclarativeGeoRouteModel::~QDeclarativeGeoRouteModel() { - if (serviceProvider_) - delete serviceProvider_; if (!routes_.empty()) { qDeleteAll(routes_); routes_.clear(); @@ -163,22 +159,16 @@ void QDeclarativeGeoRouteModel::setPlugin(QDeclarativeGeoServiceProvider *plugin plugin_ = plugin; if (complete_) emit pluginChanged(); - serviceProvider_ = new QGeoServiceProvider(plugin_->name(), - plugin_->parameterMap()); - routingManager_ = serviceProvider_->routingManager(); - if (!routingManager_ || serviceProvider_->error() != QGeoServiceProvider::NoError) { + QGeoServiceProvider *serviceProvider = plugin_->sharedGeoServiceProvider(); + QGeoRoutingManager *routingManager = serviceProvider->routingManager(); + if (!routingManager || serviceProvider->error() != QGeoServiceProvider::NoError) { qmlInfo(this) << tr("Warning: Plugin does not support routing."); - routingManager_ = 0; return; } - connect(routingManager_, - SIGNAL(finished(QGeoRouteReply*)), - this, - SLOT(routingFinished(QGeoRouteReply*))); - connect(routingManager_, - SIGNAL(error(QGeoRouteReply*, QGeoRouteReply::Error, QString)), - this, - SLOT(routingError(QGeoRouteReply*, QGeoRouteReply::Error, QString))); + connect(routingManager, SIGNAL(finished(QGeoRouteReply*)), + this, SLOT(routingFinished(QGeoRouteReply*))); + connect(routingManager, SIGNAL(error(QGeoRouteReply*,QGeoRouteReply::Error,QString)), + this, SLOT(routingError(QGeoRouteReply*,QGeoRouteReply::Error,QString))); } void QDeclarativeGeoRouteModel::queryDetailsChanged() @@ -262,7 +252,18 @@ void QDeclarativeGeoRouteModel::update() { if (!complete_) return; - if (!routingManager_) { + + if (!plugin_) { + qmlInfo(this) << tr("Plugin not set, cannot route."); + return; + } + + QGeoServiceProvider *serviceProvider = plugin_->sharedGeoServiceProvider(); + if (!serviceProvider) + return; + + QGeoRoutingManager *routingManager = serviceProvider->routingManager(); + if (!routingManager) { qmlInfo(this) << tr("No routing manager available, cannot route."); return; } @@ -279,7 +280,7 @@ void QDeclarativeGeoRouteModel::update() setError(""); // clear previous error string - reply_ = routingManager_->calculateRoute(request); + reply_ = routingManager->calculateRoute(request); setStatus(QDeclarativeGeoRouteModel::Loading); if (reply_->isFinished()) { if (reply_->error() == QGeoRouteReply::NoError) { diff --git a/src/imports/location/qdeclarativegeoroutemodel_p.h b/src/imports/location/qdeclarativegeoroutemodel_p.h index 3c104583..0c290110 100644 --- a/src/imports/location/qdeclarativegeoroutemodel_p.h +++ b/src/imports/location/qdeclarativegeoroutemodel_p.h @@ -144,8 +144,6 @@ private: QDeclarativeGeoServiceProvider* plugin_; QDeclarativeGeoRouteQuery* routeQuery_; - QGeoServiceProvider* serviceProvider_; - QGeoRoutingManager* routingManager_; QGeoRouteReply* reply_; QList<QDeclarativeGeoRoute*> routes_; diff --git a/src/imports/location/qdeclarativegeoserviceprovider.cpp b/src/imports/location/qdeclarativegeoserviceprovider.cpp index 105e051d..ca57a50f 100644 --- a/src/imports/location/qdeclarativegeoserviceprovider.cpp +++ b/src/imports/location/qdeclarativegeoserviceprovider.cpp @@ -73,7 +73,10 @@ QDeclarativeGeoServiceProvider::QDeclarativeGeoServiceProvider(QObject *parent) { } -QDeclarativeGeoServiceProvider::~QDeclarativeGeoServiceProvider() {} +QDeclarativeGeoServiceProvider::~QDeclarativeGeoServiceProvider() +{ + delete sharedProvider_; +} /*! \qmlproperty string Plugin::name @@ -86,6 +89,8 @@ void QDeclarativeGeoServiceProvider::setName(const QString &name) return; name_ = name; + delete sharedProvider_; + sharedProvider_ = 0; if (complete_) updateSupportStatus(); emit nameChanged(name_); @@ -93,7 +98,7 @@ void QDeclarativeGeoServiceProvider::setName(const QString &name) void QDeclarativeGeoServiceProvider::updateSupportStatus() { - QGeoServiceProvider* serviceProvider = new QGeoServiceProvider(name(), parameterMap()); + QGeoServiceProvider *serviceProvider = sharedGeoServiceProvider(); if (!serviceProvider || serviceProvider->error() != QGeoServiceProvider::NoError) { setSupportsGeocoding(false); setSupportsReverseGeocoding(false); @@ -122,8 +127,6 @@ void QDeclarativeGeoServiceProvider::updateSupportStatus() setSupportsMapping(false); else setSupportsMapping(true); - - delete serviceProvider; } QStringList QDeclarativeGeoServiceProvider::availableServiceProviders() @@ -217,6 +220,14 @@ bool QDeclarativeGeoServiceProvider::supportsMapping() const return supportsMapping_; } +QGeoServiceProvider *QDeclarativeGeoServiceProvider::sharedGeoServiceProvider() +{ + if (!sharedProvider_) + sharedProvider_ = new QGeoServiceProvider(name(), parameterMap()); + + return sharedProvider_; +} + /*! \qmlproperty list<PluginParameter> Plugin::parameters \default @@ -236,6 +247,8 @@ QDeclarativeListProperty<QDeclarativeGeoServiceProviderParameter> QDeclarativeGe void QDeclarativeGeoServiceProvider::parameter_append(QDeclarativeListProperty<QDeclarativeGeoServiceProviderParameter> *prop, QDeclarativeGeoServiceProviderParameter *parameter) { static_cast<QDeclarativeGeoServiceProvider*>(prop->object)->parameters_.append(parameter); + delete static_cast<QDeclarativeGeoServiceProvider*>(prop->object)->sharedProvider_; + static_cast<QDeclarativeGeoServiceProvider*>(prop->object)->sharedProvider_ = 0; } int QDeclarativeGeoServiceProvider::parameter_count(QDeclarativeListProperty<QDeclarativeGeoServiceProviderParameter> *prop) @@ -251,6 +264,8 @@ QDeclarativeGeoServiceProviderParameter* QDeclarativeGeoServiceProvider::paramet void QDeclarativeGeoServiceProvider::parameter_clear(QDeclarativeListProperty<QDeclarativeGeoServiceProviderParameter> *prop) { static_cast<QDeclarativeGeoServiceProvider*>(prop->object)->parameters_.clear(); + delete static_cast<QDeclarativeGeoServiceProvider*>(prop->object)->sharedProvider_; + static_cast<QDeclarativeGeoServiceProvider*>(prop->object)->sharedProvider_ = 0; } QMap<QString, QVariant> QDeclarativeGeoServiceProvider::parameterMap() const diff --git a/src/imports/location/qdeclarativegeoserviceprovider_p.h b/src/imports/location/qdeclarativegeoserviceprovider_p.h index 0c377ae3..50678542 100644 --- a/src/imports/location/qdeclarativegeoserviceprovider_p.h +++ b/src/imports/location/qdeclarativegeoserviceprovider_p.h @@ -51,6 +51,8 @@ QT_BEGIN_NAMESPACE +class QGeoServiceProvider; + class QDeclarativeGeoServiceProviderParameter : public QObject { Q_OBJECT @@ -110,6 +112,8 @@ public: bool supportsRouting() const; bool supportsMapping() const; + QGeoServiceProvider *sharedGeoServiceProvider(); + Q_SIGNALS: void nameChanged(const QString &name); void supportsGeocodingChanged(); @@ -128,6 +132,7 @@ private: void setSupportsRouting(bool supports); void setSupportsMapping(bool supports); + QGeoServiceProvider *sharedProvider_; QString name_; QList<QDeclarativeGeoServiceProviderParameter*> parameters_; bool supportsGeocoding_; diff --git a/src/imports/location/qdeclarativegraphicsgeomap.cpp b/src/imports/location/qdeclarativegraphicsgeomap.cpp index 90994398..d07658b5 100644 --- a/src/imports/location/qdeclarativegraphicsgeomap.cpp +++ b/src/imports/location/qdeclarativegraphicsgeomap.cpp @@ -103,8 +103,6 @@ QT_BEGIN_NAMESPACE QDeclarativeGraphicsGeoMap::QDeclarativeGraphicsGeoMap(QDeclarativeItem *parent) : QDeclarativeItem(parent), plugin_(0), - serviceProvider_(0), - mappingManager_(0), mapData_(0), center_(0), initialCoordinate(0), @@ -136,8 +134,6 @@ QDeclarativeGraphicsGeoMap::~QDeclarativeGraphicsGeoMap() } delete mapData_; } - if (serviceProvider_) - delete serviceProvider_; if (initialCoordinate) { delete initialCoordinate; @@ -249,25 +245,17 @@ void QDeclarativeGraphicsGeoMap::setPlugin(QDeclarativeGeoServiceProvider *plugi } plugin_ = plugin; emit pluginChanged(plugin_); - serviceProvider_ = new QGeoServiceProvider(plugin_->name(), - plugin_->parameterMap()); - - if (serviceProvider_->error() != QGeoServiceProvider::NoError) { - qWarning() << serviceProvider_->errorString(); - delete serviceProvider_; - serviceProvider_ = 0; + QGeoServiceProvider *serviceProvider = plugin_->sharedGeoServiceProvider(); + if (serviceProvider->error() != QGeoServiceProvider::NoError) { + qWarning() << serviceProvider->errorString(); return; } - mappingManager_ = serviceProvider_->mappingManager(); - if (!mappingManager_ || serviceProvider_->error() != QGeoServiceProvider::NoError) { - qWarning() << serviceProvider_->errorString(); - delete serviceProvider_; - serviceProvider_ = 0; - delete mappingManager_; - mappingManager_ = 0; + QGeoMappingManager *mappingManager = serviceProvider->mappingManager(); + if (!mappingManager || serviceProvider->error() != QGeoServiceProvider::NoError) { + qWarning() << serviceProvider->errorString(); return; } - mapData_ = mappingManager_->createMapData(); + mapData_ = mappingManager->createMapData(); mapData_->init(); //mapData_->setParentItem(this); @@ -334,10 +322,16 @@ QDeclarativeGeoServiceProvider* QDeclarativeGraphicsGeoMap::plugin() const */ qreal QDeclarativeGraphicsGeoMap::minimumZoomLevel() const { - if (mappingManager_) - return mappingManager_->minimumZoomLevel(); - else - return -1.0; + if (plugin_) { + QGeoServiceProvider *serviceProvider = plugin_->sharedGeoServiceProvider(); + if (serviceProvider) { + QGeoMappingManager *mappingManager = serviceProvider->mappingManager(); + if (mappingManager) + return mappingManager->minimumZoomLevel(); + } + } + + return -1.0; } /*! @@ -347,10 +341,16 @@ qreal QDeclarativeGraphicsGeoMap::minimumZoomLevel() const */ qreal QDeclarativeGraphicsGeoMap::maximumZoomLevel() const { - if (mappingManager_) - return mappingManager_->maximumZoomLevel(); - else - return -1.0; + if (plugin_) { + QGeoServiceProvider *serviceProvider = plugin_->sharedGeoServiceProvider(); + if (serviceProvider) { + QGeoMappingManager *mappingManager = serviceProvider->mappingManager(); + if (mappingManager) + return mappingManager->maximumZoomLevel(); + } + } + + return -1.0; } // TODO make these more QML like diff --git a/src/imports/location/qdeclarativegraphicsgeomap_p.h b/src/imports/location/qdeclarativegraphicsgeomap_p.h index 5b217ed5..fb13b51c 100644 --- a/src/imports/location/qdeclarativegraphicsgeomap_p.h +++ b/src/imports/location/qdeclarativegraphicsgeomap_p.h @@ -185,8 +185,6 @@ private: QDeclarativeGeoMapMouseEvent* createMapMouseEvent(QGraphicsSceneHoverEvent *event); QDeclarativeGeoServiceProvider* plugin_; - QGeoServiceProvider* serviceProvider_; - QGeoMappingManager* mappingManager_; QGeoMapData* mapData_; qreal zoomLevel_; |