1 /***************************************************************************
2       qgsgpxprovider.h  -  Data provider for GPS eXchange files
3                              -------------------
4     begin                : 2004-04-14
5     copyright            : (C) 2004 by Lars Luthman
6     email                : larsl@users.sourceforge.net
7 
8     Partly based on qgsdelimitedtextprovider.h, (C) 2004 Gary E. Sherman
9  ***************************************************************************/
10 
11 /***************************************************************************
12  *                                                                         *
13  *   This program is free software; you can redistribute it and/or modify  *
14  *   it under the terms of the GNU General Public License as published by  *
15  *   the Free Software Foundation; either version 2 of the License, or     *
16  *   (at your option) any later version.                                   *
17  *                                                                         *
18  ***************************************************************************/
19 
20 #ifndef QGSGPXPROVIDER_H
21 #define QGSGPXPROVIDER_H
22 
23 #include "qgsvectordataprovider.h"
24 #include "gpsdata.h"
25 #include "qgsfields.h"
26 #include "qgsprovidermetadata.h"
27 
28 class QgsFeature;
29 class QgsField;
30 class QFile;
31 class QDomDocument;
32 class QgsGpsData;
33 
34 class QgsGPXFeatureIterator;
35 
36 /**
37  * \class QgsGPXProvider
38  * \brief Data provider for GPX (GPS eXchange) files
39  * This provider adds the ability to load GPX files as vector layers.
40 */
41 class QgsGPXProvider final: public QgsVectorDataProvider
42 {
43     Q_OBJECT
44 
45   public:
46     explicit QgsGPXProvider( const QString &uri, const QgsDataProvider::ProviderOptions &providerOptions, QgsDataProvider::ReadFlags flags = QgsDataProvider::ReadFlags() );
47     ~QgsGPXProvider() override;
48 
49     /* Functions inherited from QgsVectorDataProvider */
50 
51     QgsAbstractFeatureSource *featureSource() const override;
52     QString storageType() const override;
53     QgsFeatureIterator getFeatures( const QgsFeatureRequest &request ) const override;
54     QgsWkbTypes::Type wkbType() const override;
55     long long featureCount() const override;
56     QgsFields fields() const override;
57     bool addFeatures( QgsFeatureList &flist, QgsFeatureSink::Flags flags = QgsFeatureSink::Flags() ) override;
58     bool deleteFeatures( const QgsFeatureIds &id ) override;
59     bool changeAttributeValues( const QgsChangedAttributesMap &attr_map ) override;
60     QgsVectorDataProvider::Capabilities capabilities() const override;
61     QVariant defaultValue( int fieldId ) const override;
62 
63 
64     /* Functions inherited from QgsDataProvider */
65 
66     QgsRectangle extent() const override;
67     bool isValid() const override;
68     QString name() const override;
69     QString description() const override;
70     QgsCoordinateReferenceSystem crs() const override;
71 
72 
73     /* new functions */
74 
75     void changeAttributeValues( QgsGpsObject &obj,
76                                 const QgsAttributeMap &attrs );
77 
78     bool addFeature( QgsFeature &f, QgsFeatureSink::Flags flags = QgsFeatureSink::Flags() ) override;
79 
80     static QString encodeUri( const QVariantMap &parts );
81     static QVariantMap decodeUri( const QString &uri );
82 
83     enum DataType
84     {
85       WaypointType = 1,
86       RouteType = 2,
87       TrackType = 4,
88 
89       TrkRteType = RouteType | TrackType,
90       AllType = WaypointType | RouteType | TrackType
91 
92     };
93 
94     enum Attribute { NameAttr = 0, EleAttr, SymAttr, NumAttr,
95                      CmtAttr, DscAttr, SrcAttr, URLAttr, URLNameAttr
96                    };
97 
98   private:
99 
100     QgsGpsData *mData = nullptr;
101 
102     //! Fields
103     QgsFields mAttributeFields;
104     //! map from field index to attribute
105     QVector<int> mIndexToAttr;
106 
107     QString mFileName;
108 
109     DataType mFeatureType = WaypointType;
110 
111     static const QStringList sAttributeNames;
112     static const QList< QVariant::Type > sAttributeTypes;
113     static const QList< DataType > sAttributedUsedForLayerType;
114 
115     bool mValid = false;
116 
117     friend class QgsGPXFeatureSource;
118 };
119 
120 class QgsGpxProviderMetadata final: public QgsProviderMetadata
121 {
122   public:
123     QgsGpxProviderMetadata();
124     QgsDataProvider *createProvider( const QString &uri, const QgsDataProvider::ProviderOptions &options, QgsDataProvider::ReadFlags flags = QgsDataProvider::ReadFlags() ) override;
125     QgsProviderMetadata::ProviderCapabilities providerCapabilities() const override;
126     QString encodeUri( const QVariantMap &parts ) const override;
127     QVariantMap decodeUri( const QString &uri ) const override;
128 };
129 
130 #endif
131