57 QgsProviderRegistry::QgsProviderRegistry(
QString pluginPath )
65 char **argv = qApp->argv();
67 int bin = appDir.
findRev(
"/bin", -1,
false );
69 QString mLibraryDirectory = baseDir +
"/lib";
71 mLibraryDirectory = pluginPath;
72 mLibraryDirectory.setSorting( QDir::Name | QDir::IgnoreCase );
73 mLibraryDirectory.setFilter( QDir::Files | QDir::NoSymLinks );
75 #if defined(WIN32) || defined(__CYGWIN__)
76 mLibraryDirectory.setNameFilters(
QStringList(
"*.dll" ) );
78 mLibraryDirectory.setNameFilters(
QStringList(
"*provider.so" ) );
80 mLibraryDirectory.setNameFilters(
QStringList(
"*.so" ) );
83 QgsDebugMsg(
QString(
"Checking %1 for provider plugins" ).arg( mLibraryDirectory.path() ) );
85 if ( mLibraryDirectory.
count() == 0 )
87 QString msg =
QObject::tr(
"No QGIS data provider plugins found in:\n%1\n" ).
arg( mLibraryDirectory.path() );
88 msg +=
QObject::tr(
"No vector layers can be loaded. Check your QGIS installation" );
98 QString filePattern = getenv(
"QGIS_PROVIDER_FILE" );
106 while ( it.hasNext() )
112 if ( fileRegexp.
indexIn( fi.fileName() ) == -1 )
114 QgsDebugMsg(
"provider " + fi.fileName() +
" skipped because doesn't match pattern " + filePattern );
122 QgsDebugMsg(
QString(
"Checking %1: ...invalid (lib not loadable): %2" ).arg( myLib.fileName() ).arg( myLib.errorString() ) );
131 QgsDebugMsg(
QString(
"Checking %1: ...invalid (has type method)" ).arg( myLib.fileName() ) );
139 QgsDebugMsg(
QString(
"Checking %1: ...invalid (no isProvider method)" ).arg( myLib.fileName() ) );
146 QgsDebugMsg(
QString(
"Checking %1: ...invalid (not a provider)" ).arg( myLib.fileName() ) );
154 QgsDebugMsg(
QString(
"Checking %1: ...invalid (no description method)" ).arg( myLib.fileName() ) );
161 QgsDebugMsg(
QString(
"Checking %1: ...invalid (no providerKey method)" ).arg( myLib.fileName() ) );
170 if ( pDatabaseDrivers )
172 mDatabaseDrivers = pDatabaseDrivers();
177 if ( pDirectoryDrivers )
179 mDirectoryDrivers = pDirectoryDrivers();
184 if ( pProtocolDrivers )
186 mProtocolDrivers = pProtocolDrivers();
191 if ( pFileVectorFilters )
195 if ( !fileVectorFilters.
isEmpty() )
196 mVectorFileFilters += fileVectorFilters;
198 QgsDebugMsg(
QString(
"Checking %1: ...loaded ok (%2 file filters)" ).arg( myLib.fileName() ).arg( fileVectorFilters.
split(
";;" ).
count() ) );
208 pBuild( fileRasterFilters );
210 QgsDebugMsg(
"raster filters: " + fileRasterFilters );
211 if ( !fileRasterFilters.
isEmpty() )
212 mRasterFileFilters += fileRasterFilters;
214 QgsDebugMsg(
QString(
"Checking %1: ...loaded ok (%2 file filters)" ).arg( myLib.fileName() ).arg( fileRasterFilters.
split(
";;" ).
count() ) );
227 Providers::const_iterator it = mProviders.begin();
229 while ( it != mProviders.end() )
232 QString lib = it->second->library();
256 QgsProviderRegistry::Providers::const_iterator i =
257 metaData.find( providerKey );
259 if ( i != metaData.end() )
284 Providers::const_iterator it = mProviders.begin();
286 if ( mProviders.empty() )
287 return QObject::tr(
"No data provider plugins are available. No vector layers can be loaded" );
294 while ( it != mProviders.end() )
299 list += it->second->description();
318 mLibraryDirectory = path;
324 return mLibraryDirectory;
348 #ifdef TESTPROVIDERLIB
349 const char *cLib = lib.
toUtf8();
353 void *handle = dlopen( cOgrLib, RTLD_LAZY | RTLD_GLOBAL );
403 if ( !dataCapabilities )
408 return dataCapabilities();
420 if ( !selectFactory )
423 return selectFactory( parent, fl );
426 #if QT_VERSION >= 0x050000
432 QgsDebugMsg(
"Library name is " + myLib.fileName() );
436 return myLib.resolve( functionName.
toAscii().
data() );
440 QgsDebugMsg(
"Cannot load library: " + myLib.errorString() );
482 typedef void registerGui_function(
QWidget * parent );
486 registerGui_function *registerGui = ( registerGui_function * )
cast_to_fptr(
function( provider,
"registerGui" ) );
491 registerGui( parent );
497 return mVectorFileFilters;
502 return mRasterFileFilters;
507 return mDatabaseDrivers;
512 return mDirectoryDrivers;
517 return mProtocolDrivers;
523 for ( Providers::const_iterator it = mProviders.begin(); it != mProviders.end(); ++it )
QgsDataProvider * classFactoryFunction_t(const QString *)
QString databaseDrivers_t()
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" ...
int findRev(QChar c, int i, bool cs) const
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.
QStringList split(const QString &sep, SplitBehavior behavior, Qt::CaseSensitivity cs) const
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.
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 if show...
Abstract base class for spatial data provider implementations.
void removeAllMapLayers()
Remove all registered layers.
virtual ~QgsProviderRegistry()
Virtual dectructor.
QString tr(const char *sourceText, const char *disambiguation, int n)
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.
void setPattern(const QString &pattern)
int indexIn(const QString &str, int offset, CaretMode caretMode) const
int count(const T &value) const
void append(const T &value)
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
int providerCapabilities(const QString &providerKey) const
Return the provider capabilities.
virtual void setMessage(const QString &message, MessageType msgType)=0
set message, it won't be displayed until
void setLibraryDirectory(const QDir &path)
Set library directory where to search for plugins.
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.
std::map< QString, QgsProviderMetadata * > Providers
open the given vector data source
A registry / canonical manager of data providers.
QLibrary * providerLibrary(const QString &providerKey) const
virtual void showMessage(bool blocking=true)=0
display the message to the user and deletes itself
virtual QString fileVectorFilters() const
return vector file filter string
static QgsMapLayerRegistry * instance()
Returns the instance pointer, creating the object on the first call.
void * resolve(const char *symbol)
QString left(int n) const
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.
QString arg(qlonglong a, int fieldWidth, int base, const QChar &fillChar) const
QByteArray toAscii() const
QString errorString() const
QByteArray toUtf8() const