4#include <QtCore/qjsonarray.h>
5#include <QtCore/qjsondocument.h>
6#include <QtCore/qjsonobject.h>
7#include <QtCore/qmetaobject.h>
8#include <QtLocation/qplace.h>
9#include <QtLocation/qplaceattribute.h>
10#include <QtLocation/qplacecategory.h>
11#include <QtLocation/qplacecontactdetail.h>
12#include <QtLocation/qplaceicon.h>
13#include <QtLocation/qplaceratings.h>
14#include <QtLocation/qplaceresult.h>
15#include <QtLocation/qplacesearchrequest.h>
16#include <QtLocation/qplacesearchresult.h>
17#include <QtPositioning/qgeoaddress.h>
18#include <QtPositioning/qgeolocation.h>
19#include <qohosmapkitcommon.h>
20#include <qplacesearchreplyohosmapkit.h>
21#include <qplacemanagerengineohosmapkit.h>
31 const QPlaceSearchRequest &request, QNetworkReply *reply, QPlaceManagerEngine *parent);
34 void onReplyFinished();
35 void onNetworkError(QNetworkReply::NetworkError error);
40 const QJsonValue openingHours = poiJsonObj.value(QStringLiteral(
"openingHours"));
41 if (!openingHours.isUndefined() && !openingHours.isNull()) {
43 attr.setLabel(QPlaceSearchReplyOhosMapKit::tr(
"Opening hours"));
44 attr.setText(openingHours.toVariant().toString());
45 place.setExtendedAttribute(QStringLiteral(
"openingHours"), attr);
48 const QJsonArray photos = poiJsonObj.value(QStringLiteral(
"photoUrls")).toArray();
49 if (!photos.isEmpty()) {
51 attr.setLabel(QPlaceSearchReplyOhosMapKit::tr(
"Photo URLs"));
52 attr.setText(QString::fromUtf8(QJsonDocument(photos).toJson(QJsonDocument::Compact)));
53 place.setExtendedAttribute(QStringLiteral(
"photoUrls"), attr);
59 auto phoneData = poiJsonObj.value(QStringLiteral(
"phone")).toVariant().toString();
60 if (!phoneData.isEmpty()) {
61 QPlaceContactDetail phoneDetail;
62 phoneDetail.setLabel(QPlaceSearchReplyOhosMapKit::tr(
"Phone"));
63 phoneDetail.setValue(phoneData);
64 place.appendContactDetail(QPlaceContactDetail::Phone, phoneDetail);
67 auto internationalPhoneData =
68 poiJsonObj.value(QStringLiteral(
"internationalPhone")).toVariant().toString();
69 if (!internationalPhoneData.isEmpty()) {
70 QPlaceContactDetail intlPhoneDetail;
71 intlPhoneDetail.setLabel(QPlaceSearchReplyOhosMapKit::tr(
"International phone"));
72 intlPhoneDetail.setValue(internationalPhoneData);
73 place.appendContactDetail(QPlaceContactDetail::Phone, intlPhoneDetail);
76 auto websiteUrl = poiJsonObj.value(QStringLiteral(
"websiteUrl")).toVariant().toString();
77 if (!websiteUrl.isEmpty()) {
78 QPlaceContactDetail websiteDetail;
79 websiteDetail.setLabel(QPlaceSearchReplyOhosMapKit::tr(
"Website"));
80 websiteDetail.setValue(internationalPhoneData);
81 place.appendContactDetail(QPlaceContactDetail::Website, websiteDetail);
84 auto rating = poiJsonObj.value(QStringLiteral(
"rating")).toDouble(0.0);
86 QPlaceRatings ratings;
87 ratings.setAverage(rating);
88 place.setRatings(ratings);
91 auto iconUrl = poiJsonObj.value(QStringLiteral(
"icon")).toVariant().toUrl();
92 if (!iconUrl.isEmpty()) {
94 icon.setParameters({{QPlaceIcon::SingleUrl, iconUrl}});
98 auto hwPoi = poiJsonObj.value(QStringLiteral(
"hwPoiTypes")).toArray();
99 if (!hwPoi.isEmpty()) {
100 auto id = hwPoi.first().toVariant().toString();
104 place.setCategory(c);
108 populatePlaceExtendedAttributes(poiJsonObj, place);
115 place.setName(siteJsonObj.value(QStringLiteral(
"name")).toVariant().toString());
116 place.setLocation(OhosMapKit::SiteJson::tryConvertToQGeoLocation(siteJsonObj));
118 const QJsonObject poiObj = siteJsonObj.value(QStringLiteral(
"poi")).toObject();
119 if (!poiObj.isEmpty())
120 populatePlaceFromPoiJson(poiObj, place);
123 result.setPlace(place);
124 result.setDistance(siteJsonObj.value(QStringLiteral(
"distance")).toVariant().toInt());
130 QList<QPlaceSearchResult> results;
132 const QJsonObject responseBodyJsonObj = responseBodyJsonDoc.object();
133 if (responseBodyJsonObj.contains(QStringLiteral(
"sites"))) {
134 const QJsonArray sites = responseBodyJsonObj.value(QStringLiteral(
"sites")).toArray();
135 for (
const QJsonValue &siteValue : sites) {
136 if (siteValue.isObject())
137 results.append(siteJsonObjToPlaceResult(siteValue.toObject()));
145 const QPlaceSearchRequest &request, QNetworkReply *reply, QPlaceManagerEngine *parent)
150 setError(QPlaceReply::UnknownError, QStringLiteral(
"Null reply"));
156 connect(reply, &QNetworkReply::errorOccurred,
this, &QPlaceSearchReplyOhosMapKit::onNetworkError);
158 connect(
this, &QPlaceReply::aborted, reply, &QNetworkReply::abort);
159 connect(
this, &QObject::destroyed, reply, &QObject::deleteLater);
164 auto *reply =
static_cast<QNetworkReply *>(sender());
165 reply->deleteLater();
167 auto setErrorEmitAndFinish = [&](QPlaceReply::Error errorCode,
const QString &errorString) {
168 setError(errorCode, errorString);
169 Q_EMIT errorOccurred(errorCode, errorString);
175 if (reply->error() != QNetworkReply::NoError) {
176 setErrorEmitAndFinish(
177 QPlaceReply::CommunicationError,
178 tr(
"Network reply error: %1")
179 .arg(QMetaEnum::fromType<QNetworkReply::NetworkError>().valueToKey(reply->error())));
183 const auto responseBodyJsonDoc = QJsonDocument::fromJson(reply->readAll());
184 if (!responseBodyJsonDoc.isObject()) {
185 setErrorEmitAndFinish(QPlaceReply::ParseError, tr(
"Response parse error"));
189 auto results = parsePlaceSearchResponse(responseBodyJsonDoc);
191 if (request().relevanceHint() == QPlaceSearchRequest::DistanceHint) {
193 results.begin(), results.end(),
194 [](
const auto &a,
const auto &b) {
196 a.type() == QPlaceSearchResult::PlaceResult
197 && b.type() == QPlaceSearchResult::PlaceResult
198 && QPlaceResult(a).distance() < QPlaceResult(b).distance();
200 }
else if (request().relevanceHint() == QPlaceSearchRequest::LexicalPlaceNameHint) {
202 results.begin(), results.end(),
203 [](
const auto &a,
const auto &b) {
205 a.type() == QPlaceSearchResult::PlaceResult
206 && b.type() == QPlaceSearchResult::PlaceResult
207 && QPlaceResult(a).place().name() < QPlaceResult(b).place().name();
220 auto *reply =
static_cast<QNetworkReply *>(sender());
221 reply->deleteLater();
222 setError(QPlaceReply::CommunicationError, reply->errorString());
228 const QPlaceSearchRequest &request, QNetworkReply *reply, QPlaceManagerEngine *parent)
QPlaceSearchReplyOhosMapKit(const QPlaceSearchRequest &request, QNetworkReply *reply, QPlaceManagerEngine *parent)
Combined button and popup list for selecting options.
QList< QPlaceSearchResult > parsePlaceSearchResponse(const QJsonDocument &responseBodyJsonDoc)
void populatePlaceExtendedAttributes(const QJsonObject &poiJsonObj, QPlace &place)
void populatePlaceFromPoiJson(const QJsonObject &poiJsonObj, QPlace &place)
QPlaceResult siteJsonObjToPlaceResult(const QJsonObject &siteJsonObj)
QPlaceSearchReply * makeQPlaceSearchReplyOhosMapKit(const QPlaceSearchRequest &request, QNetworkReply *reply, QPlaceManagerEngine *parent)