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
6
7#include <QtNetwork/QNetworkAccessManager>
8#include <QtNetwork/QNetworkRequest>
9#include <QtLocation/private/qgeotilespec_p.h>
10#include <QtLocation/private/qgeotilefetcher_p_p.h>
11
12
14
15static bool providersResolved(const QList<QGeoTileProviderOsm *> &providers)
16{
17 for (const QGeoTileProviderOsm *provider : providers)
18 if (!provider->isResolved())
19 return false;
20 return true;
21}
22
24{
25 Q_DECLARE_PUBLIC(QGeoTileFetcherOsm)
26public:
29
30private:
32};
33
34QGeoTileFetcherOsmPrivate::QGeoTileFetcherOsmPrivate() : QGeoTileFetcherPrivate()
35{
36}
37
41
42QGeoTileFetcherOsm::QGeoTileFetcherOsm(const QList<QGeoTileProviderOsm *> &providers,
43 QNetworkAccessManager *nm, QGeoMappingManagerEngine *parent)
45 m_userAgent("Qt Location based application"),
47 m_nm(nm),
48 m_ready(true)
49{
50 m_nm->setParent(this);
51 for (QGeoTileProviderOsm *provider : m_providers) {
52 if (!provider->isResolved()) {
53 m_ready = false;
54 connect(provider, &QGeoTileProviderOsm::resolutionFinished,
55 this, &QGeoTileFetcherOsm::onProviderResolutionFinished);
56 connect(provider, &QGeoTileProviderOsm::resolutionError,
57 this, &QGeoTileFetcherOsm::onProviderResolutionError);
58 connect(provider, &QGeoTileProviderOsm::resolutionRequired,
59 this, &QGeoTileFetcherOsm::restartTimer, Qt::QueuedConnection);
60 provider->resolveProvider();
61 }
62 }
63 if (m_ready)
64 readyUpdated();
65}
66
67void QGeoTileFetcherOsm::setUserAgent(const QByteArray &userAgent)
68{
69 m_userAgent = userAgent;
70}
71
73{
74 if (!m_ready) {
75 for (QGeoTileProviderOsm *provider : m_providers)
76 if (!provider->isResolved())
77 provider->resolveProvider();
78 }
79 return m_ready;
80}
81
82void QGeoTileFetcherOsm::onProviderResolutionFinished(const QGeoTileProviderOsm *provider)
83{
84 if ((m_ready = providersResolved(m_providers))) {
85 qWarning("QGeoTileFetcherOsm: all providers resolved");
86 readyUpdated();
87 }
88 emit providerDataUpdated(provider);
89}
90
92{
93 if ((m_ready = providersResolved(m_providers))) {
94 qWarning("QGeoTileFetcherOsm: all providers resolved");
95 readyUpdated();
96 }
97 emit providerDataUpdated(provider);
98}
99
101{
102 Q_D(QGeoTileFetcherOsm);
103
104 if (!d->queue_.isEmpty())
105 d->timer_.start(0, this);
106}
107
109{
110 int id = spec.mapId();
111 if (id < 1 || id > m_providers.size()) {
112 qWarning("Unknown map id %d\n", spec.mapId());
113 if (m_providers.isEmpty())
114 return nullptr;
115 else
116 id = 1;
117 }
118 id -= 1; // TODO: make OSM map ids start from 0.
119
120 if (spec.zoom() > m_providers[id]->maximumZoomLevel() || spec.zoom() < m_providers[id]->minimumZoomLevel())
121 return nullptr;
122
123 const QUrl url = m_providers[id]->tileAddress(spec.x(), spec.y(), spec.zoom());
124 QNetworkRequest request;
125 request.setHeader(QNetworkRequest::UserAgentHeader, m_userAgent);
126 request.setUrl(url);
127 QNetworkReply *reply = m_nm->get(request);
128 return new QGeoMapReplyOsm(reply, spec, m_providers[id]->format());
129}
130
131void QGeoTileFetcherOsm::readyUpdated()
132{
133 updateTileRequests(QSet<QGeoTileSpec>(), QSet<QGeoTileSpec>());
134}
135
136QT_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)
static QT_BEGIN_NAMESPACE bool providersResolved(const QList< QGeoTileProviderOsm * > &providers)