umbrello 2.34.70-5524f40e1
Umbrello UML Modeller is a Unified Modelling Language (UML) diagram program based on KDE Technology
|
#include <pluginloader.h>
Public Types | |
typedef Q3ValueList< Plugin * > | PluginList |
typedef QMap< QString, Plugin * > | PluginMap |
typedef QMap< QString, PluginList > | CategoryMap |
Public Member Functions | |
~PluginLoader () | |
Plugin * | loadPlugin (const QString &name) |
Plugin * | findPlugin (const QString &name) |
void | unloadPlugin (const QString &name) |
const PluginMap & | plugins () const |
const CategoryMap & | categories () const |
Static Public Member Functions | |
static PluginLoader * | instance () |
Private Slots | |
void | slotDestroyed (QObject *obj) |
Private Member Functions | |
PluginLoader () | |
Private Attributes | |
PluginMap | _plugins |
The plugin mapping. More... | |
CategoryMap | _categories |
Categories of plugins. More... | |
Static Private Attributes | |
static PluginLoader * | _instance = 0 |
Singleton instance. More... | |
The plugin loader is an abstraction that sits on top of KLibLoader. Whereas plugins are specialized shared objects, the plugin must specialize the loading of those objects. Essentially, the plugin loader provides a single unit of functionality - loading plugins. In order to load a plugin, we must first load a shared library and then use the libraries factory to create the plugin. However, because a plugin is required to be a singleton, we must ensure that no plugin is ever created more than once. To that end, the loader must also retain a map of loaded plugins. When a loaded plugin is requested, we can increase its reference count.
On the subject of unloading, we actually have very little to do. The unload method on a plugin is simply a reference decrementer. When it reaches 0, the object destroys itself. Being a QObject, it will emit the destroyed signal just before deletion, allowing the plugin loader to respond to the event and remove the plugin from its mapping.
The PluginLoader also manages categories of plugins. The runtime categories actually reflect the directory structure of the build environment with each category represented by the name of a directory. The categories are "pre-seeded" at startup.
typedef QMap<QString, PluginList> Umbrello::PluginLoader::CategoryMap |
Container of plugin categories
typedef Q3ValueList<Plugin *> Umbrello::PluginLoader::PluginList |
Just a container of plugins
typedef QMap<QString, Plugin *> Umbrello::PluginLoader::PluginMap |
The containment type for mapping plugins
PluginLoader::~PluginLoader | ( | ) |
Destroy the plugin loader
|
private |
Private constructor - This must be created through the instance method
const PluginLoader::CategoryMap & PluginLoader::categories | ( | ) | const |
Get a reference to the plugin category mapping.
Plugin * PluginLoader::findPlugin | ( | const QString & | name | ) |
Find a plugin
|
static |
Singleton accessor
Plugin * PluginLoader::loadPlugin | ( | const QString & | name | ) |
Load a plugin. Test to see if the plugin already exists. If it does, just add a reference to it and continue on.
const PluginLoader::PluginMap & PluginLoader::plugins | ( | ) | const |
Get a reference to the plugin mapping. This method wraps everything in consts with the express purpose that no changes are made to the plugin map after using this method.
|
privateslot |
This is used to connect to the destroyed signal emitted by plugins when they are finally deleted. The plugin loader uses this signal to remove the plugin from the plugin map.
void PluginLoader::unloadPlugin | ( | const QString & | name | ) |
Unload a plugin. Never use this method. It is only used by the deref method of a plugin to cause this class to unload the corresponding library. In fact, there is actually no corresponding plugin to unload, we just unload the library.
|
private |
Categories of plugins.
|
staticprivate |
Singleton instance.
|
private |
The plugin mapping.