diff options
Diffstat (limited to 'knetworkmanager-0.8/src/knetworkmanager-pluginmanager.cpp')
-rw-r--r-- | knetworkmanager-0.8/src/knetworkmanager-pluginmanager.cpp | 184 |
1 files changed, 184 insertions, 0 deletions
diff --git a/knetworkmanager-0.8/src/knetworkmanager-pluginmanager.cpp b/knetworkmanager-0.8/src/knetworkmanager-pluginmanager.cpp new file mode 100644 index 0000000..8bd3f85 --- /dev/null +++ b/knetworkmanager-0.8/src/knetworkmanager-pluginmanager.cpp @@ -0,0 +1,184 @@ +/*************************************************************************** + * + * knetworkmanager-pluginmanager.cpp - A NetworkManager frontend for KDE + * + * Copyright (C) 2006 Novell, Inc. + * + * Author: Helmut Schaa <[email protected]>, <[email protected]> + * + * 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. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + **************************************************************************/ + +#include <kplugininfo.h> +#include <kparts/componentfactory.h> +#include <kdebug.h> +#include <klocale.h> + +#include "knetworkmanager-pluginmanager.h" + +PluginManager* PluginManager::_instance; + +PluginManager* PluginManager::getInstance() +{ + if (_instance) + return _instance; + return new PluginManager(TQT_TQOBJECT(KNetworkManager::getInstance()), "pluginmanager"); +} + +PluginManager::PluginManager(TQObject* parent, const char* name) + : TQObject(parent, name) +{ + // get list of available plugins + this->_plugins = KPluginInfo::fromServices( KTrader::self()->query( TQString::tqfromLatin1( "KNetworkManager/Plugin" ))); + + // a bit debug output + for(TQValueList<KPluginInfo*>::ConstIterator it = _plugins.begin(); it != _plugins.end(); ++it) + kdDebug() << k_funcinfo << TQString("Found Plugin '%1'").tqarg((*it)->pluginName()) << endl; +} + +PluginManager::~PluginManager() +{ + // delete all loaded plugins + while(!_loadedPlugins.empty()) + { + PluginMap::Iterator it = _loadedPlugins.begin(); + _loadedPlugins.remove(it); + } + + // delete all available plugininfos + while(!_plugins.empty()) + { + TQValueList<KPluginInfo*>::Iterator it = _plugins.begin(); + delete *it; + _plugins.remove(it); + } +} + +TQStringList PluginManager::getPluginList(const TQString& serviceType, const TQString& property, const TQString& value) const +{ + TQStringList ret; + // find a suitable plugin + for(TQValueList<KPluginInfo*>::ConstIterator it = _plugins.begin(); it != _plugins.end(); ++it) + { + if ((*it)->service()->serviceTypes().contains(serviceType) > 0) + if ((*it)->property(property).toString().contains(value)) + ret.append( (*it)->pluginName() ); + } + return ret; +} + +Plugin* PluginManager::getPlugin(const TQString& pluginID) +{ + KPluginInfo* info = infoForPluginID(pluginID); + if (_loadedPlugins.contains(info)) + { + return _loadedPlugins[info]; + } + else + { + return loadPlugin(pluginID); + } + return NULL; +} + +const KPluginInfo* PluginManager::getPluginInfo(const TQString& pluginID) +{ + return infoForPluginID(pluginID); +} + +const KPluginInfo* PluginManager::getPluginInfo(const Plugin* plugin) +{ + for(PluginMap::ConstIterator it = _loadedPlugins.begin(); it != _loadedPlugins.end(); ++it) + { + if (it.data() == plugin) + return it.key(); + } + return NULL; +} + +void PluginManager::loadAllPlugins() +{ + // iterate over all plugins + for(TQValueList<KPluginInfo*>::ConstIterator it = _plugins.begin(); it != _plugins.end(); ++it) + { + // load Plugin + loadPlugin((*it)->pluginName()); + } +} + + +Plugin* PluginManager::loadPlugin(const TQString& pluginID) +{ + // try to load Plugin + int error = 0; + KPluginInfo* info = infoForPluginID(pluginID); + Plugin *plugin = KParts::ComponentFactory::createInstanceFromQuery<Plugin>( TQString::tqfromLatin1( "KNetworkManager/Plugin" ), + TQString::tqfromLatin1( "[X-KDE-PluginInfo-Name]=='%1'" ).tqarg( pluginID ), this, 0, TQStringList(), &error ); + + // plugin loaded? + if (plugin) + { + kdDebug() << k_funcinfo << TQString(i18n("successfully loaded plugin '%1'")).tqarg(info->pluginName()) << endl; + _loadedPlugins.insert(info, plugin); + } + else + { + // error + switch( error ) + { + case KParts::ComponentFactory::ErrNoServiceFound: + kdDebug( ) << k_funcinfo << "No service implementing the given mimetype " + << "and fullfilling the given constraint expression can be found." << endl; + break; + + case KParts::ComponentFactory::ErrServiceProvidesNoLibrary: + kdDebug( ) << "the specified service provides no shared library." << endl; + break; + + case KParts::ComponentFactory::ErrNoLibrary: + kdDebug( ) << "the specified library could not be loaded." << endl; + break; + + case KParts::ComponentFactory::ErrNoFactory: + kdDebug( ) << "the library does not export a factory for creating components." << endl; + break; + + case KParts::ComponentFactory::ErrNoComponent: + kdDebug( ) << "the factory does not support creating components of the specified type." << endl; + break; + } + + kdDebug() << k_funcinfo << "Loading plugin '" << pluginID << "' failed, KLibLoader reported error: '" << endl + << KLibLoader::self()->lastErrorMessage() << "'" << endl; + + } + + return plugin; +} + +KPluginInfo * PluginManager::infoForPluginID( const TQString& pluginID ) const +{ + TQValueList<KPluginInfo *>::ConstIterator it; + for ( it = this->_plugins.begin(); it != this->_plugins.end(); ++it ) + { + if ( ( *it )->pluginName() == pluginID ) + return *it; + } + + return 0L; +} + +#include "knetworkmanager-pluginmanager.moc" |