summaryrefslogtreecommitdiff
path: root/src/imports/location/tileprovider.cpp
blob: 03552d6fc7c954fb256bb9892fd763888f146e19 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
#include "tileprovider.h"

#include "tile.h"
#include "tilespec.h"

#include <QNetworkAccessManager>
#include <QNetworkRequest>
#include <QNetworkReply>
#include <QUrl>
#include <QPixmap>

TileProvider::TileProvider(QObject *parent)
    : QObject(parent)
{
    nam_ = new QNetworkAccessManager(this);
    connect(nam_,
            SIGNAL(finished(QNetworkReply*)),
            this,
            SLOT(finished(QNetworkReply*)));
}

void TileProvider::tileRequest(const TileSpec &spec)
{
    QString url = "http://tile.openstreetmap.org/";
    url += QString::number(spec.zoom());
    url += "/";
    url += QString::number(spec.x());
    url += "/";
    url += QString::number(spec.y());
    url += ".png";

    QNetworkRequest request = QNetworkRequest(QUrl(url));
    QNetworkReply *reply = nam_->get(request);

    map_.insert(reply, spec);
}

void TileProvider::finished(QNetworkReply *reply)
{
    if (!map_.contains(reply)) {
        reply->deleteLater();
        return;
    }

    TileSpec spec = map_.value(reply);

    if (reply->error() == QNetworkReply::NoError) {
        QByteArray bytes = reply->readAll();

        QPixmap pixmap;
        bool result = pixmap.loadFromData(bytes, "png");

        if (result) {
            Tile tile(spec, pixmap);
            emit tileReady(tile);
        }
    } else {
        emit tileError(spec);
    }

    reply->deleteLater();
}