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#include <chrono>
7
8#include "MapProvider.h"
10#include "QGCMapUrlEngine.h"
11#include "QGeoMapReplyQGC.h"
13
14QGC_LOGGING_CATEGORY(QGeoTileFetcherQGCLog, "QtLocationPlugin.QGeoTileFetcherQGC")
15
16namespace {
17// Keep pooled sockets warm across sparse tile/terrain fetches; Qt 6.11 otherwise reaps idle ones after 2 min.
18constexpr int kConnectionCacheExpirySecs = 300;
19constexpr std::chrono::seconds kTcpKeepAliveIdle{60};
20constexpr std::chrono::seconds kTcpKeepAliveInterval{30};
21constexpr int kTcpKeepAliveProbeCount = 3;
22} // namespace
23
24QGeoTileFetcherQGC::QGeoTileFetcherQGC(QNetworkAccessManager* networkManager, const QVariantMap& parameters,
26 : QGeoTileFetcher(parent), m_networkManager(networkManager)
27{
28 Q_ASSERT(networkManager);
29
30 qCDebug(QGeoTileFetcherQGCLog) << this;
31
32 // TODO: Allow useragent override again
33 /*if (parameters.contains(QStringLiteral("useragent"))) {
34 setUserAgent(parameters.value(QStringLiteral("useragent")).toString().toLatin1());
35 }*/
36}
37
39{
40 qCDebug(QGeoTileFetcherQGCLog) << this;
41}
42
43QGeoTiledMapReply* QGeoTileFetcherQGC::getTileImage(const QGeoTileSpec& spec)
44{
45 const SharedMapProvider provider = UrlFactory::getMapProviderFromQtMapId(spec.mapId());
46 if (!provider) {
47 return nullptr;
48 }
49
50 /*if (spec.zoom() > provider->maximumZoomLevel() || spec.zoom() < provider->minimumZoomLevel()) {
51 return nullptr;
52 }*/
53
54 const QNetworkRequest request = getNetworkRequest(spec.mapId(), spec.x(), spec.y(), spec.zoom());
55 if (request.url().isEmpty()) {
56 return nullptr;
57 }
58
59 QGeoTiledMapReplyQGC* tileImage = new QGeoTiledMapReplyQGC(m_networkManager, request, spec);
60 if (!tileImage->init()) {
61 tileImage->deleteLater();
62 return nullptr;
63 }
64
65 return tileImage;
66}
67
68bool QGeoTileFetcherQGC::initialized() const
69{
70 return (m_networkManager != nullptr);
71}
72
73bool QGeoTileFetcherQGC::fetchingEnabled() const
74{
75 return initialized();
76}
77
78void QGeoTileFetcherQGC::timerEvent(QTimerEvent* event)
79{
80 QGeoTileFetcher::timerEvent(event);
81}
82
83void QGeoTileFetcherQGC::handleReply(QGeoTiledMapReply* reply, const QGeoTileSpec& spec)
84{
85 if (!reply) {
86 return;
87 }
88
89 reply->deleteLater();
90
91 if (!initialized()) {
92 return;
93 }
94
95 if (reply->error() == QGeoTiledMapReply::NoError) {
96 emit tileFinished(spec, reply->mapImageData(), reply->mapImageFormat());
97 } else {
98 emit tileError(spec, reply->errorString());
99 }
100}
101
102QNetworkRequest QGeoTileFetcherQGC::getNetworkRequest(int mapId, int x, int y, int zoom)
103{
105 if (!mapProvider) {
106 return QNetworkRequest();
107 }
108
109 QNetworkRequest request;
110 request.setUrl(mapProvider->getTileURL(x, y, zoom));
111 request.setPriority(QNetworkRequest::NormalPriority);
112 request.setTransferTimeout(10000);
113 // request.setOriginatingObject(this);
114
115 // Headers
116 request.setRawHeader(QByteArrayLiteral("Accept"), QByteArrayLiteral("*/*"));
117 request.setHeader(QNetworkRequest::UserAgentHeader, s_userAgent);
118 const QByteArray referrer = mapProvider->getReferrer().toUtf8();
119 if (!referrer.isEmpty()) {
120 request.setRawHeader(QByteArrayLiteral("Referer"), referrer);
121 }
122 const QByteArray token = mapProvider->getToken();
123 if (!token.isEmpty()) {
124 request.setRawHeader(QByteArrayLiteral("User-Token"), token);
125 }
126 request.setRawHeader(QByteArrayLiteral("Connection"), QByteArrayLiteral("keep-alive"));
127 request.setAttribute(QNetworkRequest::ConnectionCacheExpiryTimeoutSecondsAttribute, kConnectionCacheExpirySecs);
128 request.setTcpKeepAliveIdleTimeBeforeProbes(kTcpKeepAliveIdle);
129 request.setTcpKeepAliveIntervalBetweenProbes(kTcpKeepAliveInterval);
130 request.setTcpKeepAliveProbeCount(kTcpKeepAliveProbeCount);
131 // request.setRawHeader(QByteArrayLiteral("Accept-Encoding"), QByteArrayLiteral("gzip, deflate, br"));
132
133 // Attributes
134 request.setAttribute(QNetworkRequest::CacheLoadControlAttribute, QNetworkRequest::PreferCache);
135 request.setAttribute(QNetworkRequest::BackgroundRequestAttribute, true);
136 request.setAttribute(QNetworkRequest::CacheSaveControlAttribute, true);
137 request.setAttribute(QNetworkRequest::RedirectPolicyAttribute, QNetworkRequest::NoLessSafeRedirectPolicy);
138 request.setAttribute(QNetworkRequest::Http2AllowedAttribute, true);
139 request.setAttribute(QNetworkRequest::DoNotBufferUploadDataAttribute, false);
140 // request.setAttribute(QNetworkRequest::AutoDeleteReplyOnFinishAttribute, true);
141
142 return request;
143}
#define QGC_LOGGING_CATEGORY(name, categoryStr)
std::shared_ptr< const MapProvider > SharedMapProvider
QGeoTileFetcherQGC(QNetworkAccessManager *networkManager, const QVariantMap &parameters, QGeoTiledMappingManagerEngineQGC *parent=nullptr)
static QNetworkRequest getNetworkRequest(int mapId, int x, int y, int zoom)
static std::shared_ptr< const MapProvider > getMapProviderFromQtMapId(int qtMapId)