12#include <QtCore/QFile>
13#include <QtCore/QString>
14#include <QtCore/QTimer>
15#include <QtNetwork/QNetworkAccessManager>
16#include <QtNetwork/QNetworkReply>
27 , _networkManager(networkManager)
30 QFile file(QStringLiteral(
":/res/BingNoTileBytes.dat"));
31 if (file.open(QFile::ReadOnly)) {
32 _bingNoTileImage = file.readAll();
34 qWarning() <<
"Error opening file" << file.fileName();
38 _timeoutTimer =
new QTimer(
this);
42 _tile.zoomLevel = zoomLevel;
64void Viewer3DTileReply::_prepareDownload()
67 _reply = _networkManager->get(request);
68 connect(_reply, &QNetworkReply::finished,
this, &Viewer3DTileReply::_onRequestFinished);
69 connect(_reply, &QNetworkReply::errorOccurred,
this, &Viewer3DTileReply::_onRequestError);
82 if (_isBingEmptyTile()) {
91void Viewer3DTileReply::_onCacheMiss()
94 _timeoutTimer->start(kTimeoutMs);
95 connect(_timeoutTimer, &QTimer::timeout,
this, &Viewer3DTileReply::_onTimeout);
98void Viewer3DTileReply::_onRequestFinished()
100 _tile.
data = _reply->readAll();
101 _timeoutTimer->stop();
103 disconnect(_timeoutTimer, &QTimer::timeout,
this, &Viewer3DTileReply::_onTimeout);
105 if (_isBingEmptyTile()) {
112 if (mapProvider && !_tile.
data.isEmpty()) {
113 const QString
format = mapProvider->getImageFormat(_tile.
data);
120void Viewer3DTileReply::_onRequestError()
122 qCWarning(Viewer3DTileReplyLog) <<
"Request error for tile x:" << _tile.
x <<
"y:" << _tile.
y <<
"zoom:" << _tile.
zoomLevel;
123 _timeoutTimer->stop();
124 disconnect(_timeoutTimer, &QTimer::timeout,
this, &Viewer3DTileReply::_onTimeout);
129void Viewer3DTileReply::_onTimeout()
131 qCDebug(Viewer3DTileReplyLog) <<
"Timeout for tile x:" << _tile.
x <<
"y:" << _tile.
y <<
"retry:" << _timeoutCounter <<
"/" << kMaxRetries;
132 if (_timeoutCounter > kMaxRetries) {
134 disconnect(_timeoutTimer, &QTimer::timeout,
this, &Viewer3DTileReply::_onTimeout);
136 _timeoutTimer->stop();
137 }
else if (_tile.
data.isEmpty()) {
149void Viewer3DTileReply::_disconnectReply()
151 disconnect(_reply, &QNetworkReply::finished,
this, &Viewer3DTileReply::_onRequestFinished);
152 disconnect(_reply, &QNetworkReply::errorOccurred,
this, &Viewer3DTileReply::_onRequestError);
155bool Viewer3DTileReply::_isBingEmptyTile()
const
158 return mapProvider && mapProvider->isBingProvider() && !_tile.
data.isEmpty() && _tile.
data == _bingNoTileImage;
#define QGC_LOGGING_CATEGORY(name, categoryStr)
QGCMapEngine * getQGCMapEngine()
std::shared_ptr< const MapProvider > SharedMapProvider
static std::once_flag s_bingNoTileInitFlag
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 QNetworkRequest getNetworkRequest(int mapId, int x, int y, int zoom)
static std::shared_ptr< const MapProvider > getMapProviderFromQtMapId(int qtMapId)
void tileDone(TileInfo_t)
void tileEmpty(TileInfo_t)
void tileGiveUp(TileInfo_t)