lqml/examples/meshtastic/cpp/tile_provider.h
2023-08-15 08:16:03 +02:00

61 lines
1.8 KiB
C++

#pragma once
#include <QTcpServer>
#include <QTcpSocket>
#include <QtDebug>
// trivial local tile provider which doesn't need an API key
// (default Qt provider requires an API key from thunderforest.com)
class TileProvider : public QTcpServer {
Q_OBJECT
public:
TileProvider(int port = 0, QObject* parent = nullptr) : QTcpServer(parent) {
listen(QHostAddress::Any, port);
qDebug() << "tile provider started at IP" << serverAddress() << "port" << serverPort();
}
void incomingConnection(qintptr socket) override {
QTcpSocket* s = new QTcpSocket(this);
connect(s, &QTcpSocket::readyRead, this, &TileProvider::readClient);
connect(s, &QTcpSocket::disconnected, this, &TileProvider::discardClient);
s->setSocketDescriptor(socket);
}
public Q_SLOTS:
void readClient() {
QString json = QStringLiteral(
"{\"UrlTemplate\": \"https://tile.openstreetmap.org/%z/%x/%y.png\","
" \"ImageFormat\": \"png\","
" \"QImageFormat\": \"Indexed8\","
" \"ID\": \"wmf-intl-1x\","
" \"MaximumZoomLevel\": 19,"
" \"MapCopyRight\": \"<a href='http://www.openstreetmap.org/copyright'>OpenStreetMap</a>\","
" \"DataCopyRight\": \"\"}");
QTcpSocket* socket = static_cast<QTcpSocket*>(sender());
if (socket->canReadLine()) {
QString line = socket->readLine();
if (line.startsWith("GET")) {
QTextStream s(socket);
s.setCodec("UTF-8");
s << QStringLiteral("HTTP/1.0 200 Ok\r\n"
"Content-Type: application/json; charset=\"utf-8\"\r\n\r\n")
<< json
<< QStringLiteral("\r\n");
socket->close();
if (socket->state() == QTcpSocket::UnconnectedState) {
delete socket;
}
}
}
}
void discardClient() {
QTcpSocket* socket = static_cast<QTcpSocket*>(sender());
socket->deleteLater();
}
};