00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #include "pluginmanager.h"
00020 #include "plugin.h"
00021
00022 #include <KDebug>
00023 #include <KServiceTypeTrader>
00024 #include <KXmlGuiWindow>
00025
00026 #include <core/debughelper.h>
00027
00028 using namespace GluonCreator;
00029
00030 template<> GLUON_CREATOR_VISIBILITY PluginManager* GluonCore::Singleton<PluginManager>::m_instance = 0;
00031
00032 class PluginManager::PluginManagerPrivate
00033 {
00034 public:
00035 PluginManagerPrivate()
00036 {
00037 mainWindow = 0;
00038 }
00039 QHash<QString, Plugin*> loadedPlugins;
00040 KXmlGuiWindow* mainWindow;
00041 };
00042
00043 QList< KPluginInfo > PluginManager::pluginInfos() const
00044 {
00045 return KPluginInfo::fromServices( KServiceTypeTrader::self()->query( "GluonCreator/Plugin" ) );
00046 }
00047
00048 void PluginManager::setMainWindow( KXmlGuiWindow* window )
00049 {
00050 d->mainWindow = window;
00051 }
00052
00053 void PluginManager::loadPlugins()
00054 {
00055 DEBUG_FUNC_NAME
00056 KConfigGroup group = KGlobal::config()->group( "Plugins" );
00057 KService::List offers = KServiceTypeTrader::self()->query( "GluonCreator/Plugin" );
00058
00059 KService::List::const_iterator iter;
00060 for( iter = offers.begin(); iter < offers.end(); ++iter )
00061 {
00062 QString error;
00063 KService::Ptr service = *iter;
00064
00065 QString serviceName = service->desktopEntryName();
00066 bool loadPlugin = group.readEntry<bool>( QString( "%1Enabled" ).arg( serviceName ), true );
00067
00068 if( !d->loadedPlugins.contains( serviceName ) && loadPlugin )
00069 {
00070 KPluginFactory* factory = KPluginLoader( service->library() ).factory();
00071
00072 if( !factory )
00073 {
00074 DEBUG_TEXT( QString( "KPluginFactory could not load the plugin: %1" ).arg( service->library() ) );
00075 continue;
00076 }
00077
00078 Plugin* plugin = factory->create<Plugin>( this );
00079
00080 if( plugin )
00081 {
00082 DEBUG_TEXT( QString( "Load plugin: %1" ).arg( service->name() ) );
00083 plugin->load( d->mainWindow );
00084 d->loadedPlugins.insert( serviceName, plugin );
00085 }
00086 else
00087 {
00088 DEBUG_TEXT( error );
00089 }
00090 }
00091 else if( !loadPlugin && d->loadedPlugins.contains( serviceName ) )
00092 {
00093 Plugin* plugin = d->loadedPlugins.value( serviceName );
00094 plugin->unload( d->mainWindow );
00095 delete plugin;
00096 d->loadedPlugins.remove( serviceName );
00097 }
00098 }
00099 }
00100
00101 PluginManager::PluginManager() : d( new PluginManagerPrivate )
00102 {
00103 }
00104
00105 PluginManager::~PluginManager()
00106 {
00107 delete d;
00108 }
00109 QHash<QString, Plugin*> PluginManager::loadedPlugins()
00110 {
00111 return d->loadedPlugins;
00112 }
00113
00114