summaryrefslogtreecommitdiffstats
path: root/libk3b/plugin/k3bpluginmanager.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'libk3b/plugin/k3bpluginmanager.cpp')
-rw-r--r--libk3b/plugin/k3bpluginmanager.cpp189
1 files changed, 189 insertions, 0 deletions
diff --git a/libk3b/plugin/k3bpluginmanager.cpp b/libk3b/plugin/k3bpluginmanager.cpp
new file mode 100644
index 0000000..3e963a2
--- /dev/null
+++ b/libk3b/plugin/k3bpluginmanager.cpp
@@ -0,0 +1,189 @@
+/*
+ *
+ * $Id: k3bpluginmanager.cpp 619556 2007-01-03 17:38:12Z trueg $
+ * Copyright (C) 2003 Sebastian Trueg <trueg@k3b.org>
+ *
+ * This file is part of the K3b project.
+ * Copyright (C) 1998-2007 Sebastian Trueg <trueg@k3b.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ * See the file "COPYING" for the exact licensing terms.
+ */
+
+#include "k3bpluginmanager.h"
+#include "k3bplugin.h"
+#include "k3bpluginconfigwidget.h"
+#include <k3bversion.h>
+
+#include <kdebug.h>
+#include <ksimpleconfig.h>
+#include <klocale.h>
+#include <kglobal.h>
+#include <kstandarddirs.h>
+#include <kdialogbase.h>
+#include <kmessagebox.h>
+#include <klibloader.h>
+
+#include <qptrlist.h>
+#include <qmap.h>
+#include <qdir.h>
+
+
+
+class K3bPluginManager::Private
+{
+public:
+ QPtrList<K3bPlugin> plugins;
+};
+
+
+
+
+K3bPluginManager::K3bPluginManager( QObject* parent, const char* name )
+ : QObject( parent, name )
+{
+ d = new Private();
+}
+
+
+K3bPluginManager::~K3bPluginManager()
+{
+ delete d;
+}
+
+
+
+QStringList K3bPluginManager::groups() const
+{
+ QStringList grps;
+
+ QPtrList<K3bPlugin> fl;
+ for( QPtrListIterator<K3bPlugin> it( d->plugins );
+ it.current(); ++it ) {
+ if( !grps.contains( it.current()->group() ) )
+ grps.append( it.current()->group() );
+ }
+
+ return grps;
+}
+
+
+QPtrList<K3bPlugin> K3bPluginManager::plugins( const QString& group ) const
+{
+ QPtrList<K3bPlugin> fl;
+ for( QPtrListIterator<K3bPlugin> it( d->plugins );
+ it.current(); ++it ) {
+ if( it.current()->group() == group || group.isEmpty() )
+ fl.append( it.current() );
+ }
+ return fl;
+}
+
+
+void K3bPluginManager::loadPlugin( const QString& fileName )
+{
+ KSimpleConfig c( fileName, true );
+ c.setGroup( "K3b Plugin" );
+
+ QString libName = c.readEntry( "Lib" );
+ if( libName.isEmpty() ) {
+ kdDebug() << "(K3bPluginManager) no Lib specified in " << fileName << endl;
+ return;
+ }
+
+ // read the lib
+ KLibFactory* factory = KLibLoader::self()->factory( libName.latin1() );
+ if( factory ) {
+ K3bPlugin* plugin = dynamic_cast<K3bPlugin*>( factory->create( this ) );
+ if( plugin ) {
+ // FIXME: improve this versioning stuff
+ if( plugin->pluginSystemVersion() != K3B_PLUGIN_SYSTEM_VERSION ) {
+ delete plugin;
+ kdDebug() << "(K3bPluginManager) plugin system does not fit lib " << libName << endl;
+ }
+ else {
+ plugin->m_pluginInfo = K3bPluginInfo( libName,
+ c.readEntry( "Name" ),
+ c.readEntry( "Author" ),
+ c.readEntry( "Email" ),
+ c.readEntry( "Comment" ),
+ c.readEntry( "Version" ),
+ c.readEntry( "License" ) );
+
+ // make sure to only use the latest version of one plugin
+ bool addPlugin = true;
+ for( QPtrListIterator<K3bPlugin> it( d->plugins ); *it; ++it ) {
+ if( it.current()->pluginInfo().name() == plugin->pluginInfo().name() ) {
+ if( K3bVersion(it.current()->pluginInfo().version()) < K3bVersion(plugin->pluginInfo().version()) ) {
+ K3bPlugin* p = it.current();
+ d->plugins.removeRef( p );
+ delete p;
+ }
+ else {
+ addPlugin = false;
+ }
+ break;
+ }
+ }
+ if( addPlugin )
+ d->plugins.append( plugin );
+ else
+ delete plugin;
+ }
+ }
+ else
+ kdDebug() << "(K3bPluginManager) lib " << libName << " not a K3b plugin" << endl;
+ }
+ else
+ kdDebug() << "(K3bPluginManager) lib " << libName << " not found" << endl;
+}
+
+
+void K3bPluginManager::loadAll()
+{
+ // we simply search the K3b plugin dir for now
+ QStringList dirs = KGlobal::dirs()->findDirs( "data", "k3b/plugins/" );
+
+ for( QStringList::const_iterator it = dirs.begin();
+ it != dirs.end(); ++it ) {
+ QStringList entries = QDir(*it).entryList( "*.plugin", QDir::Files );
+ for( QStringList::const_iterator it2 = entries.begin();
+ it2 != entries.end(); ++it2 ) {
+ loadPlugin( *it + *it2 );
+ }
+ }
+}
+
+int K3bPluginManager::pluginSystemVersion() const
+{
+ return K3B_PLUGIN_SYSTEM_VERSION;
+}
+
+
+int K3bPluginManager::execPluginDialog( K3bPlugin* plugin, QWidget* parent, const char* name )
+{
+ KDialogBase dlg( parent,
+ name,
+ true,
+ i18n("Configure plugin %1").arg( plugin->pluginInfo().name() ) );
+
+ K3bPluginConfigWidget* configWidget = plugin->createConfigWidget( &dlg );
+ if( configWidget ) {
+ dlg.setMainWidget( configWidget );
+ connect( &dlg, SIGNAL(applyClicked()), configWidget, SLOT(saveConfig()) );
+ connect( &dlg, SIGNAL(okClicked()), configWidget, SLOT(saveConfig()) );
+ configWidget->loadConfig();
+ int r = dlg.exec();
+ delete configWidget;
+ return r;
+ }
+ else {
+ KMessageBox::sorry( parent, i18n("No settings available for plugin %1.").arg( plugin->pluginInfo().name() ) );
+ return 0;
+ }
+}
+
+#include "k3bpluginmanager.moc"