diff options
Diffstat (limited to 'src/plugins/geoservices/osm/qgeotilefetcherosm.cpp')
-rw-r--r-- | src/plugins/geoservices/osm/qgeotilefetcherosm.cpp | 110 |
1 files changed, 66 insertions, 44 deletions
diff --git a/src/plugins/geoservices/osm/qgeotilefetcherosm.cpp b/src/plugins/geoservices/osm/qgeotilefetcherosm.cpp index 9d2a83fa..45da7d42 100644 --- a/src/plugins/geoservices/osm/qgeotilefetcherosm.cpp +++ b/src/plugins/geoservices/osm/qgeotilefetcherosm.cpp @@ -38,12 +38,36 @@ #include <QtNetwork/QNetworkRequest> #include <QtLocation/private/qgeotilespec_p.h> + QT_BEGIN_NAMESPACE -QGeoTileFetcherOsm::QGeoTileFetcherOsm(QObject *parent) -: QGeoTileFetcher(parent), m_networkManager(new QNetworkAccessManager(this)), - m_userAgent("Qt Location based application") +static bool providersResolved(const QVector<QGeoTileProviderOsm *> &providers) { + foreach (const QGeoTileProviderOsm *provider, providers) + if (!provider->isResolved()) + return false; + return true; +} + +QGeoTileFetcherOsm::QGeoTileFetcherOsm(const QVector<QGeoTileProviderOsm *> &providers, + QNetworkAccessManager *nm, + QObject *parent) +: QGeoTileFetcher(parent), m_userAgent("Qt Location based application"), + m_providers(providers), m_nm(nm), m_ready(true) +{ + m_nm->setParent(this); + foreach (QGeoTileProviderOsm *provider, m_providers) { + if (!provider->isResolved()) { + m_ready = false; + connect(provider, &QGeoTileProviderOsm::resolutionFinished, + this, &QGeoTileFetcherOsm::onProviderResolutionFinished); + connect(provider, &QGeoTileProviderOsm::resolutionError, + this, &QGeoTileFetcherOsm::onProviderResolutionError); + provider->resolveProvider(); + } + } + if (m_ready) + readyUpdated(); } void QGeoTileFetcherOsm::setUserAgent(const QByteArray &userAgent) @@ -51,57 +75,55 @@ void QGeoTileFetcherOsm::setUserAgent(const QByteArray &userAgent) m_userAgent = userAgent; } -void QGeoTileFetcherOsm::setUrlPrefix(const QString &urlPrefix) +bool QGeoTileFetcherOsm::initialized() const { - m_urlPrefix = urlPrefix; + if (!m_ready) { + foreach (QGeoTileProviderOsm *provider, m_providers) + if (!provider->isResolved()) + provider->resolveProvider(); + } + return m_ready; } -QGeoTiledMapReply *QGeoTileFetcherOsm::getTileImage(const QGeoTileSpec &spec) +void QGeoTileFetcherOsm::onProviderResolutionFinished(const QGeoTileProviderOsm *provider) { - QNetworkRequest request; - request.setRawHeader("User-Agent", m_userAgent); + if ((m_ready = providersResolved(m_providers))) { + qWarning("QGeoTileFetcherOsm: all providers resolved"); + readyUpdated(); + } + emit providerDataUpdated(provider); +} - QString urlPrefix; - QString suffix = QStringLiteral(".png"); +void QGeoTileFetcherOsm::onProviderResolutionError(const QGeoTileProviderOsm *provider, QNetworkReply::NetworkError error) +{ + Q_UNUSED(error) + if ((m_ready = providersResolved(m_providers))) { + qWarning("QGeoTileFetcherOsm: all providers resolved"); + readyUpdated(); + } + emit providerDataUpdated(provider); +} - switch (spec.mapId()) { - case 1: - urlPrefix = QStringLiteral("http://otile1.mqcdn.com/tiles/1.0.0/map/"); - suffix = QStringLiteral(".jpg"); - break; - case 2: - urlPrefix = QStringLiteral("http://otile1.mqcdn.com/tiles/1.0.0/sat/"); - suffix = QStringLiteral(".jpg"); - break; - case 3: - urlPrefix = QStringLiteral("http://a.tile.thunderforest.com/cycle/"); - break; - case 4: - urlPrefix = QStringLiteral("http://a.tile.thunderforest.com/transport/"); - break; - case 5: - urlPrefix = QStringLiteral("http://a.tile.thunderforest.com/transport-dark/"); - break; - case 6: - urlPrefix = QStringLiteral("http://a.tile.thunderforest.com/landscape/"); - break; - case 7: - urlPrefix = QStringLiteral("http://a.tile.thunderforest.com/outdoors/"); - break; - case 8: - urlPrefix = m_urlPrefix; - break; - default: +QGeoTiledMapReply *QGeoTileFetcherOsm::getTileImage(const QGeoTileSpec &spec) +{ + int id = spec.mapId(); + if (id < 1 || id > m_providers.size()) { qWarning("Unknown map id %d\n", spec.mapId()); + id = 0; } + id -= 1; // TODO: make OSM map ids start from 0. - request.setUrl(QUrl(urlPrefix + QString::number(spec.zoom()) + QLatin1Char('/') + - QString::number(spec.x()) + QLatin1Char('/') + - QString::number(spec.y()) + suffix)); - - QNetworkReply *reply = m_networkManager->get(request); + const QUrl url = m_providers[id]->tileAddress(spec.x(), spec.y(), spec.zoom()); + QNetworkRequest request; + request.setHeader(QNetworkRequest::UserAgentHeader, m_userAgent); + request.setUrl(url); + QNetworkReply *reply = m_nm->get(request); + return new QGeoMapReplyOsm(reply, spec, m_providers[id]->format()); +} - return new QGeoMapReplyOsm(reply, spec); +void QGeoTileFetcherOsm::readyUpdated() +{ + updateTileRequests(QSet<QGeoTileSpec>(), QSet<QGeoTileSpec>()); } QT_END_NAMESPACE |