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 QDECLARATIVEQGEOSERVICEPROVIDER_H |
38 | #define QDECLARATIVEQGEOSERVICEPROVIDER_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 | |
53 | #include <QtCore/QMap> |
54 | #include <QtCore/QString> |
55 | #include <QtCore/QStringList> |
56 | #include <QtCore/QVariant> |
57 | #include <QtQml/qqml.h> |
58 | #include <QtQml/QQmlParserStatus> |
59 | #include <QtQml/QQmlListProperty> |
60 | #include <QtLocation/QGeoServiceProvider> |
61 | #include <QtPositioningQuick/private/qdeclarativepluginparameter_p.h> |
62 | |
63 | QT_BEGIN_NAMESPACE |
64 | |
65 | class QDeclarativeGeoServiceProviderRequirements; |
66 | |
67 | class Q_LOCATION_PRIVATE_EXPORT QDeclarativeGeoServiceProvider : public QObject, public QQmlParserStatus |
68 | { |
69 | Q_OBJECT |
70 | Q_ENUMS(RoutingFeature) |
71 | Q_ENUMS(GeocodingFeature) |
72 | Q_ENUMS(MappingFeature) |
73 | Q_ENUMS(PlacesFeature) |
74 | |
75 | Q_PROPERTY(QString name READ name WRITE setName NOTIFY nameChanged) |
76 | Q_PROPERTY(QStringList availableServiceProviders READ availableServiceProviders CONSTANT) |
77 | Q_PROPERTY(QQmlListProperty<QDeclarativePluginParameter> parameters READ parameters) |
78 | Q_PROPERTY(QDeclarativeGeoServiceProviderRequirements *required READ requirements WRITE setRequirements) |
79 | Q_PROPERTY(QStringList locales READ locales WRITE setLocales NOTIFY localesChanged) |
80 | Q_PROPERTY(QStringList preferred READ preferred WRITE setPreferred NOTIFY preferredChanged) |
81 | Q_PROPERTY(bool allowExperimental READ allowExperimental WRITE setAllowExperimental NOTIFY allowExperimentalChanged) |
82 | Q_PROPERTY(bool isAttached READ isAttached NOTIFY attached) |
83 | |
84 | Q_CLASSINFO("DefaultProperty" , "parameters" ) |
85 | Q_INTERFACES(QQmlParserStatus) |
86 | |
87 | public: |
88 | explicit QDeclarativeGeoServiceProvider(QObject *parent = nullptr); |
89 | ~QDeclarativeGeoServiceProvider(); |
90 | |
91 | enum RoutingFeature { |
92 | NoRoutingFeatures = QGeoServiceProvider::NoRoutingFeatures, |
93 | OnlineRoutingFeature = QGeoServiceProvider::OnlineRoutingFeature, |
94 | OfflineRoutingFeature = QGeoServiceProvider::OfflineRoutingFeature, |
95 | LocalizedRoutingFeature = QGeoServiceProvider::LocalizedRoutingFeature, |
96 | RouteUpdatesFeature = QGeoServiceProvider::RouteUpdatesFeature, |
97 | AlternativeRoutesFeature = QGeoServiceProvider::AlternativeRoutesFeature, |
98 | ExcludeAreasRoutingFeature = QGeoServiceProvider::ExcludeAreasRoutingFeature, |
99 | AnyRoutingFeatures = QGeoServiceProvider::AnyRoutingFeatures |
100 | }; |
101 | |
102 | enum GeocodingFeature { |
103 | NoGeocodingFeatures = QGeoServiceProvider::NoGeocodingFeatures, |
104 | OnlineGeocodingFeature = QGeoServiceProvider::OnlineGeocodingFeature, |
105 | OfflineGeocodingFeature = QGeoServiceProvider::OfflineGeocodingFeature, |
106 | ReverseGeocodingFeature = QGeoServiceProvider::ReverseGeocodingFeature, |
107 | LocalizedGeocodingFeature = QGeoServiceProvider::LocalizedGeocodingFeature, |
108 | AnyGeocodingFeatures = QGeoServiceProvider::AnyGeocodingFeatures |
109 | }; |
110 | |
111 | enum MappingFeature { |
112 | NoMappingFeatures = QGeoServiceProvider::NoMappingFeatures, |
113 | OnlineMappingFeature = QGeoServiceProvider::OnlineMappingFeature, |
114 | OfflineMappingFeature = QGeoServiceProvider::OfflineMappingFeature, |
115 | LocalizedMappingFeature = QGeoServiceProvider::LocalizedMappingFeature, |
116 | AnyMappingFeatures = QGeoServiceProvider::AnyMappingFeatures |
117 | }; |
118 | |
119 | enum PlacesFeature { |
120 | NoPlacesFeatures = QGeoServiceProvider::NoPlacesFeatures, |
121 | OnlinePlacesFeature = QGeoServiceProvider::OnlinePlacesFeature, |
122 | OfflinePlacesFeature = QGeoServiceProvider::OfflinePlacesFeature, |
123 | SavePlaceFeature = QGeoServiceProvider::SavePlaceFeature, |
124 | RemovePlaceFeature = QGeoServiceProvider::RemovePlaceFeature, |
125 | SaveCategoryFeature = QGeoServiceProvider::SaveCategoryFeature, |
126 | RemoveCategoryFeature = QGeoServiceProvider::RemoveCategoryFeature, |
127 | PlaceRecommendationsFeature = QGeoServiceProvider::PlaceRecommendationsFeature, |
128 | SearchSuggestionsFeature = QGeoServiceProvider::SearchSuggestionsFeature, |
129 | LocalizedPlacesFeature = QGeoServiceProvider::LocalizedPlacesFeature, |
130 | NotificationsFeature = QGeoServiceProvider::NotificationsFeature, |
131 | PlaceMatchingFeature = QGeoServiceProvider::PlaceMatchingFeature, |
132 | AnyPlacesFeatures = QGeoServiceProvider::AnyPlacesFeatures |
133 | }; |
134 | |
135 | enum NavigationFeature { |
136 | NoNavigationFeatures = QGeoServiceProvider::NoNavigationFeatures, |
137 | OnlineNavigationFeature = QGeoServiceProvider::OnlineNavigationFeature, |
138 | OfflineNavigationFeature = QGeoServiceProvider::OfflineNavigationFeature, |
139 | AnyNavigationFeatures = QGeoServiceProvider::AnyNavigationFeatures |
140 | }; |
141 | |
142 | Q_DECLARE_FLAGS(RoutingFeatures, RoutingFeature) |
143 | Q_FLAGS(RoutingFeatures) |
144 | |
145 | Q_DECLARE_FLAGS(GeocodingFeatures, GeocodingFeature) |
146 | Q_FLAGS(GeocodingFeatures) |
147 | |
148 | Q_DECLARE_FLAGS(MappingFeatures, MappingFeature) |
149 | Q_FLAGS(MappingFeatures) |
150 | |
151 | Q_DECLARE_FLAGS(PlacesFeatures, PlacesFeature) |
152 | Q_FLAGS(PlacesFeatures) |
153 | |
154 | Q_DECLARE_FLAGS(NavigationFeatures, NavigationFeature) |
155 | Q_FLAGS(NavigationFeatures) |
156 | |
157 | // From QQmlParserStatus |
158 | virtual void classBegin() {} |
159 | virtual void componentComplete(); |
160 | |
161 | void setName(const QString &name); |
162 | QString name() const; |
163 | |
164 | QQmlListProperty<QDeclarativePluginParameter> parameters(); |
165 | QVariantMap parameterMap() const; |
166 | |
167 | QStringList availableServiceProviders(); |
168 | |
169 | QDeclarativeGeoServiceProviderRequirements *requirements() const; |
170 | void setRequirements(QDeclarativeGeoServiceProviderRequirements *req); |
171 | |
172 | QStringList preferred() const; |
173 | void setPreferred(const QStringList &val); |
174 | |
175 | QGeoServiceProvider *sharedGeoServiceProvider() const; |
176 | |
177 | Q_INVOKABLE bool supportsRouting(const RoutingFeatures &feature = AnyRoutingFeatures) const; |
178 | Q_INVOKABLE bool supportsGeocoding(const GeocodingFeatures &feature = AnyGeocodingFeatures) const; |
179 | Q_INVOKABLE bool supportsMapping(const MappingFeatures &feature = AnyMappingFeatures) const; |
180 | Q_INVOKABLE bool supportsPlaces(const PlacesFeatures &feature = AnyPlacesFeatures) const; |
181 | Q_REVISION(11) Q_INVOKABLE bool supportsNavigation(const NavigationFeature &feature = AnyNavigationFeatures) const; |
182 | |
183 | QStringList locales() const; |
184 | void setLocales(const QStringList &locales); |
185 | |
186 | bool isAttached() const; |
187 | |
188 | void setAllowExperimental(bool allow); |
189 | bool allowExperimental() const; |
190 | |
191 | Q_SIGNALS: |
192 | void nameChanged(const QString &name); |
193 | void localesChanged(); |
194 | void attached(); |
195 | void preferredChanged(const QStringList &preferences); |
196 | void allowExperimentalChanged(bool allow); |
197 | |
198 | private: |
199 | bool parametersReady(); |
200 | void tryAttach(); |
201 | static void parameter_append(QQmlListProperty<QDeclarativePluginParameter> *prop, QDeclarativePluginParameter *mapObject); |
202 | static int parameter_count(QQmlListProperty<QDeclarativePluginParameter> *prop); |
203 | static QDeclarativePluginParameter *parameter_at(QQmlListProperty<QDeclarativePluginParameter> *prop, int index); |
204 | static void parameter_clear(QQmlListProperty<QDeclarativePluginParameter> *prop); |
205 | |
206 | QGeoServiceProvider *sharedProvider_; |
207 | QString name_; |
208 | QList<QDeclarativePluginParameter *> parameters_; |
209 | QDeclarativeGeoServiceProviderRequirements *required_; |
210 | bool complete_; |
211 | bool experimental_; |
212 | QStringList locales_; |
213 | QStringList prefer_; |
214 | Q_DISABLE_COPY(QDeclarativeGeoServiceProvider) |
215 | }; |
216 | |
217 | class Q_LOCATION_PRIVATE_EXPORT QDeclarativeGeoServiceProviderRequirements : public QObject |
218 | { |
219 | Q_OBJECT |
220 | Q_PROPERTY(QDeclarativeGeoServiceProvider::MappingFeatures mapping |
221 | READ mappingRequirements WRITE setMappingRequirements |
222 | NOTIFY mappingRequirementsChanged) |
223 | Q_PROPERTY(QDeclarativeGeoServiceProvider::RoutingFeatures routing |
224 | READ routingRequirements WRITE setRoutingRequirements |
225 | NOTIFY routingRequirementsChanged) |
226 | Q_PROPERTY(QDeclarativeGeoServiceProvider::GeocodingFeatures geocoding |
227 | READ geocodingRequirements WRITE setGeocodingRequirements |
228 | NOTIFY geocodingRequirementsChanged) |
229 | Q_PROPERTY(QDeclarativeGeoServiceProvider::PlacesFeatures places |
230 | READ placesRequirements WRITE setPlacesRequirements |
231 | NOTIFY placesRequirementsChanged) |
232 | Q_PROPERTY(QDeclarativeGeoServiceProvider::NavigationFeatures navigation |
233 | READ navigationRequirements WRITE setNavigationRequirements |
234 | NOTIFY navigationRequirementsChanged) |
235 | |
236 | public: |
237 | explicit QDeclarativeGeoServiceProviderRequirements(QObject *parent = 0); |
238 | ~QDeclarativeGeoServiceProviderRequirements(); |
239 | |
240 | QDeclarativeGeoServiceProvider::MappingFeatures mappingRequirements() const; |
241 | void setMappingRequirements(const QDeclarativeGeoServiceProvider::MappingFeatures &features); |
242 | |
243 | QDeclarativeGeoServiceProvider::RoutingFeatures routingRequirements() const; |
244 | void setRoutingRequirements(const QDeclarativeGeoServiceProvider::RoutingFeatures &features); |
245 | |
246 | QDeclarativeGeoServiceProvider::GeocodingFeatures geocodingRequirements() const; |
247 | void setGeocodingRequirements(const QDeclarativeGeoServiceProvider::GeocodingFeatures &features); |
248 | |
249 | QDeclarativeGeoServiceProvider::PlacesFeatures placesRequirements() const; |
250 | void setPlacesRequirements(const QDeclarativeGeoServiceProvider::PlacesFeatures &features); |
251 | |
252 | QDeclarativeGeoServiceProvider::NavigationFeatures navigationRequirements() const; |
253 | void setNavigationRequirements(const QDeclarativeGeoServiceProvider::NavigationFeatures &features); |
254 | |
255 | Q_INVOKABLE bool matches(const QGeoServiceProvider *provider) const; |
256 | |
257 | bool operator == (const QDeclarativeGeoServiceProviderRequirements &rhs) const; |
258 | |
259 | Q_SIGNALS: |
260 | void mappingRequirementsChanged(const QDeclarativeGeoServiceProvider::MappingFeatures &features); |
261 | void routingRequirementsChanged(const QDeclarativeGeoServiceProvider::RoutingFeatures &features); |
262 | void geocodingRequirementsChanged(const QDeclarativeGeoServiceProvider::GeocodingFeatures &features); |
263 | void placesRequirementsChanged(const QDeclarativeGeoServiceProvider::PlacesFeatures &features); |
264 | void navigationRequirementsChanged(const QDeclarativeGeoServiceProvider::NavigationFeatures &features); |
265 | |
266 | void requirementsChanged(); |
267 | |
268 | private: |
269 | QDeclarativeGeoServiceProvider::MappingFeatures mapping_; |
270 | QDeclarativeGeoServiceProvider::RoutingFeatures routing_; |
271 | QDeclarativeGeoServiceProvider::GeocodingFeatures geocoding_; |
272 | QDeclarativeGeoServiceProvider::PlacesFeatures places_; |
273 | QDeclarativeGeoServiceProvider::NavigationFeatures navigation_; |
274 | }; |
275 | |
276 | QT_END_NAMESPACE |
277 | |
278 | QML_DECLARE_TYPE(QDeclarativeGeoServiceProviderRequirements) |
279 | QML_DECLARE_TYPE(QDeclarativeGeoServiceProvider) |
280 | |
281 | #endif |
282 | |