74 lines
2.4 KiB
C++
74 lines
2.4 KiB
C++
#include "../src/MapWidget.h"
|
|
|
|
#include <QApplication>
|
|
#include <QElapsedTimer>
|
|
#include <QHostAddress>
|
|
#include <QSet>
|
|
#include <QTcpServer>
|
|
#include <QTcpSocket>
|
|
#include <QThread>
|
|
|
|
#include <cassert>
|
|
|
|
int main(int argc, char **argv)
|
|
{
|
|
QApplication app(argc, argv);
|
|
|
|
QTcpServer tileServer;
|
|
assert(tileServer.listen(QHostAddress::LocalHost, 0));
|
|
|
|
int requestCount = 0;
|
|
QSet<QByteArray> requestedPaths;
|
|
QObject::connect(&tileServer, &QTcpServer::newConnection, [&]() {
|
|
while (tileServer.hasPendingConnections()) {
|
|
QTcpSocket *socket = tileServer.nextPendingConnection();
|
|
const auto respond = [&, socket]() {
|
|
if (!socket->canReadLine()) {
|
|
return;
|
|
}
|
|
const QByteArray requestLine = socket->readLine().trimmed();
|
|
const QList<QByteArray> fields = requestLine.split(' ');
|
|
if (fields.size() >= 2) {
|
|
++requestCount;
|
|
requestedPaths.insert(fields[1]);
|
|
}
|
|
socket->readAll();
|
|
socket->write("HTTP/1.1 503 Service Unavailable\r\n"
|
|
"Content-Length: 0\r\n"
|
|
"Connection: close\r\n\r\n");
|
|
socket->disconnectFromHost();
|
|
};
|
|
QObject::connect(socket, &QTcpSocket::readyRead, socket, respond);
|
|
QObject::connect(socket, &QTcpSocket::disconnected,
|
|
socket, &QObject::deleteLater);
|
|
respond();
|
|
}
|
|
});
|
|
|
|
const QByteArray tileUrl = QByteArray("http://127.0.0.1:")
|
|
+ QByteArray::number(tileServer.serverPort()) + "/{z}/{x}/{y}.png";
|
|
qputenv("LOCATION_PLOTTER_TILE_URL_TEMPLATE", tileUrl);
|
|
|
|
{
|
|
MapWidget map;
|
|
map.resize(640, 480);
|
|
map.show();
|
|
|
|
QElapsedTimer timer;
|
|
timer.start();
|
|
while (timer.elapsed() < 1200) {
|
|
app.processEvents(QEventLoop::AllEvents, 50);
|
|
QThread::msleep(5);
|
|
}
|
|
|
|
// Every URL fails. Seeing any URL more than once proves that a failed
|
|
// tile schedules a new paint/request instead of remaining a blank
|
|
// placeholder forever.
|
|
assert(!requestedPaths.isEmpty());
|
|
assert(requestCount > requestedPaths.size());
|
|
}
|
|
|
|
qunsetenv("LOCATION_PLOTTER_TILE_URL_TEMPLATE");
|
|
return 0;
|
|
}
|