00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #include <config.h>
00022 #include <kparts/plugin.h>
00023 #include <kparts/part.h>
00024 #include <kparts/componentfactory.h>
00025
00026 #include <assert.h>
00027
00028 #include <qfile.h>
00029 #include <qobjectlist.h>
00030 #include <qfileinfo.h>
00031
00032 #include <klibloader.h>
00033 #include <kinstance.h>
00034 #include <kstandarddirs.h>
00035 #include <kdebug.h>
00036 #include <kxmlguifactory.h>
00037 #include <klocale.h>
00038 #include <kconfig.h>
00039 #include <ksimpleconfig.h>
00040
00041 using namespace KParts;
00042
00043 class Plugin::PluginPrivate
00044 {
00045 public:
00046 PluginPrivate() : m_parentInstance( 0 ) {}
00047
00048 const KInstance *m_parentInstance;
00049 QString m_library;
00050 };
00051
00052 Plugin::Plugin( QObject* parent, const char* name )
00053 : QObject( parent, name )
00054 {
00055
00056 d = new PluginPrivate();
00057 }
00058
00059 Plugin::~Plugin()
00060 {
00061 delete d;
00062 }
00063
00064 QString Plugin::xmlFile() const
00065 {
00066 QString path = KXMLGUIClient::xmlFile();
00067
00068 if ( !d->m_parentInstance || ( path.length() > 0 && path[ 0 ] == '/' ) )
00069 return path;
00070
00071 QString absPath = locate( "data", QString::fromLatin1( d->m_parentInstance->instanceName() ) + '/' + path );
00072 assert( !absPath.isEmpty() );
00073 return absPath;
00074 }
00075
00076 QString Plugin::localXMLFile() const
00077 {
00078 QString path = KXMLGUIClient::xmlFile();
00079
00080 if ( !d->m_parentInstance || ( path.length() > 0 && path[ 0 ] == '/' ) )
00081 return path;
00082
00083 QString absPath = locateLocal( "data", QString::fromLatin1( d->m_parentInstance->instanceName() ) + '/' + path );
00084 assert( !absPath.isEmpty() );
00085 return absPath;
00086 }
00087
00088
00089 QValueList<Plugin::PluginInfo> Plugin::pluginInfos( const KInstance * instance )
00090 {
00091 if ( !instance )
00092 kdError(1000) << "No instance ???" << endl;
00093
00094 QValueList<PluginInfo> plugins;
00095
00096 QStringList pluginDocs = instance->dirs()->findAllResources(
00097 "data", instance->instanceName()+"/kpartplugins/*", true, false );
00098
00099 QMap<QString,QStringList> sortedPlugins;
00100
00101 QStringList::ConstIterator pIt = pluginDocs.begin();
00102 QStringList::ConstIterator pEnd = pluginDocs.end();
00103 for (; pIt != pEnd; ++pIt )
00104 {
00105 QFileInfo fInfo( *pIt );
00106 if ( fInfo.extension() == QString::fromLatin1( ".desktop" ) )
00107 continue;
00108
00109 QMap<QString,QStringList>::Iterator mapIt = sortedPlugins.find( fInfo.fileName() );
00110 if ( mapIt == sortedPlugins.end() )
00111 mapIt = sortedPlugins.insert( fInfo.fileName(), QStringList() );
00112
00113 mapIt.data().append( *pIt );
00114 }
00115
00116 QMap<QString,QStringList>::ConstIterator mapIt = sortedPlugins.begin();
00117 QMap<QString,QStringList>::ConstIterator mapEnd = sortedPlugins.end();
00118 for (; mapIt != mapEnd; ++mapIt )
00119 {
00120 PluginInfo info;
00121 QString doc;
00122 info.m_absXMLFileName = KXMLGUIClient::findMostRecentXMLFile( mapIt.data(), doc );
00123 if ( info.m_absXMLFileName.isEmpty() )
00124 continue;
00125
00126 kdDebug( 1000 ) << "found Plugin : " << info.m_absXMLFileName << " !" << endl;
00127 info.m_relXMLFileName = "kpartplugins/";
00128 info.m_relXMLFileName += mapIt.key();
00129
00130 info.m_document.setContent( doc );
00131 if ( info.m_document.documentElement().isNull() )
00132 continue;
00133
00134 plugins.append( info );
00135 }
00136
00137 return plugins;
00138 }
00139
00140 void Plugin::loadPlugins( QObject *parent, const KInstance *instance )
00141 {
00142 loadPlugins( parent, pluginInfos( instance ), instance );
00143 }
00144
00145 void Plugin::loadPlugins( QObject *parent, const QValueList<PluginInfo> &pluginInfos, const KInstance *instance )
00146 {
00147 QValueList<PluginInfo>::ConstIterator pIt = pluginInfos.begin();
00148 QValueList<PluginInfo>::ConstIterator pEnd = pluginInfos.end();
00149 for (; pIt != pEnd; ++pIt )
00150 {
00151 QString library = (*pIt).m_document.documentElement().attribute( "library" );
00152
00153 if ( library.isEmpty() || hasPlugin( parent, library ) )
00154 continue;
00155
00156 Plugin *plugin = loadPlugin( parent, QFile::encodeName(library) );
00157
00158 if ( plugin )
00159 {
00160 plugin->d->m_parentInstance = instance;
00161 plugin->setXMLFile( (*pIt).m_relXMLFileName, false, false );
00162 plugin->setDOMDocument( (*pIt).m_document );
00163
00164 }
00165 }
00166
00167 }
00168
00169 void Plugin::loadPlugins( QObject *parent, const QValueList<PluginInfo> &pluginInfos )
00170 {
00171 loadPlugins(parent, pluginInfos, 0);
00172 }
00173
00174
00175 Plugin* Plugin::loadPlugin( QObject * parent, const char* libname )
00176 {
00177 Plugin* plugin = ComponentFactory::createInstanceFromLibrary<Plugin>( libname, parent, libname );
00178 if ( !plugin )
00179 return 0L;
00180 plugin->d->m_library = libname;
00181 return plugin;
00182 }
00183
00184 QPtrList<KParts::Plugin> Plugin::pluginObjects( QObject *parent )
00185 {
00186 QPtrList<KParts::Plugin> objects;
00187
00188 if (!parent )
00189 return objects;
00190
00191 QObjectList *plugins = parent->queryList( "KParts::Plugin", 0, false, false );
00192
00193 QObjectListIt it( *plugins );
00194 for ( ; it.current() ; ++it )
00195 {
00196 objects.append( static_cast<Plugin *>( it.current() ) );
00197 }
00198
00199 delete plugins;
00200
00201 return objects;
00202 }
00203
00204 bool Plugin::hasPlugin( QObject* parent, const QString& library )
00205 {
00206 QObjectList *plugins = parent->queryList( "KParts::Plugin", 0, false, false );
00207 QObjectListIt it( *plugins );
00208 for ( ; it.current() ; ++it )
00209 {
00210 if ( static_cast<Plugin *>( it.current() )->d->m_library == library )
00211 {
00212 delete plugins;
00213 return true;
00214 }
00215 }
00216 delete plugins;
00217 return false;
00218 }
00219
00220 void Plugin::setInstance( KInstance *instance )
00221 {
00222 KGlobal::locale()->insertCatalogue( instance->instanceName() );
00223 KXMLGUIClient::setInstance( instance );
00224 }
00225
00226 void Plugin::loadPlugins( QObject *parent, KXMLGUIClient* parentGUIClient, KInstance* instance, bool enableNewPluginsByDefault )
00227 {
00228 KConfigGroup cfgGroup( instance->config(), "KParts Plugins" );
00229 QValueList<PluginInfo> plugins = pluginInfos( instance );
00230 QValueList<PluginInfo>::ConstIterator pIt = plugins.begin();
00231 QValueList<PluginInfo>::ConstIterator pEnd = plugins.end();
00232 for (; pIt != pEnd; ++pIt )
00233 {
00234 QDomElement docElem = (*pIt).m_document.documentElement();
00235 QString library = docElem.attribute( "library" );
00236
00237 if ( library.isEmpty() )
00238 continue;
00239
00240
00241 QString name = docElem.attribute( "name" );
00242 QString desktopfile = instance->dirs()->findResource( "data",
00243 QString( instance->instanceName() ) + "/kpartplugins/" + name +
00244 ".desktop" );
00245 kdDebug( 1000 ) << "loadPlugins found desktopfile for " << instance->instanceName() << ": " << desktopfile << endl;
00246 if( ! desktopfile.isNull() )
00247 {
00248 KSimpleConfig desktop( desktopfile );
00249 desktop.setGroup( "X-KDE Plugin Info" );
00250 enableNewPluginsByDefault = desktop.readBoolEntry(
00251 "EnabledByDefault", enableNewPluginsByDefault );
00252 }
00253 bool pluginEnabled = cfgGroup.readBoolEntry( name + "Enabled", enableNewPluginsByDefault );
00254
00255
00256 QObjectList *pluginList = parent->queryList( "KParts::Plugin", 0, false, false );
00257 QObjectListIt it( *pluginList );
00258 bool pluginFound = false;
00259 for ( ; it.current() ; ++it )
00260 {
00261 Plugin * plugin = static_cast<Plugin *>( it.current() );
00262 if( plugin->d->m_library == library )
00263 {
00264
00265 if( !pluginEnabled )
00266 {
00267 kdDebug( 1000 ) << "remove plugin " << name << endl;
00268 KXMLGUIFactory * factory = plugin->factory();
00269 if( factory )
00270 factory->removeClient( plugin );
00271 delete plugin;
00272 }
00273
00274 pluginFound = true;
00275 break;
00276 }
00277 }
00278 delete pluginList;
00279
00280
00281
00282 if( pluginFound || !pluginEnabled )
00283 continue;
00284
00285 kdDebug( 1000 ) << "load plugin " << name << endl;
00286 Plugin *plugin = loadPlugin( parent, QFile::encodeName(library) );
00287
00288 if ( plugin )
00289 {
00290 plugin->d->m_parentInstance = instance;
00291 plugin->setXMLFile( (*pIt).m_relXMLFileName, false, false );
00292 plugin->setDOMDocument( (*pIt).m_document );
00293 parentGUIClient->insertChildClient( plugin );
00294 }
00295 }
00296 }
00297
00298
00299
00300 #include "plugin.moc"