summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAaron McCarthy <aaron.mccarthy@nokia.com>2011-07-29 15:58:22 +1000
committerQt by Nokia <qt-info@nokia.com>2011-07-29 08:01:13 +0200
commit4031ad616e4e5987d8a1e56dbaa13ff81c147837 (patch)
tree94c22acb32f5180117ceabb81dc1536b293d9a3b
parent987252cc1892c84a5f95990890bd991c470dc55d (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>
-rw-r--r--src/imports/location/qdeclarativegeocodemodel.cpp45
-rw-r--r--src/imports/location/qdeclarativegeocodemodel_p.h2
-rw-r--r--src/imports/location/qdeclarativegeoroutemodel.cpp39
-rw-r--r--src/imports/location/qdeclarativegeoroutemodel_p.h2
-rw-r--r--src/imports/location/qdeclarativegeoserviceprovider.cpp23
-rw-r--r--src/imports/location/qdeclarativegeoserviceprovider_p.h5
-rw-r--r--src/imports/location/qdeclarativegraphicsgeomap.cpp54
-rw-r--r--src/imports/location/qdeclarativegraphicsgeomap_p.h2
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_;