4#include <QtLocation/private/qgeotilespec_p.h>
5#include <QtNetwork/QNetworkAccessManager>
6#include <QtNetwork/QSslError>
24 : QGeoTiledMapReply(spec, parent)
25 , _networkManager(networkManager)
28 qCDebug(QGeoTiledMapReplyQGCLog) <<
this;
33 qCDebug(QGeoTiledMapReplyQGCLog) <<
this;
44 _initDataFromResources();
46 (void) connect(
this, &QGeoTiledMapReplyQGC::errorOccurred,
this, [
this](QGeoTiledMapReply::Error
error,
const QString &
errorString) {
48 setMapImageData(_badTile);
49 setMapImageFormat(QStringLiteral(
"png"));
51 }, Qt::AutoConnection);
55 qCWarning(QGeoTiledMapReplyQGCLog) <<
"Failed to create fetch tile task";
56 m_initialized =
false;
60 (void) connect(task, &
QGCMapTask::error,
this, &QGeoTiledMapReplyQGC::_cacheError);
63 m_initialized =
false;
70void QGeoTiledMapReplyQGC::_initDataFromResources()
72 if (_bingNoTileImage.isEmpty()) {
73 QFile file(
":/res/BingNoTileBytes.dat");
74 if (file.open(QFile::ReadOnly)) {
75 _bingNoTileImage = file.readAll();
80 if (_badTile.isEmpty()) {
81 QFile file(
":/res/images/notile.png");
82 if (file.open(QFile::ReadOnly)) {
83 _badTile = file.readAll();
89void QGeoTiledMapReplyQGC::_networkReplyFinished()
91 QNetworkReply*
const reply = qobject_cast<QNetworkReply*>(sender());
93 setError(QGeoTiledMapReply::UnknownError, tr(
"Unexpected Error"));
98 if (reply->error() != QNetworkReply::NoError) {
102 if (!reply->isOpen()) {
103 setError(QGeoTiledMapReply::ParseError, tr(
"Empty Reply"));
107 const int statusCode = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt();
109 setError(QGeoTiledMapReply::CommunicationError, reply->attribute(QNetworkRequest::HttpReasonPhraseAttribute).toString());
113 QByteArray image = reply->readAll();
114 if (image.isEmpty()) {
115 setError(QGeoTiledMapReply::ParseError, tr(
"Image is Empty"));
121 setError(QGeoTiledMapReply::UnknownError, tr(
"Invalid Map Provider"));
125 if (mapProvider->isBingProvider() && (image == _bingNoTileImage)) {
126 setError(QGeoTiledMapReply::CommunicationError, tr(
"Bing Tile Above Zoom Level"));
130 if (mapProvider->isElevationProvider()) {
131 const SharedElevationProvider elevationProvider = std::dynamic_pointer_cast<const ElevationProvider>(mapProvider);
132 image = elevationProvider->serialize(image);
133 if (image.isEmpty()) {
134 setError(QGeoTiledMapReply::ParseError, tr(
"Failed to Serialize Terrain Tile"));
138 setMapImageData(image);
140 const QString
format = mapProvider->getImageFormat(image);
142 setError(QGeoTiledMapReply::ParseError, tr(
"Unknown Format"));
145 setMapImageFormat(format);
152void QGeoTiledMapReplyQGC::_networkReplyError(QNetworkReply::NetworkError
error)
154 if (
error != QNetworkReply::OperationCanceledError) {
155 const QNetworkReply*
const reply = qobject_cast<const QNetworkReply*>(sender());
157 setError(QGeoTiledMapReply::CommunicationError, tr(
"Invalid Reply"));
159 setError(QGeoTiledMapReply::CommunicationError, reply->errorString());
166void QGeoTiledMapReplyQGC::_networkReplySslErrors(
const QList<QSslError> &errors)
169 for (
const QSslError &
error : errors) {
177 setError(QGeoTiledMapReply::CommunicationError,
errorString);
181void QGeoTiledMapReplyQGC::_cacheReply(
QGCCacheTile *tile)
184 setMapImageData(tile->
img);
185 setMapImageFormat(tile->
format);
190 setError(QGeoTiledMapReply::UnknownError, tr(
"Invalid Cache Tile"));
201 setError(QGeoTiledMapReply::CommunicationError, tr(
"Network Not Available"));
205 _request.setOriginatingObject(
this);
207 QNetworkReply*
const reply = _networkManager->get(_request);
208 reply->setParent(
this);
211 (void) connect(reply, &QNetworkReply::finished,
this, &QGeoTiledMapReplyQGC::_networkReplyFinished);
212 (void) connect(reply, &QNetworkReply::errorOccurred,
this, &QGeoTiledMapReplyQGC::_networkReplyError);
213 (void) connect(reply, &QNetworkReply::sslErrors,
this, &QGeoTiledMapReplyQGC::_networkReplySslErrors);
214 (void) connect(
this, &QGeoTiledMapReplyQGC::aborted, reply, &QNetworkReply::abort);
219 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)