QGroundControl
Ground Control Station for MAVLink Drones
Loading...
Searching...
No Matches
QGeoTileFetcherQGC.cpp
Go to the documentation of this file.
2
3#include <QtLocation/private/qgeotiledmappingmanagerengine_p.h>
4#include <QtLocation/private/qgeotilespec_p.h>
5#include <QtNetwork/QNetworkRequest>
6
7#include "MapProvider.h"
9#include "QGCMapUrlEngine.h"
10#include "QGeoMapReplyQGC.h"
12
13QGC_LOGGING_CATEGORY(QGeoTileFetcherQGCLog, "QtLocationPlugin.QGeoTileFetcherQGC")
14
15QGeoTileFetcherQGC::QGeoTileFetcherQGC(QNetworkAccessManager *networkManager, const QVariantMap &parameters, QGeoTiledMappingManagerEngineQGC *parent)
16 : QGeoTileFetcher(parent)
17 , m_networkManager(networkManager)
18{
19 Q_ASSERT(networkManager);
20
21 qCDebug(QGeoTileFetcherQGCLog) << this;
22
23 // TODO: Allow useragent override again
24 /*if (parameters.contains(QStringLiteral("useragent"))) {
25 setUserAgent(parameters.value(QStringLiteral("useragent")).toString().toLatin1());
26 }*/
27}
28
30{
31 qCDebug(QGeoTileFetcherQGCLog) << this;
32}
33
34QGeoTiledMapReply* QGeoTileFetcherQGC::getTileImage(const QGeoTileSpec &spec)
35{
36 const SharedMapProvider provider = UrlFactory::getMapProviderFromQtMapId(spec.mapId());
37 if (!provider) {
38 return nullptr;
39 }
40
41 /*if (spec.zoom() > provider->maximumZoomLevel() || spec.zoom() < provider->minimumZoomLevel()) {
42 return nullptr;
43 }*/
44
45 const QNetworkRequest request = getNetworkRequest(spec.mapId(), spec.x(), spec.y(), spec.zoom());
46 if (request.url().isEmpty()) {
47 return nullptr;
48 }
49
50 QGeoTiledMapReplyQGC *tileImage = new QGeoTiledMapReplyQGC(m_networkManager, request, spec);
51 if (!tileImage->init()) {
52 tileImage->deleteLater();
53 return nullptr;
54 }
55
56 return tileImage;
57}
58
59bool QGeoTileFetcherQGC::initialized() const
60{
61 return (m_networkManager != nullptr);
62}
63
64bool QGeoTileFetcherQGC::fetchingEnabled() const
65{
66 return initialized();
67}
68
69void QGeoTileFetcherQGC::timerEvent(QTimerEvent *event)
70{
71 QGeoTileFetcher::timerEvent(event);
72}
73
74void QGeoTileFetcherQGC::handleReply(QGeoTiledMapReply *reply, const QGeoTileSpec &spec)
75{
76 if (!reply) {
77 return;
78 }
79
80 reply->deleteLater();
81
82 if (!initialized()) {
83 return;
84 }
85
86 if (reply->error() == QGeoTiledMapReply::NoError) {
87 emit tileFinished(spec, reply->mapImageData(), reply->mapImageFormat());
88 } else {
89 emit tileError(spec, reply->errorString());
90 }
91}
92
93QNetworkRequest QGeoTileFetcherQGC::getNetworkRequest(int mapId, int x, int y, int zoom)
94{
96 if (!mapProvider) {
97 return QNetworkRequest();
98 }
99
100 QNetworkRequest request;
101 request.setUrl(mapProvider->getTileURL(x, y, zoom));
102 request.setPriority(QNetworkRequest::NormalPriority);
103 request.setTransferTimeout(10000);
104 // request.setOriginatingObject(this);
105
106 // Headers
107 request.setRawHeader(QByteArrayLiteral("Accept"), QByteArrayLiteral("*/*"));
108 request.setHeader(QNetworkRequest::UserAgentHeader, s_userAgent);
109 const QByteArray referrer = mapProvider->getReferrer().toUtf8();
110 if (!referrer.isEmpty()) {
111 request.setRawHeader(QByteArrayLiteral("Referer"), referrer);
112 }
113 const QByteArray token = mapProvider->getToken();
114 if (!token.isEmpty()) {
115 request.setRawHeader(QByteArrayLiteral("User-Token"), token);
116 }
117 request.setRawHeader(QByteArrayLiteral("Connection"), QByteArrayLiteral("keep-alive"));
118 // request.setRawHeader(QByteArrayLiteral("Accept-Encoding"), QByteArrayLiteral("gzip, deflate, br"));
119
120 // Attributes
121 request.setAttribute(QNetworkRequest::CacheLoadControlAttribute, QNetworkRequest::PreferCache);
122 request.setAttribute(QNetworkRequest::BackgroundRequestAttribute, true);
123 request.setAttribute(QNetworkRequest::CacheSaveControlAttribute, true);
124 request.setAttribute(QNetworkRequest::RedirectPolicyAttribute, QNetworkRequest::NoLessSafeRedirectPolicy);
125 request.setAttribute(QNetworkRequest::Http2AllowedAttribute, true);
126 request.setAttribute(QNetworkRequest::DoNotBufferUploadDataAttribute, false);
127 // request.setAttribute(QNetworkRequest::AutoDeleteReplyOnFinishAttribute, true);
128
129 return request;
130}
#define QGC_LOGGING_CATEGORY(name, categoryStr)
std::shared_ptr< const MapProvider > SharedMapProvider
static QNetworkRequest getNetworkRequest(int mapId, int x, int y, int zoom)
static std::shared_ptr< const MapProvider > getMapProviderFromQtMapId(int qtMapId)