@@ -73,16 +73,21 @@ QgsGPXProvider::QgsGPXProvider( const QString &uri, const ProviderOptions &optio
73
73
// we always use UTF-8
74
74
setEncoding ( QStringLiteral ( " utf8" ) );
75
75
76
- // get the file name and the type parameter from the URI
77
- int fileNameEnd = uri. indexOf ( ' ? ' );
78
- if ( fileNameEnd == - 1 || uri. mid ( fileNameEnd + 1 , 5 ) != QLatin1String ( " type= " ) )
76
+ const QVariantMap uriParts = decodeUri ( uri );
77
+ const QString typeStr = uriParts. value ( QStringLiteral ( " layerName " ) ). toString ( );
78
+ if ( typeStr. isEmpty ( ) )
79
79
{
80
80
QgsLogger::warning ( tr ( " Bad URI - you need to specify the feature type." ) );
81
81
return ;
82
82
}
83
- QString typeStr = uri.mid ( fileNameEnd + 6 );
84
- mFeatureType = ( typeStr == QLatin1String ( " waypoint" ) ? WaypointType :
85
- ( typeStr == QLatin1String ( " route" ) ? RouteType : TrackType ) );
83
+ if ( typeStr.compare ( QLatin1String ( " waypoint" ), Qt::CaseInsensitive ) == 0 )
84
+ mFeatureType = WaypointType;
85
+ else if ( typeStr.compare ( QLatin1String ( " route" ), Qt::CaseInsensitive ) == 0 )
86
+ mFeatureType = RouteType;
87
+ else
88
+ mFeatureType = TrackType;
89
+
90
+ mFileName = uriParts.value ( QStringLiteral ( " path" ) ).toString ();
86
91
87
92
// set up the attributes and the geometry type depending on the feature type
88
93
for ( int i = 0 ; i < ATTR_COUNT; ++i )
@@ -95,8 +100,6 @@ QgsGPXProvider::QgsGPXProvider( const QString &uri, const ProviderOptions &optio
95
100
}
96
101
}
97
102
98
- mFileName = uri.left ( fileNameEnd );
99
-
100
103
// parse the file
101
104
data = QgsGpsData::getData ( mFileName );
102
105
if ( !data )
@@ -105,7 +108,6 @@ QgsGPXProvider::QgsGPXProvider( const QString &uri, const ProviderOptions &optio
105
108
mValid = true ;
106
109
}
107
110
108
-
109
111
QgsGPXProvider::~QgsGPXProvider ()
110
112
{
111
113
QgsGpsData::releaseData ( mFileName );
@@ -116,7 +118,6 @@ QgsAbstractFeatureSource *QgsGPXProvider::featureSource() const
116
118
return new QgsGPXFeatureSource ( this );
117
119
}
118
120
119
-
120
121
QString QgsGPXProvider::storageType () const
121
122
{
122
123
return tr ( " GPS eXchange file" );
@@ -171,13 +172,11 @@ bool QgsGPXProvider::isValid() const
171
172
return mValid ;
172
173
}
173
174
174
-
175
175
QgsFeatureIterator QgsGPXProvider::getFeatures ( const QgsFeatureRequest &request ) const
176
176
{
177
177
return QgsFeatureIterator ( new QgsGPXFeatureIterator ( new QgsGPXFeatureSource ( this ), true , request ) );
178
178
}
179
179
180
-
181
180
bool QgsGPXProvider::addFeatures ( QgsFeatureList &flist, Flags flags )
182
181
{
183
182
if ( !data )
@@ -371,7 +370,6 @@ bool QgsGPXProvider::addFeature( QgsFeature &f, Flags )
371
370
return success;
372
371
}
373
372
374
-
375
373
bool QgsGPXProvider::deleteFeatures ( const QgsFeatureIds &id )
376
374
{
377
375
if ( !data )
@@ -393,7 +391,6 @@ bool QgsGPXProvider::deleteFeatures( const QgsFeatureIds &id )
393
391
return true ;
394
392
}
395
393
396
-
397
394
bool QgsGPXProvider::changeAttributeValues ( const QgsChangedAttributesMap &attr_map )
398
395
{
399
396
if ( !data )
@@ -446,7 +443,6 @@ bool QgsGPXProvider::changeAttributeValues( const QgsChangedAttributesMap &attr_
446
443
return true ;
447
444
}
448
445
449
-
450
446
void QgsGPXProvider::changeAttributeValues ( QgsGpsObject &obj, const QgsAttributeMap &attrs )
451
447
{
452
448
@@ -512,37 +508,52 @@ void QgsGPXProvider::changeAttributeValues( QgsGpsObject &obj, const QgsAttribut
512
508
513
509
}
514
510
515
-
516
511
QVariant QgsGPXProvider::defaultValue ( int fieldId ) const
517
512
{
518
513
if ( fieldId == SrcAttr )
519
514
return tr ( " Digitized in QGIS" );
520
515
return QVariant ();
521
516
}
522
517
523
-
524
518
QString QgsGPXProvider::name () const
525
519
{
526
520
return GPX_KEY;
527
- } // QgsGPXProvider::name()
528
-
529
-
521
+ }
530
522
531
523
QString QgsGPXProvider::description () const
532
524
{
533
525
return GPX_DESCRIPTION;
534
- } // QgsGPXProvider::description()
526
+ }
535
527
536
528
QgsCoordinateReferenceSystem QgsGPXProvider::crs () const
537
529
{
538
530
return QgsCoordinateReferenceSystem ( QStringLiteral ( " EPSG:4326" ) );
539
531
}
540
532
541
- QgsDataProvider * QgsGpxProviderMetadata::createProvider ( const QString &uri, const QgsDataProvider::ProviderOptions &options, QgsDataProvider::ReadFlags flags )
533
+ QString QgsGPXProvider::encodeUri ( const QVariantMap &parts )
542
534
{
543
- return new QgsGPXProvider ( uri, options, flags );
535
+ if ( parts.value ( QStringLiteral ( " layerName" ) ).toString ().isEmpty () )
536
+ return parts.value ( QStringLiteral ( " path" ) ).toString ();
537
+ else
538
+ return QStringLiteral ( " %1?type=%2" ).arg ( parts.value ( QStringLiteral ( " path" ) ).toString (),
539
+ parts.value ( QStringLiteral ( " layerName" ) ).toString () );
544
540
}
545
541
542
+ QVariantMap QgsGPXProvider::decodeUri ( const QString &uri )
543
+ {
544
+ QVariantMap res;
545
+ const int fileNameEnd = uri.indexOf ( ' ?' );
546
+ if ( fileNameEnd != -1 && uri.mid ( fileNameEnd + 1 , 5 ) == QLatin1String ( " type=" ) )
547
+ {
548
+ res.insert ( QStringLiteral ( " layerName" ), uri.mid ( fileNameEnd + 6 ) );
549
+ res.insert ( QStringLiteral ( " path" ), uri.left ( fileNameEnd ) );
550
+ }
551
+ else
552
+ {
553
+ res.insert ( QStringLiteral ( " path" ), uri );
554
+ }
555
+ return res;
556
+ }
546
557
547
558
QgsGpxProviderMetadata::QgsGpxProviderMetadata ():
548
559
QgsProviderMetadata( GPX_KEY, GPX_DESCRIPTION )
@@ -553,3 +564,23 @@ QGISEXTERN QgsProviderMetadata *providerMetadataFactory()
553
564
{
554
565
return new QgsGpxProviderMetadata ();
555
566
}
567
+
568
+ QgsDataProvider *QgsGpxProviderMetadata::createProvider ( const QString &uri, const QgsDataProvider::ProviderOptions &options, QgsDataProvider::ReadFlags flags )
569
+ {
570
+ return new QgsGPXProvider ( uri, options, flags );
571
+ }
572
+
573
+ QgsProviderMetadata::ProviderCapabilities QgsGpxProviderMetadata::providerCapabilities () const
574
+ {
575
+ return QgsProviderMetadata::ProviderCapability::FileBasedUris;
576
+ }
577
+
578
+ QString QgsGpxProviderMetadata::encodeUri ( const QVariantMap &parts ) const
579
+ {
580
+ return QgsGPXProvider::encodeUri ( parts );
581
+ }
582
+
583
+ QVariantMap QgsGpxProviderMetadata::decodeUri ( const QString &uri ) const
584
+ {
585
+ return QgsGPXProvider::decodeUri ( uri );
586
+ }
0 commit comments