Qt
Internal/Contributor docs for the Qt SDK. Note: These are NOT official API docs; those are found at https://doc.qt.io/
Loading...
Searching...
No Matches
qgeotilefetcherosm.cpp
Go to the documentation of this file.
1// Copyright (C) 2016 Aaron McCarthy <mccarthy.aaron@gmail.com>
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
3// Qt-Security score:significant reason:default
4
7
8#include <QtNetwork/QNetworkAccessManager>
9#include <QtNetwork/QNetworkRequest>
10#include <QtLocation/private/qgeotilespec_p.h>
11#include <QtLocation/private/qgeotilefetcher_p_p.h>
12
13
15
16static bool providersResolved(const QList<QGeoTileProviderOsm *> &providers)
17{
18 for (const QGeoTileProviderOsm *provider : providers)
19 if (!provider->isResolved())
20 return false;
21 return true;
22}
23
25{
26 Q_DECLARE_PUBLIC(QGeoTileFetcherOsm)
27public:
30
31private:
33};
34
35QGeoTileFetcherOsmPrivate::QGeoTileFetcherOsmPrivate() : QGeoTileFetcherPrivate()
36{
37}
38
42
43QGeoTileFetcherOsm::QGeoTileFetcherOsm(const QList<QGeoTileProviderOsm *> &providers,
44 QNetworkAccessManager *nm, QGeoMappingManagerEngine *parent)
46 m_userAgent("Qt Location based application"),
48 m_nm(nm),
49 m_ready(true)
50{
51 m_nm->setParent(this);
52 for (QGeoTileProviderOsm *provider : m_providers) {
53 if (!provider->isResolved()) {
54 m_ready = false;
55 connect(provider, &QGeoTileProviderOsm::resolutionFinished,
56 this, &QGeoTileFetcherOsm::onProviderResolutionFinished);
57 connect(provider, &QGeoTileProviderOsm::resolutionError,
58 this, &QGeoTileFetcherOsm::onProviderResolutionError);
59 connect(provider, &QGeoTileProviderOsm::resolutionRequired,
60 this, &QGeoTileFetcherOsm::restartTimer, Qt::QueuedConnection);
61 provider->resolveProvider();
62 }
63 }
64 if (m_ready)
65 readyUpdated();
66}
67
68void QGeoTileFetcherOsm::setUserAgent(const QByteArray &userAgent)
69{
70 m_userAgent = userAgent;
71}
72
74{
75 if (!m_ready) {
76 for (QGeoTileProviderOsm *provider : m_providers)
77 if (!provider->isResolved())
78 provider->resolveProvider();
79 }
80 return m_ready;
81}
82
83void QGeoTileFetcherOsm::onProviderResolutionFinished(const QGeoTileProviderOsm *provider)
84{
85 if ((m_ready = providersResolved(m_providers))) {
86 qWarning("QGeoTileFetcherOsm: all providers resolved");
87 readyUpdated();
88 }
89 emit providerDataUpdated(provider);
90}
91
93{
94 if ((m_ready = providersResolved(m_providers))) {
95 qWarning("QGeoTileFetcherOsm: all providers resolved");
96 readyUpdated();
97 }
98 emit providerDataUpdated(provider);
99}
100
102{
103 Q_D(QGeoTileFetcherOsm);
104
105 if (!d->queue_.isEmpty())
106 d->timer_.start(0, this);
107}
108
110{
111 int id = spec.mapId();
112 if (id < 1 || id > m_providers.size()) {
113 qWarning("Unknown map id %d\n", spec.mapId());
114 if (m_providers.isEmpty())
115 return nullptr;
116 else
117 id = 1;
118 }
119 id -= 1; // TODO: make OSM map ids start from 0.
120
121 if (spec.zoom() > m_providers[id]->maximumZoomLevel() || spec.zoom() < m_providers[id]->minimumZoomLevel())
122 return nullptr;
123
124 const QUrl url = m_providers[id]->tileAddress(spec.x(), spec.y(), spec.zoom());
125 QNetworkRequest request;
126 request.setHeader(QNetworkRequest::UserAgentHeader, m_userAgent);
127 request.setUrl(url);
128 QNetworkReply *reply = m_nm->get(request);
129 return new QGeoMapReplyOsm(reply, spec, m_providers[id]->format());
130}
131
132void QGeoTileFetcherOsm::readyUpdated()
133{
134 updateTileRequests(QSet<QGeoTileSpec>(), QSet<QGeoTileSpec>());
135}
136
137QT_END_NAMESPACE
bool initialized() const override
void onProviderResolutionError(const QGeoTileProviderOsm *provider)
QGeoTiledMapReply * getTileImage(const QGeoTileSpec &spec) override
void setUserAgent(const QByteArray &userAgent)
QGeoTileFetcherOsm(const QList< QGeoTileProviderOsm * > &providers, QNetworkAccessManager *nm, QGeoMappingManagerEngine *parent)
Combined button and popup list for selecting options.
static QT_BEGIN_NAMESPACE bool providersResolved(const QList< QGeoTileProviderOsm * > &providers)