1 /****************************************************************************
2 **
3 ** Copyright (C) 2016 The Qt Company Ltd.
4 ** Contact: https://www.qt.io/licensing/
5 **
6 ** This file is part of the test suite of the Qt Toolkit.
7 **
8 ** $QT_BEGIN_LICENSE:GPL-EXCEPT$
9 ** Commercial License Usage
10 ** Licensees holding valid commercial Qt licenses may use this file in
11 ** accordance with the commercial license agreement provided with the
12 ** Software or, alternatively, in accordance with the terms contained in
13 ** a written agreement between you and The Qt Company. For licensing terms
14 ** and conditions see https://www.qt.io/terms-conditions. For further
15 ** information use the contact form at https://www.qt.io/contact-us.
16 **
17 ** GNU General Public License Usage
18 ** Alternatively, this file may be used under the terms of the GNU
19 ** General Public License version 3 as published by the Free Software
20 ** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
21 ** included in the packaging of this file. Please review the following
22 ** information to ensure the GNU General Public License requirements will
23 ** be met: https://www.gnu.org/licenses/gpl-3.0.html.
24 **
25 ** $QT_END_LICENSE$
26 **
27 ****************************************************************************/
28 
29 #ifndef QGEOTILEFETCHER_TEST_H
30 #define QGEOTILEFETCHER_TEST_H
31 
32 #include <QtLocation/private/qgeotiledmapreply_p.h>
33 #include <QtLocation/private/qgeotilefetcher_p.h>
34 #include <QtLocation/private/qgeotilespec_p.h>
35 #include <QtLocation/private/qgeomappingmanagerengine_p.h>
36 
37 #include <QLocale>
38 #include <QPainter>
39 #include <QPixmap>
40 #include <QByteArray>
41 #include <QBuffer>
42 #include <QTimer>
43 #include <QDebug>
44 #include <QTimerEvent>
45 #include <QVariant>
46 
47 QT_USE_NAMESPACE
48 
49 class TiledMapReplyTest :public QGeoTiledMapReply
50 {
51     Q_OBJECT
52 public:
QGeoTiledMapReply(spec,parent)53     TiledMapReplyTest(const QGeoTileSpec &spec, QObject *parent=0): QGeoTiledMapReply (spec, parent) {}
callSetError(Error error,const QString & errorString)54     void callSetError ( Error error, const QString & errorString ) {setError(error, errorString);}
callSetFinished(bool finished)55     void callSetFinished ( bool finished ) { setFinished(finished);}
callSetCached(bool cached)56     void callSetCached(bool cached) { setFinished(cached);}
callSetMapImageData(const QByteArray & data)57     void callSetMapImageData(const QByteArray &data) { setMapImageData(data); }
callSetMapImageFormat(const QString & format)58     void callSetMapImageFormat(const QString &format) { setMapImageFormat(format); }
abort()59     void abort() { emit aborted(); }
60 
61 Q_SIGNALS:
62     void aborted();
63 };
64 
65 class QGeoTileFetcherTest: public QGeoTileFetcher
66 {
67     Q_OBJECT
68 public:
QGeoTileFetcherTest(QGeoMappingManagerEngine * parent)69     QGeoTileFetcherTest(QGeoMappingManagerEngine *parent)
70     :    QGeoTileFetcher(parent), finishRequestImmediately_(false), errorCode_(QGeoTiledMapReply::NoError)
71     {
72     }
73 
init()74     bool init()
75     {
76         return true;
77     }
78 
getTileImage(const QGeoTileSpec & spec)79     QGeoTiledMapReply* getTileImage(const QGeoTileSpec &spec)
80     {
81         TiledMapReplyTest* mappingReply =  new TiledMapReplyTest(spec, this);
82 
83         QImage im(256, 256, QImage::Format_RGB888);
84         im.fill(QColor("lightgray"));
85         QRectF rect;
86         QString text("X: " + QString::number(spec.x()) + "\nY: " + QString::number(spec.y()) + "\nZ: " + QString::number(spec.zoom()));
87         rect.setWidth(250);
88         rect.setHeight(250);
89         rect.setLeft(3);
90         rect.setTop(3);
91         QPainter painter;
92         QPen pen(QColor("firebrick"));
93         painter.begin(&im);
94         painter.setPen(pen);
95         painter.setFont( QFont("Times", 35, 10, false));
96         painter.drawText(rect, text);
97         // different border color for vertically and horizontally adjacent frames
98         if ((spec.x() + spec.y()) % 2 == 0)
99             pen.setColor(QColor("yellow"));
100         pen.setWidth(5);
101         painter.setPen(pen);
102         painter.drawRect(0,0,255,255);
103         painter.end();
104         QPixmap pm = QPixmap::fromImage(im);
105         QByteArray bytes;
106         QBuffer buffer(&bytes);
107         buffer.open(QIODevice::WriteOnly);
108         pm.save(&buffer, "PNG");
109 
110         mappingReply->callSetMapImageData(bytes);
111         mappingReply->callSetMapImageFormat("png");
112 
113         if (finishRequestImmediately_) {
114             updateRequest(mappingReply);
115             return mappingReply;
116         } else {
117             if (m_queue.isEmpty())
118                 timer_.start(500, this);
119             m_queue.append(mappingReply);
120         }
121 
122         return mappingReply;
123     }
124 
setFinishRequestImmediately(bool enabled)125     void setFinishRequestImmediately(bool enabled)
126     {
127         finishRequestImmediately_ = enabled;
128     }
129 
setTileSize(QSize tileSize)130     void setTileSize(QSize tileSize)
131     {
132         tileSize_ = tileSize;
133     }
134 
135 public Q_SLOTS:
requestAborted()136     void requestAborted()
137     {
138         timer_.stop();
139         errorString_.clear();
140         errorCode_ = QGeoTiledMapReply::NoError;
141     }
142 Q_SIGNALS:
143     void tileFetched(const QGeoTileSpec&);
144 
145 protected:
updateRequest(TiledMapReplyTest * mappingReply)146     void updateRequest(TiledMapReplyTest* mappingReply)
147     {
148         if (errorCode_) {
149             mappingReply->callSetError(errorCode_, errorString_);
150             emit tileError(mappingReply->tileSpec(), errorString_);
151         } else {
152             mappingReply->callSetError(QGeoTiledMapReply::NoError, "no error");
153             mappingReply->callSetFinished(true);
154             emit tileFetched(mappingReply->tileSpec());
155         }
156     }
157 
timerEvent(QTimerEvent * event)158     void timerEvent(QTimerEvent *event)
159     {
160         if (event->timerId() != timer_.timerId()) {
161             QGeoTileFetcher::timerEvent(event);
162             return;
163         }
164         updateRequest(m_queue.takeFirst());
165         if (m_queue.isEmpty()) {
166             timer_.stop();
167         }
168     }
169 
170 private:
171     bool finishRequestImmediately_;
172     QBasicTimer timer_;
173     QGeoTiledMapReply::Error errorCode_;
174     QString errorString_;
175     QSize tileSize_;
176     QList<TiledMapReplyTest*> m_queue;
177 };
178 
179 #endif
180