umbrello 2.34.70-5524f40e1
Umbrello UML Modeller is a Unified Modelling Language (UML) diagram program based on KDE Technology
Public Types | Public Member Functions | Static Public Member Functions | Private Slots | Private Member Functions | Private Attributes | Static Private Attributes | List of all members
Umbrello::PluginLoader Class Reference

#include <pluginloader.h>

Inheritance diagram for Umbrello::PluginLoader:
Collaboration diagram for Umbrello::PluginLoader:

Public Types

typedef Q3ValueList< Plugin * > PluginList
 
typedef QMap< QString, Plugin * > PluginMap
 
typedef QMap< QString, PluginListCategoryMap
 

Public Member Functions

 ~PluginLoader ()
 
PluginloadPlugin (const QString &name)
 
PluginfindPlugin (const QString &name)
 
void unloadPlugin (const QString &name)
 
const PluginMapplugins () const
 
const CategoryMapcategories () const
 

Static Public Member Functions

static PluginLoaderinstance ()
 

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...
 

Detailed Description

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.

Bug:
Plugins are not removed from their respective categories when they are destroyed. It may be acceptable to call Plugin::category() from slotDestroyed because the category() method doesn't reference any local variables - it just returns a string.

Member Typedef Documentation

◆ CategoryMap

Container of plugin categories

◆ PluginList

Just a container of plugins

◆ PluginMap

typedef QMap<QString, Plugin *> Umbrello::PluginLoader::PluginMap

The containment type for mapping plugins

Constructor & Destructor Documentation

◆ ~PluginLoader()

PluginLoader::~PluginLoader ( )

Destroy the plugin loader

◆ PluginLoader()

PluginLoader::PluginLoader ( )
private

Private constructor - This must be created through the instance method

Member Function Documentation

◆ categories()

const PluginLoader::CategoryMap & PluginLoader::categories ( ) const

Get a reference to the plugin category mapping.

◆ findPlugin()

Plugin * PluginLoader::findPlugin ( const QString &  name)

Find a plugin

◆ instance()

PluginLoader * PluginLoader::instance ( )
static

Singleton accessor

Here is the call graph for this function:

◆ loadPlugin()

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.

Here is the call graph for this function:

◆ plugins()

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.

◆ slotDestroyed

void PluginLoader::slotDestroyed ( QObject *  obj)
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.

◆ unloadPlugin()

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.

Member Data Documentation

◆ _categories

CategoryMap Umbrello::PluginLoader::_categories
private

Categories of plugins.

◆ _instance

PluginLoader * PluginLoader::_instance = 0
staticprivate

Singleton instance.

◆ _plugins

PluginMap Umbrello::PluginLoader::_plugins
private

The plugin mapping.


The documentation for this class was generated from the following files: