1 /****************************************************************************
2 **
3 ** Copyright (C) 2015 The Qt Company Ltd.
4 ** Contact: http://www.qt.io/licensing/
5 **
6 ** This file is part of the QtLocation module of the Qt Toolkit.
7 **
8 ** $QT_BEGIN_LICENSE:LGPL3$
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 http://www.qt.io/terms-conditions. For further
15 ** information use the contact form at http://www.qt.io/contact-us.
16 **
17 ** GNU Lesser General Public License Usage
18 ** Alternatively, this file may be used under the terms of the GNU Lesser
19 ** General Public License version 3 as published by the Free Software
20 ** Foundation and appearing in the file LICENSE.LGPLv3 included in the
21 ** packaging of this file. Please review the following information to
22 ** ensure the GNU Lesser General Public License version 3 requirements
23 ** will be met: https://www.gnu.org/licenses/lgpl.html.
24 **
25 ** GNU General Public License Usage
26 ** Alternatively, this file may be used under the terms of the GNU
27 ** General Public License version 2.0 or later as published by the Free
28 ** Software Foundation and appearing in the file LICENSE.GPL included in
29 ** the packaging of this file. Please review the following information to
30 ** ensure the GNU General Public License version 2.0 requirements will be
31 ** met: http://www.gnu.org/licenses/gpl-2.0.html.
32 **
33 ** $QT_END_LICENSE$
34 **
35 ****************************************************************************/
36 
37 #ifndef QDECLARATIVEGEOCODEMODEL_H
38 #define QDECLARATIVEGEOCODEMODEL_H
39 
40 //
41 //  W A R N I N G
42 //  -------------
43 //
44 // This file is not part of the Qt API.  It exists purely as an
45 // implementation detail.  This header file may change from version to
46 // version without notice, or even be removed.
47 //
48 // We mean it.
49 //
50 
51 #include <QtLocation/private/qlocationglobal_p.h>
52 #include <QtLocation/private/qdeclarativegeoserviceprovider_p.h>
53 
54 #include <QtLocation/qgeocodereply.h>
55 #include <QtPositioningQuick/private/qdeclarativegeoaddress_p.h>
56 #include <QtPositioningQuick/private/qdeclarativegeolocation_p.h>
57 
58 #include <QtQml/qqml.h>
59 #include <QtQml/QQmlParserStatus>
60 #include <QAbstractListModel>
61 #include <QPointer>
62 
63 
64 QT_BEGIN_NAMESPACE
65 
66 class QGeoServiceProvider;
67 class QGeoCodingManager;
68 class QDeclarativeGeoLocation;
69 
70 class Q_LOCATION_PRIVATE_EXPORT QDeclarativeGeocodeModel : public QAbstractListModel, public QQmlParserStatus
71 {
72     Q_OBJECT
73     Q_ENUMS(Status)
74     Q_ENUMS(GeocodeError)
75 
76     Q_PROPERTY(QDeclarativeGeoServiceProvider *plugin READ plugin WRITE setPlugin NOTIFY pluginChanged)
77     Q_PROPERTY(bool autoUpdate READ autoUpdate WRITE setAutoUpdate NOTIFY autoUpdateChanged)
78     Q_PROPERTY(Status status READ status NOTIFY statusChanged)
79     Q_PROPERTY(QString errorString READ errorString NOTIFY errorChanged)
80     Q_PROPERTY(int count READ count NOTIFY countChanged)
81     Q_PROPERTY(int limit READ limit WRITE setLimit NOTIFY limitChanged)
82     Q_PROPERTY(int offset READ offset WRITE setOffset NOTIFY offsetChanged)
83     Q_PROPERTY(QVariant query READ query WRITE setQuery NOTIFY queryChanged)
84     Q_PROPERTY(QVariant bounds READ bounds WRITE setBounds NOTIFY boundsChanged)
85     Q_PROPERTY(GeocodeError error READ error NOTIFY errorChanged)
86     Q_INTERFACES(QQmlParserStatus)
87 
88 public:
89     enum Status {
90         Null,
91         Ready,
92         Loading,
93         Error
94     };
95 
96     enum GeocodeError {
97         NoError = QGeoCodeReply::NoError,
98         EngineNotSetError = QGeoCodeReply::EngineNotSetError, //TODO Qt6 consider merge with NotSupportedError
99         CommunicationError = QGeoCodeReply::CommunicationError, //TODO Qt6 merge with Map's ConnectionError
100         ParseError = QGeoCodeReply::ParseError,
101         UnsupportedOptionError = QGeoCodeReply::UnsupportedOptionError, //TODO Qt6 consider rename UnsupportedOperationError
102         CombinationError = QGeoCodeReply::CombinationError,
103         UnknownError = QGeoCodeReply::UnknownError,
104         //we leave gap for future QGeoCodeReply errors
105 
106         //QGeoServiceProvider related errors start here
107         UnknownParameterError = 100,
108         MissingRequiredParameterError
109     };
110 
111     enum Roles {
112         LocationRole = Qt::UserRole + 1
113     };
114 
115     explicit QDeclarativeGeocodeModel(QObject *parent = 0);
116     virtual ~QDeclarativeGeocodeModel();
117 
118     // From QQmlParserStatus
classBegin()119     virtual void classBegin() {}
120     virtual void componentComplete();
121 
122     // From QAbstractListModel
123     virtual int rowCount(const QModelIndex &parent) const;
124     virtual QVariant data(const QModelIndex &index, int role) const;
125     virtual QHash<int,QByteArray> roleNames() const;
126 
127     void setPlugin(QDeclarativeGeoServiceProvider *plugin);
128     QDeclarativeGeoServiceProvider *plugin() const;
129 
130     void setBounds(const QVariant &boundingArea);
131     QVariant bounds() const;
132 
133     Status status() const;
134     QString errorString() const;
135     GeocodeError error() const;
136 
137     bool autoUpdate() const;
138     void setAutoUpdate(bool update);
139 
140     int count() const;
141     Q_INVOKABLE QDeclarativeGeoLocation *get(int index);
142 
143     int limit() const;
144     void setLimit(int limit);
145     int offset() const;
146     void setOffset(int offset);
147 
148     QVariant query() const;
149     void setQuery(const QVariant &query);
150     Q_INVOKABLE void reset();
151     Q_INVOKABLE void cancel();
152 
153 Q_SIGNALS:
154     void countChanged();
155     void pluginChanged();
156     void statusChanged();
157     void errorChanged(); //emitted also for errorString notification
158     void locationsChanged();
159     void autoUpdateChanged();
160     void boundsChanged();
161     void queryChanged();
162     void limitChanged();
163     void offsetChanged();
164 
165 public Q_SLOTS:
166     void update();
167 
168 protected Q_SLOTS:
169     void queryContentChanged();
170     void geocodeFinished(QGeoCodeReply *reply);
171     void geocodeError(QGeoCodeReply *reply,
172                      QGeoCodeReply::Error error,
173                      const QString &errorString);
174     void pluginReady();
175 
176 protected:
177     QGeoCodingManager *searchManager();
178     void setStatus(Status status);
179     void setError(GeocodeError error, const QString &errorString);
180     bool autoUpdate_;
181     bool complete_;
182 
183 private:
184     void setLocations(const QList<QGeoLocation> &locations);
185     void abortRequest();
186     QGeoCodeReply *reply_;
187 
188     QDeclarativeGeoServiceProvider *plugin_;
189     QGeoShape boundingArea_;
190 
191     QList<QDeclarativeGeoLocation *> declarativeLocations_;
192 
193     Status status_;
194     QString errorString_;
195     GeocodeError error_;
196     QVariant queryVariant_;
197     QGeoCoordinate coordinate_;
198     QDeclarativeGeoAddress *address_;
199     QString searchString_;
200 
201     int limit_;
202     int offset_;
203 };
204 
205 QT_END_NAMESPACE
206 
207 #endif
208