summaryrefslogtreecommitdiff
path: root/src/plugins/geoservices/nokia/placesv2
diff options
context:
space:
mode:
authorAaron McCarthy <mccarthy.aaron@gmail.com>2013-07-17 23:43:43 +1000
committerThe Qt Project <gerrit-noreply@qt-project.org>2013-07-26 08:19:47 +0200
commitcfec9ee4fd3fb2633eda7fc65eae2adf3ee4643c (patch)
treecf5c33435b33823d3f1a45250f09520b92a1e12c /src/plugins/geoservices/nokia/placesv2
parent8df09353686b3b9121e84788e84afc52a1a12de0 (diff)
downloadqtlocation-cfec9ee4fd3fb2633eda7fc65eae2adf3ee4643c.tar.gz
Support explore functionality.
Add support for Nokia's explore functionality in places. This adds the ProposedSearchResult search result type. The proposed search result has a QPlaceSearchRequest, which can be submitted to QPlaceManager::search() to perform the proposed search. This has the added advantage that any arbitrary search request can be returned as a search result. To facilitate this further a search context field has been added to the place search request. This field can be used by backends to store additional search context. Other relevant fields should also be filled in. This allows additional search context to be kept. The Nokia v2 places implementation has be updated to use the explore feature and to return ProposedSearchResults as well as place results. Task-number: QTBUG-24874 Change-Id: Ib20c5a8c8a60e6bf16f38dcd75961a752b8b1b32 Reviewed-by: Alex <alexander.blasche@digia.com>
Diffstat (limited to 'src/plugins/geoservices/nokia/placesv2')
-rw-r--r--src/plugins/geoservices/nokia/placesv2/qplacesearchreplyimpl.cpp129
-rw-r--r--src/plugins/geoservices/nokia/placesv2/qplacesearchreplyimpl.h5
2 files changed, 81 insertions, 53 deletions
diff --git a/src/plugins/geoservices/nokia/placesv2/qplacesearchreplyimpl.cpp b/src/plugins/geoservices/nokia/placesv2/qplacesearchreplyimpl.cpp
index 94a087e8..41f1c73e 100644
--- a/src/plugins/geoservices/nokia/placesv2/qplacesearchreplyimpl.cpp
+++ b/src/plugins/geoservices/nokia/placesv2/qplacesearchreplyimpl.cpp
@@ -57,6 +57,7 @@
#include <QtCore/QJsonArray>
#include <QtLocation/QPlaceIcon>
#include <QtLocation/QPlaceResult>
+#include <QtLocation/QProposedSearchResult>
#include <QtCore/QDebug>
@@ -123,85 +124,107 @@ void QPlaceSearchReplyImpl::replyFinished()
QJsonObject object = document.object();
//QJsonObject searchObject = object.value(QLatin1String("search")).toObject();
- QJsonArray items;
- if (request().recommendationId().isEmpty()) {
- QJsonObject resultsObject = object.value(QLatin1String("results")).toObject();
- items = resultsObject.value(QLatin1String("items")).toArray();
- } else {
- items = object.value(QLatin1String("items")).toArray();
- }
+
+ QJsonObject resultsObject = object.value(QLatin1String("results")).toObject();
+ QJsonArray items = resultsObject.value(QLatin1String("items")).toArray();
QList<QPlaceSearchResult> results;
for (int i = 0; i < items.count(); ++i) {
QJsonObject item = items.at(i).toObject();
- QPlaceResult result;
+ const QString type = item.value(QLatin1String("type")).toString();
+ if (type == QStringLiteral("urn:nlp-types:place"))
+ results.append(parsePlaceResult(item));
+ else if (type == QStringLiteral("urn:nlp-types:search"))
+ results.append(parseSearchResult(item));
+ }
- if (item.contains(QLatin1String("distance")))
- result.setDistance(item.value(QLatin1String("distance")).toDouble());
+ setResults(results);
- QPlace place;
+ m_reply->deleteLater();
+ m_reply = 0;
- QGeoLocation location;
+ setFinished(true);
+ emit finished();
+}
- location.setCoordinate(parseCoordinate(item.value(QLatin1String("position")).toArray()));
+QPlaceResult QPlaceSearchReplyImpl::parsePlaceResult(const QJsonObject &item) const
+{
+ QPlaceResult result;
- const QString vicinity = item.value(QLatin1String("vicinity")).toString();
- QGeoAddress address;
- address.setText(vicinity);
- location.setAddress(address);
+ if (item.contains(QLatin1String("distance")))
+ result.setDistance(item.value(QLatin1String("distance")).toDouble());
- if (item.contains(QLatin1String("bbox"))) {
- QJsonArray bbox = item.value(QLatin1String("bbox")).toArray();
- QGeoRectangle box(QGeoCoordinate(bbox.at(3).toDouble(), bbox.at(0).toDouble()),
- QGeoCoordinate(bbox.at(1).toDouble(), bbox.at(2).toDouble()));
- location.setBoundingBox(box);
- }
+ QPlace place;
- place.setLocation(location);
+ QGeoLocation location;
- QPlaceRatings ratings;
- ratings.setAverage(item.value(QLatin1String("averageRating")).toDouble());
- ratings.setMaximum(5.0);
- place.setRatings(ratings);
+ location.setCoordinate(parseCoordinate(item.value(QLatin1String("position")).toArray()));
- const QString title = item.value(QLatin1String("title")).toString();
- place.setName(title);
- result.setTitle(title);
+ const QString vicinity = item.value(QLatin1String("vicinity")).toString();
+ QGeoAddress address;
+ address.setText(vicinity);
+ location.setAddress(address);
- QPlaceIcon icon = m_engine->icon(item.value(QLatin1String("icon")).toString());
- place.setIcon(icon);
- result.setIcon(icon);
+ if (item.contains(QLatin1String("bbox"))) {
+ QJsonArray bbox = item.value(QLatin1String("bbox")).toArray();
+ QGeoRectangle box(QGeoCoordinate(bbox.at(3).toDouble(), bbox.at(0).toDouble()),
+ QGeoCoordinate(bbox.at(1).toDouble(), bbox.at(2).toDouble()));
+ location.setBoundingBox(box);
+ }
- place.setCategory(parseCategory(item.value(QLatin1String("category")).toObject(),
- m_engine));
+ place.setLocation(location);
- //QJsonArray having = item.value(QLatin1String("having")).toArray();
+ QPlaceRatings ratings;
+ ratings.setAverage(item.value(QLatin1String("averageRating")).toDouble());
+ ratings.setMaximum(5.0);
+ place.setRatings(ratings);
- result.setSponsored(item.value(QLatin1String("sponsored")).toBool());
+ const QString title = item.value(QLatin1String("title")).toString();
+ place.setName(title);
+ result.setTitle(title);
- QUrl href = item.value(QLatin1String("href")).toString();
- //QUrl type = item.value(QLatin1String("type")).toString();
+ QPlaceIcon icon = m_engine->icon(item.value(QLatin1String("icon")).toString());
+ place.setIcon(icon);
+ result.setIcon(icon);
- place.setPlaceId(href.path().mid(18, 41));
+ place.setCategory(parseCategory(item.value(QLatin1String("category")).toObject(),
+ m_engine));
- QPlaceAttribute provider;
- provider.setText(QLatin1String("nokia"));
- place.setExtendedAttribute(QPlaceAttribute::Provider, provider);
- place.setVisibility(QLocation::PublicVisibility);
+ //QJsonArray having = item.value(QLatin1String("having")).toArray();
- result.setPlace(place);
+ result.setSponsored(item.value(QLatin1String("sponsored")).toBool());
- results.append(result);
- }
+ QUrl href = item.value(QLatin1String("href")).toString();
+ //QUrl type = item.value(QLatin1String("type")).toString();
- setResults(results);
+ place.setPlaceId(href.path().mid(18, 41));
- m_reply->deleteLater();
- m_reply = 0;
+ QPlaceAttribute provider;
+ provider.setText(QLatin1String("nokia"));
+ place.setExtendedAttribute(QPlaceAttribute::Provider, provider);
+ place.setVisibility(QLocation::PublicVisibility);
- setFinished(true);
- emit finished();
+ result.setPlace(place);
+
+ return result;
+}
+
+QProposedSearchResult QPlaceSearchReplyImpl::parseSearchResult(const QJsonObject &item) const
+{
+ QProposedSearchResult result;
+
+ result.setTitle(item.value(QLatin1String("title")).toString());
+
+ QPlaceIcon icon = m_engine->icon(item.value(QStringLiteral("icon")).toString());
+ result.setIcon(icon);
+
+ QPlaceSearchRequest request;
+ request.setSearchContext(QUrl(item.value("href").toString()));
+
+ result.setSearchRequest(request);
+
+ return result;
}
QT_END_NAMESPACE
diff --git a/src/plugins/geoservices/nokia/placesv2/qplacesearchreplyimpl.h b/src/plugins/geoservices/nokia/placesv2/qplacesearchreplyimpl.h
index 887147d8..a7871653 100644
--- a/src/plugins/geoservices/nokia/placesv2/qplacesearchreplyimpl.h
+++ b/src/plugins/geoservices/nokia/placesv2/qplacesearchreplyimpl.h
@@ -55,6 +55,8 @@
QT_BEGIN_NAMESPACE
class QPlaceManagerEngineNokiaV2;
+class QPlaceResult;
+class QProposedSearchResult;
class QPlaceSearchReplyImpl : public QPlaceSearchReply
{
@@ -73,6 +75,9 @@ private slots:
void replyFinished();
private:
+ QPlaceResult parsePlaceResult(const QJsonObject &item) const;
+ QProposedSearchResult parseSearchResult(const QJsonObject &item) const;
+
QNetworkReply *m_reply;
QPlaceManagerEngineNokiaV2 *m_engine;
};