57 QgsProviderRegistry::QgsProviderRegistry(
const 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(Q_OS_WIN) || 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(), 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();
257 QgsProviderRegistry::Providers::const_iterator i =
258 metaData.find( providerKey );
260 if ( i != metaData.end() )
285 Providers::const_iterator it = mProviders.begin();
287 if ( mProviders.empty() )
288 return QObject::tr(
"No data provider plugins are available. No vector layers can be loaded" );
295 while ( it != mProviders.end() )
300 list += it->second->description();
319 mLibraryDirectory = path;
325 return mLibraryDirectory;
349 #ifdef TESTPROVIDERLIB
350 const char *cLib = lib.
toUtf8();
354 void *handle = dlopen( cOgrLib, RTLD_LAZY | RTLD_GLOBAL );
404 if ( !dataCapabilities )
409 return dataCapabilities();
421 if ( !selectFactory )
424 return selectFactory( parent, fl );
427 #if QT_VERSION >= 0x050000
433 QgsDebugMsg(
"Library name is " + myLib.fileName() );
437 return myLib.resolve( functionName.
toAscii().
data() );
441 QgsDebugMsg(
"Cannot load library: " + myLib.errorString() );
483 typedef void registerGui_function(
QWidget * parent );
487 registerGui_function *registerGui = ( registerGui_function * )
cast_to_fptr(
function( provider,
"registerGui" ) );
492 registerGui( parent );
498 return mVectorFileFilters;
503 return mRasterFileFilters;
508 return mDatabaseDrivers;
513 return mDirectoryDrivers;
518 return mProtocolDrivers;
524 for ( Providers::const_iterator it = mProviders.begin(); it != mProviders.end(); ++it )
static QgsProviderRegistry * instance(const QString &pluginPath=QString::null)
Means of accessing canonical single instance.
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
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.
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.
virtual QString protocolDrivers() const
Return a string containing the available protocol drivers.
int providerCapabilities(const QString &providerKey) const
Return the provider capabilities.
static void logMessage(const QString &message, const QString &tag=QString::null, MessageLevel level=WARNING)
add a message to the instance (and create it if necessary)
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)
QWidget * selectWidget(const QString &providerKey, QWidget *parent=0, const Qt::WindowFlags &fl=0)
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