4#include <QtLocation/private/qgeotilespec_p.h>
5#include <QtNetwork/QNetworkAccessManager>
6#include <QtNetwork/QSslError>
22 : QGeoTiledMapReply(spec, parent)
23 , _networkManager(networkManager)
26 qCDebug(QGeoTiledMapReplyQGCLog) <<
this;
31 qCDebug(QGeoTiledMapReplyQGCLog) <<
this;
42 _initDataFromResources();
44 (void) connect(
this, &QGeoTiledMapReplyQGC::errorOccurred,
this, [
this](QGeoTiledMapReply::Error
error,
const QString &
errorString) {
46 setMapImageData(_badTile);
47 setMapImageFormat(QStringLiteral(
"png"));
49 }, Qt::AutoConnection);
53 qCWarning(QGeoTiledMapReplyQGCLog) <<
"Failed to create fetch tile task";
54 m_initialized =
false;
58 (void) connect(task, &
QGCMapTask::error,
this, &QGeoTiledMapReplyQGC::_cacheError);
61 m_initialized =
false;
68void QGeoTiledMapReplyQGC::_initDataFromResources()
70 if (_bingNoTileImage.isEmpty()) {
71 QFile file(
":/res/BingNoTileBytes.dat");
72 if (file.open(QFile::ReadOnly)) {
73 _bingNoTileImage = file.readAll();
78 if (_badTile.isEmpty()) {
79 QFile file(
":/res/images/notile.png");
80 if (file.open(QFile::ReadOnly)) {
81 _badTile = file.readAll();
87void QGeoTiledMapReplyQGC::_networkReplyFinished()
89 QNetworkReply*
const reply = qobject_cast<QNetworkReply*>(sender());
91 setError(QGeoTiledMapReply::UnknownError, tr(
"Unexpected Error"));
96 if (reply->error() != QNetworkReply::NoError) {
100 if (!reply->isOpen()) {
101 setError(QGeoTiledMapReply::ParseError, tr(
"Empty Reply"));
105 const int statusCode = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt();
107 setError(QGeoTiledMapReply::CommunicationError, reply->attribute(QNetworkRequest::HttpReasonPhraseAttribute).toString());
111 QByteArray image = reply->readAll();
112 if (image.isEmpty()) {
113 setError(QGeoTiledMapReply::ParseError, tr(
"Image is Empty"));
119 setError(QGeoTiledMapReply::UnknownError, tr(
"Invalid Map Provider"));
123 if (mapProvider->isBingProvider() && (image == _bingNoTileImage)) {
124 setError(QGeoTiledMapReply::CommunicationError, tr(
"Bing Tile Above Zoom Level"));
128 if (mapProvider->isElevationProvider()) {
129 const SharedElevationProvider elevationProvider = std::dynamic_pointer_cast<const ElevationProvider>(mapProvider);
130 image = elevationProvider->serialize(image);
131 if (image.isEmpty()) {
132 setError(QGeoTiledMapReply::ParseError, tr(
"Failed to Serialize Terrain Tile"));
136 setMapImageData(image);
138 const QString format = mapProvider->getImageFormat(image);
139 if (format.isEmpty()) {
140 setError(QGeoTiledMapReply::ParseError, tr(
"Unknown Format"));
143 setMapImageFormat(format);
150void QGeoTiledMapReplyQGC::_networkReplyError(QNetworkReply::NetworkError
error)
152 if (
error != QNetworkReply::OperationCanceledError) {
153 const QNetworkReply*
const reply = qobject_cast<const QNetworkReply*>(sender());
155 setError(QGeoTiledMapReply::CommunicationError, tr(
"Invalid Reply"));
157 setError(QGeoTiledMapReply::CommunicationError, reply->errorString());
164void QGeoTiledMapReplyQGC::_networkReplySslErrors(
const QList<QSslError> &errors)
167 for (
const QSslError &
error : errors) {
175 setError(QGeoTiledMapReply::CommunicationError,
errorString);
179void QGeoTiledMapReplyQGC::_cacheReply(
QGCCacheTile *tile)
182 setMapImageData(tile->
img);
183 setMapImageFormat(tile->
format);
188 setError(QGeoTiledMapReply::UnknownError, tr(
"Invalid Cache Tile"));
199 setError(QGeoTiledMapReply::CommunicationError, tr(
"Network Not Available"));
203 _request.setOriginatingObject(
this);
205 QNetworkReply*
const reply = _networkManager->get(_request);
206 reply->setParent(
this);
209 (void) connect(reply, &QNetworkReply::finished,
this, &QGeoTiledMapReplyQGC::_networkReplyFinished);
210 (void) connect(reply, &QNetworkReply::errorOccurred,
this, &QGeoTiledMapReplyQGC::_networkReplyError);
211 (void) connect(reply, &QNetworkReply::sslErrors,
this, &QGeoTiledMapReplyQGC::_networkReplySslErrors);
212 (void) connect(
this, &QGeoTiledMapReplyQGC::aborted, reply, &QNetworkReply::abort);
217 QGeoTiledMapReply::abort();
#define QGC_LOGGING_CATEGORY(name, categoryStr)
QGCMapEngine * getQGCMapEngine()
std::shared_ptr< const ElevationProvider > SharedElevationProvider
std::shared_ptr< const MapProvider > SharedMapProvider
void tileFetched(QGCCacheTile *tile)
bool addTask(QGCMapTask *task)
void error(QGCMapTask::TaskType type, const QString &errorString)
static QGCFetchTileTask * createFetchTileTask(const QString &type, int x, int y, int z)
static void cacheTile(const QString &type, int x, int y, int z, const QByteArray &image, const QString &format, qulonglong set=UINT64_MAX)
static QString getProviderTypeFromQtMapId(int qtMapId)
static std::shared_ptr< const MapProvider > getMapProviderFromQtMapId(int qtMapId)
void ignoreSslErrorsIfNeeded(QNetworkReply *reply)
bool isHttpSuccess(int statusCode)
Check if HTTP status indicates success (2xx)
bool isInternetAvailable()
Check if internet is reachable (online state, stricter than isNetworkAvailable)