diff options
author | Aaron McCarthy <mccarthy.aaron@gmail.com> | 2013-07-17 23:43:43 +1000 |
---|---|---|
committer | The Qt Project <gerrit-noreply@qt-project.org> | 2013-07-26 08:19:47 +0200 |
commit | cfec9ee4fd3fb2633eda7fc65eae2adf3ee4643c (patch) | |
tree | cf5c33435b33823d3f1a45250f09520b92a1e12c /src/plugins/geoservices/nokia/placesv2 | |
parent | 8df09353686b3b9121e84788e84afc52a1a12de0 (diff) | |
download | qtlocation-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.cpp | 129 | ||||
-rw-r--r-- | src/plugins/geoservices/nokia/placesv2/qplacesearchreplyimpl.h | 5 |
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; }; |