registerProvider now returns a bool

This commit is contained in:
Alessandro Pasotti 2018-06-04 14:26:22 +02:00
parent 0430a8d59c
commit 6ece1aa543
6 changed files with 31 additions and 5 deletions

View File

@ -69,6 +69,7 @@ no library is involved.
provider = reinterpret_cast<QgsDataProvider *>( sipConvertToType( sipResObj, sipType_QgsDataProvider, NULL, SIP_NOT_NONE, &state0, &sipIsErr ) );
if ( sipIsErr != 0 )
{
sipReleaseType( provider, sipType_QgsDataProvider, state0 );
provider = nullptr;
}
}

View File

@ -180,10 +180,12 @@ Returns a string containing the available protocol drivers
void registerGuis( QWidget *widget );
void registerProvider( QgsProviderMetadata *providerMetadata /Transfer/ );
bool registerProvider( QgsProviderMetadata *providerMetadata /Transfer/ );
%Docstring
register a new vector data provider from its ``providerMetadata``
:return: true on success, false if a provider with the same key was already registered
.. note::
ownership of the QgsProviderMetadata instance is transferred to the registry

View File

@ -90,6 +90,7 @@ class CORE_EXPORT QgsProviderMetadata
provider = reinterpret_cast<QgsDataProvider *>( sipConvertToType( sipResObj, sipType_QgsDataProvider, NULL, SIP_NOT_NONE, &state0, &sipIsErr ) );
if ( sipIsErr != 0 )
{
sipReleaseType( provider, sipType_QgsDataProvider, state0 );
provider = nullptr;
}
}

View File

@ -525,10 +525,25 @@ void QgsProviderRegistry::registerGuis( QWidget *parent )
}
}
void QgsProviderRegistry::registerProvider( QgsProviderMetadata *providerMetadata )
bool QgsProviderRegistry::registerProvider( QgsProviderMetadata *providerMetadata )
{
if ( providerMetadata )
mProviders[ providerMetadata->key() ] = providerMetadata;
{
if ( mProviders.find( providerMetadata->key() ) == mProviders.end() )
{
mProviders[ providerMetadata->key() ] = providerMetadata;
return true;
}
else
{
QgsDebugMsgLevel( QStringLiteral( "Cannot register provider metadata: a provider with the same key (%1) was already registered!" ).arg( providerMetadata->key() ), 2 );
}
}
else
{
QgsDebugMsgLevel( QStringLiteral( "Trying to register a null metadata provider!" ), 2 );
}
return false;
}
QString QgsProviderRegistry::fileVectorFilters() const

View File

@ -181,10 +181,11 @@ class CORE_EXPORT QgsProviderRegistry
/**
* \brief register a new vector data provider from its \a providerMetadata
* \return true on success, false if a provider with the same key was already registered
* \note ownership of the QgsProviderMetadata instance is transferred to the registry
* \since QGIS 3.2
*/
void registerProvider( QgsProviderMetadata *providerMetadata SIP_TRANSFER );
bool registerProvider( QgsProviderMetadata *providerMetadata SIP_TRANSFER );
/**
* Open the given vector data source

View File

@ -105,7 +105,7 @@ class TestPyQgsPythonProvider(unittest.TestCase, ProviderTestCase):
# Register the provider
r = QgsProviderRegistry.instance()
metadata = QgsProviderMetadata(PyProvider.providerKey(), PyProvider.description(), PyProvider.createProvider)
r.registerProvider(metadata)
assert r.registerProvider(metadata)
assert r.providerMetadata(PyProvider.providerKey()) == metadata
# Create test layer
@ -399,6 +399,12 @@ class TestPyQgsPythonProvider(unittest.TestCase, ProviderTestCase):
request = QgsFeatureRequest().setFilterRect(extent)
self.assertTrue(QgsTestUtils.testProviderIteratorThreadSafety(self.source, request))
def tesRegisterSameProviderTwice(self):
"""Test that a provider cannot be registered twice"""
r = QgsProviderRegistry.instance()
metadata = QgsProviderMetadata(PyProvider.providerKey(), PyProvider.description(), PyProvider.createProvider)
self.assertFalse(r.registerProvider(metadata))
if __name__ == '__main__':
unittest.main()