Qt 6.x
The Qt SDK
Loading...
Searching...
No Matches
qgeotilefetcher_nokia.cpp
Go to the documentation of this file.
1// Copyright (C) 2015 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
3
9#include "qgeouriprovider.h"
10#include "uri_constants.h"
11
12#include <QtLocation/private/qgeotilespec_p.h>
13
14#include <QDebug>
15#include <QSize>
16#include <QDir>
17#include <QUrl>
18#include <QTime>
19
20#include <map>
21
23
24namespace
25{
27 {
28 if (size > 256)
29 return QStringLiteral("512");
30 else if (size > 128)
31 return QStringLiteral("256");
32 else
33 return QStringLiteral("128"); // 128 pixel tiles are deprecated.
34 }
35
36 bool isAerialType(const QString mapScheme)
37 {
38 return mapScheme.startsWith("satellite") || mapScheme.startsWith("hybrid") || mapScheme.startsWith("terrain");
39 }
40}
42 QGeoNetworkAccessManager *networkManager,
44 const QSize &tileSize,
45 int ppi)
46: QGeoTileFetcher(engine), m_engineNokia(engine), m_networkManager(networkManager), m_ppi(ppi), m_copyrightsReply(nullptr),
47 m_baseUriProvider(new QGeoUriProvider(this, parameters, QStringLiteral("here.mapping.host"), MAP_TILES_HOST)),
48 m_aerialUriProvider(new QGeoUriProvider(this, parameters, QStringLiteral("here.mapping.host.aerial"), MAP_TILES_HOST_AERIAL))
49{
50 Q_ASSERT(networkManager);
51 m_tileSize = qMax(tileSize.width(), tileSize.height());
52 m_networkManager->setParent(this);
53
54 m_applicationId = parameters.value(QStringLiteral("here.app_id")).toString();
55 m_token = parameters.value(QStringLiteral("here.token")).toString();
56}
57
59{
60}
61
63{
64 // TODO add error detection for if request.connectivityMode() != QGraphicsGeoMap::OnlineMode
65 int ppi = m_ppi;
66 if ((spec.mapId() == 2) || (spec.mapId() == 12) || (spec.mapId() == 21)) {
67 ppi = 72; // HiDpi apparently not supported for these maps
68 } else if ((spec.mapId() >= 7 && spec.mapId() <= 11)
69 || (spec.mapId() == 14)
70 || (spec.mapId() == 16)
71 || (spec.mapId() == 18)
72 || (spec.mapId() == 20)) {
73 ppi = 250; // LoDpi apparently not supported for these maps
74 }
75
76 QString rawRequest = getRequestString(spec, ppi);
77 if (rawRequest.isEmpty()) {
79 tr("Mapping manager no longer exists"), this);
80 }
81
82 QNetworkRequest netRequest((QUrl(rawRequest))); // The extra pair of parens disambiguates this from a function declaration
84
85 QNetworkReply *netReply = m_networkManager->get(netRequest);
86
87 QGeoTiledMapReply *mapReply = new QGeoMapReplyNokia(netReply, spec);
88
89 return mapReply;
90}
91
92QString QGeoTileFetcherNokia::getRequestString(const QGeoTileSpec &spec, int ppi) const
93{
94 if (!m_engineNokia)
95 return QString();
96
97 static const QString http("http://");
98 static const QString path("/maptile/2.1/maptile/newest/");
99 static const QChar slash('/');
100
101 QString requestString = http;
102
103 const QString mapScheme = m_engineNokia->getScheme(spec.mapId());
104 if (isAerialType(mapScheme))
105 requestString += m_aerialUriProvider->getCurrentHost();
106 else
107 requestString += m_baseUriProvider->getCurrentHost();
108
109 requestString += path;
110 requestString += mapScheme;
111 requestString += slash;
112 requestString += QString::number(spec.zoom());
113 requestString += slash;
114 requestString += QString::number(spec.x());
115 requestString += slash;
116 requestString += QString::number(spec.y());
117 requestString += slash;
118 requestString += ((ppi > 72)) ? sizeToStr(m_tileSize * 2) : sizeToStr(m_tileSize);
119 static const QString slashpng("/png8");
120 requestString += slashpng;
121
122 if (!m_token.isEmpty() && !m_applicationId.isEmpty()) { // TODO: remove the if
123 requestString += "?token=";
124 requestString += m_token;
125
126 requestString += "&app_id=";
127 requestString += m_applicationId;
128 }
129
130 requestString += "&ppi=" + QString::number(ppi);
131
132 requestString += "&lg=";
133 requestString += getLanguageString();
134 return requestString;
135}
136
137QString QGeoTileFetcherNokia::getLanguageString() const
138{
139 if (!m_engineNokia)
140 return QStringLiteral("ENG");
141
142 QLocale locale = m_engineNokia.data()->locale();
143
144 // English is the default, where no ln is specified. We hardcode the languages
145 // here even though the entire list is updated automagically from the server.
146 // The current languages are Arabic, Chinese, Simplified Chinese, English
147 // French, German, Italian, Polish, Russian and Spanish. The default is English.
148 // These are actually available from the same host under the URL: /maptiler/v2/info
149
150 switch (locale.language()) {
151 case QLocale::Arabic:
152 return QStringLiteral("ARA");
153 case QLocale::Chinese:
155 return QStringLiteral("CHI");
156 else
157 return QStringLiteral("CHT");
158 case QLocale::Dutch:
159 return QStringLiteral("DUT");
160 case QLocale::French:
161 return QStringLiteral("FRE");
162 case QLocale::German:
163 return QStringLiteral("GER");
164 case QLocale::Gaelic:
165 return QStringLiteral("GLE");
166 case QLocale::Greek:
167 return QStringLiteral("GRE");
168 case QLocale::Hebrew:
169 return QStringLiteral("HEB");
170 case QLocale::Hindi:
171 return QStringLiteral("HIN");
173 return QStringLiteral("IND");
174 case QLocale::Italian:
175 return QStringLiteral("ITA");
176 case QLocale::Persian:
177 return QStringLiteral("PER");
178 case QLocale::Polish:
179 return QStringLiteral("POL");
181 return QStringLiteral("POR");
182 case QLocale::Russian:
183 return QStringLiteral("RUS");
184 case QLocale::Sinhala:
185 return QStringLiteral("SIN");
186 case QLocale::Spanish:
187 return QStringLiteral("SPA");
188 case QLocale::Thai:
189 return QStringLiteral("THA");
190 case QLocale::Turkish:
191 return QStringLiteral("TUR");
193 return QStringLiteral("UKR");
194 case QLocale::Urdu:
195 return QStringLiteral("URD");
197 return QStringLiteral("VIE");
198
199 default:
200 return QStringLiteral("ENG");
201 }
202 // No "lg" param means that we want English.
203}
204
206{
207 return m_token;
208}
209
211{
212 return m_applicationId;
213}
214
216{
217 if (m_engineNokia && m_copyrightsReply->error() == QNetworkReply::NoError) {
218 QMetaObject::invokeMethod(m_engineNokia.data(),
219 "loadCopyrightsDescriptorsFromJson",
221 Q_ARG(QByteArray, m_copyrightsReply->readAll()));
222 }
223
224 m_copyrightsReply->deleteLater();
225}
226
228{
229 if (m_engineNokia && m_versionReply->error() == QNetworkReply::NoError) {
230 QMetaObject::invokeMethod(m_engineNokia.data(),
231 "parseNewVersionInfo",
233 Q_ARG(QByteArray, m_versionReply->readAll()));
234 }
235
236 m_versionReply->deleteLater();
237}
238
240{
241 QString copyrightUrl = QStringLiteral("http://");
242
243 copyrightUrl += m_baseUriProvider->getCurrentHost();
244 copyrightUrl += QStringLiteral("/maptile/2.1/copyright/newest?output=json");
245
246 if (!token().isEmpty()) {
247 copyrightUrl += QStringLiteral("&token=");
248 copyrightUrl += token();
249 }
250
251 if (!applicationId().isEmpty()) {
252 copyrightUrl += QStringLiteral("&app_id=");
253 copyrightUrl += applicationId();
254 }
255
256 QNetworkRequest netRequest((QUrl(copyrightUrl)));
257 m_copyrightsReply = m_networkManager->get(netRequest);
258 if (m_copyrightsReply->error() != QNetworkReply::NoError) {
259 qWarning() << __FUNCTION__ << m_copyrightsReply->errorString();
260 m_copyrightsReply->deleteLater();
261 return;
262 }
263
264 if (m_copyrightsReply->isFinished()) {
266 } else {
267 connect(m_copyrightsReply, &QNetworkReply::finished,
269 }
270}
271
273{
274 QString versionUrl = QStringLiteral("http://");
275
276 versionUrl += m_baseUriProvider->getCurrentHost();
277 versionUrl += QStringLiteral("/maptile/2.1/version");
278
279 if (!token().isEmpty()) {
280 versionUrl += QStringLiteral("?token=");
281 versionUrl += token();
282 }
283
284 if (!applicationId().isEmpty()) {
285 versionUrl += QStringLiteral("&app_id=");
286 versionUrl += applicationId();
287 }
288
289 QNetworkRequest netRequest((QUrl(versionUrl)));
290 m_versionReply = m_networkManager->get(netRequest);
291
292 if (m_versionReply->error() != QNetworkReply::NoError) {
293 qWarning() << __FUNCTION__ << m_versionReply->errorString();
294 m_versionReply->deleteLater();
295 return;
296 }
297
298 if (m_versionReply->isFinished())
300 else
301 connect(m_versionReply, &QNetworkReply::finished,
303}
304
\inmodule QtCore
Definition qbytearray.h:57
\inmodule QtCore
Definition qchar.h:48
QLocale locale() const
Returns the locale used to hint to this mapping manager about what language to use for map labels.
virtual QNetworkReply * get(const QNetworkRequest &request)=0
QGeoTiledMapReply * getTileImage(const QGeoTileSpec &spec) override
QGeoTileFetcherNokia(const QVariantMap &parameters, QGeoNetworkAccessManager *networkManager, QGeoTiledMappingManagerEngineNokia *engine, const QSize &tileSize, int ppi)
int x() const
int zoom() const
int mapId() const
int y() const
\inmodule QtLocation
QString getCurrentHost() const
QByteArray readAll()
Reads all remaining data from the device, and returns it as a byte array.
QString errorString() const
Returns a human-readable description of the last device error that occurred.
@ TraditionalChineseScript
Definition qlocale.h:551
@ Polish
Definition qlocale.h:272
@ Italian
Definition qlocale.h:161
@ Spanish
Definition qlocale.h:312
@ Dutch
Definition qlocale.h:114
@ Greek
Definition qlocale.h:138
@ Chinese
Definition qlocale.h:100
@ Persian
Definition qlocale.h:270
@ Portuguese
Definition qlocale.h:273
@ Russian
Definition qlocale.h:281
@ Indonesian
Definition qlocale.h:154
@ Arabic
Definition qlocale.h:56
@ Hebrew
Definition qlocale.h:145
@ Sinhala
Definition qlocale.h:302
@ German
Definition qlocale.h:136
@ Ukrainian
Definition qlocale.h:345
@ Vietnamese
Definition qlocale.h:352
@ French
Definition qlocale.h:127
@ Turkish
Definition qlocale.h:340
@ Gaelic
Definition qlocale.h:130
@ Hindi
Definition qlocale.h:147
T value(const Key &key, const T &defaultValue=T()) const
Definition qmap.h:356
The QNetworkReply class contains the data and headers for a request sent with QNetworkAccessManager.
bool isFinished() const
NetworkError error() const
Returns the error that was found during the processing of this request.
void finished()
This signal is emitted when the reply has finished processing.
The QNetworkRequest class holds a request to be sent with QNetworkAccessManager.
void setAttribute(Attribute code, const QVariant &value)
Sets the attribute associated with code code to be value value.
static QMetaObject::Connection connect(const QObject *sender, const char *signal, const QObject *receiver, const char *member, Qt::ConnectionType=Qt::AutoConnection)
\threadsafe
Definition qobject.cpp:2823
void setParent(QObject *parent)
Makes the object a child of parent.
Definition qobject.cpp:2142
void deleteLater()
\threadsafe
Definition qobject.cpp:2352
T * data() const
Definition qpointer.h:56
\inmodule QtCore
Definition qsize.h:25
\macro QT_RESTRICTED_CAST_FROM_ASCII
Definition qstring.h:127
bool startsWith(const QString &s, Qt::CaseSensitivity cs=Qt::CaseSensitive) const
Returns true if the string starts with s; otherwise returns false.
Definition qstring.cpp:5299
bool isEmpty() const
Returns true if the string has no characters; otherwise returns false.
Definition qstring.h:1083
static QString number(int, int base=10)
This is an overloaded member function, provided for convenience. It differs from the above function o...
Definition qstring.cpp:7822
\inmodule QtCore
Definition qurl.h:94
QString toString() const
Returns the variant as a QString if the variant has a userType() including, but not limited to:
#define this
Definition dialogs.cpp:9
Q_QML_PRIVATE_EXPORT QV4::ReturnedValue locale(QV4::ExecutionEngine *engine, const QString &localeName)
Provides locale specific properties and formatted data.
Combined button and popup list for selecting options.
bool isAerialType(const QString mapScheme)
QString sizeToStr(int size)
@ QueuedConnection
#define qWarning
Definition qlogging.h:162
static QT_BEGIN_NAMESPACE const int tileSize
Definition qmemrotate.cpp:9
constexpr const T & qMax(const T &a, const T &b)
Definition qminmax.h:42
#define Q_ARG(Type, data)
Definition qobjectdefs.h:62
GLenum GLuint GLintptr GLsizeiptr size
[1]
GLsizei const GLchar *const * path
#define Q_ASSERT(cond)
Definition qrandom.cpp:47
#define QStringLiteral(str)
#define tr(X)
QObject::connect nullptr
QJSEngine engine
[0]
static bool invokeMethod(QObject *obj, const char *member, Qt::ConnectionType, QGenericReturnArgument ret, QGenericArgument val0=QGenericArgument(nullptr), QGenericArgument val1=QGenericArgument(), QGenericArgument val2=QGenericArgument(), QGenericArgument val3=QGenericArgument(), QGenericArgument val4=QGenericArgument(), QGenericArgument val5=QGenericArgument(), QGenericArgument val6=QGenericArgument(), QGenericArgument val7=QGenericArgument(), QGenericArgument val8=QGenericArgument(), QGenericArgument val9=QGenericArgument())
\threadsafe This is an overloaded member function, provided for convenience. It differs from the abov...
const QString MAP_TILES_HOST
const QString MAP_TILES_HOST_AERIAL