69 char **argv = qApp->argv();
70 QString appDir = argv[0];
71 int bin = appDir.findRev(
"/bin", -1,
false );
72 QString baseDir = appDir.left( bin );
75 mLibraryDirectory = pluginPath;
76 mLibraryDirectory.setSorting( QDir::Name | QDir::IgnoreCase );
77 mLibraryDirectory.setFilter( QDir::Files | QDir::NoSymLinks );
79 #if defined(WIN32) || defined(__CYGWIN__)
80 mLibraryDirectory.setNameFilters( QStringList(
"*.dll" ) );
82 mLibraryDirectory.setNameFilters( QStringList(
"*provider.so" ) );
84 mLibraryDirectory.setNameFilters( QStringList(
"*.so" ) );
87 QgsDebugMsg( QString(
"Checking %1 for provider plugins" ).arg( mLibraryDirectory.path() ) );
89 if ( mLibraryDirectory.count() == 0 )
91 QString msg =
QObject::tr(
"No QGIS data provider plugins found in:\n%1\n" ).arg( mLibraryDirectory.path() );
92 msg +=
QObject::tr(
"No vector layers can be loaded. Check your QGIS installation" );
101 QListIterator<QFileInfo> it( mLibraryDirectory.entryInfoList() );
102 while ( it.hasNext() )
104 QFileInfo fi( it.next() );
106 QLibrary myLib( fi.filePath() );
109 QgsDebugMsg( QString(
"Checking %1: ...invalid (lib not loadable): %2" ).arg( myLib.fileName() ).arg( myLib.errorString() ) );
118 QgsDebugMsg( QString(
"Checking %1: ...invalid (has type method)" ).arg( myLib.fileName() ) );
126 QgsDebugMsg( QString(
"Checking %1: ...invalid (no isProvider method)" ).arg( myLib.fileName() ) );
133 QgsDebugMsg( QString(
"Checking %1: ...invalid (not a provider)" ).arg( myLib.fileName() ) );
141 QgsDebugMsg( QString(
"Checking %1: ...invalid (no description method)" ).arg( myLib.fileName() ) );
148 QgsDebugMsg( QString(
"Checking %1: ...invalid (no providerKey method)" ).arg( myLib.fileName() ) );
157 if ( pDatabaseDrivers )
164 if ( pDirectoryDrivers )
171 if ( pProtocolDrivers )
178 if ( pFileVectorFilters )
182 if ( !fileVectorFilters.isEmpty() )
185 QgsDebugMsg( QString(
"Checking %1: ...loaded ok (%2 file filters)" ).arg( myLib.fileName() ).arg( fileVectorFilters.split(
";;" ).count() ) );
195 pBuild( fileRasterFilters );
197 QgsDebugMsg(
"raster filters: " + fileRasterFilters );
198 if ( !fileRasterFilters.isEmpty() )
201 QgsDebugMsg( QString(
"Checking %1: ...loaded ok (%2 file filters)" ).arg( myLib.fileName() ).arg( fileRasterFilters.split(
";;" ).count() ) );
221 QString
const & providerKey )
223 QgsProviderRegistry::Providers::const_iterator i =
224 metaData.find( providerKey );
226 if ( i != metaData.end() )
251 Providers::const_iterator it =
mProviders.begin();
254 return QObject::tr(
"No data provider plugins are available. No vector layers can be loaded" );
266 list += it->second->description();
314 QString lib =
library( providerKey );
316 #ifdef TESTPROVIDERLIB
317 const char *cLib = lib.toUtf8();
321 void *handle = dlopen( cOgrLib, RTLD_LAZY | RTLD_GLOBAL );
334 QLibrary myLib( lib );
336 QgsDebugMsg(
"Library name is " + myLib.fileName() );
346 QgsDebugMsg( QString(
"Failed to load %1: no classFactory method" ).arg( lib ) );
358 QgsDebugMsg( QString(
"Instantiated the data provider plugin: %1" ).arg( dataProvider->
name() ) );
366 QWidget * parent, Qt::WFlags fl )
371 if ( !selectFactory )
374 return selectFactory( parent, fl );
378 QString
const & functionName )
380 QLibrary myLib(
library( providerKey ) );
382 QgsDebugMsg(
"Library name is " + myLib.fileName() );
386 return myLib.resolve( functionName.toAscii().data() );
390 QgsDebugMsg(
"Cannot load library: " + myLib.errorString() );
397 QLibrary *myLib =
new QLibrary(
library( providerKey ) );
399 QgsDebugMsg(
"Library name is " + myLib->fileName() );
404 QgsDebugMsg(
"Cannot load library: " + myLib->errorString() );
413 typedef void registerGui_function( QWidget * parent );
417 registerGui_function *registerGui = ( registerGui_function * )
cast_to_fptr(
function( provider,
"registerGui" ) );
422 registerGui( parent );
456 lst.append( it->first );
469 QgsProviderRegistry::openVector( QString
const & dataSource, QString
const & providerKey )
471 return getProvider( providerKey, dataSource );
QWidget * selectFactoryFunction_t(QWidget *parent, Qt::WFlags fl)
QgsDataProvider * classFactoryFunction_t(const QString *)
QString databaseDrivers_t()
QString mRasterFileFilters
file filter string for raster files
virtual QString databaseDrivers() const
return a string containing the available database drivers
static QgsProviderMetadata * findMetadata_(QgsProviderRegistry::Providers const &metaData, QString const &providerKey)
convenience function for finding any existing data providers that match "providerKey" ...
QString mVectorFileFilters
file filter string for vector files
virtual void setTitle(const QString &title)=0
set title for the messages
static QgsProviderRegistry * instance(QString pluginPath=QString::null)
means of accessing canonical single instance
QString library(const QString &providerKey) const
Return path for the library of the provider.
static void warning(const QString &msg)
Goes to qWarning.
const QgsProviderMetadata * providerMetadata(const QString &providerKey) const
Return metadata of the provider or NULL if not found.
Providers mProviders
associative container of provider metadata handles
const QDir & libraryDirectory() const
return library directory where plugins are found
void registerGuis(QWidget *widget)
QString directoryDrivers_t()
static QgsMessageOutput * createMessageOutput()
function that returns new class derived from QgsMessageOutput (don't forget to delete it then) ...
QString mProtocolDrivers
Available protocol drivers string for vector databases.
Abstract base class for spatial data provider implementations.
virtual ~QgsProviderRegistry()
Virtual dectructor.
virtual QString name() const =0
return a provider name
QWidget * selectWidget(const QString &providerKey, QWidget *parent=0, Qt::WFlags fl=0)
static void logMessage(QString message, QString tag=QString::null, MessageLevel level=WARNING)
add a message to the instance (and create it if necessary)
QStringList providerList() const
Return list of available providers by their keys.
QgsDataProvider * provider(const QString &providerKey, const QString &dataSource)
Create an instance of the provider.
virtual QString protocolDrivers() const
return a string containing the available protocol drivers
virtual void setMessage(const QString &message, MessageType msgType)=0
set message, it won't be displayed until
QString mDirectoryDrivers
Available directory drivers string for vector databases.
void setLibraryDirectory(const QDir &path)
Set library directory where to search for plugins.
QDir mLibraryDirectory
directory in which provider plugins are installed
virtual QString directoryDrivers() const
return a string containing the available directory drivers
void buildsupportedrasterfilefilter_t(QString &theFileFiltersString)
virtual QString fileRasterFilters() const
return raster file filter string
QString fileVectorFilters_t()
QString pluginList(bool asHtml=false) const
Return list of provider plugins found.
QgsProviderRegistry(QString pluginPath)
ctor private since instance() creates it
std::map< QString, QgsProviderMetadata * > Providers
open the given vector data source
A registry / canonical manager of data providers.
QString mDatabaseDrivers
Available database drivers string for vector databases.
QLibrary * providerLibrary(const QString &providerKey) const
virtual void showMessage(bool blocking=true)=0
display the message to the user
virtual QString fileVectorFilters() const
return vector file filter string
static QgsProviderRegistry * _instance
pointer to canonical Singleton object
void * function(const QString &providerKey, const QString &functionName)
Get pointer to provider function.
void(*)() cast_to_fptr(void *p)
QString protocolDrivers_t()
Interface for showing messages from QGIS in GUI independent way.