[prev in list] [next in list] [prev in thread] [next in thread]
List: kde-commits
Subject: koffice/libs/kofficecore
From: Thomas Zander <zander () kde ! org>
Date: 2007-04-14 7:02:34
Message-ID: 1176534154.856617.25542.nullmailer () svn ! kde ! org
[Download RAW message or body]
SVN commit 653771 by zander:
Make loading of plugins configurable.
The effect is that loading of plugins (which takes time and memory) can be
explicity enabled / disabled per context. The usecase here is that when
the sysadmin installs a bibliographic plugin and I never use it, I can disable
it from taking resoures when I start KOffice apps.
M +5 -1 KoDockRegistry.cpp
M +51 -10 KoPluginLoader.cpp
M +32 -2 KoPluginLoader.h
--- trunk/koffice/libs/kofficecore/KoDockRegistry.cpp #653770:653771
@@ -26,7 +26,11 @@
}
void KoDockRegistry::init() {
- KoPluginLoader::instance()->load( QString::fromLatin1("KOffice/Dock"));
+ KoPluginLoader::PluginsConfig config;
+ config.whiteList = "docker-plugins";
+ config.blacklist = "disabled-docker-plugins";
+ config.group = "koffice";
+ KoPluginLoader::instance()->load( QString::fromLatin1("KOffice/Dock"), \
QString(), config); }
KoDockRegistry::~KoDockRegistry()
--- trunk/koffice/libs/kofficecore/KoPluginLoader.cpp #653770:653771
@@ -17,6 +17,8 @@
* Boston, MA 02110-1301, USA.
*/
+#include "KoPluginLoader.h"
+
#include <QString>
#include <QStringList>
@@ -24,12 +26,13 @@
#include <kservice.h>
#include <kservicetypetrader.h>
#include <kstaticdeleter.h>
+#include <KConfig>
-#include <KoPluginLoader.h>
-
class KoPluginLoader::Private {
public:
QStringList loadedServiceTypes;
+
+ static KoPluginLoader *singleton;
};
KoPluginLoader::KoPluginLoader()
@@ -42,35 +45,66 @@
delete d;
}
-KoPluginLoader *KoPluginLoader::m_singleton = 0;
-static KStaticDeleter<KoPluginLoader> staticShapeRegistryDeleter;
+KoPluginLoader *KoPluginLoader::Private::singleton = 0;
+static KStaticDeleter<KoPluginLoader> pluginLoaderStatic;
KoPluginLoader* KoPluginLoader::instance()
{
- if(KoPluginLoader::m_singleton == 0)
+ if(KoPluginLoader::Private::singleton == 0)
{
- staticShapeRegistryDeleter.setObject(m_singleton, new KoPluginLoader());
+ pluginLoaderStatic.setObject(Private::singleton, new KoPluginLoader());
}
- return KoPluginLoader::m_singleton;
+ return KoPluginLoader::Private::singleton;
}
-void KoPluginLoader::load(const QString & serviceType, const QString & \
versionString)
-{
+void KoPluginLoader::load(const QString & serviceType, const QString & \
versionString, const PluginsConfig &config) { // Don't load the same plugins again
if (d->loadedServiceTypes.contains(serviceType)) {
return;
}
+ // kDebug() << "KoPluginLoader::load " << serviceType << kBacktrace() << endl;
d->loadedServiceTypes << serviceType;
QString query = QString::fromLatin1("(Type == 'Service')");
if(! versionString.isEmpty())
query += QString::fromLatin1(" and (%1)").arg(versionString);
const KService::List offers = KServiceTypeTrader::self()->query(serviceType, \
query); + KService::List plugins;
+ bool configChanged = false;
+ QList<QString> blacklist; // what we will save out afterwards
+ if(config.whiteList && config.blacklist && config.group) {
+ kDebug(30003) << "loading " << serviceType << " with checking the config\n";
+ KConfigGroup configGroup = KGlobal::config()->group(config.group);
+ QList<QString> whiteList = configGroup.readEntry(config.whiteList, \
config.defaults); + QList<QString> knownList;
- foreach(KService::Ptr service, offers) {
+ // if there was no list of defaults; all plugins are loaded.
+ const bool firstStart = !config.defaults.isEmpty() && \
!configGroup.hasKey(config.whiteList); + knownList = \
configGroup.readEntry(config.blacklist, knownList); + if(firstStart)
+ configChanged = true;
+
+ foreach(KSharedPtr<KService> service, offers) {
+ QString lib = service->library();
+ if(whiteList.contains(lib))
+ plugins.append(service);
+ else if(!firstStart && !blacklist.contains(lib)) { // also load newly \
installed plugins. + plugins.append(service);
+ configChanged = true;
+ }
+ else
+ blacklist << service->library();
+ }
+ }
+ else
+ plugins = offers;
+
+ QList<QString> whiteList;
+ foreach(KSharedPtr<KService> service, plugins) {
int errCode = 0;
QObject * plugin = KService::createInstance<QObject>(service, this, \
QStringList(), &errCode ); if ( plugin ) {
+ whiteList << service->library();
kDebug(30003) << "Loaded plugin " << service->name() << endl;
delete plugin;
}
@@ -78,5 +112,12 @@
kWarning(30003) <<"loading plugin '" << service->name() << "' failed, \
"<< KLibLoader::errorString( errCode ) << " ("<< errCode << ")\n"; }
}
+
+ if(configChanged && config.whiteList && config.blacklist && config.group) {
+ KConfigGroup configGroup = KGlobal::config()->group(config.group);
+ configGroup.writeEntry(config.whiteList, whiteList);
+ configGroup.writeEntry(config.blacklist, blacklist);
+ }
}
+
#include "KoPluginLoader.moc"
--- trunk/koffice/libs/kofficecore/KoPluginLoader.h #653770:653771
@@ -68,6 +68,29 @@
Q_OBJECT
public:
+ /**
+ * Config object for load()
+ * It is possible to limit which plugins will be loaded in the KConfig \
configuration file by + * stating explicitly which plugins are wanted.
+ */
+ struct PluginsConfig {
+ PluginsConfig() : group(0), whiteList(0), blacklist(0) {}
+ /**
+ * The properties are retrieved from the config using the following \
construct; + * /code
+ * KConfigGroup configGroup = KGlobal::config()->group(config.group);
+ * /endcode
+ * For most cases you can pass the string "koffice" into this variable.
+ */
+ const char * group;
+ /// This contains the variable name for the list of plugins (by library \
name) the user wants to load + const char * whiteList;
+ /// This contains the variable name for the list of plugins (by library \
name) that will not be loaded + const char * blacklist;
+ /// A registry can state it wants to load a default set of plugins instead \
of all plugins + /// when the application starts the first time. Append all \
such plugin (library) names to this list. + QStringList defaults;
+ };
~KoPluginLoader();
@@ -81,8 +104,16 @@
* Load all plugins that conform to the versiontype and versionstring,
* for instance:
* KoPluginLoader::instance()->load("KOffice/Flake", "([X-Flake-Version] == \
3)"); + * This method allows you to optionally limit the plugins that are loaded \
by version, but also + * using a user configurable set of config options.
+ * If you pass a PluginsConfig struct only those plugins are loaded that are \
specified in the + * application config file. New plugins found since last start \
will be automatically loaded. + * @param serviceType The string used to identify \
the plugins. + * @param versionString A string match that allows you to check for \
a specific version + * @param config when passing a valid config only the wanted \
plugins are actually loaded + * @return a list of services (by library name) that \
were not know in the config
*/
- void load(const QString & serviceType, const QString & versionString = \
QString()); + void load(const QString & serviceType, const QString & versionString \
= QString(), const PluginsConfig &config = PluginsConfig() );
private:
KoPluginLoader();
@@ -90,7 +121,6 @@
KoPluginLoader operator=(const KoPluginLoader&);
private:
- static KoPluginLoader *m_singleton;
class Private;
Private * const d;
};
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic