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 QgsDebugMsg( QString(
"cleanup:%1" ).arg( it->first ) );
212 QString lib = it->second->library();
213 QLibrary myLib( lib );
214 if ( myLib.isLoaded() )
234 QString
const & providerKey )
236 QgsProviderRegistry::Providers::const_iterator i =
237 metaData.find( providerKey );
239 if ( i != metaData.end() )
264 Providers::const_iterator it =
mProviders.begin();
267 return QObject::tr(
"No data provider plugins are available. No vector layers can be loaded" );
279 list += it->second->description();
326 QString lib =
library( providerKey );
328 #ifdef TESTPROVIDERLIB
329 const char *cLib = lib.toUtf8();
333 void *handle = dlopen( cOgrLib, RTLD_LAZY | RTLD_GLOBAL );
346 QLibrary myLib( lib );
348 QgsDebugMsg(
"Library name is " + myLib.fileName() );
358 QgsDebugMsg( QString(
"Failed to load %1: no classFactory method" ).arg( lib ) );
370 QgsDebugMsg( QString(
"Instantiated the data provider plugin: %1" ).arg( dataProvider->
name() ) );
378 QWidget * parent, Qt::WindowFlags fl )
383 if ( !selectFactory )
386 return selectFactory( parent, fl );
390 QString
const & functionName )
392 QLibrary myLib(
library( providerKey ) );
394 QgsDebugMsg(
"Library name is " + myLib.fileName() );
398 return myLib.resolve( functionName.toAscii().data() );
402 QgsDebugMsg(
"Cannot load library: " + myLib.errorString() );
409 QLibrary *myLib =
new QLibrary(
library( providerKey ) );
411 QgsDebugMsg(
"Library name is " + myLib->fileName() );
416 QgsDebugMsg(
"Cannot load library: " + myLib->errorString() );
425 typedef void registerGui_function( QWidget * parent );
429 registerGui_function *registerGui = ( registerGui_function * )
cast_to_fptr(
function( provider,
"registerGui" ) );
434 registerGui( parent );
468 lst.append( it->first );
481 QgsProviderRegistry::openVector( QString
const & dataSource, QString
const & providerKey )
483 return getProvider( providerKey, dataSource );
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.
QWidget * selectFactoryFunction_t(QWidget *parent, Qt::WindowFlags fl)
virtual QString name() const =0
return a provider name
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.
QWidget * selectWidget(const QString &providerKey, QWidget *parent=0, Qt::WindowFlags fl=0)
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.