64 char **argv = qApp->argv();
65 QString appDir = argv[0];
66 int bin = appDir.findRev(
"/bin", -1,
false );
67 QString baseDir = appDir.left( bin );
70 mLibraryDirectory = pluginPath;
71 mLibraryDirectory.setSorting( QDir::Name | QDir::IgnoreCase );
72 mLibraryDirectory.setFilter( QDir::Files | QDir::NoSymLinks );
74 #if defined(WIN32) || defined(__CYGWIN__)
75 mLibraryDirectory.setNameFilters( QStringList(
"*.dll" ) );
77 mLibraryDirectory.setNameFilters( QStringList(
"*provider.so" ) );
79 mLibraryDirectory.setNameFilters( QStringList(
"*.so" ) );
82 QgsDebugMsg( QString(
"Checking %1 for provider plugins" ).arg( mLibraryDirectory.path() ) );
84 if ( mLibraryDirectory.count() == 0 )
86 QString msg =
QObject::tr(
"No QGIS data provider plugins found in:\n%1\n" ).arg( mLibraryDirectory.path() );
87 msg +=
QObject::tr(
"No vector layers can be loaded. Check your QGIS installation" );
96 QListIterator<QFileInfo> it( mLibraryDirectory.entryInfoList() );
97 while ( it.hasNext() )
99 QFileInfo fi( it.next() );
101 QLibrary myLib( fi.filePath() );
104 QgsDebugMsg( QString(
"Checking %1: ...invalid (lib not loadable): %2" ).arg( myLib.fileName() ).arg( myLib.errorString() ) );
113 QgsDebugMsg( QString(
"Checking %1: ...invalid (has type method)" ).arg( myLib.fileName() ) );
121 QgsDebugMsg( QString(
"Checking %1: ...invalid (no isProvider method)" ).arg( myLib.fileName() ) );
128 QgsDebugMsg( QString(
"Checking %1: ...invalid (not a provider)" ).arg( myLib.fileName() ) );
136 QgsDebugMsg( QString(
"Checking %1: ...invalid (no description method)" ).arg( myLib.fileName() ) );
143 QgsDebugMsg( QString(
"Checking %1: ...invalid (no providerKey method)" ).arg( myLib.fileName() ) );
152 if ( pDatabaseDrivers )
159 if ( pDirectoryDrivers )
166 if ( pProtocolDrivers )
173 if ( pFileVectorFilters )
177 if ( !fileVectorFilters.isEmpty() )
180 QgsDebugMsg( QString(
"Checking %1: ...loaded ok (%2 file filters)" ).arg( myLib.fileName() ).arg( fileVectorFilters.split(
";;" ).count() ) );
190 pBuild( fileRasterFilters );
192 QgsDebugMsg(
"raster filters: " + fileRasterFilters );
193 if ( !fileRasterFilters.isEmpty() )
196 QgsDebugMsg( QString(
"Checking %1: ...loaded ok (%2 file filters)" ).arg( myLib.fileName() ).arg( fileRasterFilters.split(
";;" ).count() ) );
207 Providers::const_iterator it =
mProviders.begin();
211 QString lib = it->second->library();
212 QLibrary myLib( lib );
213 if ( myLib.isLoaded() )
233 QString
const & providerKey )
235 QgsProviderRegistry::Providers::const_iterator i =
236 metaData.find( providerKey );
238 if ( i != metaData.end() )
263 Providers::const_iterator it =
mProviders.begin();
266 return QObject::tr(
"No data provider plugins are available. No vector layers can be loaded" );
278 list += it->second->description();
325 QString lib =
library( providerKey );
327 #ifdef TESTPROVIDERLIB
328 const char *cLib = lib.toUtf8();
332 void *handle = dlopen( cOgrLib, RTLD_LAZY | RTLD_GLOBAL );
345 QLibrary myLib( lib );
347 QgsDebugMsg(
"Library name is " + myLib.fileName() );
357 QgsDebugMsg( QString(
"Failed to load %1: no classFactory method" ).arg( lib ) );
369 QgsDebugMsg( QString(
"Instantiated the data provider plugin: %1" ).arg( dataProvider->
name() ) );
377 QWidget * parent, Qt::WFlags fl )
382 if ( !selectFactory )
385 return selectFactory( parent, fl );
389 QString
const & functionName )
391 QLibrary myLib(
library( providerKey ) );
393 QgsDebugMsg(
"Library name is " + myLib.fileName() );
397 return myLib.resolve( functionName.toAscii().data() );
401 QgsDebugMsg(
"Cannot load library: " + myLib.errorString() );
408 QLibrary *myLib =
new QLibrary(
library( providerKey ) );
410 QgsDebugMsg(
"Library name is " + myLib->fileName() );
415 QgsDebugMsg(
"Cannot load library: " + myLib->errorString() );
424 typedef void registerGui_function( QWidget * parent );
428 registerGui_function *registerGui = ( registerGui_function * )
cast_to_fptr(
function( provider,
"registerGui" ) );
433 registerGui( parent );
467 lst.append( it->first );
480 QgsProviderRegistry::openVector( QString
const & dataSource, QString
const & providerKey )
482 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
void cleanupProviderFunction_t()
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
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.