Skip to content

Commit

Permalink
Implement encode/decodeUri for Gpx provider
Browse files Browse the repository at this point in the history
  • Loading branch information
nyalldawson committed Jul 31, 2021
1 parent 963d322 commit 52ea60a
Show file tree
Hide file tree
Showing 2 changed files with 59 additions and 23 deletions.
77 changes: 54 additions & 23 deletions src/providers/gpx/qgsgpxprovider.cpp
Expand Up @@ -73,16 +73,21 @@ QgsGPXProvider::QgsGPXProvider( const QString &uri, const ProviderOptions &optio
// we always use UTF-8
setEncoding( QStringLiteral( "utf8" ) );

// get the file name and the type parameter from the URI
int fileNameEnd = uri.indexOf( '?' );
if ( fileNameEnd == -1 || uri.mid( fileNameEnd + 1, 5 ) != QLatin1String( "type=" ) )
const QVariantMap uriParts = decodeUri( uri );
const QString typeStr = uriParts.value( QStringLiteral( "layerName" ) ).toString();
if ( typeStr.isEmpty() )
{
QgsLogger::warning( tr( "Bad URI - you need to specify the feature type." ) );
return;
}
QString typeStr = uri.mid( fileNameEnd + 6 );
mFeatureType = ( typeStr == QLatin1String( "waypoint" ) ? WaypointType :
( typeStr == QLatin1String( "route" ) ? RouteType : TrackType ) );
if ( typeStr.compare( QLatin1String( "waypoint" ), Qt::CaseInsensitive ) == 0 )
mFeatureType = WaypointType;
else if ( typeStr.compare( QLatin1String( "route" ), Qt::CaseInsensitive ) == 0 )
mFeatureType = RouteType;
else
mFeatureType = TrackType;

mFileName = uriParts.value( QStringLiteral( "path" ) ).toString();

// set up the attributes and the geometry type depending on the feature type
for ( int i = 0; i < ATTR_COUNT; ++i )
Expand All @@ -95,8 +100,6 @@ QgsGPXProvider::QgsGPXProvider( const QString &uri, const ProviderOptions &optio
}
}

mFileName = uri.left( fileNameEnd );

// parse the file
data = QgsGpsData::getData( mFileName );
if ( !data )
Expand All @@ -105,7 +108,6 @@ QgsGPXProvider::QgsGPXProvider( const QString &uri, const ProviderOptions &optio
mValid = true;
}


QgsGPXProvider::~QgsGPXProvider()
{
QgsGpsData::releaseData( mFileName );
Expand All @@ -116,7 +118,6 @@ QgsAbstractFeatureSource *QgsGPXProvider::featureSource() const
return new QgsGPXFeatureSource( this );
}


QString QgsGPXProvider::storageType() const
{
return tr( "GPS eXchange file" );
Expand Down Expand Up @@ -171,13 +172,11 @@ bool QgsGPXProvider::isValid() const
return mValid;
}


QgsFeatureIterator QgsGPXProvider::getFeatures( const QgsFeatureRequest &request ) const
{
return QgsFeatureIterator( new QgsGPXFeatureIterator( new QgsGPXFeatureSource( this ), true, request ) );
}


bool QgsGPXProvider::addFeatures( QgsFeatureList &flist, Flags flags )
{
if ( !data )
Expand Down Expand Up @@ -371,7 +370,6 @@ bool QgsGPXProvider::addFeature( QgsFeature &f, Flags )
return success;
}


bool QgsGPXProvider::deleteFeatures( const QgsFeatureIds &id )
{
if ( !data )
Expand All @@ -393,7 +391,6 @@ bool QgsGPXProvider::deleteFeatures( const QgsFeatureIds &id )
return true;
}


bool QgsGPXProvider::changeAttributeValues( const QgsChangedAttributesMap &attr_map )
{
if ( !data )
Expand Down Expand Up @@ -446,7 +443,6 @@ bool QgsGPXProvider::changeAttributeValues( const QgsChangedAttributesMap &attr_
return true;
}


void QgsGPXProvider::changeAttributeValues( QgsGpsObject &obj, const QgsAttributeMap &attrs )
{

Expand Down Expand Up @@ -512,37 +508,52 @@ void QgsGPXProvider::changeAttributeValues( QgsGpsObject &obj, const QgsAttribut

}


QVariant QgsGPXProvider::defaultValue( int fieldId ) const
{
if ( fieldId == SrcAttr )
return tr( "Digitized in QGIS" );
return QVariant();
}


QString QgsGPXProvider::name() const
{
return GPX_KEY;
} // QgsGPXProvider::name()


}

QString QgsGPXProvider::description() const
{
return GPX_DESCRIPTION;
} // QgsGPXProvider::description()
}

QgsCoordinateReferenceSystem QgsGPXProvider::crs() const
{
return QgsCoordinateReferenceSystem( QStringLiteral( "EPSG:4326" ) );
}

QgsDataProvider *QgsGpxProviderMetadata::createProvider( const QString &uri, const QgsDataProvider::ProviderOptions &options, QgsDataProvider::ReadFlags flags )
QString QgsGPXProvider::encodeUri( const QVariantMap &parts )
{
return new QgsGPXProvider( uri, options, flags );
if ( parts.value( QStringLiteral( "layerName" ) ).toString().isEmpty() )
return parts.value( QStringLiteral( "path" ) ).toString();
else
return QStringLiteral( "%1?type=%2" ).arg( parts.value( QStringLiteral( "path" ) ).toString(),
parts.value( QStringLiteral( "layerName" ) ).toString() );
}

QVariantMap QgsGPXProvider::decodeUri( const QString &uri )
{
QVariantMap res;
const int fileNameEnd = uri.indexOf( '?' );
if ( fileNameEnd != -1 && uri.mid( fileNameEnd + 1, 5 ) == QLatin1String( "type=" ) )
{
res.insert( QStringLiteral( "layerName" ), uri.mid( fileNameEnd + 6 ) );
res.insert( QStringLiteral( "path" ), uri.left( fileNameEnd ) );
}
else
{
res.insert( QStringLiteral( "path" ), uri );
}
return res;
}

QgsGpxProviderMetadata::QgsGpxProviderMetadata():
QgsProviderMetadata( GPX_KEY, GPX_DESCRIPTION )
Expand All @@ -553,3 +564,23 @@ QGISEXTERN QgsProviderMetadata *providerMetadataFactory()
{
return new QgsGpxProviderMetadata();
}

QgsDataProvider *QgsGpxProviderMetadata::createProvider( const QString &uri, const QgsDataProvider::ProviderOptions &options, QgsDataProvider::ReadFlags flags )
{
return new QgsGPXProvider( uri, options, flags );
}

QgsProviderMetadata::ProviderCapabilities QgsGpxProviderMetadata::providerCapabilities() const
{
return QgsProviderMetadata::ProviderCapability::FileBasedUris;
}

QString QgsGpxProviderMetadata::encodeUri( const QVariantMap &parts ) const
{
return QgsGPXProvider::encodeUri( parts );
}

QVariantMap QgsGpxProviderMetadata::decodeUri( const QString &uri ) const
{
return QgsGPXProvider::decodeUri( uri );
}
5 changes: 5 additions & 0 deletions src/providers/gpx/qgsgpxprovider.h
Expand Up @@ -77,6 +77,8 @@ class QgsGPXProvider final: public QgsVectorDataProvider

bool addFeature( QgsFeature &f, QgsFeatureSink::Flags flags = QgsFeatureSink::Flags() ) override;

static QString encodeUri( const QVariantMap &parts );
static QVariantMap decodeUri( const QString &uri );

enum DataType
{
Expand Down Expand Up @@ -121,6 +123,9 @@ class QgsGpxProviderMetadata final: public QgsProviderMetadata
public:
QgsGpxProviderMetadata();
QgsDataProvider *createProvider( const QString &uri, const QgsDataProvider::ProviderOptions &options, QgsDataProvider::ReadFlags flags = QgsDataProvider::ReadFlags() ) override;
QgsProviderMetadata::ProviderCapabilities providerCapabilities() const override;
QString encodeUri( const QVariantMap &parts ) const override;
QVariantMap decodeUri( const QString &uri ) const override;
};

#endif

0 comments on commit 52ea60a

Please sign in to comment.