From 839a88903896441d09664bbf49bb36114d72a81f Mon Sep 17 00:00:00 2001 From: Alessandro Pasotti Date: Thu, 19 Apr 2018 19:23:59 +0200 Subject: [PATCH] SIP wrappers for QgsProviderMetadata --- .../auto_generated/qgsprovidermetadata.sip.in | 48 +++++++++++++++++++ src/core/qgsprovidermetadata.h | 43 ++++++++++++++++- 2 files changed, 90 insertions(+), 1 deletion(-) diff --git a/python/core/auto_generated/qgsprovidermetadata.sip.in b/python/core/auto_generated/qgsprovidermetadata.sip.in index 2ba01a047058..96e4873c1a72 100644 --- a/python/core/auto_generated/qgsprovidermetadata.sip.in +++ b/python/core/auto_generated/qgsprovidermetadata.sip.in @@ -36,6 +36,54 @@ library object. QgsProviderMetadata( const QString &_key, const QString &_description, const QString &_library ); + QgsProviderMetadata( const QString &key, const QString &description, SIP_PYCALLABLE / AllowNone / ); +%Docstring +Metadata for provider with direct provider creation function pointer, where +no library is involved. + +.. versionadded:: 3.0 + +.. note:: + + not available in Python bindings +%End +%MethodCode + + // Make sure the callable doesn't get garbage collected + Py_INCREF( a2 ); + + Py_BEGIN_ALLOW_THREADS + + sipCpp = new QgsProviderMetadata( *a0, *a1, [a2]( const QString &dataSource ) -> QgsDataProvider* + { + QgsDataProvider *provider; + provider = nullptr; + PyObject *sipResObj; + SIP_BLOCK_THREADS + + sipResObj = sipCallMethod( NULL, a2, "N", new QString( dataSource ), sipType_QString, NULL ); + Py_DECREF( a2 ); + if ( sipResObj ) + { + // Py_DECREF(sipResObj); + if ( sipCanConvertToType( sipResObj, sipType_QgsDataProvider, SIP_NOT_NONE ) ) + { + int state0; + int sipIsErr = 0; + provider = reinterpret_cast( sipConvertToType( sipResObj, sipType_QgsDataProvider, NULL, SIP_NOT_NONE, &state0, &sipIsErr ) ); + if ( sipIsErr != 0 ) + { + provider = nullptr; + } + } + } + SIP_UNBLOCK_THREADS + return provider; + } ); + + Py_END_ALLOW_THREADS + +%End QString key() const; %Docstring diff --git a/src/core/qgsprovidermetadata.h b/src/core/qgsprovidermetadata.h index 121b024d0b8c..7522585af637 100644 --- a/src/core/qgsprovidermetadata.h +++ b/src/core/qgsprovidermetadata.h @@ -61,7 +61,48 @@ class CORE_EXPORT QgsProviderMetadata * \note not available in Python bindings * \since QGIS 3.0 */ - SIP_SKIP QgsProviderMetadata( const QString &key, const QString &description, const QgsProviderMetadata::CreateDataProviderFunction &createFunc ); +#ifndef SIP_RUN + QgsProviderMetadata( const QString &key, const QString &description, const QgsProviderMetadata::CreateDataProviderFunction &createFunc ); +#else + QgsProviderMetadata( const QString &key, const QString &description, SIP_PYCALLABLE / AllowNone / ); + % MethodCode + + // Make sure the callable doesn't get garbage collected + Py_INCREF( a2 ); + + Py_BEGIN_ALLOW_THREADS + + sipCpp = new QgsProviderMetadata( *a0, *a1, [a2]( const QString &dataSource ) -> QgsDataProvider* + { + QgsDataProvider *provider; + provider = nullptr; + PyObject *sipResObj; + SIP_BLOCK_THREADS + + sipResObj = sipCallMethod( NULL, a2, "N", new QString( dataSource ), sipType_QString, NULL ); + Py_DECREF( a2 ); + if ( sipResObj ) + { + // Py_DECREF(sipResObj); + if ( sipCanConvertToType( sipResObj, sipType_QgsDataProvider, SIP_NOT_NONE ) ) + { + int state0; + int sipIsErr = 0; + provider = reinterpret_cast( sipConvertToType( sipResObj, sipType_QgsDataProvider, NULL, SIP_NOT_NONE, &state0, &sipIsErr ) ); + if ( sipIsErr != 0 ) + { + provider = nullptr; + } + } + } + SIP_UNBLOCK_THREADS + return provider; + } ); + + Py_END_ALLOW_THREADS + + % End +#endif /** * This returns the unique key associated with the provider