6#include "../qplacemanagerengine_nokiav2.h"
7#include "../qgeoerror_messages.h"
9#include <QCoreApplication>
10#include <QtCore/QJsonDocument>
11#include <QtCore/QJsonObject>
12#include <QtCore/QJsonArray>
13#include <QtPositioning/QGeoAddress>
14#include <QtPositioning/QGeoLocation>
15#include <QtPositioning/QGeoRectangle>
16#include <QtLocation/QPlace>
17#include <QtLocation/QPlaceAttribute>
18#include <QtLocation/QPlaceIcon>
19#include <QtLocation/QPlaceResult>
20#include <QtLocation/QPlaceRatings>
21#include <QtLocation/QPlaceProposedSearchResult>
22#include <QtLocation/private/qplacesearchrequest_p.h>
24#include <QtCore/QDebug>
28QPlaceSearchReplyHere::QPlaceSearchReplyHere(
const QPlaceSearchRequest &request,
30 QPlaceManagerEngineNokiaV2 *parent)
31 : QPlaceSearchReply(parent), m_engine(parent)
34 setError(UnknownError, QStringLiteral(
"Null reply"));
39 connect(reply, &QNetworkReply::finished,
40 this, &QPlaceSearchReplyHere::replyFinished);
41 connect(reply, &QNetworkReply::errorOccurred,
42 this, &QPlaceSearchReplyHere::replyError);
43 connect(
this, &QPlaceReply::aborted, reply, &QNetworkReply::abort);
44 connect(
this, &QObject::destroyed, reply, &QObject::deleteLater);
53 QPlaceReply::setError(error_, errorString);
54 emit errorOccurred(error_, errorString);
61 QNetworkReply *reply =
static_cast<QNetworkReply *>(sender());
64 if (reply->error() != QNetworkReply::NoError)
67 QJsonDocument document = QJsonDocument::fromJson(reply->readAll());
68 if (!document.isObject()) {
69 setError(ParseError, QCoreApplication::translate(NOKIA_PLUGIN_CONTEXT_NAME, PARSE_ERROR));
73 QJsonObject resultsObject = document.object();
75 if (resultsObject.contains(QStringLiteral(
"results")))
76 resultsObject = resultsObject.value(QStringLiteral(
"results")).toObject();
78 QJsonArray items = resultsObject.value(QStringLiteral(
"items")).toArray();
80 QList<QPlaceSearchResult> results;
81 for (
int i = 0; i < items.count(); ++i) {
82 QJsonObject item = items.at(i).toObject();
84 const QString type = item.value(QStringLiteral(
"type")).toString();
85 if (type == QStringLiteral(
"urn:nlp-types:place"))
86 results.append(parsePlaceResult(item));
87 else if (type == QStringLiteral(
"urn:nlp-types:search"))
88 results.append(parseSearchResult(item));
91 QPlaceSearchRequest r_orig = request();
92 QPlaceSearchRequestPrivate *rpimpl_orig = QPlaceSearchRequestPrivate::get(r_orig);
94 if (resultsObject.contains(QStringLiteral(
"next"))) {
95 QPlaceSearchRequest request;
96 request.setSearchContext(QUrl(resultsObject.value(QStringLiteral(
"next")).toString()));
97 QPlaceSearchRequestPrivate *rpimpl = QPlaceSearchRequestPrivate::get(request);
98 rpimpl->related =
true;
99 rpimpl->page = rpimpl_orig->page + 1;
100 setNextPageRequest(request);
103 if (resultsObject.contains(QStringLiteral(
"previous"))) {
104 QPlaceSearchRequest request;
105 request.setSearchContext(QUrl(resultsObject.value(QStringLiteral(
"previous")).toString()));
106 QPlaceSearchRequestPrivate *rpimpl = QPlaceSearchRequestPrivate::get(request);
107 rpimpl->related =
true;
108 rpimpl->page = rpimpl_orig->page - 1;
109 setPreviousPageRequest(request);
122 if (item.contains(QStringLiteral(
"distance")))
123 result.setDistance(item.value(QStringLiteral(
"distance")).toDouble());
127 QGeoLocation location;
129 location.setCoordinate(parseCoordinate(item.value(QStringLiteral(
"position")).toArray()));
131 const QString vicinity = item.value(QStringLiteral(
"vicinity")).toString();
133 address.setText(vicinity);
134 location.setAddress(address);
136 if (item.contains(QStringLiteral(
"bbox"))) {
137 QJsonArray bbox = item.value(QStringLiteral(
"bbox")).toArray();
138 QGeoRectangle box(QGeoCoordinate(bbox.at(3).toDouble(), bbox.at(0).toDouble()),
139 QGeoCoordinate(bbox.at(1).toDouble(), bbox.at(2).toDouble()));
140 location.setBoundingShape(box);
143 place.setLocation(location);
145 QPlaceRatings ratings;
146 ratings.setAverage(item.value(QStringLiteral(
"averageRating")).toDouble());
147 ratings.setMaximum(5.0);
148 place.setRatings(ratings);
150 const QString title = item.value(QStringLiteral(
"title")).toString();
151 place.setName(title);
152 result.setTitle(title);
154 QPlaceIcon icon = m_engine->icon(item.value(QStringLiteral(
"icon")).toString());
156 result.setIcon(icon);
158 place.setCategory(parseCategory(item.value(QStringLiteral(
"category")).toObject(),
163 result.setSponsored(item.value(QStringLiteral(
"sponsored")).toBool());
165 QUrl href = item.value(QStringLiteral(
"href")).toString();
168 place.setPlaceId(href.path().mid(18, 41));
170 QPlaceAttribute provider;
171 provider.setText(QStringLiteral(
"here"));
172 place.setExtendedAttribute(QPlaceAttribute::Provider, provider);
173 place.setVisibility(QLocation::PublicVisibility);
175 result.setPlace(place);
182 QPlaceProposedSearchResult result;
184 result.setTitle(item.value(QStringLiteral(
"title")).toString());
186 QPlaceIcon icon = m_engine->icon(item.value(QStringLiteral(
"icon")).toString());
187 result.setIcon(icon);
189 QPlaceSearchRequest request;
190 request.setSearchContext(QUrl(item.value(
"href").toString()));
192 result.setSearchRequest(request);
199 QNetworkReply *reply =
static_cast<QNetworkReply *>(sender());
200 reply->deleteLater();
201 if (error == QNetworkReply::OperationCanceledError) {
202 setError(QPlaceReply::CancelError, QCoreApplication::translate(NOKIA_PLUGIN_CONTEXT_NAME, CANCEL_ERROR));
203 }
else if (error == QNetworkReply::ContentNotFoundError) {
204 setError(QPlaceReply::PlaceDoesNotExistError,
205 QString::fromLatin1(
"The id, %1, does not reference an existing place")
206 .arg(request().recommendationId()));
208 setError(QPlaceReply::CommunicationError, QCoreApplication::translate(NOKIA_PLUGIN_CONTEXT_NAME, NETWORK_ERROR));