Skip to content

Commit

Permalink
QgsProviderRegistry: add a 'multipleProviderMetadataFactory' entry po…
Browse files Browse the repository at this point in the history
…int in loadable plugins so they can register multiple providers, and use it in the WFS provider

Funded by Planet
  • Loading branch information
rouault authored and nyalldawson committed Oct 25, 2019
1 parent a1adb32 commit d7ea384
Show file tree
Hide file tree
Showing 2 changed files with 41 additions and 20 deletions.
57 changes: 39 additions & 18 deletions src/core/qgsproviderregistry.cpp
Expand Up @@ -145,6 +145,8 @@ void QgsProviderRegistry::init()
fileRegexp.setPattern( filePattern );
}

typedef std::vector<QgsProviderMetadata *> multiple_factory_function();

const auto constEntryInfoList = mLibraryDirectory.entryInfoList();
for ( const QFileInfo &fi : constEntryInfoList )
{
Expand All @@ -164,29 +166,48 @@ void QgsProviderRegistry::init()
continue;
}

QFunctionPointer func = myLib.resolve( QStringLiteral( "providerMetadataFactory" ).toLatin1().data() );
factory_function *function = reinterpret_cast< factory_function * >( cast_to_fptr( func ) );
if ( !function )
QFunctionPointer multi_func = myLib.resolve( QStringLiteral( "multipleProviderMetadataFactory" ).toLatin1().data() );
multiple_factory_function *multi_function = reinterpret_cast< multiple_factory_function * >( cast_to_fptr( multi_func ) );
if ( multi_function )
{
QgsDebugMsg( QStringLiteral( "Checking %1: ...invalid (no providerMetadataFactory method)" ).arg( myLib.fileName() ) );
continue;
for ( const auto meta : multi_function() )
{
if ( findMetadata_( mProviders, meta->key() ) )
{
QgsDebugMsg( QStringLiteral( "Checking %1: ...invalid (key %2 already registered)" ).arg( myLib.fileName() ).arg( meta->key() ) );
delete meta;
continue;
}
// add this provider to the provider map
mProviders[meta->key()] = meta;
}
}

QgsProviderMetadata *meta = function();
if ( !meta )
else
{
QgsDebugMsg( QStringLiteral( "Checking %1: ...invalid (no metadata returned)" ).arg( myLib.fileName() ) );
continue;
}
QFunctionPointer func = myLib.resolve( QStringLiteral( "providerMetadataFactory" ).toLatin1().data() );
factory_function *function = reinterpret_cast< factory_function * >( cast_to_fptr( func ) );
if ( !function )
{
QgsDebugMsg( QStringLiteral( "Checking %1: ...invalid (no providerMetadataFactory method)" ).arg( myLib.fileName() ) );
continue;
}

if ( findMetadata_( mProviders, meta->key() ) )
{
QgsDebugMsg( QStringLiteral( "Checking %1: ...invalid (key %2 already registered)" ).arg( myLib.fileName() ).arg( meta->key() ) );
delete meta;
continue;
QgsProviderMetadata *meta = function();
if ( !meta )
{
QgsDebugMsg( QStringLiteral( "Checking %1: ...invalid (no metadata returned)" ).arg( myLib.fileName() ) );
continue;
}

if ( findMetadata_( mProviders, meta->key() ) )
{
QgsDebugMsg( QStringLiteral( "Checking %1: ...invalid (key %2 already registered)" ).arg( myLib.fileName() ).arg( meta->key() ) );
delete meta;
continue;
}
// add this provider to the provider map
mProviders[meta->key()] = meta;
}
// add this provider to the provider map
mProviders[meta->key()] = meta;
}
#endif
QgsDebugMsg( QStringLiteral( "Loaded %1 providers (%2) " ).arg( mProviders.size() ).arg( providerList().join( ';' ) ) );
Expand Down
4 changes: 2 additions & 2 deletions src/providers/wfs/qgswfsprovider.cpp
Expand Up @@ -1869,7 +1869,7 @@ QList<QgsDataItemProvider *> QgsWfsProviderMetadata::dataItemProviders() const
QgsWfsProviderMetadata::QgsWfsProviderMetadata():
QgsProviderMetadata( QgsWFSProvider::WFS_PROVIDER_KEY, QgsWFSProvider::WFS_PROVIDER_DESCRIPTION ) {}

QGISEXTERN QgsProviderMetadata *providerMetadataFactory()
QGISEXTERN std::vector<QgsProviderMetadata *> multipleProviderMetadataFactory()
{
return new QgsWfsProviderMetadata();
return std::vector<QgsProviderMetadata *> { new QgsWfsProviderMetadata() };
}

0 comments on commit d7ea384

Please sign in to comment.