Skip to content

Commit

Permalink
Cleanup and fix vtpk data provider encode/uri handling
Browse files Browse the repository at this point in the history
  • Loading branch information
nyalldawson committed Mar 24, 2023
1 parent f499f49 commit bd53161
Show file tree
Hide file tree
Showing 2 changed files with 9 additions and 63 deletions.
70 changes: 9 additions & 61 deletions src/core/vectortile/qgsvtpkvectortiledataprovider.cpp
Expand Up @@ -242,94 +242,42 @@ QgsProviderMetadata::ProviderCapabilities QgsVtpkVectorTileDataProviderMetadata:

QVariantMap QgsVtpkVectorTileDataProviderMetadata::decodeUri( const QString &uri ) const
{
// TODO -- carefully thin out options which don't apply to vtpk

QgsDataSourceUri dsUri;
dsUri.setEncodedUri( uri );

QVariantMap uriComponents;
uriComponents.insert( QStringLiteral( "type" ), dsUri.param( QStringLiteral( "type" ) ) );
if ( dsUri.hasParam( QStringLiteral( "serviceType" ) ) )
uriComponents.insert( QStringLiteral( "serviceType" ), dsUri.param( QStringLiteral( "serviceType" ) ) );

if ( uriComponents[ QStringLiteral( "type" ) ] == QLatin1String( "mbtiles" ) ||
( uriComponents[ QStringLiteral( "type" ) ] == QLatin1String( "xyz" ) &&
!dsUri.param( QStringLiteral( "url" ) ).startsWith( QLatin1String( "http" ) ) ) )
{
uriComponents.insert( QStringLiteral( "path" ), dsUri.param( QStringLiteral( "url" ) ) );
}
else
{
uriComponents.insert( QStringLiteral( "url" ), dsUri.param( QStringLiteral( "url" ) ) );
}

if ( dsUri.hasParam( QStringLiteral( "zmin" ) ) )
uriComponents.insert( QStringLiteral( "zmin" ), dsUri.param( QStringLiteral( "zmin" ) ) );
if ( dsUri.hasParam( QStringLiteral( "zmax" ) ) )
uriComponents.insert( QStringLiteral( "zmax" ), dsUri.param( QStringLiteral( "zmax" ) ) );

dsUri.httpHeaders().updateMap( uriComponents );

if ( dsUri.hasParam( QStringLiteral( "styleUrl" ) ) )
uriComponents.insert( QStringLiteral( "styleUrl" ), dsUri.param( QStringLiteral( "styleUrl" ) ) );

const QString authcfg = dsUri.authConfigId();
if ( !authcfg.isEmpty() )
uriComponents.insert( QStringLiteral( "authcfg" ), authcfg );
uriComponents.insert( QStringLiteral( "path" ), dsUri.param( QStringLiteral( "url" ) ) );

return uriComponents;
}

QString QgsVtpkVectorTileDataProviderMetadata::encodeUri( const QVariantMap &parts ) const
{
// TODO -- carefully thin out options which don't apply to vtpk

QgsDataSourceUri dsUri;
dsUri.setParam( QStringLiteral( "type" ), parts.value( QStringLiteral( "type" ) ).toString() );
if ( parts.contains( QStringLiteral( "serviceType" ) ) )
dsUri.setParam( QStringLiteral( "serviceType" ), parts[ QStringLiteral( "serviceType" ) ].toString() );
dsUri.setParam( QStringLiteral( "url" ), parts.value( parts.contains( QStringLiteral( "path" ) ) ? QStringLiteral( "path" ) : QStringLiteral( "url" ) ).toString() );

if ( parts.contains( QStringLiteral( "zmin" ) ) )
dsUri.setParam( QStringLiteral( "zmin" ), parts[ QStringLiteral( "zmin" ) ].toString() );
if ( parts.contains( QStringLiteral( "zmax" ) ) )
dsUri.setParam( QStringLiteral( "zmax" ), parts[ QStringLiteral( "zmax" ) ].toString() );

dsUri.httpHeaders().setFromMap( parts );

if ( parts.contains( QStringLiteral( "styleUrl" ) ) )
dsUri.setParam( QStringLiteral( "styleUrl" ), parts[ QStringLiteral( "styleUrl" ) ].toString() );

if ( parts.contains( QStringLiteral( "authcfg" ) ) )
dsUri.setAuthConfigId( parts[ QStringLiteral( "authcfg" ) ].toString() );

return dsUri.encodedUri();
}

QString QgsVtpkVectorTileDataProviderMetadata::absoluteToRelativeUri( const QString &uri, const QgsReadWriteContext &context ) const
{
QgsDataSourceUri dsUri;
dsUri.setEncodedUri( uri );
QVariantMap parts = decodeUri( uri );

QString sourcePath = dsUri.param( QStringLiteral( "url" ) );
const QString originalPath = parts.value( QStringLiteral( "path" ) ).toString();
parts.insert( QStringLiteral( "path" ), context.pathResolver().writePath( originalPath ) );

sourcePath = context.pathResolver().writePath( sourcePath );
dsUri.removeParam( QStringLiteral( "url" ) ); // needed because setParam() would insert second "url" key
dsUri.setParam( QStringLiteral( "url" ), sourcePath );
return dsUri.encodedUri();
return encodeUri( parts );
}

QString QgsVtpkVectorTileDataProviderMetadata::relativeToAbsoluteUri( const QString &uri, const QgsReadWriteContext &context ) const
{
QgsDataSourceUri dsUri;
dsUri.setEncodedUri( uri );
QVariantMap parts = decodeUri( uri );

QString sourcePath = dsUri.param( QStringLiteral( "url" ) );
const QString originalPath = parts.value( QStringLiteral( "path" ) ).toString();
parts.insert( QStringLiteral( "path" ), context.pathResolver().readPath( originalPath ) );

sourcePath = context.pathResolver().readPath( sourcePath );
dsUri.removeParam( QStringLiteral( "url" ) ); // needed because setParam() would insert second "url" key
dsUri.setParam( QStringLiteral( "url" ), sourcePath );
return dsUri.encodedUri();
return encodeUri( parts );
}

QList<Qgis::LayerType> QgsVtpkVectorTileDataProviderMetadata::supportedLayerTypes() const
Expand Down
2 changes: 0 additions & 2 deletions tests/src/core/testqgsvectortilelayer.cpp
Expand Up @@ -354,12 +354,10 @@ void TestQgsVectorTileLayer::test_absoluteRelativeUriVtpk()
QgsDataSourceUri dsAbs;
dsAbs.setParam( "type", "vtpk" );
dsAbs.setParam( "url", QString( "%1/testvtpk.vtpk" ).arg( TEST_DATA_DIR ) );
dsAbs.setParam( "zmax", "1" );

QgsDataSourceUri dsRel;
dsRel.setParam( "type", "vtpk" );
dsRel.setParam( "url", "./testvtpk.vtpk" );
dsRel.setParam( "zmax", "1" );

QString absoluteUri = dsAbs.encodedUri();
QString relativeUri = dsRel.encodedUri();
Expand Down

0 comments on commit bd53161

Please sign in to comment.