mirror of
https://github.com/qgis/QGIS.git
synced 2025-02-25 00:58:06 -05:00
Moved plugin loading from QgisApp to QgsPluginRegistry
git-svn-id: http://svn.osgeo.org/qgis/trunk@9630 c8812cc2-4d05-0410-92ff-de0c093fc19c
This commit is contained in:
parent
acd3a32c1f
commit
e151de86a9
@ -187,11 +187,6 @@
|
|||||||
|
|
||||||
class QTreeWidgetItem;
|
class QTreeWidgetItem;
|
||||||
|
|
||||||
/* typedefs for plugins */
|
|
||||||
typedef QgisPlugin *create_ui( QgisInterface * qI );
|
|
||||||
typedef QString name_t();
|
|
||||||
typedef QString description_t();
|
|
||||||
typedef int type_t();
|
|
||||||
|
|
||||||
// IDs for locating particular menu items
|
// IDs for locating particular menu items
|
||||||
const int BEFORE_RECENT_PATHS = 123;
|
const int BEFORE_RECENT_PATHS = 123;
|
||||||
@ -397,7 +392,8 @@ QgisApp::QgisApp( QSplashScreen *splash, QWidget * parent, Qt::WFlags fl )
|
|||||||
// load any plugins that were running in the last session
|
// load any plugins that were running in the last session
|
||||||
mSplash->showMessage( tr( "Restoring loaded plugins" ), Qt::AlignHCenter | Qt::AlignBottom );
|
mSplash->showMessage( tr( "Restoring loaded plugins" ), Qt::AlignHCenter | Qt::AlignBottom );
|
||||||
qApp->processEvents();
|
qApp->processEvents();
|
||||||
restoreSessionPlugins( QgsApplication::pluginPath() );
|
QgsPluginRegistry::instance()->setQgisInterface( mQgisInterface );
|
||||||
|
QgsPluginRegistry::instance()->restoreSessionPlugins( QgsApplication::pluginPath() );
|
||||||
|
|
||||||
mSplash->showMessage( tr( "Initializing file filters" ), Qt::AlignHCenter | Qt::AlignBottom );
|
mSplash->showMessage( tr( "Initializing file filters" ), Qt::AlignHCenter | Qt::AlignBottom );
|
||||||
qApp->processEvents();
|
qApp->processEvents();
|
||||||
@ -1827,109 +1823,7 @@ void QgisApp::about()
|
|||||||
abt->activateWindow();
|
abt->activateWindow();
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Load up any plugins used in the last session
|
|
||||||
*/
|
|
||||||
|
|
||||||
void QgisApp::restoreSessionPlugins( QString thePluginDirString )
|
|
||||||
{
|
|
||||||
QSettings mySettings;
|
|
||||||
|
|
||||||
#ifdef WIN32
|
|
||||||
QString pluginExt = "*.dll";
|
|
||||||
#else
|
|
||||||
QString pluginExt = "*.so*";
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// check all libs in the current plugin directory and get name and descriptions
|
|
||||||
QDir myPluginDir( thePluginDirString, pluginExt, QDir::Name | QDir::IgnoreCase, QDir::Files | QDir::NoSymLinks );
|
|
||||||
|
|
||||||
for ( uint i = 0; i < myPluginDir.count(); i++ )
|
|
||||||
{
|
|
||||||
QString myFullPath = thePluginDirString + "/" + myPluginDir[i];
|
|
||||||
|
|
||||||
QString baseName = QFileInfo( myFullPath ).baseName();
|
|
||||||
QLibrary *myLib = new QLibrary( myFullPath );
|
|
||||||
bool loaded = myLib->load();
|
|
||||||
if ( loaded )
|
|
||||||
{
|
|
||||||
|
|
||||||
name_t * myName = ( name_t * ) cast_to_fptr( myLib->resolve( "name" ) );
|
|
||||||
description_t * myDescription = ( description_t * ) cast_to_fptr( myLib->resolve( "description" ) );
|
|
||||||
version_t * myVersion = ( version_t * ) cast_to_fptr( myLib->resolve( "version" ) );
|
|
||||||
if ( myName && myDescription && myVersion )
|
|
||||||
{
|
|
||||||
//check if the plugin was active on last session
|
|
||||||
|
|
||||||
// Windows stores a "true" value as a 1 in the registry so we
|
|
||||||
// have to use readBoolEntry in this function
|
|
||||||
|
|
||||||
if ( mySettings.value( "/Plugins/" + baseName ).toBool() )
|
|
||||||
{
|
|
||||||
//QgsDebugMsg("Loading plugin: " + myEntryName);
|
|
||||||
|
|
||||||
loadPlugin( myFullPath, myName() );
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
//QgsDebugMsg("Plugin was not active last session, leaving disabled: " + myEntryName);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
//QgsDebugMsg("Failed to get name, description, or type for " + myLib->fileName());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
//QgsDebugMsg("Failed to load " + myLib->fileName());
|
|
||||||
//QgsDebugMsg("Reason: " + myLib->errorString());
|
|
||||||
}
|
|
||||||
delete myLib;
|
|
||||||
}
|
|
||||||
|
|
||||||
QString pluginName, description, version;
|
|
||||||
|
|
||||||
if ( mPythonUtils && mPythonUtils->isEnabled() )
|
|
||||||
{
|
|
||||||
|
|
||||||
// check for python plugins system-wide
|
|
||||||
QStringList pluginList = mPythonUtils->pluginList();
|
|
||||||
std::cout << "Loading python plugins" << std::endl; // OK
|
|
||||||
|
|
||||||
|
|
||||||
for ( int i = 0; i < pluginList.size(); i++ )
|
|
||||||
{
|
|
||||||
QString packageName = pluginList[i];
|
|
||||||
|
|
||||||
// import plugin's package
|
|
||||||
if ( !mPythonUtils->loadPlugin( packageName ) )
|
|
||||||
continue;
|
|
||||||
|
|
||||||
// get information from the plugin
|
|
||||||
// if there are some problems, don't continue with metadata retreival
|
|
||||||
pluginName = mPythonUtils->getPluginMetadata( packageName, "name" );
|
|
||||||
if ( pluginName != "__error__" )
|
|
||||||
{
|
|
||||||
description = mPythonUtils->getPluginMetadata( packageName, "description" );
|
|
||||||
if ( description != "__error__" )
|
|
||||||
version = mPythonUtils->getPluginMetadata( packageName, "version" );
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( pluginName == "__error__" || description == "__error__" || version == "__error__" )
|
|
||||||
{
|
|
||||||
QMessageBox::warning( this, tr( "Python error" ), tr( "Error when reading metadata of plugin " ) + packageName );
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( mySettings.value( "/PythonPlugins/" + packageName ).toBool() )
|
|
||||||
{
|
|
||||||
loadPythonPlugin( packageName, pluginName );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
std::cout << "Plugin loading completed" << std::endl; // OK
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -4131,6 +4025,7 @@ void QgisApp::showPluginManager()
|
|||||||
pm->resizeColumnsToContents();
|
pm->resizeColumnsToContents();
|
||||||
if ( pm->exec() )
|
if ( pm->exec() )
|
||||||
{
|
{
|
||||||
|
QgsPluginRegistry* pRegistry = QgsPluginRegistry::instance();
|
||||||
// load selected plugins
|
// load selected plugins
|
||||||
std::vector < QgsPluginItem > pi = pm->getSelectedPlugins();
|
std::vector < QgsPluginItem > pi = pm->getSelectedPlugins();
|
||||||
std::vector < QgsPluginItem >::iterator it = pi.begin();
|
std::vector < QgsPluginItem >::iterator it = pi.begin();
|
||||||
@ -4139,11 +4034,11 @@ void QgisApp::showPluginManager()
|
|||||||
QgsPluginItem plugin = *it;
|
QgsPluginItem plugin = *it;
|
||||||
if ( plugin.isPython() )
|
if ( plugin.isPython() )
|
||||||
{
|
{
|
||||||
loadPythonPlugin( plugin.fullPath(), plugin.name() );
|
pRegistry->loadPythonPlugin( plugin.fullPath() );
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
loadPlugin( plugin.fullPath(), plugin.name() );
|
pRegistry->loadCppPlugin( plugin.fullPath() );
|
||||||
}
|
}
|
||||||
it++;
|
it++;
|
||||||
}
|
}
|
||||||
@ -4200,112 +4095,6 @@ void QgisApp::loadPythonSupport()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void QgisApp::loadPythonPlugin( QString packageName, QString pluginName )
|
|
||||||
{
|
|
||||||
if ( !mPythonUtils || !mPythonUtils->isEnabled() )
|
|
||||||
{
|
|
||||||
QgsDebugMsg( "Python is not enabled in QGIS." );
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
QgsPluginRegistry *pRegistry = QgsPluginRegistry::instance();
|
|
||||||
|
|
||||||
// is loaded already?
|
|
||||||
if ( ! pRegistry->isLoaded( packageName ) )
|
|
||||||
{
|
|
||||||
mPythonUtils->loadPlugin( packageName );
|
|
||||||
mPythonUtils->startPlugin( packageName );
|
|
||||||
|
|
||||||
// TODO: test success
|
|
||||||
|
|
||||||
// add to plugin registry
|
|
||||||
pRegistry->addPlugin( packageName, QgsPluginMetadata( packageName, pluginName, NULL, true ) );
|
|
||||||
|
|
||||||
// add to settings
|
|
||||||
QSettings settings;
|
|
||||||
settings.setValue( "/PythonPlugins/" + packageName, true );
|
|
||||||
std::cout << "Loaded : " << pluginName.toLocal8Bit().constData() << " (package: "
|
|
||||||
<< packageName.toLocal8Bit().constData() << ")" << std::endl; // OK
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void QgisApp::loadPlugin( QString theFullPathName, QString name )
|
|
||||||
{
|
|
||||||
QSettings settings;
|
|
||||||
// first check to see if its already loaded
|
|
||||||
QgsPluginRegistry *pRegistry = QgsPluginRegistry::instance();
|
|
||||||
|
|
||||||
QString baseName = QFileInfo( theFullPathName ).baseName();
|
|
||||||
|
|
||||||
if ( pRegistry->isLoaded( baseName ) )
|
|
||||||
{
|
|
||||||
// plugin is loaded
|
|
||||||
// QMessageBox::warning(this, "Already Loaded", description + " is already loaded");
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
QLibrary *myLib = new QLibrary( theFullPathName );
|
|
||||||
|
|
||||||
QString myError; //we will only show detailed diagnostics if something went wrong
|
|
||||||
myError += "Library name is " + myLib->fileName() + " " + QString( __LINE__ ) + " in " + QString( __FUNCTION__ ) + "\n";
|
|
||||||
|
|
||||||
bool loaded = myLib->load();
|
|
||||||
if ( loaded )
|
|
||||||
{
|
|
||||||
myError += "Attempting to resolve the classFactory function " + QString( __LINE__ ) + " in " + QString( __FUNCTION__ ) + "\n";
|
|
||||||
|
|
||||||
type_t *pType = ( type_t * ) cast_to_fptr( myLib->resolve( "type" ) );
|
|
||||||
|
|
||||||
switch ( pType() )
|
|
||||||
{
|
|
||||||
case QgisPlugin::RENDERER:
|
|
||||||
case QgisPlugin::UI:
|
|
||||||
{
|
|
||||||
// UI only -- doesn't use mapcanvas
|
|
||||||
create_ui *cf = ( create_ui * ) cast_to_fptr( myLib->resolve( "classFactory" ) );
|
|
||||||
if ( cf )
|
|
||||||
{
|
|
||||||
QgisPlugin *pl = cf( mQgisInterface );
|
|
||||||
if ( pl )
|
|
||||||
{
|
|
||||||
pl->initGui();
|
|
||||||
// add it to the plugin registry
|
|
||||||
pRegistry->addPlugin( baseName, QgsPluginMetadata( myLib->fileName(), name, pl ) );
|
|
||||||
//add it to the qsettings file [ts]
|
|
||||||
settings.setValue( "/Plugins/" + baseName, true );
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// something went wrong
|
|
||||||
QMessageBox::warning( this, tr( "Error Loading Plugin" ), tr( "There was an error loading a plugin."
|
|
||||||
"The following diagnostic information may help the QGIS developers resolve the issue:\n%1." ).arg
|
|
||||||
( myError ) );
|
|
||||||
//disable it to the qsettings file [ts]
|
|
||||||
settings.setValue( "/Plugins/" + baseName, false );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
QgsDebugMsg( "Unable to find the class factory for " + theFullPathName );
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
// type is unknown
|
|
||||||
QgsDebugMsg( "Plugin " + theFullPathName + " did not return a valid type and cannot be loaded" );
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
QgsDebugMsg( "Failed to load " + theFullPathName );
|
|
||||||
}
|
|
||||||
delete myLib;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void QgisApp::checkQgisVersion()
|
void QgisApp::checkQgisVersion()
|
||||||
|
@ -378,16 +378,10 @@ class QgisApp : public QMainWindow
|
|||||||
void zoomToLayerExtent();
|
void zoomToLayerExtent();
|
||||||
//! zoom to actual size of raster layer
|
//! zoom to actual size of raster layer
|
||||||
void zoomActualSize();
|
void zoomActualSize();
|
||||||
//! load any plugins used in the last qgis session
|
|
||||||
void restoreSessionPlugins( QString thePluginDirString );
|
|
||||||
//! plugin manager
|
//! plugin manager
|
||||||
void showPluginManager();
|
void showPluginManager();
|
||||||
//! load python support if possible
|
//! load python support if possible
|
||||||
void loadPythonSupport();
|
void loadPythonSupport();
|
||||||
//! plugin loader
|
|
||||||
void loadPlugin( QString mFullPath, QString name );
|
|
||||||
//! python plugin loader
|
|
||||||
void loadPythonPlugin( QString packageName, QString pluginName );
|
|
||||||
//! Find the QMenu with the given name (ie the user visible text on the menu item)
|
//! Find the QMenu with the given name (ie the user visible text on the menu item)
|
||||||
QMenu* getPluginMenu( QString menuName );
|
QMenu* getPluginMenu( QString menuName );
|
||||||
//! Add the action to the submenu with the given name under the plugin menu
|
//! Add the action to the submenu with the given name under the plugin menu
|
||||||
|
@ -17,12 +17,28 @@
|
|||||||
***************************************************************************/
|
***************************************************************************/
|
||||||
/* $Id$ */
|
/* $Id$ */
|
||||||
|
|
||||||
|
#include <QDir>
|
||||||
|
#include <QFileInfo>
|
||||||
|
#include <QLibrary>
|
||||||
|
#include <QMessageBox>
|
||||||
|
#include <QSettings>
|
||||||
|
|
||||||
|
#include "qgis.h"
|
||||||
|
#include "qgisinterface.h"
|
||||||
#include "qgspluginregistry.h"
|
#include "qgspluginregistry.h"
|
||||||
#include "qgspluginmetadata.h"
|
#include "qgspluginmetadata.h"
|
||||||
#include "qgisplugin.h"
|
#include "qgisplugin.h"
|
||||||
#include "qgspythonutils.h"
|
#include "qgspythonutils.h"
|
||||||
#include "qgslogger.h"
|
#include "qgslogger.h"
|
||||||
|
|
||||||
|
|
||||||
|
/* typedefs for plugins */
|
||||||
|
typedef QgisPlugin *create_ui( QgisInterface * qI );
|
||||||
|
typedef QString name_t();
|
||||||
|
typedef QString description_t();
|
||||||
|
typedef int type_t();
|
||||||
|
|
||||||
|
|
||||||
QgsPluginRegistry *QgsPluginRegistry::_instance = 0;
|
QgsPluginRegistry *QgsPluginRegistry::_instance = 0;
|
||||||
QgsPluginRegistry *QgsPluginRegistry::instance()
|
QgsPluginRegistry *QgsPluginRegistry::instance()
|
||||||
{
|
{
|
||||||
@ -34,11 +50,16 @@ QgsPluginRegistry *QgsPluginRegistry::instance()
|
|||||||
}
|
}
|
||||||
|
|
||||||
QgsPluginRegistry::QgsPluginRegistry()
|
QgsPluginRegistry::QgsPluginRegistry()
|
||||||
: mPythonUtils( NULL )
|
: mPythonUtils( NULL ), mQgisInterface( NULL )
|
||||||
{
|
{
|
||||||
// constructor does nothing
|
// constructor does nothing
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void QgsPluginRegistry::setQgisInterface( QgisInterface* iface )
|
||||||
|
{
|
||||||
|
mQgisInterface = iface;
|
||||||
|
}
|
||||||
|
|
||||||
void QgsPluginRegistry::setPythonUtils( QgsPythonUtils* pythonUtils )
|
void QgsPluginRegistry::setPythonUtils( QgsPythonUtils* pythonUtils )
|
||||||
{
|
{
|
||||||
mPythonUtils = pythonUtils;
|
mPythonUtils = pythonUtils;
|
||||||
@ -129,3 +150,217 @@ void QgsPluginRegistry::unloadAll()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void QgsPluginRegistry::loadPythonPlugin( QString packageName )
|
||||||
|
{
|
||||||
|
if ( !mPythonUtils || !mPythonUtils->isEnabled() )
|
||||||
|
{
|
||||||
|
QgsDebugMsg( "Python is not enabled in QGIS." );
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// is loaded already?
|
||||||
|
if ( ! isLoaded( packageName ) )
|
||||||
|
{
|
||||||
|
mPythonUtils->loadPlugin( packageName );
|
||||||
|
mPythonUtils->startPlugin( packageName );
|
||||||
|
|
||||||
|
// TODO: test success
|
||||||
|
|
||||||
|
QString pluginName = mPythonUtils->getPluginMetadata( packageName, "name" );
|
||||||
|
|
||||||
|
// add to plugin registry
|
||||||
|
addPlugin( packageName, QgsPluginMetadata( packageName, pluginName, NULL, true ) );
|
||||||
|
|
||||||
|
// add to settings
|
||||||
|
QSettings settings;
|
||||||
|
settings.setValue( "/PythonPlugins/" + packageName, true );
|
||||||
|
std::cout << "Loaded : " << pluginName.toLocal8Bit().constData() << " (package: "
|
||||||
|
<< packageName.toLocal8Bit().constData() << ")" << std::endl; // OK
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void QgsPluginRegistry::loadCppPlugin( QString theFullPathName )
|
||||||
|
{
|
||||||
|
QSettings settings;
|
||||||
|
|
||||||
|
QString baseName = QFileInfo( theFullPathName ).baseName();
|
||||||
|
|
||||||
|
// first check to see if its already loaded
|
||||||
|
if ( isLoaded( baseName ) )
|
||||||
|
{
|
||||||
|
// plugin is loaded
|
||||||
|
// QMessageBox::warning(this, "Already Loaded", description + " is already loaded");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
QLibrary myLib( theFullPathName );
|
||||||
|
|
||||||
|
QString myError; //we will only show detailed diagnostics if something went wrong
|
||||||
|
myError += "Library name is " + myLib.fileName() + " " + QString( __LINE__ ) + " in " + QString( __FUNCTION__ ) + "\n";
|
||||||
|
|
||||||
|
bool loaded = myLib.load();
|
||||||
|
if ( ! loaded )
|
||||||
|
{
|
||||||
|
QgsDebugMsg( "Failed to load " + theFullPathName );
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
myError += "Attempting to resolve the classFactory function " + QString( __LINE__ ) + " in " + QString( __FUNCTION__ ) + "\n";
|
||||||
|
|
||||||
|
type_t *pType = ( type_t * ) cast_to_fptr( myLib.resolve( "type" ) );
|
||||||
|
name_t *pName = ( name_t * ) cast_to_fptr( myLib.resolve( "name" ) );
|
||||||
|
|
||||||
|
switch ( pType() )
|
||||||
|
{
|
||||||
|
case QgisPlugin::RENDERER:
|
||||||
|
case QgisPlugin::UI:
|
||||||
|
{
|
||||||
|
// UI only -- doesn't use mapcanvas
|
||||||
|
create_ui *cf = ( create_ui * ) cast_to_fptr( myLib.resolve( "classFactory" ) );
|
||||||
|
if ( cf )
|
||||||
|
{
|
||||||
|
QgisPlugin *pl = cf( mQgisInterface );
|
||||||
|
if ( pl )
|
||||||
|
{
|
||||||
|
pl->initGui();
|
||||||
|
// add it to the plugin registry
|
||||||
|
addPlugin( baseName, QgsPluginMetadata( myLib.fileName(), pName(), pl ) );
|
||||||
|
//add it to the qsettings file [ts]
|
||||||
|
settings.setValue( "/Plugins/" + baseName, true );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// something went wrong
|
||||||
|
QMessageBox::warning( mQgisInterface->mainWindow(), QObject::tr( "Error Loading Plugin" ),
|
||||||
|
QObject::tr( "There was an error loading a plugin."
|
||||||
|
"The following diagnostic information may help the QGIS developers resolve the issue:\n%1." ).arg
|
||||||
|
( myError ) );
|
||||||
|
//disable it to the qsettings file [ts]
|
||||||
|
settings.setValue( "/Plugins/" + baseName, false );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
QgsDebugMsg( "Unable to find the class factory for " + theFullPathName );
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
// type is unknown
|
||||||
|
QgsDebugMsg( "Plugin " + theFullPathName + " did not return a valid type and cannot be loaded" );
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void QgsPluginRegistry::restoreSessionPlugins( QString thePluginDirString )
|
||||||
|
{
|
||||||
|
QSettings mySettings;
|
||||||
|
|
||||||
|
#ifdef WIN32
|
||||||
|
QString pluginExt = "*.dll";
|
||||||
|
#else
|
||||||
|
QString pluginExt = "*.so*";
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// check all libs in the current plugin directory and get name and descriptions
|
||||||
|
QDir myPluginDir( thePluginDirString, pluginExt, QDir::Name | QDir::IgnoreCase, QDir::Files | QDir::NoSymLinks );
|
||||||
|
|
||||||
|
for ( uint i = 0; i < myPluginDir.count(); i++ )
|
||||||
|
{
|
||||||
|
QString myFullPath = thePluginDirString + "/" + myPluginDir[i];
|
||||||
|
if (checkCppPlugin( myFullPath ) )
|
||||||
|
{
|
||||||
|
// check if the plugin was active on last session
|
||||||
|
|
||||||
|
QString baseName = QFileInfo( myFullPath ).baseName();
|
||||||
|
if ( mySettings.value( "/Plugins/" + baseName ).toBool() )
|
||||||
|
{
|
||||||
|
loadCppPlugin( myFullPath );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( mPythonUtils && mPythonUtils->isEnabled() )
|
||||||
|
{
|
||||||
|
// check for python plugins system-wide
|
||||||
|
QStringList pluginList = mPythonUtils->pluginList();
|
||||||
|
QgsDebugMsg("Loading python plugins");
|
||||||
|
|
||||||
|
for ( int i = 0; i < pluginList.size(); i++ )
|
||||||
|
{
|
||||||
|
QString packageName = pluginList[i];
|
||||||
|
|
||||||
|
if (checkPythonPlugin( packageName ) )
|
||||||
|
{
|
||||||
|
// check if the plugin was active on last session
|
||||||
|
|
||||||
|
if ( mySettings.value( "/PythonPlugins/" + packageName ).toBool() )
|
||||||
|
{
|
||||||
|
loadPythonPlugin( packageName );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
QgsDebugMsg("Plugin loading completed");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool QgsPluginRegistry::checkCppPlugin( QString pluginFullPath )
|
||||||
|
{
|
||||||
|
QLibrary myLib( pluginFullPath );
|
||||||
|
bool loaded = myLib.load();
|
||||||
|
if ( ! loaded )
|
||||||
|
{
|
||||||
|
//QgsDebugMsg("Failed to load " + myLib.fileName());
|
||||||
|
//QgsDebugMsg("Reason: " + myLib.errorString());
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
name_t * myName = ( name_t * ) cast_to_fptr( myLib.resolve( "name" ) );
|
||||||
|
description_t * myDescription = ( description_t * ) cast_to_fptr( myLib.resolve( "description" ) );
|
||||||
|
version_t * myVersion = ( version_t * ) cast_to_fptr( myLib.resolve( "version" ) );
|
||||||
|
|
||||||
|
if ( myName && myDescription && myVersion )
|
||||||
|
return true;
|
||||||
|
|
||||||
|
QgsDebugMsg("Failed to get name, description, or type for " + myLib.fileName());
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool QgsPluginRegistry::checkPythonPlugin( QString packageName )
|
||||||
|
{
|
||||||
|
// import plugin's package
|
||||||
|
if ( !mPythonUtils->loadPlugin( packageName ) )
|
||||||
|
return false;
|
||||||
|
|
||||||
|
QString pluginName, description, version;
|
||||||
|
|
||||||
|
// get information from the plugin
|
||||||
|
// if there are some problems, don't continue with metadata retreival
|
||||||
|
pluginName = mPythonUtils->getPluginMetadata( packageName, "name" );
|
||||||
|
if ( pluginName != "__error__" )
|
||||||
|
{
|
||||||
|
description = mPythonUtils->getPluginMetadata( packageName, "description" );
|
||||||
|
if ( description != "__error__" )
|
||||||
|
version = mPythonUtils->getPluginMetadata( packageName, "version" );
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( pluginName == "__error__" || description == "__error__" || version == "__error__" )
|
||||||
|
{
|
||||||
|
QMessageBox::warning( mQgisInterface->mainWindow(), QObject::tr( "Python error" ),
|
||||||
|
QObject::tr( "Error when reading metadata of plugin " ) + packageName );
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
@ -25,6 +25,7 @@
|
|||||||
class QgsPluginMetadata;
|
class QgsPluginMetadata;
|
||||||
class QgsPythonUtils;
|
class QgsPythonUtils;
|
||||||
class QgisPlugin;
|
class QgisPlugin;
|
||||||
|
class QgisInterface;
|
||||||
class QString;
|
class QString;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -41,6 +42,9 @@ class QgsPluginRegistry
|
|||||||
public:
|
public:
|
||||||
//! Returns the instance pointer, creating the object on the first call
|
//! Returns the instance pointer, creating the object on the first call
|
||||||
static QgsPluginRegistry* instance();
|
static QgsPluginRegistry* instance();
|
||||||
|
|
||||||
|
//! set pointer to qgis interface passed to plugins (used by QgisApp)
|
||||||
|
void setQgisInterface( QgisInterface* iface );
|
||||||
|
|
||||||
//! Check whether this module is loaded
|
//! Check whether this module is loaded
|
||||||
bool isLoaded( QString key );
|
bool isLoaded( QString key );
|
||||||
@ -69,13 +73,27 @@ class QgsPluginRegistry
|
|||||||
//! Dump list of plugins
|
//! Dump list of plugins
|
||||||
void dump();
|
void dump();
|
||||||
|
|
||||||
|
//! C++ plugin loader
|
||||||
|
void loadCppPlugin( QString mFullPath );
|
||||||
|
//! Python plugin loader
|
||||||
|
void loadPythonPlugin( QString packageName );
|
||||||
|
|
||||||
|
//! Load any plugins used in the last qgis session
|
||||||
|
void restoreSessionPlugins( QString thePluginDirString );
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
//! protected constructor
|
//! protected constructor
|
||||||
QgsPluginRegistry();
|
QgsPluginRegistry();
|
||||||
|
|
||||||
|
//! Try to load and get metadata from c++ plugin, return true on success
|
||||||
|
bool checkCppPlugin( QString pluginFullPath );
|
||||||
|
//! Try to load and get metadata from Python plugin, return true on success
|
||||||
|
bool checkPythonPlugin( QString packageName );
|
||||||
|
|
||||||
private:
|
private:
|
||||||
static QgsPluginRegistry* _instance;
|
static QgsPluginRegistry* _instance;
|
||||||
QMap<QString, QgsPluginMetadata> mPlugins;
|
QMap<QString, QgsPluginMetadata> mPlugins;
|
||||||
QgsPythonUtils* mPythonUtils;
|
QgsPythonUtils* mPythonUtils;
|
||||||
|
QgisInterface* mQgisInterface;
|
||||||
};
|
};
|
||||||
#endif //QgsPluginRegistry_H
|
#endif //QgsPluginRegistry_H
|
||||||
|
Loading…
x
Reference in New Issue
Block a user